Version 2.1.0-dev.7.0

Merge commit 'a50dfd66980ed5c9aef9851fcc57557fb607769c' into dev
diff --git a/.gitattributes b/.gitattributes
index b7d52e5..7501c16 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -3,11 +3,11 @@
 *.cc text eol=lf
 *.cpp text eol=lf
 *.h text eol=lf
+*.dart text eol=lf
 
 # Explicitly declare text files we want to be normalized.
 *.gyp text
 *.gypi text
-*.dart text
 *.mk text
 *.Makefile text
 *.md text
diff --git a/.github/no-response.yml b/.github/no-response.yml
new file mode 100644
index 0000000..6db0fdf
--- /dev/null
+++ b/.github/no-response.yml
@@ -0,0 +1,16 @@
+# Configuration for probot-no-response - https://github.com/probot/no-response
+
+# Number of days of inactivity before an issue is closed for lack of response.
+daysUntilClose: 21
+
+# Label requiring a response.
+responseRequiredLabel: "need-info"
+
+# Comment to post when closing an Issue for lack of response.
+closeComment: >-
+  Without additional information, we are unfortunately not sure how to
+  resolve this issue. We are therefore reluctantly going to close this
+  bug for now. Please don't hesitate to comment on the bug if you have
+  any more information for us; we will reopen it right away!
+
+  Thanks for your contribution.
diff --git a/.packages b/.packages
index df189b4..0b9c7ed 100644
--- a/.packages
+++ b/.packages
@@ -33,7 +33,9 @@
 dart_style:third_party/pkg_tested/dart_style/lib
 dartdoc:third_party/pkg/dartdoc/lib
 dev_compiler:pkg/dev_compiler/lib
+diagnostic:pkg/diagnostic/lib
 expect:pkg/expect/lib
+file:third_party/pkg/file/packages/file/lib
 fixnum:third_party/pkg/fixnum/lib
 front_end:pkg/front_end/lib
 func:third_party/pkg/func/lib
@@ -68,8 +70,10 @@
 package_resolver:third_party/pkg_tested/package_resolver/lib
 path:third_party/pkg/path/lib
 petitparser:third_party/pkg/petitparser/lib
+platform:third_party/pkg/platform/lib
 plugin:third_party/pkg/plugin/lib
 pool:third_party/pkg/pool/lib
+process:third_party/pkg/process/lib
 protobuf:third_party/pkg/protobuf/lib
 pub:third_party/pkg/pub/lib
 pub_semver:third_party/pkg/pub_semver/lib
diff --git a/BUILD.gn b/BUILD.gn
index 6a4a55e..27a1cf8 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -42,7 +42,6 @@
   }
   deps = [
     "runtime/bin:dart",
-    "runtime/bin:dart_bootstrap($host_toolchain)",
     "runtime/bin:process_test",
     "runtime/bin:run_vm_tests",
     "runtime/bin:sample_extension",
@@ -64,7 +63,6 @@
 
 group("runtime_precompiled") {
   deps = [
-    "runtime/bin:dart_bootstrap($host_toolchain)",
     "runtime/bin:dart_precompiled_runtime",
     "runtime/bin:process_test",
   ]
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b6949d9..af78436 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,60 @@
+## 2.1.0-dev.7.0
+
+### Language
+
+*   Fixed a bug (issue [32014](http://dartbug.com/32014)) that caused invalid
+    implementations of the interface of a class to not be reported in some cases.
+    For instance, the following code would not produce a compile-time error:
+
+    ```dart
+    class A {
+      num get thing => 2.0;
+    }
+
+    abstract class B implements A {
+      int get thing;
+    }
+
+    class C extends A with B {} // 'thing' from 'A' is not a valid override of 'thing' from 'B'.
+
+    main() {
+      print(new C().thing.isEven); // Expects an int but gets a double.
+    }
+    ```
+
+*   Fixed a bug (issue [34235](http://dartbug.com/34235)) that caused invalid
+    overrides between a mixin member and an overridden member in the superclass
+    of the mixin application to not be reported. For instance, the following
+    code would not produce a compile-time error:
+
+    ```dart
+    class A {
+      int get thing => 2;
+    }
+
+    class B {
+      num get thing => 2.0;
+    }
+
+    class C extends A with B {} // 'thing' from 'B' is not a valid override of 'thing' from 'A'.
+
+    main() {
+      A a = new C();
+      print(a.thing.isEven); // Expects an int but gets a double.
+    }
+    ```
+
+### Core library changes
+
+#### `dart:core`
+
+*   Made `Uri` parsing more permissive about `[` and `]` occurring
+    in the path, query or fragment, and `#` occurring in fragment.
+
 ## 2.1.0-dev.6.0
 
 ## 2.1.0-dev.5.0
 
-### Core library changes
-
 #### `dart:core`
 
 *   Exported `Future` and `Stream` from `dart:core`.
diff --git a/DEPS b/DEPS
index efd5aea..06ad967 100644
--- a/DEPS
+++ b/DEPS
@@ -37,7 +37,7 @@
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
   "co19_rev": "9858ee7d79cf09b50d6b5bc13fb950ae5f357954",
-  "co19_2_rev": "7514e576a02ced94a360ec51e0d26b32f9ebc82f",
+  "co19_2_rev": "9484b81650d8c5bedf72abc541960dd1c90b2329",
 
   # As Flutter does, we pull buildtools, including the clang toolchain, from
   # Fuchsia. This revision should be kept up to date with the revision pulled
@@ -80,7 +80,8 @@
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
   "dart_style_tag": "1.2.0",  # Please see the note above before updating.
 
-  "dartdoc_tag" : "v0.21.1",
+  "dartdoc_tag" : "v0.23.0",
+  "file_rev": "515ed1dd48740ab14b625de1be464cb2bca4fefd",  # 5.0.6
   "fixnum_tag": "0.10.8",
   "func_rev": "25eec48146a58967d75330075ab376b3838b18a8",
   "glob_tag": "1.1.7",
@@ -92,10 +93,10 @@
   "http_tag" : "0.11.3+17",
   "http_throttle_tag" : "1.0.2",
   "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
-  "intl_tag": "0.15.6",
+  "intl_tag": "0.15.7",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "2.0.9",
-  "linter_tag": "0.1.63",
+  "linter_tag": "0.1.68",
   "logging_tag": "0.11.3+2",
   "markdown_tag": "2.0.2",
   "matcher_tag": "0.12.3",
@@ -107,9 +108,11 @@
   "package_config_tag": "1.0.5",
   "package_resolver_tag": "1.0.4",
   "path_tag": "1.6.2",
+  "platform_rev": "c368ca95775a4ec8d0b60899ce51299a9fbda399", # 2.2.0
   "plugin_tag": "f5b4b0e32d1406d62daccea030ba6457d14b1c47",
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.6",
+  "process_rev": "b8d73f0bad7be5ab5130baf10cd042aae4366d7c", # 3.0.5
   "protobuf_tag": "0.9.0",
   "pub_rev": "9f00679ef47bc79cadc18e143720ade6c06c0100",
   "pub_semver_tag": "1.4.2",
@@ -157,7 +160,7 @@
       "packages": [
           {
               "package": "dart/dart-sdk/${{platform}}",
-              "version": "version:2.1.0-dev.4.0",
+              "version": "version:2.1.0-dev.6.0",
           },
       ],
       "dep_type": "cipd",
@@ -230,6 +233,8 @@
       Var("dart_git") + "dart2js_info.git" + "@" + Var("dart2js_info_tag"),
   Var("dart_root") + "/third_party/pkg/dartdoc":
       Var("dart_git") + "dartdoc.git" + "@" + Var("dartdoc_tag"),
+  Var("dart_root") + "/third_party/pkg/file":
+      Var("dart_git") + "file.dart.git" + "@" + Var("file_rev"),
   Var("dart_root") + "/third_party/pkg/fixnum":
       Var("dart_git") + "fixnum.git" + "@" + Var("fixnum_tag"),
   Var("dart_root") + "/third_party/pkg/func":
@@ -286,10 +291,14 @@
       + "@" + Var("package_resolver_tag"),
   Var("dart_root") + "/third_party/pkg/path":
       Var("dart_git") + "path.git" + "@" + Var("path_tag"),
+  Var("dart_root") + "/third_party/pkg/platform":
+      Var("dart_git") + "platform.dart.git" + "@" + Var("platform_rev"),
   Var("dart_root") + "/third_party/pkg/plugin":
       Var("dart_git") + "plugin.git" + "@" + Var("plugin_tag"),
   Var("dart_root") + "/third_party/pkg/pool":
       Var("dart_git") + "pool.git" + "@" + Var("pool_tag"),
+  Var("dart_root") + "/third_party/pkg/process":
+      Var("dart_git") + "process.dart.git" + "@" + Var("process_rev"),
   Var("dart_root") + "/third_party/pkg/protobuf":
       Var("dart_git") + "protobuf.git" + "@" + Var("protobuf_tag"),
   Var("dart_root") + "/third_party/pkg/pub_semver":
@@ -475,8 +484,4 @@
     'pattern': '.',
     'action': ['python', 'sdk/build/vs_toolchain.py', 'update'],
   },
-  {
-    "pattern": ".",
-    "action": ["python", Var("dart_root") + "/tools/generate_buildfiles.py"],
-  },
 ]
diff --git a/build/dart/dart_action.gni b/build/dart/dart_action.gni
index d1825f9..e3d36f6 100644
--- a/build/dart/dart_action.gni
+++ b/build/dart/dart_action.gni
@@ -16,11 +16,10 @@
 # Dart's build.
 #
 # - prebuilt_dart_action()
-#   Runs Dart scripts using the downloaded prebuilt Dart SDK if there is one,
-#   and a built dart_bootstrap otherwise. This is the preferred method of
-#   running Dart code during the build as it is much faster than using
-#   dart_action() in debug and cross builds. However, prebuilt_dart_action()
-#   should *not* be used to generate snapshots.
+#   Runs Dart scripts using the downloaded prebuilt Dart SDK. This is the
+#   preferred method of running Dart code during the build as it is much
+#   faster than using dart_action() in debug and cross builds.
+#   However, prebuilt_dart_action() should *not* be used to generate snapshots.
 #
 # - dart_action()
 #   Runs Dart scripts using the binary built for runtime/bin:dart using the
@@ -29,9 +28,6 @@
 #   an App-JIT snapshot. This will be slow in Debug builds, and very slow in
 #   cross builds.
 #
-# - dart_bootstrap_action()
-#   Ditto, but uses runtime/bin:dart_bootstrap.
-#
 # - gen_snapshot_action()
 #   Runs the binary built for runtime/bin:gen_snapshot using the host
 #   toolchain. It should only be used when an artifact agreeing exactly
@@ -102,91 +98,57 @@
 template("_prebuilt_tool_action") {
   assert(defined(invoker.binary),
          "The path to where the prebuilt binary lives must be defined")
-  assert(defined(invoker.target),
-         "The target to use if the prebuilt doesn't exist must be defined")
+  assert(_is_fuchsia || prebuilt_dart_exe_works,
+         "A pre built dart executable needs to be present")
 
   vm_args = []
   if (defined(invoker.vm_args)) {
     vm_args += invoker.vm_args
   }
 
-  if (_is_fuchsia || prebuilt_dart_exe_works) {
-    not_needed(invoker, [ "target" ])
-    action(target_name) {
-      forward_variables_from(invoker,
-                             [
-                               "depfile",
-                               "deps",
-                               "outputs",
-                               "testonly",
-                               "visibility",
-                             ])
-      script = "$_dart_root/build/gn_run_binary.py"
+  action(target_name) {
+    forward_variables_from(invoker,
+                           [
+                             "depfile",
+                             "deps",
+                             "outputs",
+                             "testonly",
+                             "visibility",
+                           ])
+    script = "$_dart_root/build/gn_run_binary.py"
 
-      inputs = []
-      if (defined(invoker.inputs)) {
-        inputs += invoker.inputs
-      }
-
-      if (defined(invoker.script)) {
-        inputs += [ invoker.script ]
-      }
-      if (defined(invoker.packages)) {
-        inputs += [ invoker.packages ]
-      }
-
-      args = [
-               "compiled_action",
-               rebase_path(invoker.binary),
-             ] + vm_args
-      if (defined(invoker.packages)) {
-        args += [ "--packages=" + rebase_path(invoker.packages) ]
-      }
-      if (defined(invoker.dfe)) {
-        args += [ "--dfe=" + rebase_path(invoker.dfe) ]
-      }
-      if (defined(invoker.script)) {
-        args += [ rebase_path(invoker.script) ]
-      }
-      args += invoker.args
+    inputs = []
+    if (defined(invoker.inputs)) {
+      inputs += invoker.inputs
     }
-  } else {
-    not_needed(invoker, [ "binary" ])
-    _compiled_action(target_name) {
-      forward_variables_from(invoker,
-                             [
-                               "depfile",
-                               "deps",
-                               "inputs",
-                               "outputs",
-                               "testonly",
-                               "visibility",
-                             ])
 
-      if (defined(invoker.script)) {
-        inputs += [ invoker.script ]
-      }
-      if (defined(invoker.packages)) {
-        inputs += [ invoker.packages ]
-      }
-
-      tool = invoker.target
-      args = vm_args
-      if (defined(invoker.packages)) {
-        args += [ "--packages=" + rebase_path(invoker.packages) ]
-      }
-      if (defined(invoker.script)) {
-        args += [ rebase_path(invoker.script) ]
-      }
-      args += invoker.args
+    if (defined(invoker.script)) {
+      inputs += [ invoker.script ]
     }
+    if (defined(invoker.packages)) {
+      inputs += [ invoker.packages ]
+    }
+
+    args = [
+             "compiled_action",
+             rebase_path(invoker.binary),
+           ] + vm_args
+    if (defined(invoker.packages)) {
+      args += [ "--packages=" + rebase_path(invoker.packages) ]
+    }
+    if (defined(invoker.dfe)) {
+      args += [ "--dfe=" + rebase_path(invoker.dfe) ]
+    }
+    if (defined(invoker.script)) {
+      args += [ rebase_path(invoker.script) ]
+    }
+    args += invoker.args
   }
 }
 
 # A template for running Dart scripts during the build using the prebuilt Dart
 # SDK. This should *not* be used for generating snapshots. It uses the dart
-# binary from the prebuilt Dart SDK if one is available, and dart_bootstrap
-# otherwise.
+# binary from the prebuilt Dart SDK.
 #
 # Parameters:
 #  script:
@@ -224,7 +186,6 @@
       binary = "$_dart_root/tools/sdks/dart-sdk/bin/dart$executable_suffix"
       dfe = "$_dart_root/tools/sdks/dart-sdk/bin/snapshots/kernel-service.dart.snapshot"
     }
-    target = "$_dart_root/runtime/bin:dart_bootstrap"
   }
 }
 
@@ -233,7 +194,6 @@
     _prebuilt_tool_action(target_name) {
       forward_variables_from(invoker, "*")
       binary = prebuilt_gen_snapshot
-      target = "error"
     }
   }
 }
@@ -252,7 +212,6 @@
       extension = ".bat"
     }
     binary = "$_dart_root/tools/sdks/dart-sdk/bin/dart2js${extension}"
-    target = "error"
   }
 }
 
@@ -375,57 +334,6 @@
   }
 }
 
-# This template runs the dart_bootstrap produced by the in-progress build.
-#
-# Parameters:
-#  script:
-#    The un-rebased path to the Dart script.
-#
-#  vm_args (optional):
-#    Arguments to pass to the Dart VM.
-#
-#  args (optional):
-#    The arguments to pass to the Dart script.
-#
-#  packages (optional):
-#    The un-rebased path to the .packages file.
-#
-#  Forwarded to action() with the usual meaning:
-#    depfile
-#    deps
-#    inputs
-#    outputs
-#    testonly
-#    visibility
-template("dart_bootstrap_action") {
-  assert(defined(invoker.script), "script must be defined for $target_name")
-  if (!_is_fuchsia || !use_prebuilt_dart_sdk) {
-    _built_tool_action(target_name) {
-      tool = "$_dart_root/runtime/bin:dart_bootstrap"
-      forward_variables_from(invoker,
-                             [
-                               "args",
-                               "depfile",
-                               "deps",
-                               "inputs",
-                               "outputs",
-                               "packages",
-                               "script",
-                               "testonly",
-                               "tool",
-                               "visibility",
-                               "vm_args",
-                             ])
-    }
-  } else {
-    # We already have a prebuilt dart at the right version, so there is no
-    # reason to use dart_bootstrap.
-    prebuilt_dart_action(target_name) {
-      forward_variables_from(invoker, "*")
-    }
-  }
-}
-
 # This template runs the gen_snapshot produced by the in-progress build.
 #
 # Parameters:
diff --git a/build/gn_helpers.py b/build/gn_helpers.py
index 3b0647d..9a94abf 100644
--- a/build/gn_helpers.py
+++ b/build/gn_helpers.py
@@ -15,7 +15,7 @@
   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 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('"', '\\"') + '"'
@@ -36,4 +36,4 @@
   if isinstance(value, int):
     return str(value)
 
-  raise GNException("Unsupported type when printing to GN.")
+  raise GNException("Unsupported type %s (value %s) when printing to GN." % (type(value), value))
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py
index bfb8215..cfc2f50 100644
--- a/build/vs_toolchain.py
+++ b/build/vs_toolchain.py
@@ -9,8 +9,7 @@
 #   https://cs.chromium.org/chromium/src/build/vs_toolchain.py
 # 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 and removing
-# dependencies on any 'import gyp' in the original script.
+# tree, and edit to make it work in the Dart tree by updating paths in the original script.
 
 import glob
 import json
@@ -22,6 +21,7 @@
 import stat
 import subprocess
 import sys
+from gn_helpers import ToGNString
 
 
 script_dir = os.path.dirname(os.path.realpath(__file__))
@@ -50,7 +50,9 @@
   if ((sys.platform in ('win32', 'cygwin') or os.path.exists(json_data_file))
       and depot_tools_win_toolchain):
     if ShouldUpdateToolchain():
-      Update()
+      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)
 
@@ -86,9 +88,8 @@
     bitness = platform.architecture()[0]
     # When running 64-bit python the x64 DLLs will be in System32
     x64_path = 'System32' if bitness == '64bit' else 'Sysnative'
-    system_root = os.environ['SystemRoot']
-    x64_path = os.path.join(system_root, x64_path)
-    vs_runtime_dll_dirs = [x64_path, os.path.join(system_root, r'SysWOW64')]
+    x64_path = os.path.join(os.path.expandvars('%windir%'), x64_path)
+    vs_runtime_dll_dirs = [x64_path, os.path.expandvars('%windir%/SysWOW64')]
 
   return vs_runtime_dll_dirs
 
@@ -134,7 +135,6 @@
   # build/toolchain/win/setup_toolchain.py as well.
   version_as_year = GetVisualStudioVersion()
   year_to_version = {
-      '2015': '14.0',
       '2017': '15.0',
   }
   if version_as_year not in year_to_version:
@@ -149,19 +149,14 @@
     # For now we use a hardcoded default with an environment variable override.
     for path in (
         os.environ.get('vs2017_install'),
-        r'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional',
-        r'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community'):
+        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
-  else:
-    keys = [r'HKLM\Software\Microsoft\VisualStudio\%s' % version,
-            r'HKLM\Software\Wow6432Node\Microsoft\VisualStudio\%s' % version]
-    for key in keys:
-      path = _RegistryGetValue(key, 'InstallDir')
-      if not path:
-        continue
-      path = os.path.normpath(os.path.join(path, '..', '..'))
-      return path
 
   raise Exception(('Visual Studio Version %s (from GYP_MSVS_VERSION)'
                    ' not found.') % (version_as_year))
@@ -197,14 +192,15 @@
     target = os.path.join(target_dir, dll)
     source = os.path.join(source_dir, dll)
     _CopyRuntimeImpl(target, source)
-  # Copy the UCRT files needed by VS 2015 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.
+  # 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',
-                     'C:\\Program Files (x86)\\Windows Kits\\10'))
+                     os.path.expandvars('%ProgramFiles(x86)%'
+                                        '\\Windows Kits\\10')))
   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'))
@@ -246,11 +242,7 @@
   env_version = GetVisualStudioVersion()
   # These dependencies will be in a different location depending on the version
   # of the toolchain.
-  if env_version == '2015':
-    pgo_x86_runtime_dir = os.path.join(os.environ.get('GYP_MSVS_OVERRIDE_PATH'),
-                                       'VC', 'bin')
-    pgo_x64_runtime_dir = os.path.join(pgo_x86_runtime_dir, 'amd64')
-  elif env_version == '2017':
+  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
@@ -335,9 +327,11 @@
       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))
+                        ' 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)
 
@@ -346,12 +340,14 @@
   """Load a list of SHA1s corresponding to the toolchains that we want installed
   to build with."""
   env_version = GetVisualStudioVersion()
-  if env_version == '2015':
-    # Update 3 final with 10.0.15063.468 SDK and no vctip.exe.
-    return ['f53e4598951162bad6330f7a167486c7ae5db1e5']
   if env_version == '2017':
-    # VS 2017 Update 3.2 with 10.0.15063.468 SDK.
-    return ['9bc7ccbf9f4bd50d4a3bd185e8ca94ff1618de0b']
+    # 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)
 
 
@@ -385,6 +381,31 @@
         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])
+
     # Necessary so that get_toolchain_if_necessary.py will put the VS toolkit
     # in the correct directory.
     os.environ['GYP_MSVS_VERSION'] = GetVisualStudioVersion()
@@ -415,7 +436,8 @@
 
   # If WINDOWSSDKDIR is not set, search the default SDK path and set it.
   if not 'WINDOWSSDKDIR' in os.environ:
-    default_sdk_path = 'C:\\Program Files (x86)\\Windows Kits\\10'
+    default_sdk_path = os.path.expandvars('%ProgramFiles(x86)%'
+                                          '\\Windows Kits\\10')
     if os.path.isdir(default_sdk_path):
       os.environ['WINDOWSSDKDIR'] = default_sdk_path
 
@@ -428,17 +450,17 @@
   runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs()
   win_sdk_dir = SetEnvironmentAndGetSDKDir()
 
-  print '''vs_path = "%s"
-sdk_path = "%s"
-vs_version = "%s"
-wdk_dir = "%s"
-runtime_dirs = "%s"
+  print '''vs_path = %s
+sdk_path = %s
+vs_version = %s
+wdk_dir = %s
+runtime_dirs = %s
 ''' % (
-      NormalizePath(os.environ['GYP_MSVS_OVERRIDE_PATH']),
-      win_sdk_dir,
-      GetVisualStudioVersion(),
-      NormalizePath(os.environ.get('WDK_DIR', '')),
-      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():
@@ -454,4 +476,4 @@
 
 
 if __name__ == '__main__':
-  sys.exit(main())
+  sys.exit(main())
\ No newline at end of file
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 72d9f1d..3b8f01e 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -49,7 +49,7 @@
 % - Introduce a notion of lookup which is needed for superinvocations.
 % - Use new lookup concept to simplify specification of getter, setter, method
 %   lookup.
-% - Introduce several `Case< SomeTopic >` markers in order to improve
+% - Introduce several `Case<SomeTopic>` markers in order to improve
 %   readability.
 % - Reorganize several sections to specify static analysis first and then
 %   dynamic semantics; clarify many details along the way. The sections are:
@@ -59,6 +59,8 @@
 %   \ref{localVariableDeclaration}, and \ref{return}.
 % - Corrected error involving multiple uses of the same part in the same
 %   program such that it takes exports into account.
+% - Eliminate all references to checked and production mode, Dart 2 does
+%   not have modes.
 %
 % 2.0
 % - Don't allow functions as assert test values.
@@ -113,6 +115,13 @@
 %   dynamically.
 % - Specify that it is an error for a superinitializer to occur anywhere else
 %   than at the end of an initializer list.
+% - Update the potentially/compile-time constant expression definitions
+%   so that "potentially constant" depends only on the grammar, not the types
+%   of sub-expressions.
+% - Make `==` recognize `null` and make `&&` and `||` short-circuit in constant
+%   expressions.
+% - Add `as` and `is` expressions as constant expressions
+% - Make `^`, `|` and `&` operations on `bool` constant operations.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -371,37 +380,68 @@
 
 \LMHash{}
 Dart programs may be statically checked.
-The static checker will report some violations of the type rules, but such violations do not abort compilation or preclude execution.
-
-\LMHash{}
-Dart programs may be executed in one of two modes: production mode or checked mode.
-In production mode, static type annotations (\ref{staticTypes}) have absolutely no effect on execution with the exception of reflection and structural type tests.
+Programs with compile-time errors do not have a specified dynamic semantics.
+This specification makes no attempt to answer additional questions
+about a library or program at the point
+where it is known to have a compile-time error.
 
 \commentary{
-Reflection, by definition, examines the program structure.
-If we provide reflective access to the type of a declaration, or to source code, it will inevitably produce results that depend on the types used in the underlying code.
-
-Type tests also examine the types in a program explicitly.
-Nevertheless, in most cases, these will not depend on type annotations.
-The exceptions to this rule are type tests involving function types.
-Function types are structural, and so depend on the types declared for their parameters and on their return types.
+However, tools may choose to support execution of some programs with errors.
+For instance, a compiler may compile certain constructs with errors such that
+a dynamic error will be raised if an attempt is made to
+execute such a construct,
+or an IDE integrated runtime may support opening
+an editor window when such a construct is executed,
+allowing developers to correct the error.
+It is expected that such features would amount to a natural extension of the
+dynamic semantics of Dart as specified here, but, as mentioned,
+this specification makes no attempt to specify exactly what that means.
 }
 
 \LMHash{}
-In checked mode, assignments are dynamically checked, and certain violations of the type system throw exceptions at run time.
+As specified in this document,
+dynamic checks are guaranteed to be performed in certain situations,
+and certain violations of the type system throw exceptions at run time.
+
+\commentary{
+An implementation is free to omit such checks whenever they are
+guaranteed to succeed, e.g., based on results from the static analysis.
+}
 
 \commentary{
 The coexistence between optional typing and reification is based on the following:
 \begin{enumerate}
-\item Reified type information reflects the types of objects at run time and may always be queried by dynamic typechecking constructs (the analogs of instanceOf, casts, typecase etc.\ in other languages).
-Reified type information includes class declarations, the run-time type (aka class) of an object, and type arguments to constructors.
-\item Static type annotations determine the types of variables and function declarations (including methods and constructors).
-\item Production mode respects optional typing.
-Static type annotations do not affect run-time behavior.
-\item Checked mode utilizes static type annotations and dynamic type information aggressively yet selectively to provide early error detection during development.
+\item
+  Reified type information reflects the types of objects at run time
+  and may always be queried by dynamic typechecking constructs
+  (the analogs of instanceOf, casts, typecase etc.\ in other languages).
+  Reified type information includes
+  access to instances of class \code{Type} representing types,
+  the run-time type (aka class) of an object,
+  and the actual values of type parameters
+  to constructors and generic function invocations.
+\item
+  Type annotations declare the types of
+  variables and functions (including methods and constructors).
+\item
+  %% TODO(eernst): Change when integrating instantiate-to-bounds.md.
+  Type annotations may be omitted, in which case they are generally
+  filled in with the type \DYNAMIC{}
+  (\ref{typeDynamic}).
 \end{enumerate}
 }
 
+%% TODO(eernst): Update when we add inference.
+\commentary{
+Dart as implemented includes extensive support for inference of omitted types.
+This specification makes the assumption that inference has taken place,
+and hence inferred types are considered to be present in the program already.
+However, in some cases no information is available
+to infer an omitted type annotation,
+and hence this specification still needs to specify how to deal with that.
+A future version of this specification will also specify type inference.
+}
+
 \LMHash{}
 Dart programs are organized in a modular fashion into units called {\em libraries} (\ref{librariesAndScripts}).
 Libraries are units of encapsulation and may be mutually recursive.
@@ -411,6 +451,10 @@
 To get multiple copies of a library running simultaneously, one needs to spawn an isolate.
 }
 
+\LMHash{}
+A dart program execution may occur with assertions enabled or disabled.
+The method used to enable or disable assertions is implementation specific.
+
 
 \subsection{Scoping}
 \LMLabel{scoping}
@@ -706,7 +750,7 @@
 
 \LMHash{}
 A {\em constant variable} is a variable whose declaration includes the modifier \CONST{}.
-A constant variable must be initialized to a compile-time constant (\ref{constants}) or a compile-time error occurs.
+A constant variable must be initialized to a constant expression (\ref{constants}) or a compile-time error occurs.
 
 \LMHash{}
 A {\em final variable} is a variable whose binding is fixed upon initialization;
@@ -854,9 +898,9 @@
 }
 
 \LMHash{}
-In checked mode,
-it is a dynamic type error if $o$ is not the null object (\ref{null})
-and the interface of the class of $o$ is not a subtype of the actual type of the variable $v$
+It is a dynamic type error if $o$ is not the null object (\ref{null})
+and the dynamic type of $o$ is not
+a subtype of the actual type of the variable $v$
 (\ref{actualTypeOfADeclaration}).
 
 
@@ -901,9 +945,9 @@
 \code{\CONST{} $T$ $v$ = $e$;},
 \code{\STATIC{} \CONST{} $v$ = $e$;} or
 \code{\STATIC{} \CONST{} $T$ $v$ = $e$;}
-the result of the getter is the value of the compile-time constant $e$.
+the result of the getter is the value of the constant expression $e$.
 \commentary{
-Note that a compile-time constant cannot depend on itself,
+Note that a constant expression cannot depend on itself,
 so no cyclic references can occur.
 }
 \item {\bf Variable declaration without initializer}.
@@ -1190,7 +1234,7 @@
 It is deprecated and will be removed in a later version of the language specification.
 
 \LMHash{}
-It is a compile-time error if the default value of an optional parameter is not a compile-time constant (\ref{constants}).
+It is a compile-time error if the default value of an optional parameter is not a constant expression (\ref{constants}).
 If no default is explicitly specified for an optional parameter an implicit default of \NULL{} is provided.
 
 \LMHash{}
@@ -1938,10 +1982,10 @@
 must be a potentially constant expression (\ref{constantConstructors}).
 
 \LMHash{}
-It is a dynamic error if an actual argument passed in an invocation of a redirecting generative constructor $k$
+It is a dynamic type error if an actual argument passed in an invocation of a redirecting generative constructor $k$
 is not a subtype of the actual type (\ref{actualTypeOfADeclaration})
 of the corresponding formal parameter in the declaration of $k$.
-It is a dynamic error if an actual argument passed to the redirectee $k'$ of a redirecting generative constructor
+It is a dynamic type error if an actual argument passed to the redirectee $k'$ of a redirecting generative constructor
 is not a subtype of the actual type
 (\ref{actualTypeOfADeclaration})
 of the corresponding formal parameter in the declaration of the redirectee.
@@ -2122,10 +2166,9 @@
 \LMHash{}
 First, the expression $e$ is evaluated to an object $o$.
 Then, the instance variable $v$ of $i$ is bound to $o$.
-In checked mode,
-it is a dynamic type error if $o$ is not the null object
+It is a dynamic type error if $o$ is not the null object
 (\ref{null})
-and the interface of the class of $o$ is not a subtype of the actual type
+and the dynamic type of $o$ is not a subtype of the actual type
 (\ref{actualTypeOfADeclaration})
 of the instance variable $v$.
 
@@ -2184,7 +2227,10 @@
 It is a compile-time error if $M$ is not the name of the immediately enclosing class.
 
 \LMHash{}
-In checked mode, it is a dynamic type error if a factory returns a non-null object whose type is not a subtype of its actual (\ref{actualTypeOfADeclaration}) return type.
+It is a dynamic type error if a factory returns a non-null object
+whose type is not a subtype of its actual
+(\ref{actualTypeOfADeclaration})
+return type.
 
 \rationale{
 It seems useless to allow a factory to return the null object (\ref{null}).
@@ -2219,17 +2265,29 @@
 
 \begin{dartCode}
 $\ConstMetavar$ \FACTORY{}
-    $N$($T_1\ x_1 \ldots,\ T_n\ x_n,\ $[$T_{n+1}\ x_{n+1} = d_1 \ldots,\ T_{n+k}\ x_{n+k} = d_k$]) = $R$;
+    $N$($T_1\ x_1 \ldots,\ T_n\ x_n,\ $[$T_{n+1}\ x_{n+1}$=$d_1, \ldots,\ T_{n+k}\ x_{n+k}$=$d_k$]) = $R$;
 \\
 $\ConstMetavar$ \FACTORY{}
-    $N$($T_1\ x_1 \ldots,\ T_n\ x_n,\ $\{$T_{n+1}\ x_{n+1} = d_1 \ldots,\ T_{n+k}\ x_{n+k} = d_k$\}) = $R$;
+    $N$($T_1\ x_1 \ldots,\ T_n\ x_n,\ $\{$T_{n+1}\ x_{n+1}$=$d_1, \ldots,\ T_{n+k}\ x_{n+k}$=$d_k$\}) = $R$;
 \end{dartCode}
 
 \noindent
 where $R$ is of one of the forms
 \code{$T$<$S_1 \ldots,\ S_p$>} or
 \code{$T$<$S_1 \ldots,\ S_p$>.\id}.
-The {\em redirectee constructor} for this declaration is then the constructor denoted by $R$.
+
+\LMHash{}
+It is a compile-time error if $T$ does not denote
+a class accessible in the current scope.
+If $T$ does denote such a class $D$,
+it is a compile-time error if $R$ does not denote a constructor.
+% It is by induction sufficient to check for abstractness one level down,
+% because it is an error on the redirectee if this occurs after multiple
+% redirections:
+Otherwise, it is a compile-time error
+if $R$ denotes a generative constructor and $D$ is abstract.
+Otherwise, the {\em redirectee constructor} for this declaration is
+the constructor denoted by $R$.
 
 \LMHash{}
 A redirecting factory constructor $q'$ is {\em redirection-reachable}
@@ -2268,6 +2326,7 @@
 
 \LMHash{}
 It is a compile-time error if $k$ explicitly specifies a default value for an optional parameter.
+
 \commentary{
 Default values specified in $k$ would be ignored, since it is the {\em actual} parameters that are passed to $k'$.
 Hence, default values are disallowed.
@@ -2278,50 +2337,18 @@
 whose type is not a subtype of the type annotation
 on the corresponding formal parameter in $k$.
 
-\LMHash{}
-It is a compile-time error if a redirecting factory constructor redirects to itself, either directly or indirectly via a sequence of redirections.
-
-\LMHash{}
-It is a compile-time error if $type$ does not denote a class accessible in the current scope;
-if $type$ does denote such a class $C$ it is a compile-time error if the referenced constructor (be it \metavar{type} or \code{\metavar{type}.\id}) is not a constructor of $C$.
-
 \commentary{
 Note that it is not possible to modify the arguments being passed to $k'$.
 }
-% but we have the same issue with other redirecting constructors, no?)
+
 \rationale{
 At first glance, one might think that ordinary factory constructors could simply create instances of other classes and return them, and that redirecting factories are unnecessary.
 However, redirecting factories have several advantages:
 \begin{itemize}
 \item An abstract class may provide a constant constructor that utilizes the constant constructor of another class.
-\item A redirecting factory constructor avoids the need for forwarders to repeat the default values for formal parameters in their signatures.
-%\item A generic factory class that aggregates factory constructors for types it does not implement can still have its type arguments passed correctly.
+\item A redirecting factory constructor avoids the need for forwarders to repeat the formal parameters and their default values.
 \end{itemize}
-
-%An example of the latter point:
-%}
-
-%\begin{dartCode}
-%\CLASS{} W<T> \IMPLEMENTS{} A<T> { W(w) {...} ...}
-%\CLASS{} X<T> \IMPLEMENTS{} A<T> { X(x) {...} ...}
-%\CLASS{} Y<T> \IMPLEMENTS{} A<T> { Y(y) {...} ...}
-%\CLASS{} Z<T> \IMPLEMENTS{} A<T> { Z(z) {...} ...}
-
-%\CLASS{} F<T> { // note that F does not implement A
-%  \STATIC{} F<T> idw(w) => \NEW{} W<T>(w); // illegal - T not in scope in idw
-%  \FACTORY{} F.idx(x) => \NEW{} X<T>(x);
-%  \FACTORY{} F.idy(y) => \NEW{} Y<T>(y);
-%  \STATIC{} F idz(z) => \NEW{} Z(z); // does not capture the type argument
-%}
-
-%\CLASS{} A<T>{
-%  \FACTORY{} A.idw(w) => F<T>.idw(w);
-%// illegal - cannot pass type parameter to static method
-%  \FACTORY{} A.idx(x) $=> \NEW{} $F<T>.idx(x); // works, but allocates a gratuitous instance of F
-%  \FACTORY{} A.idy(y) = Y<T>; // works
-%  \FACTORY{} A.idz(z) => F.idz(z); // wrong - returns Z<Dynamic>; no way to pass type argument
 }
-%\end{dartCode}
 
 \LMHash{}
 It is a compile-time error if $k$ is prefixed with the \CONST{} modifier but $k'$ is not a constant constructor (\ref{constantConstructors}).
@@ -2331,7 +2358,7 @@
 in the declaration of $k$.
 Let $X_1, \ldots, X_m$ be the formal type arguments declared by
 the class that contains the declaration of $k'$.
-Let $F'$ be the function of $k'$ (\ref{constructors}).
+Let $F'$ be the function type of $k'$ (\ref{constructors}).
 It is a compile-time error if $[T_1/X_1, \ldots, T_m/X_m]F'$
 is not a subtype of the function type of $k$.
 
@@ -2343,15 +2370,12 @@
 }
 
 \LMHash{}
-It is a compile-time error if any of the type arguments to $k'$ are not subtypes of the bounds of the corresponding formal type parameters of $type$.
-
-\LMHash{}
 For the dynamic semantics,
 assume that $k$ is a redirecting factory constructor
 and $k'$ is the redirectee of $k$.
 
 \LMHash{}
-It is a dynamic error if an actual argument passed in an invocation of $k$
+It is a dynamic type error if an actual argument passed in an invocation of $k$
 is not a subtype of the actual type (\ref{actualTypeOfADeclaration})
 of the corresponding formal parameter in the declaration of $k$.
 
@@ -2408,30 +2432,14 @@
 Any expression that appears within the initializer list of a constant constructor must be a potentially constant expression, or a compile-time error occurs.
 
 \LMHash{}
-A {\em potentially constant expression} is an expression $e$ that would be a valid constant expression if all formal parameters of $e$'s immediately enclosing constant constructor were treated as compile-time constants that were guaranteed to evaluate to an integer, boolean or string value as required by their immediately enclosing superexpression, and where $e$ is also a valid expression if all the formal parameters are treated as non-constant variables.
+A {\em potentially constant expression} is an expression $e$ that could be a valid constant expression if all formal parameters of $e$'s immediately enclosing constant constructor were treated as compile-time constants of appropriate types, and where $e$ is also a valid expression if all the formal parameters are treated as non-constant variables.
 
 \commentary{
-Note that a parameter that is not used in a superexpression that is restricted to certain types can be a constant of any type.
-For example
-}
+The difference between a potentially constant expression and a constant expression (\ref{const}) deserves some explanation.
 
-\begin{dartCode}
-\CLASS{} A \{
-  \FINAL{} m;
-  \CONST{} A(this.m);
-\}
-\end{dartCode}
+The key issue is how one treats the formal parameters of a constructor.
 
-\commentary{
-can be instantiated via \code{\CONST{} A(\CONST []);}
-}
-
-\commentary{
-The difference between a potentially constant expression and a compile-time constant expression (\ref{const}) deserves some explanation.
-
-The key issue is whether one treats the formal parameters of a constructor as compile-time constants.
-
-If a constant constructor is invoked from a constant object expression, the actual arguments will be required to be compile-time constants.
+If a constant constructor is invoked from a constant object expression, the actual arguments will be required to be constant expressions.
 Therefore, if we were assured that constant constructors were always invoked from constant object expressions, we could assume that the formal parameters of a constructor were compile-time constants.
 
 However, constant constructors can also be invoked from ordinary instance creation expressions (\ref{new}), and so the above assumption is not generally valid.
@@ -2450,9 +2458,9 @@
 \end{dartCode}
 
 \commentary{
-The assignment to \code{x} is allowed under the assumption that \code{q} is a compile-time constant (even though \code{q} is not, in general a compile-time constant).
+The assignment to \code{x} is allowed under the assumption that \code{q} is constant (even though \code{q} is not, in general a compile-time constant).
 The assignment to \code{y} is similar, but raises additional questions.
-In this case, the superexpression of \code{p} is \code{p + 100}, and it requires that \code{p} be a numeric compile-time constant for the entire expression to be considered constant.
+In this case, the superexpression of \code{p} is \code{p + 100}, and it requires that \code{p} be a numeric constant expression for the entire expression to be considered constant.
 The wording of the specification allows us to assume that \code{p} evaluates to an integer.
 A similar argument holds for \code{p} and \code{q} in the assignment to \code{z}.
 
@@ -2532,17 +2540,35 @@
 \subsection{Superclasses}
 \LMLabel{superclasses}
 
+%% TODO(eernst): We need to say that the superclass which is obtained
+%% by mixin application is generic when $C$ is generic, or at least
+%% when one or more of $C$'s type variables are used by the classes
+%% in the \EXTENDS{} or \WITH{} clause of $C$. It says below that
+%% these clauses are in the type parameter scope of $C$, but that does
+%% not allow us to talk about the superclass as an actual, stand-alone
+%% class (unless we start defining nested classes, such that the
+%% superclass can be declared in that scope).
+
 \LMHash{}
-The superclass $S^\prime$ of a class $C$ that has a with clause \code{\WITH{} $M_1, \ldots,\ M_k$} and an extends clause \code{\EXTENDS{} $S$} is the application of mixin composition (\ref{mixins}) $M_k* \cdots * M_1$ to $S$. The name $S^\prime$ is a fresh identifier.
-If no \WITH{} clause is specified then the \EXTENDS{} clause of a class $C$ specifies its superclass.
+The superclass $S'$ of a class $C$ whose declaration has a with clause
+\code{\WITH{} $M_1, \ldots,\ M_k$}
+and an extends clause
+\code{\EXTENDS{} $S$}
+is the abstract class obtained by application of
+mixin composition (\ref{mixins}) $M_k* \cdots * M_1$ to $S$.
+The name $S'$ is a fresh identifier.
+If no \WITH{} clause is specified then the \EXTENDS{} clause of
+a class $C$ specifies its superclass.
 If no \EXTENDS{} clause is specified, then either:
 \begin{itemize}
 \item $C$ is \code{Object}, which has no superclass. OR
-\item Class $C$ is deemed to have an \EXTENDS{} clause of the form \code{\EXTENDS{} Object}, and the rules above apply.
+\item Class $C$ is deemed to have an \EXTENDS{} clause of the form
+\code{\EXTENDS{} Object}, and the rules above apply.
 \end{itemize}
 
 \LMHash{}
-It is a compile-time error to specify an \EXTENDS{} clause for class \code{Object}.
+It is a compile-time error to specify an \EXTENDS{} clause
+for class \code{Object}.
 
 \begin{grammar}
 <superclass> ::= \EXTENDS{} <type>
@@ -3036,7 +3062,7 @@
 which denote the superclass, by $N_C$,
 $\SUPER_q$ is obtained from $S_q$ by replacing occurrences of $S_N$
 which denote the superclass by \SUPER{},
-and $d'_i$, $i \in 1..p$, is a compile-time constant expression evaluating
+and $d'_i$, $i \in 1..p$, is a constant expression evaluating
 to the same value as $d_i$.
 If $S_q$ is a generative const constructor, and $M$ does not declare any
 fields, $C_q$ is also a const constructor.
@@ -3054,7 +3080,7 @@
 which denote the superclass by $N_C$,
 $\SUPER_q$ is obtained from $S_q$ by replacing occurrences of $S_N$
 which denote the superclass by \SUPER{},
-and $d'_i$, $i \in 1..n$, is a compile-time constant expression evaluating to the same value as $d_i$.
+and $d'_i$, $i \in 1..n$, is a constant expression evaluating to the same value as $d_i$.
 If $S_q$ is a generative const constructor, and $M$ does not declare any
 fields, $C_q$ is also a const constructor.
 
@@ -3744,7 +3770,7 @@
 Metadata consists of a series of annotations, each of which begin with the character @, followed by a constant expression that starts with an identifier.
 It is a compile-time error if the expression is not one of the following:
 \begin{itemize}
-\item A reference to a compile-time constant variable.
+\item A reference to a constant variable.
 \item A call to a constant constructor.
 \end{itemize}
 
@@ -3873,56 +3899,188 @@
 \subsection{Constants}
 \LMLabel{constants}
 
-\LMHash{}
-A {\em constant expression} is an expression whose value can never change, and that can be evaluated entirely at compile time.
+\commentary{
+All usages of the word 'constant' in Dart are associated with compile time.
+A potentially constant expression is an expression that will generally yield
+a constant value when the value of certain parameters is given.
+The constant expressions is a subset of the potentially constant expressions that {\em can} be evaluated entirely at compile time.
+}
+
+\rationale{
+The constant expressions are restricted to expressions that
+perform only simple arithmetic operations, boolean conditions, and string and instance creation.
+No user written function body is executed during constant expression evaluation,
+only members of the system classes \code{int}, \code{double}, \code{bool}, \code{String} or \code{Null}.
+}
 
 \LMHash{}
-A constant expression is one of the following:
+The {\em potentially constant expressions} and {\em constant expressions} are the following:
+
 \begin{itemize}
-\item A literal number (\ref{numbers}).
-\item A literal boolean (\ref{booleans}).
-\item A literal string (\ref{strings}) where every interpolated expression (\ref{stringInterpolation}) is a compile-time constant that evaluates to a numeric, string or boolean value or to the null object (\ref{null}).
-\rationale{
-It would be tempting to allow string interpolation where the interpolated value is any compile-time constant.
-However, this would require running the \code{toString()} method for constant objects, which could contain arbitrary code.
-}
-\item A literal symbol (\ref{symbols}).
-\item \NULL{} (\ref{null}).
-\item A qualified reference to a static constant variable (\ref{variables}) that is not qualified by a deferred prefix.
+\item A literal boolean, \TRUE{} or \FALSE{} (\ref{booleans}), is a potentially constant and constant expression.
+
+\item A literal number (\ref{numbers}) is a potentially constant and constant expression if it evaluates to a value of type \code{int} or \code{double}.
+% A too-large integer literal does not evaluate to a value.
+
+\item A literal string (\ref{strings}) with string interpolations (\ref{stringInterpolation} with expressions $e_1$, \ldots{}, $e_n$ is a potentially constant expression if $e_1$, \ldots{}, $e_n$ are potentially constant expressions.
+The literal is further a constant expression if $e_1$, \ldots{}, $e_n$ are constant expressions evaluating to values that are instances of \code{int}, \code{double} \code{String}, \code{bool} or \code{Null}.
+\commentary{These requirements hold trivially if there are no interpolations in the string}.
+\rationale{It would be tempting to allow string interpolation where the
+interpolated value is any compile-time constant. However, this would require
+running the \code{toString()} method for constant objects, which could contain
+arbitrary code.}
+
+\item A literal symbol (\ref{symbols}) is a potentially constant and constant expression.
+
+\item The literal \NULL{} (\ref{null}) is a potentially constant and constant expression.
+
+\item An identifier that denotes a constant variable is a potentially constant and constant expression.
+
+\item A qualified reference to a static constant variable (\ref{variables}) that is not qualified by a deferred prefix, is a potentially constant and constant expression.
 \commentary{
-For example, if class C declares a constant variable v, C.v is a constant.
-The same is true if C is accessed via a prefix p; p.C.v is a constant unless p is a deferred prefix.
+For example, If class $C$ declares a constant static variable $v$, \code{$C$.$v$} is a constant.
+The same is true if $C$ is accessed via a prefix $p$; \code{$p$.$C$.$v$} is a constant unless $p$ is a deferred prefix.
 }
-\item An identifier expression that denotes a constant variable.
-\item A simple or qualified identifier denoting a class or type alias that is not qualified by a deferred prefix.
+
+\item A simple or qualified identifier denoting a class, a mixin or a type alias that is not qualified by a deferred prefix, is a potentially constant and constant expression.
 \commentary{
-For example, If C is a class or typedef, C is a constant, and if C is imported with a prefix p, p.C is a constant unless p is a deferred prefix.
+The constant expression always evaluates to a \code{Type} object.
+For example, if $C$ is the name of a class or type alias, the expression \code{$C$} is a constant, and if $C$ is imported with a prefix $p$, \code{$p$.$C$} is a constant \code{Type} instance representing the type of $C$ unless $p$ is a deferred prefix.
 }
-\item A constant constructor invocation (\ref{const}) that is not qualified by a deferred prefix.
-\item A constant list literal (\ref{lists}).
-\item A constant map literal (\ref{maps}).
-\item A simple or qualified identifier denoting a top-level function (\ref{functions}) or a static method (\ref{staticMethods}) that is not qualified by a deferred prefix.
-\item A parenthesized expression \code{($e$)} where $e$ is a constant expression.
-\item An expression of the form \code{identical($e_1$, $e_2$)} where $e_1$ and $e_2$ are constant expressions and \code{identical()} is statically bound to the predefined dart function \code{identical()} discussed above (\ref{objectIdentity}).
-\item An expression of one of the forms \code{$e_1$\,==\,$e_2$} or \code{$e_1$\,!=\,$e_2$} where $e_1$ and $e_2$ are constant expressions, and either both evaluate to a numeric, string or boolean value, or at least one of $e_1$ or $e_2$ evaluates to the null object (\ref{null}).
-\item An expression of one of the forms \code{!$e$}, \code{$e_1$\,\&\&\,$e_2$} or \code{$e_1$\,||\,$e_2$}, where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a boolean value.
-\item An expression of one of the forms \code{\~{}$e$}, \code{$e_1$\,\^\,$e_2$}, \code{$e_1$\,\&\,$e_2$}, \code{$e_1$\,|\,$e_2$}, \code{$e_1$\,<\mbox<\,$e_2$}, \code{$e_1$\,\gtgt\,$e_2$} or \code{$e_1$\,\gtgtgt\,$e_2$}, where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to an integer value or to the null object (\ref{null}).
-\item An expression of the form \code{$e_1$\,+\,$e_2$} where $e_1$ and $e_2$ are constant expressions that evaluate to a numeric or string value or to the null object (\ref{null}).
-\item An expression of one of the forms \code{-$e$}, \code{$e_1$\,-\,$e_2$}, \code{$e_1$\,*\,$e_2$}, \code{$e_1$\,/\,$e_2$,} \code{$e_1$\,\~{}/\,$e_2$}, \code{$e_1$\,>\,$e_2$}, \code{$e_1$\,<\,$e_2$}, \code{$e_1$\,>=\,$e_2$}, \code{$e_1$\,<=\,$e_2$} or \code{$e_1$\,\%\,$e_2$}, where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a numeric value or to the null object (\ref{null}).
-\item An expression of the form \code{$e_1$\,?\,$e_2$\,:\,$e3$} where $e_1$, $e_2$ and $e_3$ are constant expressions and $e_1$ evaluates to a boolean value.
-\item An expression of the form \code{$e_1$\,??\,$e_2$} where $e_1$ and $e_2$ are constant expressions.
-\item An expression of the form \code{$e$.length} where $e$ is a constant expression that evaluates to a string value.
+
+\item A simple or qualified identifier denoting a top-level function (\ref{functions}) or a static method (\ref{staticMethods}) that is not qualified by a deferred prefix, is a potentially constant and constant expression.
+
+\item An identifier expression denoting a parameter of a constant constructor (\ref{constantConstructors}) that occurs in the initializer list of the constructor, is a potentially constant expression.
+
+\item A constant object expression (\ref{const}),
+\code{\CONST{} $C$<$T_1,\ \ldots,\ T_k$>(\metavar{arguments})} or
+\code{\CONST{} $C$<$T_1,\ \ldots,\ T_k$>.\id(\metavar{arguments})},
+or either expression without the leading \CONST{} that occurs in a constant context, is a potentially constant expression if $T_1$, \ldots{}, $T_k$ are constant type expressions, and the actual argument expressions in \metavar{arguments} are constant expressions.
+It is further a constant expression if the invocation evaluates to a value.
+% \ref{const} requires each actual argument to be a constant expression,
+% but here we also catch errors during evaluation, e.g., `C(1, 0)` where
+% `C(double x, double y): z = x / y;`.
+It is a compile-time error if a constant object expression is
+not a constant expression (\ref{const}).
+
+\item A constant list literal (\ref{lists}),
+\code{\CONST{} <$T$>[$e_1$, \ldots{}, $e_n$]}, or
+\code{<$T$>[$e_1$, \ldots{}, $e_n$]}
+that occurs in a constant context, is a potentially constant expression if $T$ is a constant type expression, and $e_1$, \ldots{} , $e_n$ are constant expressions.
+It is further a constant expression if the list literal evaluates to a value.
+
+\item A constant map literal (\ref{maps}),
+\code{\CONST{} <$K$, $V$>\{$k_1$: $v_1$, \ldots{}, $k_n$: $v_n$\}}
+is a potentially constant expression if
+\begin{itemize}
+  \item $K$ and $V$ are constant type expressions,
+  \item $k_1$, \ldots{}, $k_n$ are constant expressions evaluating to values that are either \code{int} or \code{String} instances, created using a symbol literal or a const invocation of the \code{Symbol} constructor, or instances of classes that that do not override the \code{==} operator inherited from \code{Object}, and
+  \item $v_1$, \ldots{}, $v_n$ are constant expressions.
+\end{itemize}
+It is further a constant expression if the map literal evaluates to a value.
+%Should we also require the key instances to not override hashCode? Because Symbols do.
+
+\item A parenthesized expression \code{($e$)} is a potentially constant expression if $e$ is a potentially constant expression. It is further a constant expression if $e$ is a constant expression.
+
+\item An expression of the form \code{identical($e_1$, $e_2$)} is a potentially constant expression if $e_1$ and $e_2$ are potentially constant expressions and \code{identical} is statically bound to the predefined dart function \code{identical()} discussed above (\ref{objectIdentity}). It is further a constant expression if $e_1$ and $e_2$ are constant expressions.
+
+\item An expression of the form \code{$e_1$\,!=\,$e_2$} is equivalent to \code{!($e_1$\,==\,$e_2$)} in every way, including whether it is potentially constant or constant.
+
+\item An expression of the form \code{$e_1$\,==\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if both $e_1$ and $e_2$ are constant and either $e_1$ evaluates to a value that is an instance of \code{int}, \code{double}, \code{String}, \code{bool} or \code{Null}, or if $e_2$ evaluates to the null object (\ref{null}).
+%TODO: Consider adding enum instances here.
+
+\item An expression of the form \code{!$e_1$} is potentially constant if $e_1$ is potentially constant. It is further constant if $e_1$ is a constant expression that evaluates to a value of type \code{bool}.
+
+\item An expression of the form \code{$e_1$\,\&\&\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if $e_1$ is a constant expression and either
+\begin{enumerate}
+\item $e_1$ evaluates to \FALSE{}, or
+\item $e_1$ evaluates to \TRUE{} and $e_2$ is a constant expression that evaluates to a value of type \code{bool}.
+\end{enumerate}
+
+\item An expression of the form \code{$e_1$\,||\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if $e_1$ is a constant expression and either
+\begin{enumerate}
+\item $e_1$ evaluates to \TRUE{}, or
+\item $e_1$ evaluates to \FALSE{} and $e_2$ is a constant expression that evaluates to a value of type \code{bool}.
+\end{enumerate}
+
+\item An expression of the form \code{~$e_1$} is a potentially constant expression if $e_1$ is a potentially constant expression. It is further a constant expression if $e_1$ is a constant expression that evaluates to a value of type \code{int}.
+
+\item An expression of one of the forms \code{$e_1$\,\&\,$e_2$}, \code{$e_1$\,|\,$e_2$}, or \code{$e_1$\,\^\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if both $e_1$ and $e_2$ are constant expressions that both evaluate to values that are both instances of \code{int}, or that are both instances of \code{bool}.
+% The bool case is new in 2.1.
+
+\item An expression of one of the forms \code{$e_1$\,\~{}/\,$e_2$}, \code{$e_1$\,\gtgt\,$e_2$}, \code{$e_1$\,\gtgtgt\,$e_2$}, or \code{$e_1$\,\ltlt\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if both $e_1$ and $e_2$ are constant expressions that evaluate to values that are instances of \code{int}.
+
+\item An expression of the form \code{$e_1$\,+\,$e_2$} is a potentially constant expression if $e_1$ and $e_2$ are both potentially constant expressions. It is further a constant expression if both $e_1$ and $e_2$ are constant expressions and either both evaluate to values that are instances of \code{int} or \code{double}, or both evaluate to values of type \code{String}.
+
+\item An expression of the form \code{-$e_1$} is a potentially constant expression if $e_1$ is a potentially constant expression. It is further a constant expression if $e_1$ is a constant expression that evaluates to a value that is an instance of \code{int} or \code{double}.
+
+\item An expression of the form \code{$e_1$\,-\,$e_2$}, \code{$e_1$\,*\,$e_2$}, \code{$e_1$\,/\,$e_2$}, \code{$e_1$\,\%\,$e_2$}, \code{$e_1$\,<\,$e_2$}, \code{$e_1$\,<=\,$e_2$}, \code{$e_1$\,>\,$e_2$}, or \code{$e_1$\,>=\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if both $e_1$ and $e_2$ are constant expressions that evaluate to values that are instances of \code{int} or \code{double}.
+
+\item An expression of the form \code{$e_1$\,?\,$e_2$\,:\,$e_3$} is potentially constant if $e_1$, $e_2$, and $e_3$ are all potentially constant expressions. It is constant if $e_1$ is a constant expression and either
+\begin{enumerate}
+\item $e_1$ evaluates to \TRUE{} and $e_2$ is a constant expression, or
+\item $e_1$ evaluates to \FALSE{} and $e_3$ is a constant expression.
+\end{enumerate}
+
+\item An expression of the form \code{$e_1$\,??\,$e_2$} is potentially constant if $e_1$ and $e_2$ are both potentially constant expressions. It is further constant if $e_1$ is a constant expression and either
+\begin{enumerate}
+\item $e_1$ evaluates to a non-\NULL{} value, or
+\item $e_1$ evaluates to \NULL{} and $e_2$ is a constant expression.
+\end{enumerate}
+
+\item An expression of the form \code{$e$.length} is potentially constant if $e$ is a potentially constant expression. It is further constant if $e$ is a constant expression that evaluates to a \code{String}.
+
+% New in 2.1.
+\item An expression of the form \code{$e$ as $T$} is potentially constant if $e$ is a potentially constant expression and $T$ is a constant type expression, and it is further constant if $e$ is constant.
+\commentary{
+It is a compile-time error to evaluate the constant expression
+if the cast operation would throw, that is,
+if the value the $e$ evaluates to is not \NULL{} and not of type $T$.
+}
+
+% New in 2.1.
+\item An expression of the form \code{$e$ is $T$} is potentially constant if $e$ is a potentially constant expression and $T$ is a constant type expression, and it is further constant if $e$ is constant.
+
+% New in 2.1.
+\item{}
+An expression of the form \code{$e$ is! $T$} is equivalent to \code{!($e$ is $T$)} in every way,
+including whether it's potentially constant or constant.
+
 \end{itemize}
 
-% null in all the expressions
+\LMHash{}
+% New in 2.1.
+A constant type expression is one of:
+\begin{itemize}
+\item An simple or qualified identifier denoting a type declaration (a type alias, class or mixin declaration) that is not qualified by a deferred prefix,
+optionally followed by type arguments on the form
+\code{<$T_1$,\ \ldots,\ $T_n$>}
+where $T_1$, \ldots{}, $T_n$ are constant type expressions.
+\item A type of the form \code{FutureOr<$T$>} where $T$ is a constant type expression.
+\item A function type
+\code{$R$ Function<\metavar{typeParameters}>(\metavar{argumentTypes})}
+(where $R$ and \code{<\metavar{typeParameters}>} may be omitted)
+and where $R$, \metavar{typeParameters} and \metavar{argumentTypes} (if present) contain only constant type expressions.
+\item The type \VOID{}.
+\item The type \DYNAMIC{}.
+\end{itemize}
 
-% designed so constants do not depend on check diode being on or not.
+% Being potentially constant is entirely structural, not type based,
+% but the program still has to satisfy strong-mode typing.
+
+% Constant expressions (like "const Foo(42)") always evaluate to the
+% same value, with at most one value per source location.
+% Potentially constant expressions that are not constant only
+% allow simple operations on basic types (num, String, bool, Null). These can
+% be computed statically without running user code.
+
+% A validly typed potentially constant expression can still fail when evaluated.
+% If that happens in a const invociation, it's a compile-time error.
 
 \LMHash{}
 It is a compile-time error if an expression is required to be a constant expression but its evaluation would throw an exception.
-It is a compile-time error if an assertion is part of a compile-time constant constructor invocation and the assertion would throw an exception.
+It is a compile-time error if an assertion is evaluated as part of a constant object expression evaluation, and the assertion would throw an exception.
 
-% so, checked mode? analyzers? editor/development compilers?
 \commentary{
 Note that there is no requirement that every constant expression evaluate correctly.
 Only when a constant expression is required (e.g., to initialize a constant variable, or as a default value of a formal parameter, or as metadata) do we insist that a constant expression actually be evaluated successfully at compile time.
@@ -3987,7 +4145,7 @@
 }
 
 \LMHash{}
-It is a compile-time error if the value of a compile-time constant expression depends on itself.
+It is a compile-time error if the value of a constant expression depends on itself.
 
 \commentary{
 As an example, consider:
@@ -4398,7 +4556,7 @@
 A symbol literal \code{\#\id} where \id{} is an identifier
 that does not begin with an underscore ('\code{\_}'),
 evaluates to an instance of \code{Symbol} representing the identifier \id.
-All occurences of \code{\#\id} evaluate to the same instance
+All occurrences of \code{\#\id} evaluate to the same instance
 \commentary{(symbol instances are canonicalized)},
 and no other symbol literals evaluate to that \code{Symbol} instance
 or to a \code{Symbol} instance that is equal
@@ -4408,7 +4566,7 @@
 A symbol literal \code{\#$\id.\id_2\ldots\id_n$}
 where $\id{} \ldots \id_n$ are identifiers,
 evaluates to an instance of \code{Symbol} representing that particular sequence of identifiers.
-All occurences of \code{\#$\id.\id_2\ldots\id_n$} with the same sequence of identifiers
+All occurrences of \code{\#$\id.\id_2\ldots\id_n$} with the same sequence of identifiers
 evaluate to the same instance,
 and no other symbol literals evaluate to that \code{Symbol} instance
 or to a \code{Symbol} instance that is \code{==} to that instance.
@@ -4418,14 +4576,14 @@
 \LMHash{}
 A symbol literal \code{\#\metavar{operator}} evaluates to an instance of \code{Symbol}
 representing that particular operator name.
-All occurences of \code{\#\metavar{operator}} evaluate to the same instance,
+All occurrences of \code{\#\metavar{operator}} evaluate to the same instance,
 and no other symbol literals evaluate to that \code{Symbol} instance
 or to a \code{Symbol} instance that is \code{==} to that instance.
 
 \LMHash{}
 A symbol literal \code{\#\_\id}, evaluates to an instance of \code{Symbol}
 representing the private identifier \code{\_\id} of the containing library.
-All occurences of \code{\#\_\id} {\em in the same library} evaluate to the same instance,
+All occurrences of \code{\#\_\id} {\em in the same library} evaluate to the same instance,
 and no other symbol literals evaluate to that \code{Symbol} instance
 or to a \code{Symbol} instance that is \code{==} to that instance.
 
@@ -4466,18 +4624,18 @@
 It is a run-time error to attempt to access a list using an index that is not a member of its set of indices.
 
 \LMHash{}
-If a list literal begins with the reserved word \CONST{}, it is a {\em constant list literal} which is a compile-time constant (\ref{constants}) and therefore evaluated at compile time.
+If a list literal begins with the reserved word \CONST{}, it is a {\em constant list literal} which is a constant expression (\ref{constants}) and therefore evaluated at compile time.
 Otherwise, it is a {\em run-time list literal} and it is evaluated at run time.
 Only run-time list literals can be mutated
 after they are created.
 Attempting to mutate a constant list literal will result in a dynamic error.
 
 \LMHash{}
-It is a compile-time error if an element of a constant list literal is not a compile-time constant.
+It is a compile-time error if an element of a constant list literal is not a constant expression.
 % Need 'free': `const <Function(Function<X>(X))>[]` is OK, but `X` is not free.
 It is a compile-time error if the type argument of a constant list literal is or contains a free type variable.
 \rationale{
-The binding of a type parameter is not known at compile time, so we cannot use type parameters inside compile-time constants.
+The binding of a type parameter is not known at compile time, so we cannot use type parameters inside constant expressions.
 }
 
 \LMHash{}
@@ -4524,7 +4682,9 @@
 \commentary{
 Note that this document does not specify an order in which the elements are set.
 This allows for parallel assignments into the list if an implementation so desires.
-The order can only be observed in checked mode (and may not be relied upon): if element $i$ is not a subtype of the element type of the list, a dynamic type error will occur when $a[i]$ is assigned $o_{i-1}$.
+The order can only be observed (and may not be relied upon):
+if element $i$ is not a subtype of the element type of the list,
+a dynamic type error will occur when $a[i]$ is assigned $o_{i-1}$.
 }
 
 \LMHash{}
@@ -4536,10 +4696,9 @@
 \commentary{
 There is no restriction precluding nesting of list literals.
 It follows from the rules above that
-\code{<List<int\gtgt{}[[1, 2, 3], [4, 5, 6]]}
-is a list with type parameter
-\code{List<int>},
-containing two lists with type parameter \DYNAMIC{}.
+\code{<List<int>{}>[<int>[1, 2, 3], <int>[4, 5, 6]]}
+is a list with type parameter \code{List<int>},
+containing two lists with type parameter \code{int}.
 }
 
 \LMHash{}
@@ -4547,26 +4706,12 @@
 \code{\CONST{} <$E$>[$e_1, \ldots, e_n$]}
 or the form
 \code{<$E$>[$e_1, \ldots, e_n$]}
-is
-\code{List<E>}.
+is \code{List<$E$>}.
 The static type a list literal of the form
 \code{\CONST{} [$e_1, \ldots, e_n$]}
 or the form
 \code{[$e_1, \ldots, e_n$]}
-is
-\code{List<\DYNAMIC{}>}.
-
-\rationale{
-It is tempting to assume that the type of the list literal would be computed based on the types of its elements.
-However, for mutable lists this may be unwarranted.
-Even for constant lists, we found this behavior to be problematic.
-Since compile time is often actually run time, the run-time system must be able to perform a complex least upper bound computation to determine a reasonably precise type.
-It is better to leave this task to a tool in the IDE.
-It is also much more uniform (and therefore predictable and understandable) to insist that whenever types are unspecified they are assumed to be the unknown type \DYNAMIC{}.
-}
-
-%Invoking the getter \code{runtimeType} on a list literal returns the \code{Type} object that is the value of the expression \code{List}. The static type of a list literal is \code{List}.
-% what about generics?
+is \code{List<\DYNAMIC{}>}.
 
 
 \subsection{Maps}
@@ -4588,13 +4733,13 @@
 Each key and each value is denoted by an expression.
 
 \LMHash{}
-If a map literal begins with the reserved word \CONST{}, it is a {\em constant map literal} which is a compile-time constant (\ref{constants}) and therefore evaluated at compile time.
+If a map literal begins with the reserved word \CONST{}, it is a {\em constant map literal} which is a constant expression (\ref{constants}) and therefore evaluated at compile time.
 Otherwise, it is a {\em run-time map literal} and it is evaluated at run time.
 Only run-time map literals can be mutated after they are created.
 Attempting to mutate a constant map literal will result in a dynamic error.
 
 \LMHash{}
-It is a compile-time error if either a key or a value of an entry in a constant map literal is not a compile-time constant.
+It is a compile-time error if either a key or a value of an entry in a constant map literal is not a constant expression.
 It is a compile-time error if the key of an entry in a constant map literal is an instance of
 a class that has a concrete operator \syntax{`=='} declaration different from the one in \code{Object},
 unless the key is a string or an integer,
@@ -5117,7 +5262,7 @@
 $j \in 1 .. n + k$
 the run-time type of $o_j$ is not a subtype of
 $[u_1/X_1, \ldots, u_m/X_m]S_j$,
-a dynamic error occurs.
+a dynamic type error occurs.
 
 \LMHash{}
 \Case{Non-loaded deferred constructors}
@@ -5208,7 +5353,7 @@
 It is a compile-time error if $T$ is a deferred type
 (\ref{staticTypes}).
 \commentary{
-For instance, $T$ can not be a type variable.
+In particular, $T$ must not be a type variable.
 }
 
 \LMHash{}
@@ -5868,11 +6013,19 @@
 
 \LMHash{}
 % Check the type arguments.
-In checked mode, it is a dynamic type error if $t_i$ is not a subtype of the actual bound (\ref{actualTypeOfADeclaration}) of the $i$th type argument of $f$, for actual type arguments $t_1, \ldots, t_r$.
+It is a dynamic type error if $t_i$ is not a subtype of the actual bound
+(\ref{actualTypeOfADeclaration})
+of the $i$th type argument of $f$, for actual type arguments $t_1, \ldots, t_r$.
 % Check the types of positional arguments.
-In checked mode, it is a dynamic type error if $o_i$ is not the null object (\ref{null}) and the actual type (\ref{actualTypeOfADeclaration}) of $p_i$ is not a supertype of the type of $o_i, i \in 1 .. m$.
+It is a dynamic type error if $o_i$ is not the null object (\ref{null})
+and the actual type
+(\ref{actualTypeOfADeclaration})
+of $p_i$ is not a supertype of the dynamic type of $o_i, i \in 1 .. m$.
 % Check the types of named arguments.
-In checked mode, it is a dynamic type error if $o_{m+j}$ is not the null object and the actual type (\ref{actualTypeOfADeclaration}) of $q_j$ is not a supertype of the type of $o_{m+j}, j \in 1 .. l$.
+It is a dynamic type error if $o_{m+j}$ is
+not the null object and the actual type
+(\ref{actualTypeOfADeclaration})
+of $q_j$ is not a supertype of the dynamic type of $o_{m+j}, j \in 1 .. l$.
 
 
 \subsubsection{Unqualified Invocation}
@@ -6986,8 +7139,10 @@
 Otherwise, the assignment is equivalent to the assignment \code{\THIS{}.$v$ = $e$}.
 
 \LMHash{}
-In checked mode, it is a dynamic type error if $o$ is not the null object (\ref{null})
-and the interface of the class of $o$ is not a subtype of the actual type (\ref{actualTypeOfADeclaration}) of $v$.
+It is a dynamic type error if $o$ is not the null object (\ref{null})
+and the dynamic type of $o$ is not a subtype of the actual type
+(\ref{actualTypeOfADeclaration})
+of $v$.
 
 \LMHash{}
 \Case{\code{$e_1$?.$v$ = $e_2$}}
@@ -7055,7 +7210,10 @@
 The value of the assignment expression is $o_2$ irrespective of whether setter lookup has failed or succeeded.
 
 \LMHash{}
-In checked mode, it is a dynamic type error if $o_2$ is not the null object (\ref{null}) and the interface of the class of $o_2$ is not a subtype of the actual type of $e_1.v$.
+It is a dynamic type error if $o_2$ is not the null object (\ref{null})
+and the dynamic type of $o_2$ is
+not a subtype of the actual type of $e_1.v$
+(\ref{actualTypeOfADeclaration}).
 
 \LMHash{}
 Let $T$ be the static type of $e_1$.
@@ -7103,8 +7261,10 @@
 The value of the assignment expression is $o$ irrespective of whether setter lookup has failed or succeeded.
 
 \LMHash{}
-In checked mode, it is a dynamic type error if $o$ is not the null object (\ref{null})
-and the interface of the class of $o$ is not a subtype of the actual type of $S.v$.
+It is a dynamic type error if $o$ is not the null object (\ref{null})
+and the dynamic type of $o$ is
+not a subtype of the actual type of \code{$S$.$v$}
+(\ref{actualTypeOfADeclaration}).
 
 \LMHash{}
 \Case{\code{$e_1$[$e_2$] = $e_3$}}
@@ -8083,7 +8243,7 @@
 %\item If $d$ is a library variable then:
 %  \begin{itemize}
 %  \item If $d$ is of one of the forms \code{\VAR{} $v$ = $e_i$;} , \code{$T$ $v$ = $e_i$;} , \code{\FINAL{} $v$ = $e_i$;} or \code{\FINAL{} $T$ $v$ = $e_i$;} and no value has yet been stored into $v$ then the initializer expression $e_i$ is evaluated. If, during the evaluation of $e_i$, the getter for $v$ is referenced, a \code{CyclicInitializationError} is thrown. If the evaluation succeeded yielding an object $o$, let $r$ be $o$, otherwise let $r$ be the null object (\ref{null}). In any case, $r$ is stored into $v$. The value of $e$ is $r$.
-\item If $d$ is a constant variable of one of the forms \code{\CONST{} $v$ = $e$;} or \code{\CONST{} $T$ $v$ = $e$;} then the value \id{} is the value of the compile-time constant $e$.
+\item If $d$ is a constant variable of one of the forms \code{\CONST{} $v$ = $e$;} or \code{\CONST{} $T$ $v$ = $e$;} then the value \id{} is the value of the constant expression $e$.
 %  Otherwise
 %  \item $e$ evaluates to the current binding of \id.
 %  \end{itemize}
@@ -8149,8 +8309,9 @@
 
 \LMHash{}
 The expression $e$ is evaluated to a value $v$.
+% TODO(eernst): https://github.com/dart-lang/sdk/issues/34521.
 Then, if $T$ is a malformed or deferred type (\ref{staticTypes}), a dynamic error occurs.
-Otherwise, if the interface of the class of $v$ is a subtype of $T$, the is-expression evaluates to \TRUE.
+Otherwise, if the dynamic type of $v$ is a subtype of $T$, the is-expression evaluates to \TRUE.
 Otherwise it evaluates to \FALSE.
 
 \commentary{
@@ -8207,10 +8368,11 @@
 
 \LMHash{}
 The expression $e$ is evaluated to a value $v$.
+%% TODO(eernst): https://github.com/dart-lang/sdk/issues/34521
 Then, if $T$ is a malformed or deferred type (\ref{staticTypes}), a dynamic error occurs.
-Otherwise, if the interface of the class of $v$ is a subtype of $T$, the cast expression evaluates to $v$.
-Otherwise, if $v$ is the null object (\ref{null}), the cast expression evaluates to $v$.
-In all other cases, a \code{CastError} is thrown.
+It is a dynamic type error if $o$ is not the null object (\ref{null})
+and the dynamic type of $o$ is not a subtype of $T$.
+Otherwise $e$ evaluates to $v$.
 
 \LMHash{}
 The static type of a cast expression \code{$e$ \AS{} $T$} is $T$.
@@ -8391,7 +8553,8 @@
 It is a compile-time error if
 a local variable is referenced at a source code location that is before
 the end of its initializing expression, if any,
-and otherwise before the identifier which names the variable.
+and otherwise before the declaring occurrence of
+the identifier which names the variable.
 
 \commentary{
 The example below illustrates the expected behavior.
@@ -8476,7 +8639,7 @@
 \LMHash{}
 The expression $e$ is evaluated to an object $o$.
 Then, the variable $v$ is set to $o$.
-A dynamic error occurs
+A dynamic type error occurs
 if the dynamic type of $o$ is not a subtype of the actual type
 (\ref{actualTypeOfADeclaration})
 of $v$.
@@ -8739,7 +8902,7 @@
 
 \LMHash{}
 The expression $e$ is evaluated to an object $o$.
-It is a dynamic error if $o$ is not an instance of a class that implements \code{Stream}.
+It is a dynamic type error if $o$ is not an instance of a class that implements \code{Stream}.
 It is a compile-time error if $D$ is empty and \id{} is a final variable.
 
 \LMHash{}
@@ -8905,7 +9068,7 @@
 \}
 \end{dartCode}
 
-it is a compile-time error if the expressions $e_k$ are not compile-time constants for all $k \in 1 .. n$.
+it is a compile-time error unless the expressions $e_k$ are constant expressions for all $k \in 1 .. n$.
 It is a compile-time error if the values of the expressions $e_k$ are not either:
 \begin{itemize}
 \item instances of the same class $C$, for all $k \in 1 .. n$, or
@@ -8915,7 +9078,11 @@
 
 \commentary{
 In other words, all the expressions in the cases evaluate to constants of the exact same user defined class or are of certain known types.
-Note that the values of the expressions are known at compile time, and are independent of any static type annotations.
+%% TODO(eernst): Update when we specify inference: const List<int> xs = [];
+%% may be a counter-example: The value is a list that "knows" it is a
+%% `List<int>` independently of the type annotation, but it wouldn't be a
+%% `List<int>` if that type annotation hadn't been there.
+Note that the values of the expressions are known at compile time, and are independent of any type annotations.
 }
 
 \LMHash{}
@@ -8961,7 +9128,8 @@
 
 \LMHash{}
 The statement \code{\VAR{} \id{} = $e$;} is evaluated, where \id{} is a fresh variable.
-In checked mode, it is a run-time error if the value of $e$ is not an instance of the same class as the constants $e_1, \ldots, e_n$.
+It is a run-time error if the value of $e$ is
+not an instance of the same class as the constants $e_1, \ldots, e_n$.
 
 \commentary{
 Note that if there are no case clauses ($n = 0$), the type of $e$ does not matter.
@@ -9364,7 +9532,6 @@
 
 \LMHash{}
 Let $U$ be the run-time type of $r$.
-In checked mode:
 \begin{itemize}
 \item If the body of $f$ is marked \ASYNC{} (\ref{functions})
 it is a dynamic type error if $o$ is not the null object (\ref{null}),
@@ -9560,7 +9727,7 @@
 \LMHash{}
 If the immediately enclosing function $m$ is marked \code{\SYNC*} (\ref{functions}), then:
 \begin{enumerate}
-\item It is a dynamic error if the class of $o$ does not implement \code{Iterable}.
+\item It is a dynamic type error if the class of $o$ does not implement \code{Iterable}.
 Otherwise
 \item The method \code{iterator} is invoked upon $o$ returning an object $i$.
 \item \label{moveNext} The \code{moveNext} method of $i$ is invoked on it with no arguments.
@@ -9577,7 +9744,7 @@
 \LMHash{}
 If $m$ is marked \code{\ASYNC*} (\ref{functions}), then:
 \begin{itemize}
-\item It is a dynamic error if the class of $o$ does not implement \code{Stream}.
+\item It is a dynamic type error if the class of $o$ does not implement \code{Stream}.
 Otherwise
 \item The nearest enclosing asynchronous for loop (\ref{asynchronousFor-in}), if any, is paused.
 \item The $o$ stream is listened to, creating a subscription $s$, and for each event $x$, or error $e$ with stack trace $t$, of $s$:
@@ -9631,9 +9798,11 @@
 and completes in the same way as the assertion.
 
 \LMHash{}
-In production mode an assertion has no effect
-and its execution immediately completes normally (\ref{completion}).
-In checked mode,
+When assertions are not enabled,
+execution of an assertion immediately completes normally
+(\ref{completion}).
+\commentary{That is, no subexpressions of the assertion are evaluated.}
+When assertions are enabled,
 execution of an assertion \code{\ASSERT{}($c$, $e$)} proceeds as follows:
 
 \LMHash{}
@@ -9647,10 +9816,10 @@
 and then the execution of the assert statement throws (\ref{completion}) an \code{AssertionError} containing $m$ and with a stack trace corresponding to the current execution state at the assertion.
 
 \LMHash{}
-It is a compile-time error if the type of $e$ may not be assigned to \code{bool}.
+It is a compile-time error if the type of $c$ may not be assigned to \code{bool}.
 
 \rationale{
-Why is this a statement, not a built in function call? Because it is handled magically so it has no effect and no overhead in production mode.
+Why is this a statement, not a built in function call? Because it is handled magically so it has no effect and no overhead when assertions are disabled.
 Also, in the absence of final methods, one could not prevent it being overridden (though there is no real harm in that).
 It cannot be viewed as a function call that is being optimized away because the arguments might have side effects.
 }
@@ -10222,10 +10391,10 @@
 \end{grammar}
 
 \LMHash{}
-It is a compile-time error if the string literal $x$ that describes a URI is not a compile-time constant, or if $x$ involves string interpolation.
+It is a compile-time error if the string literal $x$ that describes a URI contains a string interpolation.
 
 \LMHash{}
-It is a compile-time error if the string literal $x$ that is used in a {\em uriTest} is not a compile-time constant, or if $x$ involves string interpolation.
+It is a compile-time error if the string literal $x$ that is used in a {\em uriTest} is not a constant expression, or if $x$ involves string interpolation.
 
 \LMHash{} A {\em configurable URI} $c$ of the form \code{\metavar{uri} $\metavar{configurationUri}_1$ \ldots $\metavar{configurationUri}_n$} {\em specifies a URI} as follows:
 \begin{itemize}
@@ -10302,9 +10471,8 @@
 \LMLabel{staticTypes}
 
 \LMHash{}
-Static type annotations are used in variable declarations (\ref{variables}) (including formal parameters (\ref{formalParameters})), in the return types of functions (\ref{functions}) and in the bounds of type variables.
-Static type annotations are used during static checking and when running programs in checked mode.
-They have no effect whatsoever in production mode.
+Type annotations are used in variable declarations (\ref{variables}) (including formal parameters (\ref{formalParameters})), in the return types of functions (\ref{functions}) and in the bounds of type variables.
+Type annotations are used during static checking and when running programs.
 
 \begin{grammar}
 <type> ::= <typeName> <typeArguments>?
@@ -10408,108 +10576,79 @@
 \subsection{Dynamic Type System}
 \LMLabel{dynamicTypeSystem}
 
+% \ref{classes} says that 'when a class name appears as a type,%
+% that name denotes the interface of the class. So we can say
+% that the dynamic type of an instance is a non-generic class or
+% a generic instantiation of a generic class.
+
 \LMHash{}
-A Dart implementation must support execution in both {\em production mode} and {\em checked mode}.
-Those dynamic checks specified as occurring specifically in checked mode must be performed if{}f the code is executed in checked mode.
+Let $o$ be an instance.
+The {\em dynamic type} of $o$ is the class which is specified
+for the situation where $o$ was obtained as a fresh instance
+(\ref{redirectingFactoryConstructors},
+\ref{lists}, \ref{maps}, \ref{new}, \ref{functionInvocation}).
 
 \commentary{
-Note that this is the case even if the deferred type belongs to a prefix that has already been loaded.
-This is regrettable, since it strongly discourages the use of type annotations that involve deferred types because Dart programmers use checked mode much of the time.
-
-In practice, many scenarios involving deferred loading involve deferred loading of classes that implement eagerly loaded interfaces, so the situation is often less onerous than it seems.
-The current semantics were adopted based on considerations of ease of implementation.
-
-Clearly, if a deferred type has not yet been loaded, it is impossible to do a correct subtype test involving it, and one would expect a dynamic failure, as is the case with type tests and casts.
-By the same token, one would expect checked mode to work seamlessly once a type had been loaded.
-We hope to adopt these semantics in the future; such a change would be upwardly compatible.
+In particular, the dynamic type of an instance never changes.
+It is at times only specified that the given class implements
+a certain type, e.g., for a list literal.
+In these cases the dynamic type is implementation dependent,
+except of course that said subtype requirement must be satisfied.
 }
 
 \LMHash{}
-In checked mode, it is a dynamic type error if a deferred, malformed or malbounded (\ref{parameterizedTypes}) type is used in a subtype test.
-
-%In production mode, an undeclared type is treated as an instance of type \DYNAMIC{}.
+The dynamic types of a running Dart program are equivalent to
+the static types with regard to subtyping.
 
 \commentary{
-Consider the following program:
+Certain dynamic type checks are performed during execution
+(\ref{variables},
+\ref{redirectingGenerativeConstructors},
+\ref{executionOfInitializerLists},
+\ref{factories},
+\ref{redirectingFactoryConstructors},
+\ref{lists},
+\ref{new},
+\ref{bindingActualsToFormals},
+\ref{ordinaryInvocation},
+\ref{assignment},
+\ref{typeCast},
+\ref{localVariableDeclaration},
+\ref{asynchronousFor-in},
+\ref{return},
+\ref{yieldEach},
+\ref{assert}).
+As specified in those locations,
+these dynamic checks are based on the dynamic types of instances,
+and the actual types of declarations
+(\ref{actualTypeOfADeclaration}).
+}
+
+\LMHash{}
+When types are reified as instances of the built-in class \code{Type},
+two \code{Type} objects are equal according to operator \syntax{`=='}
+if{}f the corresponding types are subtypes of each other.
+
+\commentary{
+For example, the \code{Type} objects for the types
+\DYNAMIC{} and \code{Object} are equal to each other
+and hence \code{dynamic\,==\,Object} must evaluate to \TRUE.
+No constraints are imposed on the built-in function \code{identical},
+so \code{identical(dynamic, Object)} may be \TRUE{} or \FALSE.
+
+Similarly, \code{Type} instances for distinct type alias declarations
+declaring a name for the same function type are equal:
 }
 
 \begin{dartCode}
-\TYPEDEF{} F(bool x);
-f(foo x) => x;
-main() \{
-  if (f is F) \{
-    print("yoyoma");
-  \}
+\TYPEDEF{} F = void Function<X>(X);
+\TYPEDEF{} G = void Function<Y>(Y);
+\\
+\VOID{} main() \{
+  assert(F == G);
 \}
 \end{dartCode}
 
-\commentary{
-The type of the formal parameter of \code{f} is \code{foo}, which is undeclared in the lexical scope.
-This will lead to a compile-time error.
-
-As another example take
-}
-
-\begin{dartCode}
-\VAR{} i;
-i j; // a variable j of type i (supposedly)
-main() \{
-     j = 'I am not an i';
-\}
-\end{dartCode}
-
-\commentary{
-Since $i$ is not a type, a compile-time error will be issue at the declaration of $j$.
-However, the program can be executed without incident in production mode because the undeclared type $i$ is treated as \DYNAMIC{}.
-However, in checked mode, the implicit subtype test at the assignment will trigger an error at run time.
-}
-
-\commentary{
-Here is an example involving malbounded types:
-}
-
-\begin{dartCode}
-\CLASS{} I<T \EXTENDS{} num> \{\}
-\CLASS{} J \{\}
-
-\CLASS{} A<T> \IMPLEMENTS{} J, I<T> // compile-time error: T is not a subtype of num
-\{ ...
-\}
-\end{dartCode}
-
-\commentary{
-Given the declarations above, the following
-}
-
-\begin{dartCode}
-I x = \NEW{} A<String>();
-\end{dartCode}
-
-\commentary{
-will cause a dynamic type error in checked mode, because the assignment requires a subtype test A<String> <: I.
-To show that this holds, we need to show that A<String> $<<$ I<String>, but I<String> is a malbounded type, causing the dynamic error.
-No error is thrown in production mode.
-Note that
-}
-
-\begin{dartCode}
-J x = \NEW{} A<String>();
-\end{dartCode}
-
-\commentary{
-does not cause a dynamic error, as there is no need to test against \code{I<String>} in this case.
-Similarly, in production mode
-}
-
-\begin{dartCode}
-A x = \NEW{} A<String>();
-bool b = x is I;
-\end{dartCode}
-
-\commentary{
-\code{b} is bound to \TRUE, but in checked mode the second line causes a dynamic type error.
-}
-
 
 \subsection{Type Declarations}
 \LMLabel{typeDeclarations}
@@ -10846,53 +10985,40 @@
 \LMLabel{typeDynamic}
 
 \LMHash{}
-The type \DYNAMIC{} denotes the unknown type.
-
-\LMHash{}
-If no static type annotation has been provided the type system assumes the declaration has the unknown type.
-%% TODO(eernst): Change when adding specification of instantiate-to-bound.
-If a generic type is used but type arguments are not provided, then the type arguments default to the unknown type.
+The type \DYNAMIC{} is a static type which is a supertype of all other types,
+just like \code{Object},
+but it it differs from other types in that the static analysis
+assumes that every member access has a corresponding member
+with a signature that admits the given access.
 
 \commentary{
-%% TODO(eernst): Delete when adding specification of instantiate-to-bound.
-This means that given a generic declaration \code{$G$<$T_1, \ldots,\ T_n$>}, the type $G$ is equivalent to
-\code{$G$<$\DYNAMIC{}, \ldots,\ \DYNAMIC{}$>}.
+For instance,
+when the receiver in an ordinary method invocation has type \DYNAMIC{},
+any method name can be invoked,
+with any number of type arguments or none,
+with any number of positional arguments,
+and any set of named arguments,
+of any type,
+without error.
+Note that the invocation will still cause a compile-time error
+if one or more arguments or other subterms has an error.
 }
 
 \LMHash{}
-%% TODO(eernst): Rephrase to say that receivers of type `dynamic` _are treated as if_ this were the case.
-Type \DYNAMIC{} has methods for every possible identifier and arity, with every possible combination of named parameters.
-These methods all have \DYNAMIC{} as their return type, and their formal parameters all have type \DYNAMIC{}.
-Type \DYNAMIC{} has properties for every possible identifier.
-These properties all have type \DYNAMIC{}.
+% Inference is assumed to have taken place, so the type was not inferred.
+If no static type annotation has been provided,
+the type system considers declarations to have type \DYNAMIC{}.
+%% TODO(eernst): Change when adding specification of instantiate-to-bound.
+If a generic type is used but type arguments are not provided,
+the type arguments default to type \DYNAMIC{}.
 
-\rationale{
-%% TODO(eernst): Change this entire rationale when adding specification of instantiate-to-bound.
-
-From a usability perspective, we want to ensure that the checker does not issue errors everywhere an unknown type is used.
-The definitions above ensure that no secondary errors are reported when accessing an unknown type.
-
-The current rules say that missing type arguments are treated as if they were the type \DYNAMIC{}.
-An alternative is to consider them as meaning \code{Object}.
-This would lead to earlier error detection in checked mode, and more aggressive errors during static typechecking.
-For example:
-
-(1) \code{typedAPI(G<String> g)\{...\}}
-
-(2) \code{typedAPI(new G()); }
-
-Under the alternative rules, (2) would cause a run-time error in checked mode.
-This seems desirable from the perspective of error localization.
-However, when a dynamic error is thrown at (2), the only way to keep running is rewriting (2) into
-
-(3) \code{typedAPI(new G<String>());}
-
-This forces users to write type information in their client code just because they are calling a typed API.
-We do not want to impose this on Dart programmers, some of which may be blissfully unaware of types in general, and genericity in particular.
-
-What of static checking? Surely we would want to flag (2) when users have explicitly asked for static typechecking? Yes, but the reality is that the Dart static checker is likely to be running in the background by default.
-Engineering teams typically desire a ``clean build'' free of errors and so the checker is designed to be extremely charitable.
-Other tools can interpret the type information more aggressively and warn about violations of conventional (and sound) static type discipline.
+\commentary{
+%% TODO(eernst): Amend when adding specification of instantiate-to-bound.
+This means that given a generic declaration
+\code{$G$<$P_1, \ldots,\ P_n$>$\ldots$},
+where $P_i$ is a formal type parameter declaration, $i \in 1 .. n$,
+the type $G$ is equivalent to
+\code{$G$<$\DYNAMIC{}, \ldots,\ \DYNAMIC{}$>}.
 }
 
 \LMHash{}
@@ -10903,6 +11029,12 @@
 it evaluates to a \code{Type} object representing the \DYNAMIC{} type,
 even though \DYNAMIC{} is not a class.
 
+\commentary{
+This \code{Type} object must compare equal to the corresponding \code{Type}
+objects for \code{Object} and \VOID{}
+(\ref{dynamicTypeSystem}).
+}
+
 
 \subsection{Type FutureOr}
 \LMLabel{typeFutureOr}
@@ -10997,7 +11129,8 @@
 On the other hand, it is possible to return the result of a void method from within a void method.
 One can also return the null object (\ref{null}); or a value of type \DYNAMIC{}.
 Returning any other result will cause a compile-time error.
-In checked mode, a dynamic type error would arise if a non-null object was returned from a void method (since no object has run-time type \DYNAMIC{}).
+%% TODO(eernst): Correct this when integrating generalized-void.md.
+A dynamic type error would arise if a non-null object was returned from a void method (since no object has run-time type \DYNAMIC{}).
 }
 
 \commentary{
diff --git a/docs/language/informal/instantiate-to-bound.md b/docs/language/informal/instantiate-to-bound.md
index a847a39..4bed76e 100644
--- a/docs/language/informal/instantiate-to-bound.md
+++ b/docs/language/informal/instantiate-to-bound.md
@@ -2,7 +2,7 @@
 
 **Author**: eernst@
 
-**Version**: 0.7 (2018-02-26)
+**Version**: 0.8 (2018-09-26)
 
 **Status**: Implemented.
 
@@ -99,7 +99,8 @@
 
 ## Static analysis
 
-Let _G_ be a generic class with formal type parameter declarations
+Let _G_ be a generic class or parameterized type alias with formal type
+parameter declarations
 _F<sub>1</sub> .. F<sub>k</sub>_ containing formal type parameters
 _X<sub>1</sub> .. X<sub>k</sub>_ and bounds
 _B<sub>1</sub> .. B<sub>k</sub>_. We say that the formal type parameter
@@ -111,25 +112,27 @@
 2. _B<sub>j</sub>_ is included, but does not contain any of _X<sub>1</sub>
    .. X<sub>k</sub>_. If _B<sub>j</sub>_ contains a type _T_ on the form
    `qualified` (*for instance, `C` or `p.D`*) which denotes a generic class
-   _G<sub>1</sub>_ (*that is, _T_ is a raw type*), every type argument of
-   _G<sub>1</sub>_ has a simple bound.
+   or parameterized type alias _G<sub>1</sub>_ (*that is, _T_ is a raw type*),
+   every type argument of _G<sub>1</sub>_ has a simple bound.
 
 The notion of a simple bound must be interpreted inductively rather than
-coinductively, i.e., if a bound _B<sub>j</sub>_ of a generic class _G_ is
-reached during an investigation of whether _B<sub>j</sub>_ is a simple
-bound, the answer is no.
+coinductively, i.e., if a bound _B<sub>j</sub>_ of a generic class or
+parameterized type alias _G_ is reached during an investigation of whether
+_B<sub>j</sub>_ is a simple bound, the answer is no.
 
 *For example, with `class C<X extends C> {}` the type parameter `X` does
-not have a simple bound.*
+not have a simple bound: A raw `C` is used as a bound for `X`, so `C` 
+must have simple bounds, but one of the bounds of `C` is the bound of `X`, 
+and that bound is `C`, so `C` must have simple bounds: Cycle, hence error!*
 
 *We can now specify in which sense instantiate to bound requires the
 involved types to be "simple enough". We impose the following constraint on
 all bounds because any generic type may be used as a raw type.*
 
 It is a compile-time error if a formal parameter bound _B_ contains a type
-_T_ on the form `qualified` and _T_ denotes a generic class _G_ (*that is,
-_T_ is a raw type*), unless every formal type parameter of _G_ has a simple
-bound.
+_T_ on the form `qualified` and _T_ denotes a generic class or parameterized
+type alias _G_ (*that is, _T_ is a raw type*), unless every formal type
+parameter of _G_ has a simple bound.
 
 *In short, type arguments on bounds can only be omitted if they themselves
 have simple bounds. In particular, `class C<X extends C> {}` is a
@@ -138,9 +141,9 @@
 simple bound.*
 
 When a type annotation _T_ on the form `qualified` denotes a generic class
-(*so _T_ is raw*), instantiate to bound is used to provide the missing type
-argument list. It is a compile-time error if the instantiate to bound
-process fails.
+or parameterized type alias (*so _T_ is raw*), instantiate to bound is used
+to provide the missing type argument list. It is a compile-time error if
+the instantiate to bound process fails.
 
 *Other mechanisms may be considered for this situation, e.g., inference
 could be used to select a possible type annotation, and type arguments
@@ -154,17 +157,18 @@
 infer the omitted type arguments, e.g., for `List xs = [];`.*
 
 *When type inference is providing actual type arguments for a term _G_ on
-the form `qualified` which denotes a generic class, instantiate to bound
-may be used to provide the value for type arguments where no information is
-available for inferring such an actual type argument. This document does
-not specify how inference interacts with instantiate to bound, that will be
-specified as part of the specification of inference. We will hence proceed
-to specify instantiate to bound as it applies to a type argument list which
-is omitted, such that a value for all the actual type arguments must be
-computed.*
+the form `qualified` which denotes a generic class or a parameterized type
+alias, instantiate to bound may be used to provide the value for type
+arguments where no information is available for inferring such an actual
+type argument. This document does not specify how inference interacts with
+instantiate to bound, that will be specified as part of the specification
+of inference. We will hence proceed to specify instantiate to bound as it
+applies to a type argument list which is omitted, such that a value for all
+the actual type arguments must be computed.*
 
-Let _T_ be a `qualified` term which denotes a generic class _G_ (*so _T_ is
-a raw type*), let _F<sub>1</sub> .. F<sub>k</sub>_ be the formal type
+Let _T_ be a `qualified` term which denotes a generic class or
+parameterized type alias _G_ (*so _T_ is a raw type*), let
+_F<sub>1</sub> .. F<sub>k</sub>_ be the formal type
 parameter declarations in the declaration of _G_, with type parameters
 _X<sub>1</sub> .. X<sub>k</sub>_ and bounds _B<sub>1</sub>
 .. B<sub>k</sub>_ with types _T<sub>1</sub> .. T<sub>k</sub>_. For _i_ in
@@ -260,6 +264,10 @@
 
 ## Updates
 
+*   Sep 26th 2018, version 0.8: Fixed unintended omission: the same rules
+    that we specified for a generic class are now also specified to hold
+    for parameterized type aliases.
+
 *   Feb 26th 2018, version 0.7: Revised cycle breaking algorithm for
     F-bounded type variables to avoid specifying orderings that do not matter.
 
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index f9056d7..504713e 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -245,7 +245,7 @@
 <li><a href="#request_analysis.getHover">analysis.getHover</a></li>
 <li><a href="#request_analysis.getLibraryDependencies">analysis.getLibraryDependencies</a></li>
 <li><a href="#request_analysis.getNavigation">analysis.getNavigation</a></li>
-<li><a href="#request_analysis.getReachableSources">analysis.getReachableSources</a></li>
+<li><a class="deprecated" href="#request_analysis.getReachableSources">analysis.getReachableSources</a></li>
 <li><a href="#request_analysis.reanalyze">analysis.reanalyze</a></li>
 <li><a href="#request_analysis.setAnalysisRoots">analysis.setAnalysisRoots</a></li>
 <li><a href="#request_analysis.setGeneralSubscriptions">analysis.setGeneralSubscriptions</a></li>
@@ -762,7 +762,7 @@
           A list of the navigation regions within the requested region of
           the file.
         </p>
-      </dd></dl></dd><dt class="request"><a name="request_analysis.getReachableSources">analysis.getReachableSources</a></dt><dd><div class="box"><pre>request: {
+      </dd></dl></dd><dt class="request deprecated"><a name="request_analysis.getReachableSources">analysis.getReachableSources</a></dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "analysis.getReachableSources"
   "params": {
@@ -4358,17 +4358,6 @@
           An "edit.sortMembers" request specified a Dart file that has
           scan or parse errors.
         </p>
-      </dd><dt class="value">UNANALYZED_PRIORITY_FILES</dt><dd>
-        
-        <p>
-          An "analysis.setPriorityFiles" request includes one or
-          more files that are not being analyzed.
-        </p>
-        <p>
-          This is a legacy error; it will be removed before the
-          API reaches version 1.0.
-        </p>
-        
       </dd><dt class="value">UNKNOWN_REQUEST</dt><dd>
         
         <p>
@@ -4376,12 +4365,6 @@
           not recognize, or cannot handle in its current
           configuration.
         </p>
-      </dd><dt class="value">UNKNOWN_SOURCE</dt><dd>
-        
-        <p>
-          The analysis server was requested to perform an action
-          on a source that does not exist.
-        </p>
       </dd><dt class="value">UNSUPPORTED_FEATURE</dt><dd>
         
         <p>
diff --git a/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart b/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
index 082517d..e203b4a 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
@@ -18,11 +18,6 @@
  */
 class Fix {
   /**
-   * An empty list of fixes.
-   */
-  static const List<Fix> EMPTY_LIST = const <Fix>[];
-
-  /**
    * A comparator that can be used to sort fixes by their relevance. The most
    * relevant fixes will be sorted before fixes with a lower relevance. Fixes
    * with the same relevance are sorted alphabetically.
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 fc19967..c4d54d1 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
@@ -57,11 +57,11 @@
     AnalysisDriver driver = context.analysisDriver;
     Source source = context.error.source;
     if (!AnalysisEngine.isDartFileName(source.fullName)) {
-      return Fix.EMPTY_LIST;
+      return const <Fix>[];
     }
     CompilationUnit unit = (await driver.getResult(source.fullName)).unit;
     if (unit == null) {
-      return Fix.EMPTY_LIST;
+      return const <Fix>[];
     }
     DartFixContext dartContext =
         new DartFixContextImpl(context, new AstProviderForDriver(driver), unit);
diff --git a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
index 4d46fa6..e4ab6d5 100644
--- a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
@@ -10,12 +10,13 @@
 import 'package:analyzer/dart/element/element.dart' as engine;
 import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:path/path.dart' as pathos;
 
 /**
  * Return a protocol [Element] corresponding to the given [engine.Element].
  */
 Element convertElement(engine.Element element) {
-  String name = element.displayName;
+  String name = getElementDisplayName(element);
   String elementTypeParameters = _getTypeParametersString(element);
   String elementParameters = _getParametersString(element);
   String elementReturnType = getReturnTypeString(element);
@@ -125,6 +126,14 @@
   return convertElementKind(element.kind);
 }
 
+String getElementDisplayName(engine.Element element) {
+  if (element is engine.CompilationUnitElement) {
+    return pathos.basename(element.source.fullName);
+  } else {
+    return element.displayName;
+  }
+}
+
 String _getParametersString(engine.Element element) {
   // TODO(scheglov) expose the corresponding feature from ExecutableElement
   List<engine.ParameterElement> parameters;
diff --git a/pkg/analysis_server/lib/protocol/protocol.dart b/pkg/analysis_server/lib/protocol/protocol.dart
index c113e65..f3253cf 100644
--- a/pkg/analysis_server/lib/protocol/protocol.dart
+++ b/pkg/analysis_server/lib/protocol/protocol.dart
@@ -402,7 +402,7 @@
   Response.formatInvalidFile(Request request)
       : this(request.id,
             error: new RequestError(RequestErrorCode.FORMAT_INVALID_FILE,
-                'Error during `edit.format`: invalid file.'));
+                'Error during `${request.method}`: invalid file.'));
 
   /**
    * Initialize a newly created instance to represent the FORMAT_WITH_ERROR
@@ -629,16 +629,6 @@
 
   /**
    * Initialize a newly created instance to represent an error condition caused
-   * by a `analysis.setPriorityFiles` [request] that includes one or more files
-   * that are not being analyzed.
-   */
-  Response.unanalyzedPriorityFiles(String requestId, String fileNames)
-      : this(requestId,
-            error: new RequestError(RequestErrorCode.UNANALYZED_PRIORITY_FILES,
-                "Unanalyzed files cannot be a priority: '$fileNames'"));
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
    * by a [request] that cannot be handled by any known handlers.
    */
   Response.unknownRequest(Request request)
@@ -648,15 +638,6 @@
 
   /**
    * Initialize a newly created instance to represent an error condition caused
-   * by a [request] referencing a source that does not exist.
-   */
-  Response.unknownSource(Request request)
-      : this(request.id,
-            error: new RequestError(
-                RequestErrorCode.UNKNOWN_SOURCE, 'Unknown source'));
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
    * by a [request] for a service that is not supported.
    */
   Response.unsupportedFeature(String requestId, String message)
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index 40d0ca6..51eeee6 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -173,8 +173,11 @@
 const String EDIT_REQUEST_ORGANIZE_DIRECTIVES_FILE = 'file';
 const String EDIT_REQUEST_SORT_MEMBERS = 'edit.sortMembers';
 const String EDIT_REQUEST_SORT_MEMBERS_FILE = 'file';
-const String EDIT_RESPONSE_DARTFIX_DESCRIPTION = 'description';
+const String EDIT_RESPONSE_DARTFIX_DESCRIPTION_OF_FIXES = 'descriptionOfFixes';
 const String EDIT_RESPONSE_DARTFIX_FIXES = 'fixes';
+const String EDIT_RESPONSE_DARTFIX_HAS_ERRORS = 'hasErrors';
+const String EDIT_RESPONSE_DARTFIX_OTHER_RECOMMENDATIONS =
+    'otherRecommendations';
 const String EDIT_RESPONSE_FORMAT_EDITS = 'edits';
 const String EDIT_RESPONSE_FORMAT_SELECTION_LENGTH = 'selectionLength';
 const String EDIT_RESPONSE_FORMAT_SELECTION_OFFSET = 'selectionOffset';
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index aa83274..5930a94 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -6179,19 +6179,25 @@
 
   /**
    * A list of the files and directories for which edits should be suggested.
+   *
+   * If a request is made with a path that is invalid, e.g. is not absolute and
+   * normalized, an error of type INVALID_FILE_PATH_FORMAT will be generated.
    * If a request is made for a file which does not exist, or which is not
    * currently subject to analysis (e.g. because it is not associated with any
    * analysis root specified to analysis.setAnalysisRoots), an error of type
-   * FORMAT_INVALID_FILE will be generated.
+   * FILE_NOT_ANALYZED will be generated.
    */
   List<String> get included => _included;
 
   /**
    * A list of the files and directories for which edits should be suggested.
+   *
+   * If a request is made with a path that is invalid, e.g. is not absolute and
+   * normalized, an error of type INVALID_FILE_PATH_FORMAT will be generated.
    * If a request is made for a file which does not exist, or which is not
    * currently subject to analysis (e.g. because it is not associated with any
    * analysis root specified to analysis.setAnalysisRoots), an error of type
-   * FORMAT_INVALID_FILE will be generated.
+   * FILE_NOT_ANALYZED will be generated.
    */
   void set included(List<String> value) {
     assert(value != null);
@@ -6262,28 +6268,64 @@
  * edit.dartfix result
  *
  * {
- *   "description": List<String>
+ *   "descriptionOfFixes": List<String>
+ *   "otherRecommendations": List<String>
+ *   "hasErrors": bool
  *   "fixes": List<SourceFileEdit>
  * }
  *
  * Clients may not extend, implement or mix-in this class.
  */
 class EditDartfixResult implements ResponseResult {
-  List<String> _description;
+  List<String> _descriptionOfFixes;
+
+  List<String> _otherRecommendations;
+
+  bool _hasErrors;
 
   List<SourceFileEdit> _fixes;
 
   /**
    * A list of human readable changes made by applying the fixes.
    */
-  List<String> get description => _description;
+  List<String> get descriptionOfFixes => _descriptionOfFixes;
 
   /**
    * A list of human readable changes made by applying the fixes.
    */
-  void set description(List<String> value) {
+  void set descriptionOfFixes(List<String> value) {
     assert(value != null);
-    this._description = value;
+    this._descriptionOfFixes = value;
+  }
+
+  /**
+   * A list of human readable recommended changes that cannot be made
+   * automatically.
+   */
+  List<String> get otherRecommendations => _otherRecommendations;
+
+  /**
+   * A list of human readable recommended changes that cannot be made
+   * automatically.
+   */
+  void set otherRecommendations(List<String> value) {
+    assert(value != null);
+    this._otherRecommendations = value;
+  }
+
+  /**
+   * True if the analyzed source contains errors that might impact the
+   * correctness of the recommended fixes that can be automatically applied.
+   */
+  bool get hasErrors => _hasErrors;
+
+  /**
+   * True if the analyzed source contains errors that might impact the
+   * correctness of the recommended fixes that can be automatically applied.
+   */
+  void set hasErrors(bool value) {
+    assert(value != null);
+    this._hasErrors = value;
   }
 
   /**
@@ -6299,8 +6341,14 @@
     this._fixes = value;
   }
 
-  EditDartfixResult(List<String> description, List<SourceFileEdit> fixes) {
-    this.description = description;
+  EditDartfixResult(
+      List<String> descriptionOfFixes,
+      List<String> otherRecommendations,
+      bool hasErrors,
+      List<SourceFileEdit> fixes) {
+    this.descriptionOfFixes = descriptionOfFixes;
+    this.otherRecommendations = otherRecommendations;
+    this.hasErrors = hasErrors;
     this.fixes = fixes;
   }
 
@@ -6310,12 +6358,30 @@
       json = {};
     }
     if (json is Map) {
-      List<String> description;
-      if (json.containsKey("description")) {
-        description = jsonDecoder.decodeList(jsonPath + ".description",
-            json["description"], jsonDecoder.decodeString);
+      List<String> descriptionOfFixes;
+      if (json.containsKey("descriptionOfFixes")) {
+        descriptionOfFixes = jsonDecoder.decodeList(
+            jsonPath + ".descriptionOfFixes",
+            json["descriptionOfFixes"],
+            jsonDecoder.decodeString);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "description");
+        throw jsonDecoder.mismatch(jsonPath, "descriptionOfFixes");
+      }
+      List<String> otherRecommendations;
+      if (json.containsKey("otherRecommendations")) {
+        otherRecommendations = jsonDecoder.decodeList(
+            jsonPath + ".otherRecommendations",
+            json["otherRecommendations"],
+            jsonDecoder.decodeString);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "otherRecommendations");
+      }
+      bool hasErrors;
+      if (json.containsKey("hasErrors")) {
+        hasErrors =
+            jsonDecoder.decodeBool(jsonPath + ".hasErrors", json["hasErrors"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "hasErrors");
       }
       List<SourceFileEdit> fixes;
       if (json.containsKey("fixes")) {
@@ -6327,7 +6393,8 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, "fixes");
       }
-      return new EditDartfixResult(description, fixes);
+      return new EditDartfixResult(
+          descriptionOfFixes, otherRecommendations, hasErrors, fixes);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "edit.dartfix result", json);
     }
@@ -6343,7 +6410,9 @@
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["description"] = description;
+    result["descriptionOfFixes"] = descriptionOfFixes;
+    result["otherRecommendations"] = otherRecommendations;
+    result["hasErrors"] = hasErrors;
     result["fixes"] =
         fixes.map((SourceFileEdit value) => value.toJson()).toList();
     return result;
@@ -6360,8 +6429,11 @@
   @override
   bool operator ==(other) {
     if (other is EditDartfixResult) {
-      return listEqual(
-              description, other.description, (String a, String b) => a == b) &&
+      return listEqual(descriptionOfFixes, other.descriptionOfFixes,
+              (String a, String b) => a == b) &&
+          listEqual(otherRecommendations, other.otherRecommendations,
+              (String a, String b) => a == b) &&
+          hasErrors == other.hasErrors &&
           listEqual(fixes, other.fixes,
               (SourceFileEdit a, SourceFileEdit b) => a == b);
     }
@@ -6371,7 +6443,9 @@
   @override
   int get hashCode {
     int hash = 0;
-    hash = JenkinsSmiHash.combine(hash, description.hashCode);
+    hash = JenkinsSmiHash.combine(hash, descriptionOfFixes.hashCode);
+    hash = JenkinsSmiHash.combine(hash, otherRecommendations.hashCode);
+    hash = JenkinsSmiHash.combine(hash, hasErrors.hashCode);
     hash = JenkinsSmiHash.combine(hash, fixes.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
@@ -15830,9 +15904,7 @@
  *   SERVER_ERROR
  *   SORT_MEMBERS_INVALID_FILE
  *   SORT_MEMBERS_PARSE_ERRORS
- *   UNANALYZED_PRIORITY_FILES
  *   UNKNOWN_REQUEST
- *   UNKNOWN_SOURCE
  *   UNSUPPORTED_FEATURE
  * }
  *
@@ -16022,16 +16094,6 @@
       const RequestErrorCode._("SORT_MEMBERS_PARSE_ERRORS");
 
   /**
-   * An "analysis.setPriorityFiles" request includes one or more files that are
-   * not being analyzed.
-   *
-   * This is a legacy error; it will be removed before the API reaches version
-   * 1.0.
-   */
-  static const RequestErrorCode UNANALYZED_PRIORITY_FILES =
-      const RequestErrorCode._("UNANALYZED_PRIORITY_FILES");
-
-  /**
    * A request was received which the analysis server does not recognize, or
    * cannot handle in its current configuration.
    */
@@ -16039,13 +16101,6 @@
       const RequestErrorCode._("UNKNOWN_REQUEST");
 
   /**
-   * The analysis server was requested to perform an action on a source that
-   * does not exist.
-   */
-  static const RequestErrorCode UNKNOWN_SOURCE =
-      const RequestErrorCode._("UNKNOWN_SOURCE");
-
-  /**
    * The analysis server was requested to perform an action which is not
    * supported.
    *
@@ -16085,9 +16140,7 @@
     SERVER_ERROR,
     SORT_MEMBERS_INVALID_FILE,
     SORT_MEMBERS_PARSE_ERRORS,
-    UNANALYZED_PRIORITY_FILES,
     UNKNOWN_REQUEST,
-    UNKNOWN_SOURCE,
     UNSUPPORTED_FEATURE
   ];
 
@@ -16150,12 +16203,8 @@
         return SORT_MEMBERS_INVALID_FILE;
       case "SORT_MEMBERS_PARSE_ERRORS":
         return SORT_MEMBERS_PARSE_ERRORS;
-      case "UNANALYZED_PRIORITY_FILES":
-        return UNANALYZED_PRIORITY_FILES;
       case "UNKNOWN_REQUEST":
         return UNKNOWN_REQUEST;
-      case "UNKNOWN_SOURCE":
-        return UNKNOWN_SOURCE;
       case "UNSUPPORTED_FEATURE":
         return UNSUPPORTED_FEATURE;
     }
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 2069432..bdd5194 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -68,8 +68,10 @@
 import 'package:analyzer/src/util/glob.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/file_byte_store.dart'
+    show EvictingFileByteStore;
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:telemetry/crash_reporting.dart';
 import 'package:telemetry/telemetry.dart' as telemetry;
 import 'package:watcher/watcher.dart';
@@ -77,30 +79,6 @@
 typedef void OptionUpdater(AnalysisOptionsImpl options);
 
 /**
- * Enum representing reasons why analysis might be done for a given file.
- */
-class AnalysisDoneReason {
-  /**
-   * Analysis of the file completed successfully.
-   */
-  static const AnalysisDoneReason COMPLETE =
-      const AnalysisDoneReason._('COMPLETE');
-
-  /**
-   * Analysis of the file was aborted because the context was removed.
-   */
-  static const AnalysisDoneReason CONTEXT_REMOVED =
-      const AnalysisDoneReason._('CONTEXT_REMOVED');
-
-  /**
-   * Textual description of this [AnalysisDoneReason].
-   */
-  final String text;
-
-  const AnalysisDoneReason._(this.text);
-}
-
-/**
  * Instances of the class [AnalysisServer] implement a server that listens on a
  * [CommunicationChannel] for analysis requests and process them.
  */
@@ -178,7 +156,7 @@
   /**
    * The object used to manage the SDK's known to this server.
    */
-  DartSdkManager sdkManager;
+  final DartSdkManager sdkManager;
 
   /**
    * The instrumentation service that is to be used by this analysis server.
@@ -212,7 +190,7 @@
   /**
    * Performance information before initial analysis is complete.
    */
-  ServerPerformance performanceDuringStartup = new ServerPerformance();
+  final ServerPerformance performanceDuringStartup = new ServerPerformance();
 
   /**
    * Performance information after initial analysis is complete
@@ -244,11 +222,6 @@
   StreamController<bool> _onAnalysisStartedController;
 
   /**
-   * The controller that is notified when a single file has been analyzed.
-   */
-  StreamController<ChangeNotice> _onFileAnalyzedController;
-
-  /**
    * The content overlay for all analysis drivers.
    */
   final nd.FileContentOverlay fileContentOverlay = new nd.FileContentOverlay();
@@ -294,40 +267,10 @@
   /**
    * The controller for [onAnalysisSetChanged].
    */
-  StreamController _onAnalysisSetChangedController =
+  final StreamController _onAnalysisSetChangedController =
       new StreamController.broadcast(sync: true);
 
   /**
-   * This exists as a temporary stopgap for plugins, until the official plugin
-   * API is complete.
-   */
-  StreamController<String> _onFileAddedController;
-
-  /**
-   * This exists as a temporary stopgap for plugins, until the official plugin
-   * API is complete.
-   */
-  StreamController<String> _onFileChangedController;
-
-  /**
-   * This exists as a temporary stopgap for plugins, until the official plugin
-   * API is complete.
-   */
-  Function onResultErrorSupplementor;
-
-  /**
-   * This exists as a temporary stopgap for plugins, until the official plugin
-   * API is complete.
-   */
-  Function onNoAnalysisResult;
-
-  /**
-   * This exists as a temporary stopgap for plugins, until the official plugin
-   * API is complete.
-   */
-  Function onNoAnalysisCompletion;
-
-  /**
    * The set of the files that are currently priority.
    */
   final Set<String> priorityFiles = new Set<String>();
@@ -337,7 +280,7 @@
    * to start an http diagnostics server or return the port for an existing
    * server.
    */
-  DiagnosticServer diagnosticServer;
+  final DiagnosticServer diagnosticServer;
 
   final DetachableFileSystemManager detachableFileSystemManager;
 
@@ -411,11 +354,6 @@
     contextManager.callbacks = contextManagerCallbacks;
     AnalysisEngine.instance.logger = new AnalysisLogger(this);
     _onAnalysisStartedController = new StreamController.broadcast();
-    _onFileAnalyzedController = new StreamController.broadcast();
-    // temporary plugin support:
-    _onFileAddedController = new StreamController.broadcast();
-    // temporary plugin support:
-    _onFileChangedController = new StreamController.broadcast();
     running = true;
     onAnalysisStarted.first.then((_) {
       onAnalysisComplete.then((_) {
@@ -511,25 +449,6 @@
   }
 
   /**
-   * The stream that is notified when a single file has been added. This exists
-   * as a temporary stopgap for plugins, until the official plugin API is
-   * complete.
-   */
-  Stream get onFileAdded => _onFileAddedController.stream;
-
-  /**
-   * The stream that is notified when a single file has been analyzed.
-   */
-  Stream get onFileAnalyzed => _onFileAnalyzedController.stream;
-
-  /**
-   * The stream that is notified when a single file has been changed. This
-   * exists as a temporary stopgap for plugins, until the official plugin API is
-   * complete.
-   */
-  Stream get onFileChanged => _onFileChangedController.stream;
-
-  /**
    * Return the total time the server's been alive.
    */
   Duration get uptime {
@@ -554,17 +473,6 @@
   }
 
   /**
-   * If the given notice applies to a file contained within an analysis root,
-   * notify interested parties that the file has been (at least partially)
-   * analyzed.
-   */
-  void fileAnalyzed(ChangeNotice notice) {
-    if (contextManager.isInAnalysisRoot(notice.source.fullName)) {
-      _onFileAnalyzedController.add(notice);
-    }
-  }
-
-  /**
    * Return one of the SDKs that has been created, or `null` if no SDKs have
    * been created yet.
    */
@@ -644,19 +552,6 @@
   }
 
   /**
-   * Return the [nd.AnalysisDriver] for the "innermost" context whose associated
-   * folder is or contains the given path.  ("innermost" refers to the nesting
-   * of contexts, so if there is a context for path /foo and a context for
-   * path /foo/bar, then the innermost context containing /foo/bar/baz.dart is
-   * the context for /foo/bar.)
-   *
-   * If no context contains the given path, `null` is returned.
-   */
-  nd.AnalysisDriver getContainingDriver(String path) {
-    return contextManager.getDriverFor(path);
-  }
-
-  /**
    * Return a [Future] that completes with the [Element] at the given
    * [offset] of the given [file], or with `null` if there is no node at the
    * [offset] or the node does not have an element.
@@ -781,15 +676,6 @@
   }
 
   /**
-   * Returns `true` if there is a subscription for the given [service] and
-   * [file].
-   */
-  bool hasAnalysisSubscription(AnalysisService service, String file) {
-    Set<String> files = analysisServices[service];
-    return files != null && files.contains(file);
-  }
-
-  /**
    * Return `true` if analysis is complete.
    */
   bool isAnalysisComplete() {
@@ -1078,9 +964,6 @@
         driver.changeFile(file);
       });
 
-      // temporary plugin support:
-      _onFileChangedController.add(file);
-
       // If the file did not exist, and is "overlay only", it still should be
       // analyzed. Add it to driver to which it should have been added.
       contextManager.getDriverFor(file)?.addFile(file);
@@ -1153,6 +1036,10 @@
     return null;
   }
 
+  /**
+   * Returns `true` if there is a subscription for the given [service] and
+   * [file].
+   */
   bool _hasAnalysisServiceSubscription(AnalysisService service, String file) {
     return analysisServices[service]?.contains(file) ?? false;
   }
@@ -1219,15 +1106,6 @@
   bool enableUXExperiment2 = false;
 }
 
-/**
- * A [PriorityChangeEvent] indicates the set the priority files has changed.
- */
-class PriorityChangeEvent {
-  final Source firstSource;
-
-  PriorityChangeEvent(this.firstSource);
-}
-
 class ServerContextManagerCallbacks extends ContextManagerCallbacks {
   final AnalysisServer analysisServer;
 
@@ -1386,13 +1264,9 @@
     if (analysisDriver != null) {
       changeSet.addedSources.forEach((source) {
         analysisDriver.addFile(source.fullName);
-        // temporary plugin support:
-        analysisServer._onFileAddedController.add(source.fullName);
       });
       changeSet.changedSources.forEach((source) {
         analysisDriver.changeFile(source.fullName);
-        // temporary plugin support:
-        analysisServer._onFileChangedController.add(source.fullName);
       });
       changeSet.removedSources.forEach((source) {
         analysisDriver.removeFile(source.fullName);
@@ -1445,13 +1319,6 @@
   }
 
   @override
-  void moveContext(Folder from, Folder to) {
-    // There is nothing to do.
-    // This method is mostly for tests.
-    // Context managers manage folders and contexts themselves.
-  }
-
-  @override
   void removeContext(Folder folder, List<String> flushedFiles) {
     sendAnalysisNotificationFlushResults(analysisServer, flushedFiles);
     nd.AnalysisDriver driver = analysisServer.driverMap.remove(folder);
@@ -1562,7 +1429,7 @@
    * The creation time and the time when performance information
    * started to be recorded here.
    */
-  int startTime = new DateTime.now().millisecondsSinceEpoch;
+  final int startTime = new DateTime.now().millisecondsSinceEpoch;
 
   /**
    * The number of requests.
@@ -1608,49 +1475,27 @@
   /**
    * The [PerformanceTag] for `package:analysis_server`.
    */
-  static PerformanceTag server = new PerformanceTag('server');
-
-  /**
-   * The [PerformanceTag] for time spent in [ExecutionDomainHandler].
-   */
-  static PerformanceTag executionNotifications =
-      new PerformanceTag('executionNotifications');
-
-  /**
-   * The [PerformanceTag] for time spent performing a _DartIndexOperation.
-   */
-  static PerformanceTag indexOperation = new PerformanceTag('indexOperation');
-
-  /**
-   * The [PerformanceTag] for time spent between calls to
-   * AnalysisServer.performOperation when the server is not idle.
-   */
-  static PerformanceTag intertask = new PerformanceTag('intertask');
+  static final PerformanceTag server = new PerformanceTag('server');
 
   /**
    * The [PerformanceTag] for time spent between calls to
    * AnalysisServer.performOperation when the server is idle.
    */
-  static PerformanceTag idle = new PerformanceTag('idle');
+  static final PerformanceTag idle = new PerformanceTag('idle');
 
   /**
    * The [PerformanceTag] for time spent in
    * PerformAnalysisOperation._sendNotices.
    */
-  static PerformanceTag notices = server.createChild('notices');
+  static final PerformanceTag notices = server.createChild('notices');
 
   /**
    * The [PerformanceTag] for time spent in server communication channels.
    */
-  static PerformanceTag serverChannel = server.createChild('channel');
+  static final PerformanceTag serverChannel = server.createChild('channel');
 
   /**
    * The [PerformanceTag] for time spent in server request handlers.
    */
-  static PerformanceTag serverRequests = server.createChild('requests');
-
-  /**
-   * The [PerformanceTag] for time spent in split store microtasks.
-   */
-  static PerformanceTag splitStore = new PerformanceTag('splitStore');
+  static final PerformanceTag serverRequests = server.createChild('requests');
 }
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index d56e4ca..32c9e00 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -31,6 +31,7 @@
 import 'package:analyzer/src/source/sdk_ext.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/src/util/glob.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
 import 'package:analyzer_plugin/utilities/analyzer_converter.dart';
@@ -371,12 +372,6 @@
   ContextBuilder createContextBuilder(Folder folder, AnalysisOptions options);
 
   /**
-   * Called when the context manager changes the folder with which a context is
-   * associated. Currently this is mostly FYI, and used only in tests.
-   */
-  void moveContext(Folder from, Folder to);
-
-  /**
    * Remove the context associated with the given [folder].  [flushedFiles] is
    * a list of the files which will be "orphaned" by removing this context
    * (they will no longer be analyzed by any context).
@@ -1759,9 +1754,10 @@
     if (packageMap == null) {
       packageMap = <String, List<Folder>>{};
       if (packages != null) {
+        var pathContext = resourceProvider.pathContext;
         packages.asMap().forEach((String name, Uri uri) {
           if (uri.scheme == 'file' || uri.scheme == '' /* unspecified */) {
-            var path = resourceProvider.pathContext.fromUri(uri);
+            String path = fileUriToNormalizedPath(pathContext, uri);
             packageMap[name] = <Folder>[resourceProvider.getFolder(path)];
           }
         });
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 8cfedbb..ae19037 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -64,16 +64,6 @@
     }
 
     AnalysisResult result = await server.getAnalysisResult(file);
-
-    if (server.onResultErrorSupplementor != null) {
-      if (result != null) {
-        await server.onResultErrorSupplementor(file, result.errors);
-      } else {
-        server.onNoAnalysisResult(file, send);
-        return;
-      }
-    }
-
     send(result?.driver?.analysisOptions, result?.lineInfo, result?.errors);
   }
 
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index d4bd1c2..10597e3 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -174,14 +174,7 @@
 
     AnalysisResult result = await server.getAnalysisResult(filePath);
 
-    if (result == null || !result.exists) {
-      if (server.onNoAnalysisCompletion != null) {
-        String completionId = (_nextCompletionId++).toString();
-        await server.onNoAnalysisCompletion(
-            request, this, params, performance, completionId);
-        return;
-      }
-    } else {
+    if (result != null && result.exists) {
       if (offset < 0 || offset > result.content.length) {
         server.sendResponse(new Response.invalidParameter(
             request,
diff --git a/pkg/analysis_server/lib/src/domain_execution.dart b/pkg/analysis_server/lib/src/domain_execution.dart
index a1ed194..52bf9d6 100644
--- a/pkg/analysis_server/lib/src/domain_execution.dart
+++ b/pkg/analysis_server/lib/src/domain_execution.dart
@@ -9,7 +9,7 @@
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/domains/execution/completion.dart';
+import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -63,25 +63,30 @@
    * Implement the 'execution.getSuggestions' request.
    */
   void getSuggestions(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    var params = new ExecutionGetSuggestionsParams.fromRequest(request);
-    var computer = new RuntimeCompletionComputer(
-        server.resourceProvider,
-        server.fileContentOverlay,
-        server.getAnalysisDriver(params.contextFile),
-        params.code,
-        params.offset,
-        params.contextFile,
-        params.contextOffset,
-        params.variables,
-        params.expressions);
-    RuntimeCompletionResult completionResult = await computer.compute();
-
-    // Send the response.
+//    // TODO(brianwilkerson) Determine whether this await is necessary.
+//    await null;
+//    var params = new ExecutionGetSuggestionsParams.fromRequest(request);
+//    var computer = new RuntimeCompletionComputer(
+//        server.resourceProvider,
+//        server.fileContentOverlay,
+//        server.getAnalysisDriver(params.contextFile),
+//        params.code,
+//        params.offset,
+//        params.contextFile,
+//        params.contextOffset,
+//        params.variables,
+//        params.expressions);
+//    RuntimeCompletionResult completionResult = await computer.compute();
+//
+//    // Send the response.
+//    var result = new ExecutionGetSuggestionsResult(
+//        suggestions: completionResult.suggestions,
+//        expressions: completionResult.expressions);
+    // TODO(brianwilkerson) Re-enable this functionality after implementing a
+    // way of computing suggestions that is compatible with AnalysisSession.
     var result = new ExecutionGetSuggestionsResult(
-        suggestions: completionResult.suggestions,
-        expressions: completionResult.expressions);
+        suggestions: <CompletionSuggestion>[],
+        expressions: <RuntimeCompletionExpression>[]);
     server.sendResponse(result.toResponse(request.id));
   }
 
diff --git a/pkg/analysis_server/lib/src/edit/edit_dartfix.dart b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
new file mode 100644
index 0000000..fc1139a
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
@@ -0,0 +1,314 @@
+// 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/plugin/edit/assist/assist_dart.dart';
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/assist_internal.dart';
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/lint/linter.dart';
+import 'package:analyzer/src/lint/linter_visitor.dart';
+import 'package:analyzer/src/lint/registry.dart';
+import 'package:analyzer/src/services/lint.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart'
+    show SourceChange, SourceEdit, SourceFileEdit;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:front_end/src/scanner/token.dart';
+import 'package:source_span/src/span.dart';
+
+class EditDartFix {
+  final AnalysisServer server;
+  final Request request;
+  final fixFolders = <Folder>[];
+  final fixFiles = <File>[];
+
+  List<String> descriptionOfFixes;
+  List<String> otherRecommendations;
+  SourceChange sourceChange;
+
+  EditDartFix(this.server, this.request);
+
+  void addFix(String description, SourceChange change) {
+    descriptionOfFixes.add(description);
+    for (SourceFileEdit fileEdit in change.edits) {
+      for (SourceEdit sourceEdit in fileEdit.edits) {
+        sourceChange.addEdit(fileEdit.file, fileEdit.fileStamp, sourceEdit);
+      }
+    }
+  }
+
+  void addRecommendation(String recommendation) {
+    otherRecommendations.add(recommendation);
+  }
+
+  Future<Response> compute() async {
+    final params = new EditDartfixParams.fromRequest(request);
+
+    // Validate each included file and directory.
+    final resourceProvider = server.resourceProvider;
+    final contextManager = server.contextManager;
+    for (String path in params.included) {
+      if (!server.isValidFilePath(path)) {
+        return new Response.invalidFilePathFormat(request, path);
+      }
+      Resource res = resourceProvider.getResource(path);
+      if (!res.exists ||
+          !(contextManager.includedPaths.contains(path) ||
+              contextManager.isInAnalysisRoot(path))) {
+        return new Response.fileNotAnalyzed(request, path);
+      }
+      if (res is Folder) {
+        fixFolders.add(res);
+      } else {
+        fixFiles.add(res);
+      }
+    }
+
+    // Get the desired lints
+    final LintRule preferMixin = Registry.ruleRegistry['prefer_mixin'];
+    if (preferMixin == null) {
+      return new Response.serverError(
+          request, 'Missing prefer_mixin lint', null);
+    }
+    final preferMixinFix = new PreferMixinFix(this);
+    preferMixin.reporter = preferMixinFix;
+
+    // Setup
+    final linters = <Linter>[
+      preferMixin,
+    ];
+    final fixes = <LinterFix>[
+      preferMixinFix,
+    ];
+    final visitors = <AstVisitor>[];
+    final registry = new NodeLintRegistry(false);
+    for (Linter linter in linters) {
+      final visitor = linter.getVisitor();
+      if (visitor != null) {
+        visitors.add(visitor);
+      }
+      if (linter is NodeLintRule) {
+        (linter as NodeLintRule).registerNodeProcessors(registry);
+      }
+    }
+    final AstVisitor astVisitor = visitors.isNotEmpty
+        ? new ExceptionHandlingDelegatingAstVisitor(
+            visitors, ExceptionHandlingDelegatingAstVisitor.logException)
+        : null;
+    final AstVisitor linterVisitor = new LinterVisitor(
+        registry, ExceptionHandlingDelegatingAstVisitor.logException);
+
+    // 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.
+
+    // Analyze each source file.
+    final resources = <Resource>[];
+    for (String rootPath in contextManager.includedPaths) {
+      resources.add(resourceProvider.getResource(rootPath));
+    }
+    bool hasErrors = false;
+    while (resources.isNotEmpty) {
+      Resource res = resources.removeLast();
+      if (res is Folder) {
+        for (Resource child in res.getChildren()) {
+          if (!child.shortName.startsWith('.') &&
+              contextManager.isInAnalysisRoot(child.path)) {
+            resources.add(child);
+          }
+        }
+        continue;
+      }
+      AnalysisResult result = await server.getAnalysisResult(res.path);
+      CompilationUnit unit = result?.unit;
+      if (unit != null) {
+        if (!hasErrors) {
+          for (AnalysisError error in result.errors) {
+            if (error.errorCode.type == ErrorType.SYNTACTIC_ERROR) {
+              hasErrors = true;
+              break;
+            }
+          }
+        }
+        Source source = result.sourceFactory.forUri2(result.uri);
+        for (Linter linter in linters) {
+          linter.reporter.source = source;
+        }
+        if (astVisitor != null) {
+          unit.accept(astVisitor);
+        }
+        unit.accept(linterVisitor);
+      }
+    }
+
+    // Cleanup
+    for (Linter linter in linters) {
+      linter.reporter = null;
+    }
+
+    // Reporting
+    descriptionOfFixes = <String>[];
+    otherRecommendations = <String>[];
+    sourceChange = new SourceChange('dartfix');
+    for (LinterFix fix in fixes) {
+      await fix.applyFix();
+    }
+    return new EditDartfixResult(descriptionOfFixes, otherRecommendations,
+            hasErrors, sourceChange.edits)
+        .toResponse(request.id);
+  }
+
+  /// Return `true` if the path in within the set of `included` files
+  /// or is within an `included` directory.
+  bool isIncluded(String path) {
+    if (path != null) {
+      for (File file in fixFiles) {
+        if (file.path == path) {
+          return true;
+        }
+      }
+      for (Folder folder in fixFolders) {
+        if (folder.contains(path)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+}
+
+class EditDartFixAssistContext implements DartAssistContext {
+  @override
+  final AnalysisDriver analysisDriver;
+
+  @override
+  final int selectionLength;
+
+  @override
+  final int selectionOffset;
+
+  @override
+  final Source source;
+
+  @override
+  final CompilationUnit unit;
+
+  EditDartFixAssistContext(
+      EditDartFix dartFix, this.source, this.unit, AstNode node)
+      : analysisDriver = dartFix.server.getAnalysisDriver(source.fullName),
+        selectionOffset = node.offset,
+        selectionLength = 0;
+}
+
+abstract class LinterFix implements ErrorReporter {
+  final EditDartFix dartFix;
+
+  @override
+  Source source;
+
+  LinterFix(this.dartFix);
+
+  @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 reportTypeErrorForNode(
+      ErrorCode errorCode, AstNode node, List<Object> arguments) {
+    // ignored
+  }
+
+  void applyFix();
+}
+
+class PreferMixinFix extends LinterFix {
+  final classesToConvert = new Set<Element>();
+
+  PreferMixinFix(EditDartFix dartFix) : super(dartFix);
+
+  @override
+  void reportErrorForNode(ErrorCode errorCode, AstNode node,
+      [List<Object> arguments]) {
+    TypeName type = node;
+    Element element = type.name.staticElement;
+    String path = element.source?.fullName;
+    if (path != null && dartFix.isIncluded(path)) {
+      classesToConvert.add(element);
+    }
+  }
+
+  @override
+  void applyFix() async {
+    for (Element elem in classesToConvert) {
+      await convertClassToMixin(elem);
+    }
+  }
+
+  void convertClassToMixin(Element elem) async {
+    String path = elem.source?.fullName;
+    AnalysisResult result = await dartFix.server.getAnalysisResult(path);
+
+    // TODO(danrubel): Verify that class can be converted
+    for (CompilationUnitMember declaration in result.unit.declarations) {
+      if (declaration is ClassOrMixinDeclaration &&
+          declaration.name.name == elem.name) {
+        AssistProcessor processor = new AssistProcessor(
+            new EditDartFixAssistContext(
+                dartFix, elem.source, result.unit, declaration.name));
+        List<Assist> assists = await processor
+            .computeAssist(DartAssistKind.CONVERT_CLASS_TO_MIXIN);
+        if (assists.isNotEmpty) {
+          for (Assist assist in assists) {
+            dartFix.addFix(
+                'Convert class to mixin: ${elem.name}', assist.change);
+          }
+        } else {
+          // TODO(danrubel): If assists is empty, then determine why
+          // assist could not be performed and report that in the description.
+          dartFix.addRecommendation(
+              'Could not automatically convert ${elem.name} to a mixin'
+              ' because the class contains a constructor.');
+        }
+      }
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 221af2e..f7a28e7 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -13,6 +13,7 @@
 import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/computer/import_elements_computer.dart';
 import 'package:analysis_server/src/domain_abstract.dart';
+import 'package:analysis_server/src/edit/edit_dartfix.dart';
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analysis_server/src/plugin/result_converter.dart';
 import 'package:analysis_server/src/protocol_server.dart' hide Element;
@@ -84,6 +85,18 @@
     _newRefactoringManager();
   }
 
+  Future dartfix(Request request) async {
+    // TODO(danrubel): Add support for dartfix plugins
+
+    //
+    // Compute fixes
+    //
+    var dartFix = new EditDartFix(server, request);
+    Response response = await dartFix.compute();
+
+    server.sendResponse(response);
+  }
+
   Response format(Request request) {
     server.options.analytics?.sendEvent('edit', 'format');
 
@@ -346,6 +359,9 @@
       } else if (requestName == EDIT_REQUEST_GET_FIXES) {
         getFixes(request);
         return Response.DELAYED_RESPONSE;
+      } else if (requestName == EDIT_REQUEST_DARTFIX) {
+        dartfix(request);
+        return Response.DELAYED_RESPONSE;
       } else if (requestName == EDIT_REQUEST_GET_REFACTORING) {
         return _getRefactoring(request);
       } else if (requestName == EDIT_REQUEST_IMPORT_ELEMENTS) {
@@ -597,22 +613,20 @@
     {
       var analysisResult = await server.getAnalysisResult(file);
       if (analysisResult != null) {
-        // TODO(scheglov) Update other refactorings to use ResolveResult.
-        var unit = analysisResult.unit;
         // Try EXTRACT_LOCAL_VARIABLE.
         if (new ExtractLocalRefactoring(analysisResult, offset, length)
             .isAvailable()) {
           kinds.add(RefactoringKind.EXTRACT_LOCAL_VARIABLE);
         }
         // Try EXTRACT_METHOD.
-        if (new ExtractMethodRefactoring(
-                searchEngine, server.getAstProvider(file), unit, offset, length)
+        if (new ExtractMethodRefactoring(searchEngine,
+                server.getAstProvider(file), analysisResult, offset, length)
             .isAvailable()) {
           kinds.add(RefactoringKind.EXTRACT_METHOD);
         }
         // Try EXTRACT_WIDGETS.
         if (new ExtractWidgetRefactoring(
-                searchEngine, analysisResult.session, unit, offset, length)
+                searchEngine, analysisResult, offset, length)
             .isAvailable()) {
           kinds.add(RefactoringKind.EXTRACT_WIDGET);
         }
@@ -955,35 +969,34 @@
       }
     }
     if (kind == RefactoringKind.EXTRACT_METHOD) {
-      CompilationUnit unit = await server.getResolvedCompilationUnit(file);
-      if (unit != null) {
-        refactoring = new ExtractMethodRefactoring(
-            searchEngine, server.getAstProvider(file), unit, offset, length);
+      var analysisResult = await server.getAnalysisResult(file);
+      if (analysisResult != null) {
+        refactoring = new ExtractMethodRefactoring(searchEngine,
+            server.getAstProvider(file), analysisResult, offset, length);
         feedback = new ExtractMethodFeedback(offset, length, '', <String>[],
             false, <RefactoringMethodParameter>[], <int>[], <int>[]);
       }
     }
     if (kind == RefactoringKind.EXTRACT_WIDGET) {
-      CompilationUnit unit = await server.getResolvedCompilationUnit(file);
-      if (unit != null) {
-        var analysisSession = server.getAnalysisDriver(file).currentSession;
+      var analysisResult = await server.getAnalysisResult(file);
+      if (analysisResult != null) {
         refactoring = new ExtractWidgetRefactoring(
-            searchEngine, analysisSession, unit, offset, length);
+            searchEngine, analysisResult, offset, length);
         feedback = new ExtractWidgetFeedback();
       }
     }
     if (kind == RefactoringKind.INLINE_LOCAL_VARIABLE) {
-      CompilationUnit unit = await server.getResolvedCompilationUnit(file);
-      if (unit != null) {
+      var analysisResult = await server.getAnalysisResult(file);
+      if (analysisResult != null) {
         refactoring = new InlineLocalRefactoring(
-            searchEngine, server.getAstProvider(file), unit, offset);
+            searchEngine, server.getAstProvider(file), analysisResult, offset);
       }
     }
     if (kind == RefactoringKind.INLINE_METHOD) {
-      CompilationUnit unit = await server.getResolvedCompilationUnit(file);
-      if (unit != null) {
+      var analysisResult = await server.getAnalysisResult(file);
+      if (analysisResult != null) {
         refactoring = new InlineMethodRefactoring(
-            searchEngine, server.getAstProvider(file), unit, offset);
+            searchEngine, server.getAstProvider(file), analysisResult, offset);
       }
     }
     if (kind == RefactoringKind.MOVE_FILE) {
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
index 996f97a..e937e26 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
@@ -7,7 +7,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:front_end/src/base/source.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:path/src/context.dart';
 
 /**
diff --git a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
index 9934390..f100d1e 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
@@ -10,19 +10,6 @@
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
 /**
- * An empty list returned by [CompletionContributor]s
- * when they have no suggestions to contribute.
- */
-const EMPTY_LIST = const <CompletionSuggestion>[];
-
-/**
- * An object used to instantiate a [CompletionContributor] instance
- * for each 'completion.getSuggestions' request.
- * Contributors should *not* be cached between requests.
- */
-typedef CompletionContributor CompletionContributorFactory();
-
-/**
  * [AbortCompletion] is thrown when the current completion request
  * should be aborted because either
  * the source changed since the request was made, or
diff --git a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
index 093c2da..f96c93e 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
@@ -13,18 +13,9 @@
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
 import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
 
-export 'package:analysis_server/src/provisional/completion/completion_core.dart'
-    show EMPTY_LIST;
 export 'package:analyzer_plugin/utilities/completion/relevance.dart';
 
 /**
- * An object used to instantiate a [DartCompletionContributor] instance
- * for each 'completion.getSuggestions' request.
- * Contributors should *not* be cached between requests.
- */
-typedef DartCompletionContributor DartCompletionContributorFactory();
-
-/**
  * An object used to produce completions
  * at a specific location within a Dart file.
  *
diff --git a/pkg/analysis_server/lib/src/server/dev_server.dart b/pkg/analysis_server/lib/src/server/dev_server.dart
index 38dcf6d..44bb21c 100644
--- a/pkg/analysis_server/lib/src/server/dev_server.dart
+++ b/pkg/analysis_server/lib/src/server/dev_server.dart
@@ -161,12 +161,15 @@
 }
 
 class DevChannel implements ServerCommunicationChannel {
-  StreamController<Request> _requestController =
-      new StreamController.broadcast();
-  StreamController<Notification> _notificationController =
+  final StreamController<Request> _requestController =
       new StreamController.broadcast();
 
-  Map<String, Completer<Response>> _responseCompleters = {};
+  final StreamController<Notification> _notificationController =
+      new StreamController.broadcast();
+
+  final Map<String, Completer<Response>> _responseCompleters = {};
+
+  Stream<Notification> get onNotification => _notificationController.stream;
 
   @override
   void close() {
@@ -191,12 +194,6 @@
     _notificationController.add(notification);
   }
 
-  @override
-  void sendResponse(Response response) {
-    Completer<Response> completer = _responseCompleters.remove(response.id);
-    completer?.complete(response);
-  }
-
   Future<Response> sendRequest(Request request) {
     Completer<Response> completer = new Completer();
     _responseCompleters[request.id] = completer;
@@ -204,5 +201,9 @@
     return completer.future;
   }
 
-  Stream<Notification> get onNotification => _notificationController.stream;
+  @override
+  void sendResponse(Response response) {
+    Completer<Response> completer = _responseCompleters.remove(response.id);
+    completer?.complete(response);
+  }
 }
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 0ee7c49..b676b41 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -431,7 +431,9 @@
     InstrumentationService instrumentationService =
         new InstrumentationService(instrumentationServer);
     instrumentationService.logVersion(
-        _readUuid(instrumentationService),
+        trainDirectory != null
+            ? 'training-0'
+            : _readUuid(instrumentationService),
         analysisServerOptions.clientId,
         analysisServerOptions.clientVersion,
         AnalysisServer.VERSION,
@@ -449,7 +451,6 @@
     socketServer = new SocketServer(
         analysisServerOptions,
         new DartSdkManager(defaultSdkPath, true),
-        defaultSdk,
         instrumentationService,
         diagnosticServer,
         fileResolverProvider,
diff --git a/pkg/analysis_server/lib/src/server/http_server.dart b/pkg/analysis_server/lib/src/server/http_server.dart
index aee5eb0..5b51304 100644
--- a/pkg/analysis_server/lib/src/server/http_server.dart
+++ b/pkg/analysis_server/lib/src/server/http_server.dart
@@ -19,24 +19,6 @@
 }
 
 /**
- * An [AbstractGetHandler] that always returns the given error message.
- */
-class ErrorGetHandler extends AbstractGetHandler {
-  final String message;
-
-  ErrorGetHandler(this.message);
-
-  @override
-  void handleGetRequest(HttpRequest request) {
-    HttpResponse response = request.response;
-    response.statusCode = HttpStatus.notFound;
-    response.headers.contentType = ContentType.text;
-    response.write(message);
-    response.close();
-  }
-}
-
-/**
  * Instances of the class [HttpServer] implement a simple HTTP server. The
  * server:
  *
@@ -68,7 +50,7 @@
   /**
    * Last PRINT_BUFFER_LENGTH lines printed.
    */
-  List<String> _printBuffer = <String>[];
+  final List<String> _printBuffer = <String>[];
 
   /**
    * Initialize a newly created HTTP server.
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 654c128..a2857e1 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
@@ -197,11 +197,11 @@
     // for a method or a constructor or an annotation
     SimpleIdentifier targetId = _getTargetId(request.target.containingNode);
     if (targetId == null) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
     Element elem = targetId.staticElement;
     if (elem == null) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     // Generate argument list suggestion based upon the type of element
@@ -221,7 +221,7 @@
       _addSuggestions(elem.parameters);
       return suggestions;
     }
-    return EMPTY_LIST;
+    return const <CompletionSuggestion>[];
   }
 
   void _addDefaultParamSuggestions(Iterable<ParameterElement> parameters,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
index 3481a82..18ba66b 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
@@ -23,7 +23,7 @@
     await null;
     AstNode node = request.target.containingNode;
     if (node is! Combinator) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     // Build list of suggestions
@@ -40,6 +40,6 @@
         return builder.suggestions;
       }
     }
-    return EMPTY_LIST;
+    return const <CompletionSuggestion>[];
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart b/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart
index e7e691f..6b74935 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart
@@ -33,7 +33,7 @@
    * The names are ordered from most relevant to least relevant.
    * Names not listed are considered equally less relevant than those listed.
    */
-  Map<String, List<String>> selectorRelevance;
+  final Map<String, List<String>> selectorRelevance;
 
   CommonUsageSorter([this.selectorRelevance = defaultSelectorRelevance]);
 
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 cbc27b9..306c6b3 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
@@ -60,7 +60,7 @@
     await null;
     request.checkAborted();
     if (!AnalysisEngine.isDartFileName(request.result.path)) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     CompletionPerformance performance =
@@ -70,7 +70,7 @@
 
     // Don't suggest in comments.
     if (dartRequest.target.isCommentText) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     SourceRange range =
@@ -196,7 +196,7 @@
   Expression dotTarget;
 
   @override
-  Source librarySource;
+  final Source librarySource;
 
   @override
   CompletionTarget target;
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 62a56cd..2a45ee0 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
@@ -22,7 +22,7 @@
     await null;
     AstNode node = request.target.containingNode;
     if (node is! FieldFormalParameter) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     // If this is a constructor declaration
@@ -30,7 +30,7 @@
     ConstructorDeclaration constructorDecl =
         node.getAncestor((p) => p is ConstructorDeclaration);
     if (constructorDecl == null) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     // Compute the list of fields already referenced in the constructor
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
index 9c2a7e8..6f9d9b3 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
@@ -44,12 +44,12 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     if (!request.includeIdentifiers) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     List<ImportElement> imports = request.libraryElement.imports;
     if (imports == null) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     this.request = request;
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 441e31d..0f6f992 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
@@ -22,18 +22,16 @@
  * or `null` if the target is in a static method or field
  * or not in a class.
  */
-ClassDeclaration _enclosingClass(CompletionTarget target) {
+ClassOrMixinDeclaration _enclosingClass(CompletionTarget target) {
   AstNode node = target.containingNode;
   while (node != null) {
-    if (node is ClassDeclaration) {
+    if (node is ClassOrMixinDeclaration) {
       return node;
-    }
-    if (node is MethodDeclaration) {
+    } else if (node is MethodDeclaration) {
       if (node.isStatic) {
         return null;
       }
-    }
-    if (node is FieldDeclaration) {
+    } else if (node is FieldDeclaration) {
       if (node.isStatic) {
         return null;
       }
@@ -60,28 +58,22 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     if (!request.includeIdentifiers) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
-    ClassDeclaration classDecl = _enclosingClass(request.target);
+    ClassOrMixinDeclaration classDecl = _enclosingClass(request.target);
     if (classDecl == null || classDecl.declaredElement == null) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
     containingLibrary = request.libraryElement;
-    return _computeSuggestionsForClass2(
-        resolutionMap.elementDeclaredByClassDeclaration(classDecl), request);
-  }
-
-  List<CompletionSuggestion> computeSuggestionsForClass(
-      ClassElement classElement, DartCompletionRequest request,
-      {bool skipChildClass: true}) {
-    if (!request.includeIdentifiers) {
-      return EMPTY_LIST;
+    if (classDecl is ClassDeclaration) {
+      return _computeSuggestionsForClass2(
+          resolutionMap.elementDeclaredByClassDeclaration(classDecl), request);
+    } else if (classDecl is MixinDeclaration) {
+      return _computeSuggestionsForClass2(
+          resolutionMap.elementDeclaredByMixinDeclaration(classDecl), request);
     }
-    containingLibrary = request.libraryElement;
-
-    return _computeSuggestionsForClass2(classElement, request,
-        skipChildClass: skipChildClass);
+    return const <CompletionSuggestion>[];
   }
 
   _addSuggestionsForType(InterfaceType type, DartCompletionRequest request,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
index 411a1d5..7a21679 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
@@ -38,7 +38,7 @@
         }
       }
     }
-    return EMPTY_LIST;
+    return const <CompletionSuggestion>[];
   }
 
   List<CompletionSuggestion> _buildSuggestions(
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 537b7bf..6b46436 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
@@ -22,12 +22,12 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     if (!request.includeIdentifiers) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     List<ImportElement> imports = request.libraryElement.imports;
     if (imports == null) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     List<CompletionSuggestion> suggestions = <CompletionSuggestion>[];
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 ac072f0..007465e 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
@@ -27,8 +27,6 @@
   final OpType optype;
   CompletionSuggestionKind kind;
   final String prefix;
-  List<String> showNames;
-  List<String> hiddenNames;
 
   /**
    * The set of libraries that have been, or are currently being, visited.
@@ -195,13 +193,13 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     if (!request.includeIdentifiers) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     List<CompilationUnitElement> libraryUnits =
         request.result.unit.declaredElement.library.units;
     if (libraryUnits == null) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     OpType optype = (request as DartCompletionRequestImpl).opType;
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 bed81db..cee82af 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
@@ -65,7 +65,7 @@
         return visitor.suggestions;
       }
     }
-    return EMPTY_LIST;
+    return const <CompletionSuggestion>[];
   }
 }
 
@@ -307,7 +307,7 @@
       TypeAnnotation typeName, protocol.ElementKind elemKind,
       {bool isAbstract: false,
       bool isDeprecated: false,
-      ClassDeclaration classDecl,
+      ClassOrMixinDeclaration classDecl,
       FormalParameterList param,
       int relevance: DART_RELEVANCE_DEFAULT}) {
     CompletionSuggestionKind kind = targetIsFunctionalArgument
@@ -378,7 +378,7 @@
       protocol.ElementKind elemKind,
       {bool isAbstract: false,
       bool isDeprecated: false,
-      ClassDeclaration classDecl,
+      ClassOrMixinDeclaration classDecl,
       FormalParameterList param,
       int relevance: DART_RELEVANCE_DEFAULT}) {
     relevance = optype.returnValueSuggestionsFilter(
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
index 0a80399..57a2f27 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
@@ -24,7 +24,7 @@
     AstNode node = request.target.containingNode;
     LibraryElement libElem = request.libraryElement;
     if (libElem == null) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     // Build the list of suggestions
@@ -40,7 +40,7 @@
         }
       }
     }
-    return EMPTY_LIST;
+    return const <CompletionSuggestion>[];
   }
 
   List<CompletionSuggestion> _buildSuggestions(
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 5c3f924..7c86874 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
@@ -8,12 +8,11 @@
     show CompletionSuggestion, CompletionSuggestionKind;
 import 'package:analysis_server/src/protocol_server.dart' as protocol
     hide CompletionSuggestion, CompletionSuggestionKind;
-import 'package:analysis_server/src/provisional/completion/completion_core.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager2.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';
@@ -31,25 +30,26 @@
     await null;
     SimpleIdentifier targetId = _getTargetId(request.target);
     if (targetId == null) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
     ClassDeclaration classDecl =
         targetId.getAncestor((p) => p is ClassDeclaration);
     if (classDecl == null) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
+    var inheritance = new InheritanceManager2(
+        request.result.libraryElement.context.typeSystem);
+
     // Generate a collection of inherited members
     ClassElement classElem = classDecl.declaredElement;
-    InheritanceManager manager = new InheritanceManager(classElem.library);
-    Map<String, ExecutableElement> map =
-        manager.getMembersInheritedFromInterfaces(classElem);
-    List<String> memberNames = _computeMemberNames(map, classElem);
+    var interface = inheritance.getInterface(classElem.type).map;
+    var namesToOverride = _namesToOverride(classElem, interface.keys);
 
     // Build suggestions
     List<CompletionSuggestion> suggestions = <CompletionSuggestion>[];
-    for (String memberName in memberNames) {
-      ExecutableElement element = map[memberName];
+    for (Name name in namesToOverride) {
+      ExecutableElement element = interface[name].element;
       // Gracefully degrade if the overridden element has not been resolved.
       if (element.returnType != null) {
         CompletionSuggestion suggestion =
@@ -127,22 +127,6 @@
   }
 
   /**
-   * Return a list containing the names of all of the inherited but not
-   * implemented members of the class represented by the given [element].
-   * The [map] is used to find all of the members that are inherited.
-   */
-  List<String> _computeMemberNames(
-      Map<String, ExecutableElement> map, ClassElement element) {
-    List<String> memberNames = <String>[];
-    for (String memberName in map.keys) {
-      if (!_hasMember(element, memberName)) {
-        memberNames.add(memberName);
-      }
-    }
-    return memberNames;
-  }
-
-  /**
    * If the target looks like a partial identifier inside a class declaration
    * then return that identifier, otherwise return `null`.
    */
@@ -209,4 +193,19 @@
     }
     return false;
   }
+
+  /**
+   * Return a list containing the subset of [interfaceNames] that are not
+   * defined yet in the given [classElement].
+   */
+  List<Name> _namesToOverride(
+      ClassElement classElement, Iterable<Name> interfaceNames) {
+    var notDefinedNames = <Name>[];
+    for (var name in interfaceNames) {
+      if (!_hasMember(classElement, name.name)) {
+        notDefinedNames.add(name);
+      }
+    }
+    return notDefinedNames;
+  }
 }
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 98a841a..087b39e 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
@@ -30,7 +30,7 @@
         // Gracefully degrade if the library could not be determined
         // e.g. detached part file or source change
         if (containingLibrary == null) {
-          return EMPTY_LIST;
+          return const <CompletionSuggestion>[];
         }
 
         _SuggestionBuilder builder = new _SuggestionBuilder(containingLibrary);
@@ -38,7 +38,7 @@
         return builder.suggestions;
       }
     }
-    return EMPTY_LIST;
+    return const <CompletionSuggestion>[];
   }
 }
 
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 7c88a82..ef91fd7 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
@@ -14,8 +14,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:path/path.dart' as path;
 
-const String DYNAMIC = 'dynamic';
-
 /**
  * Return a suggestion based upon the given element
  * or `null` if a suggestion is not appropriate for the given element.
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 8fb2ddb..d0b3d04 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
@@ -28,23 +28,23 @@
     // Gracefully degrade if the library element is not resolved
     // e.g. detached part file or source change
     if (containingLibrary == null) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
 
     // Recompute the target since resolution may have changed it
     Expression expression = request.dotTarget;
     if (expression == null || expression.isSynthetic) {
-      return EMPTY_LIST;
+      return const <CompletionSuggestion>[];
     }
     if (expression is Identifier) {
       Element elem = expression.staticElement;
       if (elem is ClassElement) {
         // Suggestions provided by StaticMemberContributor
-        return EMPTY_LIST;
+        return const <CompletionSuggestion>[];
       }
       if (elem is PrefixElement) {
         // Suggestions provided by LibraryMemberContributor
-        return EMPTY_LIST;
+        return const <CompletionSuggestion>[];
       }
     }
 
@@ -75,8 +75,10 @@
       }
     }
     String containingMethodName;
+    List<InterfaceType> mixins;
     if (expression is SuperExpression && type is InterfaceType) {
       // Suggest members from superclass if target is "super"
+      mixins = (type as InterfaceType).mixins;
       type = (type as InterfaceType).superclass;
       // Determine the name of the containing method because
       // the most likely completion is a super expression with same name
@@ -97,10 +99,10 @@
     // Build the suggestions
     if (type is InterfaceType) {
       _SuggestionBuilder builder = new _SuggestionBuilder(containingLibrary);
-      builder.buildSuggestions(type, containingMethodName);
+      builder.buildSuggestions(type, containingMethodName, mixins: mixins);
       return builder.suggestions.toList();
     }
-    return EMPTY_LIST;
+    return const <CompletionSuggestion>[];
   }
 }
 
@@ -259,12 +261,12 @@
    * Note: the enumerated values stored in this map are intended to be bitwise
    * compared.
    */
-  Map<String, int> _completionTypesGenerated = new HashMap<String, int>();
+  final Map<String, int> _completionTypesGenerated = new HashMap<String, int>();
 
   /**
    * Map from completion identifier to completion suggestion
    */
-  Map<String, CompletionSuggestion> _suggestionMap =
+  final Map<String, CompletionSuggestion> _suggestionMap =
       <String, CompletionSuggestion>{};
 
   _SuggestionBuilder(this.containingLibrary);
@@ -276,12 +278,16 @@
    * If the 'dot' completion is a super expression, then [containingMethodName]
    * is the name of the method in which the completion is requested.
    */
-  void buildSuggestions(InterfaceType type, String containingMethodName) {
+  void buildSuggestions(InterfaceType type, String containingMethodName,
+      {List<InterfaceType> mixins}) {
     // Visit all of the types in the class hierarchy, collecting possible
     // completions.  If multiple elements are found that complete to the same
     // identifier, addSuggestion will discard all but the first (with a few
     // exceptions to handle getter/setter pairs).
     List<InterfaceType> types = _getTypeOrdering(type);
+    if (mixins != null) {
+      types.addAll(mixins);
+    }
     for (InterfaceType targetType in types) {
       for (MethodElement method in targetType.methods) {
         // Exclude static methods when completion on an instance
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 a56cc64..0f2b10b 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -102,28 +102,12 @@
 }
 
 /**
- * Create a new suggestion for the given [fieldDecl]. Return the new suggestion
- * or `null` if it could not be created.
- */
-CompletionSuggestion createLocalFieldSuggestion(
-    Source source, FieldDeclaration fieldDecl, VariableDeclaration varDecl) {
-  bool deprecated = isDeprecated(fieldDecl) || isDeprecated(varDecl);
-  TypeAnnotation type = fieldDecl.fields.type;
-  return createLocalSuggestion(
-      varDecl.name, deprecated, DART_RELEVANCE_LOCAL_FIELD, type,
-      classDecl: fieldDecl.parent,
-      element: createLocalElement(
-          source, protocol.ElementKind.FIELD, varDecl.name,
-          returnType: type, isDeprecated: deprecated));
-}
-
-/**
  * Create a new suggestion based upon the given information. Return the new
  * suggestion or `null` if it could not be created.
  */
 CompletionSuggestion createLocalSuggestion(SimpleIdentifier id,
     bool isDeprecated, int defaultRelevance, TypeAnnotation returnType,
-    {ClassDeclaration classDecl,
+    {ClassOrMixinDeclaration classDecl,
     CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
     protocol.Element element}) {
   if (id == null) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
index 44790b9..eda5336 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
@@ -82,7 +82,7 @@
         }
       }
       if (strName == null) {
-        return EMPTY_LIST;
+        return const <CompletionSuggestion>[];
       }
 
       List<String> variableNameSuggestions = getCamelWordCombinations(strName);
@@ -96,6 +96,6 @@
       }
       return suggestions;
     }
-    return EMPTY_LIST;
+    return const <CompletionSuggestion>[];
   }
 }
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 12ebc38..1a690a8 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
@@ -327,8 +327,6 @@
 
   LineInfo get lineInfo => completionContext.lineInfo;
 
-  int get requestLine => lineInfo.getLocation(selectionOffset).lineNumber;
-
   int get selectionOffset => completionContext.selectionOffset;
 
   /**
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 d8e7aa4..929f1fe 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
@@ -151,8 +151,6 @@
 
   LineInfo get lineInfo => statementContext.lineInfo;
 
-  int get requestLine => lineInfo.getLocation(selectionOffset).lineNumber;
-
   int get selectionOffset => statementContext.selectionOffset;
 
   Source get source => statementContext.unitElement.source;
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 2dad5df..d0f2695 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -112,14 +112,7 @@
   Future<List<Assist>> compute() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    try {
-      utils = new CorrectionUtils(unit);
-    } catch (e) {
-      throw new CancelCorrectionException(exception: e);
-    }
-
-    node = new NodeLocator(selectionOffset, selectionEnd).searchWithin(unit);
-    if (node == null) {
+    if (!_setupCompute()) {
       return assists;
     }
 
@@ -175,6 +168,18 @@
     return assists;
   }
 
+  Future<List<Assist>> computeAssist(AssistKind assistKind) async {
+    if (!_setupCompute()) {
+      return assists;
+    }
+
+    // Calculate only specific assists for edit.dartFix
+    if (assistKind == DartAssistKind.CONVERT_CLASS_TO_MIXIN) {
+      await _addProposal_convertClassToMixin();
+    }
+    return assists;
+  }
+
   FunctionBody getEnclosingFunctionBody() {
     // TODO(brianwilkerson) Determine whether there is a reason why this method
     // isn't just "return node.getAncestor((node) => node is FunctionBody);"
@@ -474,8 +479,8 @@
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addReplacement(
           range.startStart(
-              classDeclaration.classKeyword, classDeclaration.leftBracket),
-          (DartEditBuilder builder) {
+              classDeclaration.abstractKeyword ?? classDeclaration.classKeyword,
+              classDeclaration.leftBracket), (DartEditBuilder builder) {
         builder.write('mixin ');
         builder.write(classDeclaration.name.name);
         builder.writeTypes(superclassConstraints, prefix: ' on ');
@@ -1110,6 +1115,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     // may be () in prefix expression
+    AstNode node = this.node;
     if (node is ParenthesizedExpression && node.parent is PrefixExpression) {
       node = node.parent;
     }
@@ -1320,7 +1326,7 @@
       // rename field
       builder.addSimpleReplacement(range.node(nameNode), '_$name');
       // update references in constructors
-      ClassDeclaration classDeclaration = fieldDeclaration.parent;
+      ClassOrMixinDeclaration classDeclaration = fieldDeclaration.parent;
       for (ClassMember member in classDeclaration.members) {
         if (member is ConstructorDeclaration) {
           for (FormalParameter parameter in member.parameters.parameters) {
@@ -3293,6 +3299,17 @@
     return utils.getRangeText(range);
   }
 
+  bool _setupCompute() {
+    try {
+      utils = new CorrectionUtils(unit);
+    } catch (e) {
+      throw new CancelCorrectionException(exception: e);
+    }
+
+    node = new NodeLocator(selectionOffset, selectionEnd).searchWithin(unit);
+    return node != null;
+  }
+
   Future<void> _swapParentAndChild(InstanceCreationExpression parent,
       InstanceCreationExpression child, AssistKind kind) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
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 869e3b6..2fba47c 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -36,8 +36,8 @@
 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/inheritance_manager.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/error/inheritance_override.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error_verifier.dart';
 import 'package:analyzer/src/generated/java_core.dart';
@@ -90,7 +90,7 @@
       List<Fix> fixAllFixes = await _computeFixAllFixes(context, fixes);
       return new List.from(fixes)..addAll(fixAllFixes);
     } on CancelCorrectionException {
-      return Fix.EMPTY_LIST;
+      return const <Fix>[];
     }
   }
 
@@ -105,14 +105,14 @@
     // - return if no fixes
     // - return if no other analysis errors
     if (fixes.isEmpty || allAnalysisErrors.length < 2) {
-      return Fix.EMPTY_LIST;
+      return const <Fix>[];
     }
 
     // Remove any analysis errors that don't have the expected error code name
     allAnalysisErrors
         .removeWhere((e) => analysisError.errorCode.name != e.errorCode.name);
     if (allAnalysisErrors.length < 2) {
-      return Fix.EMPTY_LIST;
+      return const <Fix>[];
     }
 
     // A map between each FixKind and the List of associated fixes
@@ -308,6 +308,11 @@
         errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT) {
       await _addFix_addAsync();
     }
+    if ((errorCode == CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE ||
+            errorCode == ParserErrorCode.UNEXPECTED_TOKEN) &&
+        error.message.indexOf("'await'") >= 0) {
+      await _addFix_addAsync();
+    }
     if (errorCode == CompileTimeErrorCode.INTEGER_LITERAL_IMPRECISE_AS_DOUBLE) {
       await _addFix_changeToNearestPreciseValue();
     }
@@ -1954,12 +1959,8 @@
     ClassDeclaration targetClass = node.parent as ClassDeclaration;
     ClassElement targetClassElement = targetClass.declaredElement;
     utils.targetClassElement = targetClassElement;
-    List<ExecutableElement> elements = ErrorVerifier.computeMissingOverrides(
-            typeProvider,
-            typeSystem,
-            new InheritanceManager(unitLibraryElement),
-            targetClassElement)
-        .toList();
+    List<ExecutableElement> elements =
+        InheritanceOverrideVerifier.missingOverrides(targetClass).toList();
     // sort by name, getters before setters
     elements.sort((Element a, Element b) {
       int names = compareStrings(a.displayName, b.displayName);
@@ -2299,7 +2300,8 @@
         showNames.addAll(showCombinator.shownNames);
         showNames.add(name);
         // prepare library name - unit name or 'dart:name' for SDK library
-        String libraryName = libraryElement.definingCompilationUnit.displayName;
+        String libraryName =
+            libraryElement.definingCompilationUnit.source.uri.toString();
         if (libraryElement.isInSdk) {
           libraryName = libraryElement.source.shortName;
         }
@@ -2908,7 +2910,8 @@
     } else if (element is ParameterElement) {
       if (!element.isNamed) {
         AstNode root = node.getAncestor((node) =>
-            node.parent is ClassDeclaration || node.parent is CompilationUnit);
+            node.parent is ClassOrMixinDeclaration ||
+            node.parent is CompilationUnit);
         references = findLocalElementReferences(root, element);
       }
     }
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 0017566..1bd8aef8 100644
--- a/pkg/analysis_server/lib/src/services/correction/sort_members.dart
+++ b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
@@ -10,7 +10,7 @@
  * Sorter for unit/class members.
  */
 class MemberSorter {
-  static List<_PriorityItem> _PRIORITY_ITEMS = [
+  static final List<_PriorityItem> _PRIORITY_ITEMS = [
     new _PriorityItem(false, _MemberKind.UNIT_FUNCTION_MAIN, false),
     new _PriorityItem(false, _MemberKind.UNIT_VARIABLE_CONST, false),
     new _PriorityItem(false, _MemberKind.UNIT_VARIABLE_CONST, true),
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
index b24a839..61dd338 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
@@ -77,9 +77,6 @@
     return change;
   }
 
-  @override
-  bool requiresPreview() => false;
-
   RefactoringStatus _checkInitialConditions() {
     if (!element.isGetter || element.isSynthetic) {
       return new RefactoringStatus.fatal(
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
index 068f5a7..4f38b26 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
@@ -94,9 +94,6 @@
     return change;
   }
 
-  @override
-  bool requiresPreview() => false;
-
   Future<void> _updateElementDeclaration(Element element) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index e2ade9f..cf9cd10 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -219,9 +219,6 @@
     return !_checkSelection().hasFatalError;
   }
 
-  @override
-  bool requiresPreview() => false;
-
   /**
    * Checks if [selectionRange] selects [Expression] which can be extracted, and
    * location of this [Expression] in AST allows extracting.
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 2d260ed..6969c41 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -16,7 +16,7 @@
 import 'package:analysis_server/src/services/refactoring/rename_class_member.dart';
 import 'package:analysis_server/src/services/refactoring/rename_unit_member.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -75,15 +75,12 @@
 
   final SearchEngine searchEngine;
   final AstProvider astProvider;
-  final CompilationUnit unit;
+  final ResolveResult resolveResult;
   final int selectionOffset;
   final int selectionLength;
-  AnalysisSession session;
-  CompilationUnitElement unitElement;
-  LibraryElement libraryElement;
   SourceRange selectionRange;
   CorrectionUtils utils;
-  Set<Source> librariesToImport = new Set<Source>();
+  final Set<Source> librariesToImport = new Set<Source>();
 
   String returnType = '';
   String variableType;
@@ -98,18 +95,19 @@
   /**
    * The map of local names to their visibility ranges.
    */
-  Map<String, List<SourceRange>> _localNames = <String, List<SourceRange>>{};
+  final Map<String, List<SourceRange>> _localNames =
+      <String, List<SourceRange>>{};
 
   /**
    * The set of names that are referenced without any qualifier.
    */
-  Set<String> _unqualifiedNames = new Set<String>();
+  final Set<String> _unqualifiedNames = new Set<String>();
 
-  Set<String> _excludedNames = new Set<String>();
+  final Set<String> _excludedNames = new Set<String>();
   List<RefactoringMethodParameter> _parameters = <RefactoringMethodParameter>[];
-  Map<String, RefactoringMethodParameter> _parametersMap =
+  final Map<String, RefactoringMethodParameter> _parametersMap =
       <String, RefactoringMethodParameter>{};
-  Map<String, List<SourceRange>> _parameterReferencesMap =
+  final Map<String, List<SourceRange>> _parameterReferencesMap =
       <String, List<SourceRange>>{};
   bool _hasAwait = false;
   DartType _returnType;
@@ -121,13 +119,11 @@
   List<_Occurrence> _occurrences = [];
   bool _staticContext = false;
 
-  ExtractMethodRefactoringImpl(this.searchEngine, this.astProvider, this.unit,
-      this.selectionOffset, this.selectionLength) {
-    unitElement = unit.declaredElement;
-    libraryElement = unitElement.library;
-    session = astProvider.driver.currentSession;
+  ExtractMethodRefactoringImpl(this.searchEngine, this.astProvider,
+      this.resolveResult, this.selectionOffset, this.selectionLength) {
     selectionRange = new SourceRange(selectionOffset, selectionLength);
-    utils = new CorrectionUtils(unit);
+    utils =
+        new CorrectionUtils(resolveResult.unit, buffer: resolveResult.content);
   }
 
   @override
@@ -140,7 +136,8 @@
 
   @override
   String get refactoringName {
-    AstNode node = new NodeLocator(selectionOffset).searchWithin(unit);
+    AstNode node =
+        new NodeLocator(selectionOffset).searchWithin(resolveResult.unit);
     if (node != null &&
         node.getAncestor((node) => node is ClassDeclaration) != null) {
       return 'Extract Method';
@@ -311,7 +308,8 @@
       }
       // add replace edit
       SourceEdit edit = newSourceEdit_range(range, invocationSource);
-      doSourceChange_addElementEdit(change, unitElement, edit);
+      doSourceChange_addElementEdit(
+          change, resolveResult.unit.declaredElement, edit);
     }
     // add method declaration
     {
@@ -391,12 +389,13 @@
         int offset = _parentMember.end;
         SourceEdit edit =
             new SourceEdit(offset, 0, '$eol$eol$prefix$declarationSource');
-        doSourceChange_addElementEdit(change, unitElement, edit);
+        doSourceChange_addElementEdit(
+            change, resolveResult.unit.declaredElement, edit);
       }
     }
     // done
-    addLibraryImports(session.resourceProvider.pathContext, change,
-        libraryElement, librariesToImport);
+    addLibraryImports(resolveResult.session.resourceProvider.pathContext,
+        change, resolveResult.libraryElement, librariesToImport);
     return change;
   }
 
@@ -405,9 +404,6 @@
     return !_checkSelection().hasFatalError;
   }
 
-  @override
-  bool requiresPreview() => false;
-
   /**
    * Adds a new reference to the parameter with the given name.
    */
@@ -482,8 +478,8 @@
     }
 
     _ExtractMethodAnalyzer selectionAnalyzer =
-        new _ExtractMethodAnalyzer(unit, selectionRange);
-    unit.accept(selectionAnalyzer);
+        new _ExtractMethodAnalyzer(resolveResult.unit, selectionRange);
+    resolveResult.unit.accept(selectionAnalyzer);
     // May be a fatal error.
     {
       if (selectionAnalyzer.status.hasFatalError) {
@@ -584,7 +580,8 @@
       return null;
     }
     int offset = selectionRange.offset;
-    AstNode node = new NodeLocator2(offset, offset).searchWithin(unit);
+    AstNode node =
+        new NodeLocator2(offset, offset).searchWithin(resolveResult.unit);
 
     // Check for the parameter list of a FunctionExpression.
     {
@@ -679,7 +676,8 @@
     String originalSource = utils.getText(range.offset, range.length);
     _SourcePattern pattern = new _SourcePattern();
     List<SourceEdit> replaceEdits = <SourceEdit>[];
-    unit.accept(new _GetSourcePatternVisitor(range, pattern, replaceEdits));
+    resolveResult.unit
+        .accept(new _GetSourcePatternVisitor(range, pattern, replaceEdits));
     replaceEdits = replaceEdits.reversed.toList();
     String source = SourceEdit.applySequence(originalSource, replaceEdits);
     pattern.normalizedSource = _getNormalizedSource(source);
@@ -730,7 +728,8 @@
     _parameterReferencesMap.clear();
     RefactoringStatus result = new RefactoringStatus();
     List<VariableElement> assignedUsedVariables = [];
-    unit.accept(new _InitializeParametersVisitor(this, assignedUsedVariables));
+    resolveResult.unit
+        .accept(new _InitializeParametersVisitor(this, assignedUsedVariables));
     // single expression
     if (_selectionExpression != null) {
       _returnType = _selectionExpression.staticType;
@@ -744,7 +743,7 @@
     }
     // maybe ends with "return" statement
     if (_selectionStatements != null) {
-      TypeSystem typeSystem = await session.typeSystem;
+      TypeSystem typeSystem = await resolveResult.session.typeSystem;
       _ReturnTypeComputer returnTypeComputer =
           new _ReturnTypeComputer(typeSystem);
       _selectionStatements.forEach((statement) {
@@ -785,7 +784,7 @@
   Future<void> _initializeReturnType() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    TypeProvider typeProvider = await session.typeProvider;
+    TypeProvider typeProvider = await resolveResult.session.typeProvider;
     InterfaceType futureType = typeProvider.futureType;
     if (_selectionFunctionExpression != null) {
       variableType = '';
@@ -827,7 +826,8 @@
    * Checks if it is OK to extract the node with the given [SourceRange].
    */
   bool _isExtractable(SourceRange range) {
-    _ExtractMethodAnalyzer analyzer = new _ExtractMethodAnalyzer(unit, range);
+    _ExtractMethodAnalyzer analyzer =
+        new _ExtractMethodAnalyzer(resolveResult.unit, range);
     utils.unit.accept(analyzer);
     return analyzer.status.isOK;
   }
@@ -1317,7 +1317,7 @@
   final SourceRange range;
   final bool isSelection;
 
-  Map<String, String> _parameterOldToOccurrenceName = <String, String>{};
+  final Map<String, String> _parameterOldToOccurrenceName = <String, String>{};
 
   _Occurrence(this.range, this.isSelection);
 }
@@ -1365,7 +1365,7 @@
 class _SourcePattern {
   final List<DartType> parameterTypes = <DartType>[];
   String normalizedSource;
-  Map<String, String> originalToPatternNames = {};
+  final Map<String, String> originalToPatternNames = {};
 
   bool isCompatible(_SourcePattern other) {
     if (other.normalizedSource != normalizedSource) {
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 0b00d57..8218754 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -14,7 +14,7 @@
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/dart/analysis/session.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';
@@ -28,18 +28,15 @@
 class ExtractWidgetRefactoringImpl extends RefactoringImpl
     implements ExtractWidgetRefactoring {
   final SearchEngine searchEngine;
+  final ResolveResult resolveResult;
   final AnalysisSessionHelper sessionHelper;
-  final CompilationUnit unit;
   final int offset;
   final int length;
 
-  CompilationUnitElement unitElement;
-  LibraryElement libraryElement;
   CorrectionUtils utils;
 
   ClassElement classBuildContext;
   ClassElement classKey;
-  ClassElement classStatefulWidget;
   ClassElement classStatelessWidget;
   ClassElement classWidget;
   PropertyAccessorElement accessorRequired;
@@ -73,12 +70,11 @@
   /// and [_method] parameters.
   List<_Parameter> _parameters = [];
 
-  ExtractWidgetRefactoringImpl(this.searchEngine, AnalysisSession session,
-      this.unit, this.offset, this.length)
-      : sessionHelper = new AnalysisSessionHelper(session) {
-    unitElement = unit.declaredElement;
-    libraryElement = unitElement.library;
-    utils = new CorrectionUtils(unit);
+  ExtractWidgetRefactoringImpl(
+      this.searchEngine, this.resolveResult, this.offset, this.length)
+      : sessionHelper = new AnalysisSessionHelper(resolveResult.session) {
+    utils =
+        new CorrectionUtils(resolveResult.unit, buffer: resolveResult.content);
   }
 
   @override
@@ -126,7 +122,7 @@
 
     // Check for duplicate declarations.
     if (!result.hasFatalError) {
-      visitLibraryTopLevelElements(libraryElement, (element) {
+      visitLibraryTopLevelElements(resolveResult.libraryElement, (element) {
         if (hasDisplayName(element, name)) {
           String message = format(
               "Library already declares {0} with name '{1}'.",
@@ -144,9 +140,8 @@
   Future<SourceChange> createChange() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    String file = unitElement.source.fullName;
     var changeBuilder = new DartChangeBuilder(sessionHelper.session);
-    await changeBuilder.addFileEdit(file, (builder) {
+    await changeBuilder.addFileEdit(resolveResult.path, (builder) {
       if (_expression != null) {
         builder.addReplacement(range.node(_expression), (builder) {
           _writeWidgetInstantiation(builder);
@@ -172,12 +167,10 @@
     return !_checkSelection().hasFatalError;
   }
 
-  @override
-  bool requiresPreview() => false;
-
   /// Checks if [offset] is a widget creation expression that can be extracted.
   RefactoringStatus _checkSelection() {
-    AstNode node = new NodeLocator(offset, offset + length).searchWithin(unit);
+    AstNode node = new NodeLocator(offset, offset + length)
+        .searchWithin(resolveResult.unit);
 
     // Treat single ReturnStatement as its expression.
     if (node is ReturnStatement) {
@@ -268,7 +261,6 @@
     classBuildContext = await getClass('BuildContext');
     classKey = await getClass('Key');
     classStatelessWidget = await getClass('StatelessWidget');
-    classStatefulWidget = await getClass('StatefulWidget');
     classWidget = await getClass('Widget');
 
     accessorRequired = await getAccessor('package:meta/meta.dart', 'required');
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
index 5ac6f97..eafbcaf 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analysis_server/src/services/search/search_engine.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';
@@ -26,9 +27,8 @@
     implements InlineLocalRefactoring {
   final SearchEngine searchEngine;
   final AstProvider astProvider;
-  final CompilationUnit unit;
+  final ResolveResult resolveResult;
   final int offset;
-  CompilationUnitElement unitElement;
   CorrectionUtils utils;
 
   Element _variableElement;
@@ -36,9 +36,9 @@
   List<SearchMatch> _references;
 
   InlineLocalRefactoringImpl(
-      this.searchEngine, this.astProvider, this.unit, this.offset) {
-    unitElement = unit.declaredElement;
-    utils = new CorrectionUtils(unit);
+      this.searchEngine, this.astProvider, this.resolveResult, this.offset) {
+    utils =
+        new CorrectionUtils(resolveResult.unit, buffer: resolveResult.content);
   }
 
   @override
@@ -73,7 +73,8 @@
     RefactoringStatus result = new RefactoringStatus();
     // prepare variable
     {
-      AstNode offsetNode = new NodeLocator(offset).searchWithin(unit);
+      AstNode offsetNode =
+          new NodeLocator(offset).searchWithin(resolveResult.unit);
       if (offsetNode is SimpleIdentifier) {
         Element element = offsetNode.staticElement;
         if (element is LocalVariableElement) {
@@ -123,8 +124,8 @@
       Statement declarationStatement = _variableNode
           .getAncestor((node) => node is VariableDeclarationStatement);
       SourceRange range = utils.getLinesRangeStatements([declarationStatement]);
-      doSourceChange_addElementEdit(
-          change, unitElement, newSourceEdit_range(range, ''));
+      doSourceChange_addElementEdit(change, resolveResult.unit.declaredElement,
+          newSourceEdit_range(range, ''));
     }
     // prepare initializer
     Expression initializer = _variableNode.initializer;
@@ -160,16 +161,13 @@
         codeForReference = initializerCode;
       }
       // do replace
-      doSourceChange_addElementEdit(change, unitElement,
+      doSourceChange_addElementEdit(change, resolveResult.unit.declaredElement,
           newSourceEdit_range(editRange, codeForReference));
     }
     // done
     return new Future.value(change);
   }
 
-  @override
-  bool requiresPreview() => false;
-
   bool _isVariableDeclaredInStatement() {
     if (_variableNode == null) {
       return false;
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 a57352f..05e5c1b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -12,6 +12,7 @@
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
 import 'package:analysis_server/src/services/search/search_engine.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';
@@ -188,7 +189,7 @@
     implements InlineMethodRefactoring {
   final SearchEngine searchEngine;
   final AstProvider astProvider;
-  final CompilationUnit unit;
+  final ResolveResult resolveResult;
   final int offset;
   ResolvedUnitCache _unitCache;
   CorrectionUtils utils;
@@ -208,13 +209,14 @@
   Expression _methodExpression;
   _SourcePart _methodExpressionPart;
   _SourcePart _methodStatementsPart;
-  List<_ReferenceProcessor> _referenceProcessors = [];
-  Set<FunctionBody> _alreadyMadeAsync = new Set<FunctionBody>();
+  final List<_ReferenceProcessor> _referenceProcessors = [];
+  final Set<FunctionBody> _alreadyMadeAsync = new Set<FunctionBody>();
 
   InlineMethodRefactoringImpl(
-      this.searchEngine, this.astProvider, this.unit, this.offset) {
-    _unitCache = new ResolvedUnitCache(astProvider, unit);
-    utils = new CorrectionUtils(unit);
+      this.searchEngine, this.astProvider, this.resolveResult, this.offset) {
+    _unitCache = new ResolvedUnitCache(astProvider, resolveResult.unit);
+    utils =
+        new CorrectionUtils(resolveResult.unit, buffer: resolveResult.content);
   }
 
   @override
@@ -309,9 +311,6 @@
     return new Future.value(change);
   }
 
-  @override
-  bool requiresPreview() => false;
-
   Future<FunctionDeclaration> _computeFunctionDeclaration() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -355,7 +354,7 @@
     RefactoringStatus fatalStatus = new RefactoringStatus.fatal(
         'Method declaration or reference must be selected to activate this refactoring.');
     // prepare selected SimpleIdentifier
-    AstNode node = new NodeLocator(offset).searchWithin(unit);
+    AstNode node = new NodeLocator(offset).searchWithin(resolveResult.unit);
     if (node is! SimpleIdentifier) {
       return fatalStatus;
     }
@@ -799,12 +798,12 @@
   /**
    * The [SourceRange] of the element body.
    */
-  SourceRange bodyRange;
+  final SourceRange bodyRange;
 
   /**
    * The [_SourcePart] to record reference into.
    */
-  _SourcePart result;
+  final _SourcePart result;
 
   int offset;
 
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index 7b871e0..d5d1853 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -10,9 +10,10 @@
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:path/path.dart' as pathos;
@@ -45,12 +46,21 @@
 
   @override
   Future<RefactoringStatus> checkFinalConditions() async {
-    final drivers = workspace.driversContaining(newFile);
+    final drivers = workspace.driversContaining(oldFile);
     if (drivers.length != 1) {
-      return new RefactoringStatus.fatal(
-          'Unable to find a single driver for $newFile.');
+      if (workspace.drivers
+          .any((d) => pathContext.equals(d.contextRoot.root, oldFile))) {
+        return new RefactoringStatus.fatal(
+            'Renaming an analysis root is not supported ($oldFile)');
+      } else {
+        return new RefactoringStatus.fatal(
+            '$oldFile does not belong to an analysis root.');
+      }
     }
     driver = drivers.first;
+    if (!driver.resourceProvider.getFile(oldFile).exists) {
+      return new RefactoringStatus.fatal('$oldFile does not exist.');
+    }
     return new RefactoringStatus();
   }
 
@@ -78,6 +88,24 @@
         _updateUriReferences(builder, library.exports, oldDir, newDir);
         _updateUriReferences(builder, library.parts, oldDir, newDir);
       });
+    } else {
+      // Otherwise, we need to update any relative part-of references.
+      Iterable<PartOfDirective> partOfs = element.unit.directives
+          .whereType<PartOfDirective>()
+          .where((po) => po.uri != null && _isRelativeUri(po.uri.stringValue));
+
+      if (partOfs.isNotEmpty) {
+        await changeBuilder.addFileEdit(element.source.fullName, (builder) {
+          partOfs.forEach((po) {
+            final oldDir = pathContext.dirname(oldFile);
+            final newDir = pathContext.dirname(newFile);
+            String oldLocation = pathContext.join(oldDir, po.uri.stringValue);
+            String newUri = _getRelativeUri(oldLocation, newDir);
+            builder.addSimpleReplacement(
+                new SourceRange(po.uri.offset, po.uri.length), "'$newUri'");
+          });
+        });
+      }
     }
 
     // Update incoming references to this file
@@ -94,8 +122,23 @@
     return changeBuilder.sourceChange;
   }
 
-  @override
-  bool requiresPreview() => false;
+  /**
+   * Computes the URI to use to reference [newFile] from [reference].
+   */
+  String _computeNewUri(SourceReference reference) {
+    String refDir = pathContext.dirname(reference.file);
+    // try to keep package: URI
+    // if (_isPackageReference(reference)) {
+    //   Source newSource = new NonExistingSource(
+    //       newFile, pathos.toUri(newFile), UriKind.FILE_URI);
+    //   Uri restoredUri = context.sourceFactory.restoreUri(newSource);
+    //   if (restoredUri != null) {
+    //     return restoredUri.toString();
+    //   }
+    // }
+    // if no package: URI, prepare relative
+    return _getRelativeUri(newFile, refDir);
+  }
 
   String _getRelativeUri(String path, String from) {
     String uri = pathContext.relative(path, from: from);
@@ -144,22 +187,4 @@
       _updateUriReference(builder, element, oldDir, newDir);
     }
   }
-
-  /**
-   * Computes the URI to use to reference [newFile] from [reference].
-   */
-  String _computeNewUri(SourceReference reference) {
-    String refDir = pathContext.dirname(reference.file);
-    // try to keep package: URI
-    // if (_isPackageReference(reference)) {
-    //   Source newSource = new NonExistingSource(
-    //       newFile, pathos.toUri(newFile), UriKind.FILE_URI);
-    //   Uri restoredUri = context.sourceFactory.restoreUri(newSource);
-    //   if (restoredUri != null) {
-    //     return restoredUri.toString();
-    //   }
-    // }
-    // if no package: URI, prepare relative
-    return _getRelativeUri(newFile, refDir);
-  }
 }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index 238c857..50e2344 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -22,7 +22,6 @@
 import 'package:analysis_server/src/services/refactoring/rename_unit_member.dart';
 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';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
@@ -146,11 +145,11 @@
   factory ExtractMethodRefactoring(
       SearchEngine searchEngine,
       AstProvider astProvider,
-      CompilationUnit unit,
+      ResolveResult resolveResult,
       int selectionOffset,
       int selectionLength) {
-    return new ExtractMethodRefactoringImpl(
-        searchEngine, astProvider, unit, selectionOffset, selectionLength);
+    return new ExtractMethodRefactoringImpl(searchEngine, astProvider,
+        resolveResult, selectionOffset, selectionLength);
   }
 
   /**
@@ -244,9 +243,9 @@
    * Returns a new [ExtractWidgetRefactoring] instance.
    */
   factory ExtractWidgetRefactoring(SearchEngine searchEngine,
-      AnalysisSession session, CompilationUnit unit, int offset, int length) {
+      ResolveResult resolveResult, int offset, int length) {
     return new ExtractWidgetRefactoringImpl(
-        searchEngine, session, unit, offset, length);
+        searchEngine, resolveResult, offset, length);
   }
 
   /**
@@ -280,9 +279,9 @@
    * Returns a new [InlineLocalRefactoring] instance.
    */
   factory InlineLocalRefactoring(SearchEngine searchEngine,
-      AstProvider astProvider, CompilationUnit unit, int offset) {
+      AstProvider astProvider, ResolveResult resolveResult, int offset) {
     return new InlineLocalRefactoringImpl(
-        searchEngine, astProvider, unit, offset);
+        searchEngine, astProvider, resolveResult, offset);
   }
 
   /**
@@ -304,9 +303,9 @@
    * Returns a new [InlineMethodRefactoring] instance.
    */
   factory InlineMethodRefactoring(SearchEngine searchEngine,
-      AstProvider astProvider, CompilationUnit unit, int offset) {
+      AstProvider astProvider, ResolveResult resolveResult, int offset) {
     return new InlineMethodRefactoringImpl(
-        searchEngine, astProvider, unit, offset);
+        searchEngine, astProvider, resolveResult, offset);
   }
 
   /**
@@ -402,12 +401,6 @@
    * Returns the [Change] to apply to perform this refactoring.
    */
   Future<SourceChange> createChange();
-
-  /**
-   * Returs `true` if the [Change] created by refactoring may be unsafe,
-   * so we want user to review the [Change] to ensure that he understands it.
-   */
-  bool requiresPreview();
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index 3b201fb..d7f193c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -121,11 +121,6 @@
    */
   Future<void> fillChange();
 
-  @override
-  bool requiresPreview() {
-    return false;
-  }
-
   static String _getDisplayName(Element element) {
     if (element is ImportElement) {
       PrefixElement prefix = element.prefix;
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 4fd78db..9e22d01 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -27,7 +27,6 @@
    */
   final DartSdkManager sdkManager;
 
-  final DartSdk defaultSdk;
   final InstrumentationService instrumentationService;
   final DiagnosticServer diagnosticServer;
   final ResolverProvider fileResolverProvider;
@@ -43,7 +42,6 @@
   SocketServer(
       this.analysisServerOptions,
       this.sdkManager,
-      this.defaultSdk,
       this.instrumentationService,
       this.diagnosticServer,
       this.fileResolverProvider,
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 40a157d..ecbbbb32 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -20,8 +20,8 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 
 import 'mock_sdk.dart';
 import 'src/utilities/flutter_util.dart';
diff --git a/pkg/analysis_server/test/analysis/get_navigation_test.dart b/pkg/analysis_server/test/analysis/get_navigation_test.dart
index c2d0241..20f6b0f 100644
--- a/pkg/analysis_server/test/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/get_navigation_test.dart
@@ -65,7 +65,7 @@
   }
 
   test_fileDoesNotExist() async {
-    String file = '$projectPath/doesNotExist.dart';
+    String file = convertPath('$projectPath/doesNotExist.dart');
     Request request = _createGetNavigationRequest(file, 0, 100);
     Response response = await serverChannel.sendRequest(request);
     expect(response.error, isNull);
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 6d4af90..a2911fa 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -24,8 +24,8 @@
 import 'package:analyzer/src/summary/summary_file_builder.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/util/glob.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:linter/src/rules.dart';
 import 'package:linter/src/rules/avoid_as.dart';
 import 'package:path/path.dart' as path;
@@ -57,11 +57,10 @@
 @reflectiveTest
 class AbstractContextManagerTest extends ContextManagerTest {
   void test_contextsInAnalysisRoot_nestedContext() {
-    String subProjPath = path.posix.join(projPath, 'subproj');
+    String subProjPath = join(projPath, 'subproj');
     Folder subProjFolder = resourceProvider.newFolder(subProjPath);
-    resourceProvider.newFile(
-        path.posix.join(subProjPath, 'pubspec.yaml'), 'contents');
-    String subProjFilePath = path.posix.join(subProjPath, 'file.dart');
+    resourceProvider.newFile(join(subProjPath, 'pubspec.yaml'), 'contents');
+    String subProjFilePath = join(subProjPath, 'file.dart');
     resourceProvider.newFile(subProjFilePath, 'contents');
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     // Make sure that there really are contexts for both the main project and
@@ -194,11 +193,10 @@
   }
 
   void test_isInAnalysisRoot_inNestedContext() {
-    String subProjPath = path.posix.join(projPath, 'subproj');
+    String subProjPath = join(projPath, 'subproj');
     Folder subProjFolder = resourceProvider.newFolder(subProjPath);
-    resourceProvider.newFile(
-        path.posix.join(subProjPath, 'pubspec.yaml'), 'contents');
-    String subProjFilePath = path.posix.join(subProjPath, 'file.dart');
+    resourceProvider.newFile(join(subProjPath, 'pubspec.yaml'), 'contents');
+    String subProjFilePath = join(subProjPath, 'file.dart');
     resourceProvider.newFile(subProjFilePath, 'contents');
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     // Make sure that there really is a context for the subproject.
@@ -221,14 +219,14 @@
 
   test_packagesFolder_areAnalyzed() {
     // create a context with a pubspec.yaml file
-    String pubspecPath = path.posix.join(projPath, 'pubspec.yaml');
+    String pubspecPath = join(projPath, 'pubspec.yaml');
     resourceProvider.newFile(pubspecPath, 'pubspec');
     // create a file in the "packages" folder
-    String filePath1 = path.posix.join(projPath, 'packages', 'file1.dart');
+    String filePath1 = join(projPath, 'packages', 'file1.dart');
     File file1 = resourceProvider.newFile(filePath1, 'contents');
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     expect(callbacks.currentFilePaths, unorderedEquals([file1.path]));
-    String filePath2 = path.posix.join(projPath, 'packages', 'file2.dart');
+    String filePath2 = join(projPath, 'packages', 'file2.dart');
     File file2 = resourceProvider.newFile(filePath2, 'contents');
     return pumpEventQueue().then((_) {
       expect(callbacks.currentFilePaths,
@@ -264,7 +262,7 @@
 
   test_refresh_folder_with_packagespec() {
     // create a context with a .packages file
-    String packagespecFile = path.posix.join(projPath, '.packages');
+    String packagespecFile = join(projPath, '.packages');
     resourceProvider.newFile(packagespecFile, '');
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     return pumpEventQueue().then((_) {
@@ -308,7 +306,7 @@
 
   test_refresh_folder_with_pubspec() {
     // create a context with a pubspec.yaml file
-    String pubspecPath = path.posix.join(projPath, 'pubspec.yaml');
+    String pubspecPath = join(projPath, 'pubspec.yaml');
     resourceProvider.newFile(pubspecPath, 'pubspec');
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     return pumpEventQueue().then((_) {
@@ -498,10 +496,11 @@
 
   void test_setRoots_addFolderWithPackagespec() {
     String packagespecPath = join(projPath, '.packages');
-    resourceProvider.newFile(packagespecPath,
-        'unittest:file:///home/somebody/.pub/cache/unittest-0.9.9/lib/');
+    var testLib = convertPath('/home/somebody/.pub/cache/unittest-0.9.9/lib');
+    var testLibUri = resourceProvider.pathContext.toUri(testLib);
+    resourceProvider.newFile(packagespecPath, 'unittest:$testLibUri');
     String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
-    File mainFile = resourceProvider.newFile(join(libPath, 'main.dart'), '');
+    File mainFile = newFile('$libPath/main.dart', content: '');
     Source source = mainFile.createSource();
 
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
@@ -514,17 +513,15 @@
     Source resolvedSource =
         sourceFactory.resolveUri(source, 'package:unittest/unittest.dart');
     expect(resolvedSource, isNotNull);
-    expect(
-        resolvedSource.fullName,
-        equals(convertPath(
-            '/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart')));
+    expect(resolvedSource.fullName, convertPath('$testLib/unittest.dart'));
   }
 
   void test_setRoots_addFolderWithPackagespecAndPackageRoot() {
     // The package root should take priority.
-    String packagespecPath = path.posix.join(projPath, '.packages');
-    resourceProvider.newFile(packagespecPath,
-        'unittest:file:///home/somebody/.pub/cache/unittest-0.9.9/lib/');
+    String packagespecPath = join(projPath, '.packages');
+    var testLib = convertPath('/home/somebody/.pub/cache/unittest-0.9.9/lib');
+    var testLibUri = resourceProvider.pathContext.toUri(testLib);
+    resourceProvider.newFile(packagespecPath, 'unittest:$testLibUri');
     String packageRootPath = '/package/root/';
     manager.setRoots(<String>[projPath], <String>[],
         <String, String>{projPath: packageRootPath});
@@ -533,7 +530,7 @@
   }
 
   void test_setRoots_addFolderWithPubspec() {
-    String pubspecPath = path.posix.join(projPath, 'pubspec.yaml');
+    String pubspecPath = join(projPath, 'pubspec.yaml');
     resourceProvider.newFile(pubspecPath, 'pubspec');
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     // verify
@@ -542,8 +539,8 @@
   }
 
   void test_setRoots_addFolderWithPubspec_andPackagespec() {
-    String pubspecPath = path.posix.join(projPath, 'pubspec.yaml');
-    String packagespecPath = path.posix.join(projPath, '.packages');
+    String pubspecPath = join(projPath, 'pubspec.yaml');
+    String packagespecPath = join(projPath, '.packages');
     resourceProvider.newFile(pubspecPath, 'pubspec');
     resourceProvider.newFile(packagespecPath, '');
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
@@ -587,14 +584,14 @@
     String subProjectA_file = convertPath('$subProjectA/bin/a.dart');
     String subProjectB_file = convertPath('$subProjectB/bin/b.dart');
     // create files
-    resourceProvider.newFile('$subProjectA/pubspec.yaml', 'pubspec');
-    resourceProvider.newFile('$subProjectB/pubspec.yaml', 'pubspec');
-    resourceProvider.newFile('$subProjectA/.packages', '');
-    resourceProvider.newFile('$subProjectB/.packages', '');
+    newFile('$subProjectA/pubspec.yaml', content: 'pubspec');
+    newFile('$subProjectB/pubspec.yaml', content: 'pubspec');
+    newFile('$subProjectA/.packages', content: '');
+    newFile('$subProjectB/.packages', content: '');
 
-    resourceProvider.newFile(rootFile, 'library root;');
-    resourceProvider.newFile(subProjectA_file, 'library a;');
-    resourceProvider.newFile(subProjectB_file, 'library b;');
+    newFile(rootFile, content: 'library root;');
+    newFile(subProjectA_file, content: 'library a;');
+    newFile(subProjectB_file, content: 'library b;');
 
     // set roots
     manager.setRoots(<String>[root], <String>[], <String, String>{});
@@ -927,7 +924,7 @@
   }
 
   void test_setRoots_noContext_inDotFolder() {
-    String pubspecPath = path.posix.join(projPath, '.pub', 'pubspec.yaml');
+    String pubspecPath = join(projPath, '.pub', 'pubspec.yaml');
     resourceProvider.newFile(pubspecPath, 'name: test');
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     // verify
@@ -952,7 +949,7 @@
   }
 
   void test_setRoots_packagesFolder_hasContext() {
-    String pubspecPath = path.posix.join(projPath, 'packages', 'pubspec.yaml');
+    String pubspecPath = join(projPath, 'packages', 'pubspec.yaml');
     resourceProvider.newFile(pubspecPath, 'name: test');
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     // verify
@@ -986,7 +983,7 @@
 
   void test_setRoots_removeFolderWithPackagespec() {
     // create a pubspec
-    String pubspecPath = path.posix.join(projPath, '.packages');
+    String pubspecPath = join(projPath, '.packages');
     resourceProvider.newFile(pubspecPath, '');
     // add one root - there is a context
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
@@ -1036,7 +1033,7 @@
 
   void test_setRoots_removeFolderWithPubspec() {
     // create a pubspec
-    String pubspecPath = path.posix.join(projPath, 'pubspec.yaml');
+    String pubspecPath = join(projPath, 'pubspec.yaml');
     resourceProvider.newFile(pubspecPath, 'pubspec');
     // add one root - there is a context
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
@@ -1118,7 +1115,7 @@
     // empty folder initially
     expect(callbacks.currentFilePaths, isEmpty);
     // add link
-    String filePath = path.posix.join(projPath, 'foo.dart');
+    String filePath = join(projPath, 'foo.dart');
     resourceProvider.newDummyLink(filePath);
     // the link was ignored
     return pumpEventQueue().then((_) {
@@ -2627,21 +2624,6 @@
   }
 
   @override
-  void moveContext(Folder from, Folder to) {
-    String path = from.path;
-    String path2 = to.path;
-    expect(currentContextFilePaths, contains(path));
-    expect(currentContextTimestamps, contains(path));
-    expect(currentContextSources, contains(path));
-    expect(currentContextFilePaths, isNot(contains(path2)));
-    expect(currentContextTimestamps, isNot(contains(path2)));
-    expect(currentContextSources, isNot(contains(path2)));
-    currentContextFilePaths[path2] = currentContextFilePaths.remove(path);
-    currentContextTimestamps[path2] = currentContextTimestamps.remove(path);
-    currentContextSources[path2] = currentContextSources.remove(path);
-  }
-
-  @override
   void removeContext(Folder folder, List<String> flushedFiles) {
     String path = folder.path;
     expect(currentContextRoots, contains(path));
diff --git a/pkg/analysis_server/test/domain_diagnostic_test.dart b/pkg/analysis_server/test/domain_diagnostic_test.dart
index 7601a5e..7a84c54 100644
--- a/pkg/analysis_server/test/domain_diagnostic_test.dart
+++ b/pkg/analysis_server/test/domain_diagnostic_test.dart
@@ -29,7 +29,7 @@
     newFile('/project/pubspec.yaml', content: 'name: project');
     newFile('/project/bin/test.dart', content: 'main() {}');
 
-    server.setAnalysisRoots('0', [convertPath('/project/')], [], {});
+    server.setAnalysisRoots('0', [convertPath('/project')], [], {});
 
     await server.onAnalysisComplete;
 
diff --git a/pkg/analysis_server/test/domain_execution_test.dart b/pkg/analysis_server/test/domain_execution_test.dart
index 1370637..9805a59 100644
--- a/pkg/analysis_server/test/domain_execution_test.dart
+++ b/pkg/analysis_server/test/domain_execution_test.dart
@@ -201,12 +201,16 @@
     Response response = await waitResponse(request);
 
     var result = new ExecutionGetSuggestionsResult.fromResponse(response);
-    expect(result.suggestions, isNotEmpty);
+//    expect(result.suggestions, isNotEmpty);
+//
+//    expect(
+//        result.suggestions,
+//        contains(
+//            predicate<CompletionSuggestion>((s) => s.completion == 'foo')));
 
-    expect(
-        result.suggestions,
-        contains(
-            predicate<CompletionSuggestion>((s) => s.completion == 'foo')));
+    // TODO(brianwilkerson) Restore the expectations above (and delete the line
+    // below) after the functionality has been re-enabled.
+    expect(result.suggestions, isEmpty);
   }
 
   void test_mapUri_file() {
diff --git a/pkg/analysis_server/test/edit/sort_members_test.dart b/pkg/analysis_server/test/edit/sort_members_test.dart
index d6b70c1..2da9a0a 100644
--- a/pkg/analysis_server/test/edit/sort_members_test.dart
+++ b/pkg/analysis_server/test/edit/sort_members_test.dart
@@ -35,7 +35,8 @@
   test_BAD_doesNotExist() async {
     // The analysis driver fails to return an error
     Request request =
-        new EditSortMembersParams('/no/such/file.dart').toRequest('0');
+        new EditSortMembersParams(convertPath('/no/such/file.dart'))
+            .toRequest('0');
     Response response = await waitResponse(request);
     expect(response,
         isResponseFailure('0', RequestErrorCode.SORT_MEMBERS_INVALID_FILE));
diff --git a/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart b/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
index 150c67f..eb2ea8b 100644
--- a/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
@@ -35,6 +35,7 @@
     await analysisFinished;
 
     AnalysisGetReachableSourcesResult result =
+        // ignore: deprecated_member_use
         await sendAnalysisGetReachableSources(pathname);
     Map<String, List<String>> sources = result.sources;
     List<String> keys = sources.keys.toList();
diff --git a/pkg/analysis_server/test/integration/search/find_element_references_test.dart b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
index 10bfbfa..6ea7f6e 100644
--- a/pkg/analysis_server/test/integration/search/find_element_references_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
@@ -41,8 +41,10 @@
   test_findReferences() async {
     String text = r'''
 main() {
-  print /* target */ ('Hello');
+  foo /* target */ ('Hello');
 }
+
+foo(String str) {}
 ''';
 
     pathname = sourcePath('foo.dart');
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 0d95b2b..b2954eb 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -395,6 +395,7 @@
    *   reachable from a given file, clients can check for its presence in the
    *   resulting key set.
    */
+  @deprecated
   Future<AnalysisGetReachableSourcesResult> sendAnalysisGetReachableSources(
       String file) async {
     var params = new AnalysisGetReachableSourcesParams(file).toJson();
@@ -1505,17 +1506,31 @@
    * included: List<FilePath>
    *
    *   A list of the files and directories for which edits should be suggested.
-   *   If a request is made for a file which does not exist, or which is not
-   *   currently subject to analysis (e.g. because it is not associated with
-   *   any analysis root specified to analysis.setAnalysisRoots), an error of
-   *   type FORMAT_INVALID_FILE will be generated.
+   *
+   *   If a request is made with a path that is invalid, e.g. is not absolute
+   *   and normalized, an error of type INVALID_FILE_PATH_FORMAT will be
+   *   generated. If a request is made for a file which does not exist, or
+   *   which is not currently subject to analysis (e.g. because it is not
+   *   associated with any analysis root specified to
+   *   analysis.setAnalysisRoots), an error of type FILE_NOT_ANALYZED will be
+   *   generated.
    *
    * Returns
    *
-   * description: List<String>
+   * descriptionOfFixes: List<String>
    *
    *   A list of human readable changes made by applying the fixes.
    *
+   * otherRecommendations: List<String>
+   *
+   *   A list of human readable recommended changes that cannot be made
+   *   automatically.
+   *
+   * hasErrors: bool
+   *
+   *   True if the analyzed source contains errors that might impact the
+   *   correctness of the recommended fixes that can be automatically applied.
+   *
    * fixes: List<SourceFileEdit>
    *
    *   The suggested fixes.
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index 26ecc39..f2f732b 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -1280,9 +1280,7 @@
  *   SERVER_ERROR
  *   SORT_MEMBERS_INVALID_FILE
  *   SORT_MEMBERS_PARSE_ERRORS
- *   UNANALYZED_PRIORITY_FILES
  *   UNKNOWN_REQUEST
- *   UNKNOWN_SOURCE
  *   UNSUPPORTED_FEATURE
  * }
  */
@@ -1313,9 +1311,7 @@
   "SERVER_ERROR",
   "SORT_MEMBERS_INVALID_FILE",
   "SORT_MEMBERS_PARSE_ERRORS",
-  "UNANALYZED_PRIORITY_FILES",
   "UNKNOWN_REQUEST",
-  "UNKNOWN_SOURCE",
   "UNSUPPORTED_FEATURE"
 ]);
 
@@ -2135,13 +2131,19 @@
  * edit.dartfix result
  *
  * {
- *   "description": List<String>
+ *   "descriptionOfFixes": List<String>
+ *   "otherRecommendations": List<String>
+ *   "hasErrors": bool
  *   "fixes": List<SourceFileEdit>
  * }
  */
-final Matcher isEditDartfixResult = new LazyMatcher(() => new MatchesJsonObject(
-    "edit.dartfix result",
-    {"description": isListOf(isString), "fixes": isListOf(isSourceFileEdit)}));
+final Matcher isEditDartfixResult =
+    new LazyMatcher(() => new MatchesJsonObject("edit.dartfix result", {
+          "descriptionOfFixes": isListOf(isString),
+          "otherRecommendations": isListOf(isString),
+          "hasErrors": isBool,
+          "fixes": isListOf(isSourceFileEdit)
+        }));
 
 /**
  * edit.format params
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 9286f27..6c4b927 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -10,7 +10,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel/channel.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:front_end/src/base/timestamped_data.dart';
+import 'package:analyzer/src/generated/timestamped_data.dart';
 import 'package:test/test.dart';
 
 /**
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index af72494..d6d427d 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -213,21 +213,6 @@
         }));
   }
 
-  void test_create_unanalyzedPriorityFiles() {
-    Response response = new Response.unanalyzedPriorityFiles('0', 'file list');
-    expect(response.id, equals('0'));
-    expect(response.error, isNotNull);
-    expect(
-        response.toJson(),
-        equals({
-          Response.ID: '0',
-          Response.ERROR: {
-            'code': 'UNANALYZED_PRIORITY_FILES',
-            'message': "Unanalyzed files cannot be a priority: 'file list'"
-          }
-        }));
-  }
-
   void test_create_unknownRequest() {
     Response response = new Response.unknownRequest(new Request('0', ''));
     expect(response.id, equals('0'));
diff --git a/pkg/analysis_server/test/search/type_hierarchy_test.dart b/pkg/analysis_server/test/search/type_hierarchy_test.dart
index ee2f6b5..dfeea6a 100644
--- a/pkg/analysis_server/test/search/type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/search/type_hierarchy_test.dart
@@ -1072,7 +1072,7 @@
 
   Future<void> test_superOnly_fileDoesNotExist() async {
     Request request = new SearchGetTypeHierarchyParams(
-            '/does/not/exist.dart', 0,
+            convertPath('/does/not/exist.dart'), 0,
             superOnly: true)
         .toRequest(requestId);
     Response response = await serverChannel.sendRequest(request);
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 015c377..fc67b56 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
@@ -382,7 +382,7 @@
         defaultArgListString: defaultArgListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges);
     expect(cs.declaringType, equals(declaringType));
-    expect(cs.returnType, returnType != null ? returnType : 'dynamic');
+    expect(cs.returnType, returnType ?? 'dynamic');
     Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(ElementKind.METHOD));
@@ -391,7 +391,7 @@
     expect(param, isNotNull);
     expect(param[0], equals('('));
     expect(param[param.length - 1], equals(')'));
-    expect(element.returnType, returnType != null ? returnType : 'dynamic');
+    expect(element.returnType, returnType ?? 'dynamic');
     assertHasParameterInfo(cs);
     return cs;
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
index be6cb0a..d4689fe 100644
--- a/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
@@ -203,7 +203,7 @@
     assertSuggestMethod('y2', 'A2', 'int');
   }
 
-  test_method_in_class() async {
+  test_method_inClass() async {
     addTestSource('''
 class A {
   void m(x, int y) {}
@@ -214,6 +214,30 @@
     assertNotSuggested('m');
   }
 
+  test_method_inMixin() async {
+    addTestSource('''
+mixin A {
+  void m(x, int y) {}
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_method_inMixin_fromSuperclassConstraint() async {
+    addTestSource('''
+class C {
+  void c(x, int y) {}
+}
+mixin M on C {
+  m() {^}
+}
+''');
+    await computeSuggestions();
+    assertSuggestMethod('c', 'C', 'void');
+  }
+
   test_method_parameters_mixed_required_and_named() async {
     resolveSource('/libA.dart', '''
 class A {
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index ea5d2cc..a20b367 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -3645,6 +3645,23 @@
     assertNotSuggested('ms3');
   }
 
+  test_super_withMixin() async {
+    addTestSource('''
+mixin M {
+  void m() {}
+}
+
+class C with M {
+  void c() {
+    super.^;
+  }
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('c');
+    assertSuggestMethod('m', 'M', 'void');
+  }
+
   test_SwitchStatement_c() async {
     // SwitchStatement  Block  BlockFunctionBody  MethodDeclaration
     addTestSource('class A {String g(int x) {switch(x) {c^}}}');
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index 25aa478..2241cfd 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -746,6 +746,15 @@
     await assertNoAssistAt('f();', DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE);
   }
 
+  test_convertClassToMixin_abstract() async {
+    await resolveTestUnit('''
+abstract class A {}
+''');
+    await assertHasAssistAt('A', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
+mixin A {}
+''');
+  }
+
   test_convertClassToMixin_extends_noSuper() async {
     await resolveTestUnit('''
 class A {}
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 6e8e2f2..93b95a7 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -251,11 +251,19 @@
 
   Future<AnalysisError> _findErrorToFix() async {
     List<AnalysisError> errors = await _computeErrors();
+    List<AnalysisError> filteredErrors = errors;
     if (errorFilter != null) {
-      errors = errors.where(errorFilter).toList();
+      filteredErrors = filteredErrors.where(errorFilter).toList();
     }
-    expect(errors, hasLength(1));
-    return errors[0];
+    if (filteredErrors.length != 1) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.writeln('Expected one error, found:');
+      for (AnalysisError error in errors) {
+        buffer.writeln('  $error [${error.errorCode}]');
+      }
+      fail(buffer.toString());
+    }
+    return filteredErrors[0];
   }
 
   Future<AnalysisError> _findErrorToFixOfType(ErrorCode errorCode) async {
@@ -304,45 +312,46 @@
     await assertNoFix(DartFixKind.ADD_ASYNC);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_addAsync_blockFunctionBody() async {
+    errorFilter = (AnalysisError error) {
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
+    };
     await resolveTestUnit('''
 foo() {}
 main() {
   await foo();
 }
 ''');
-    List<AnalysisError> errors = await _computeErrors();
-    expect(errors, hasLength(2));
-    errors.sort((a, b) => a.message.compareTo(b.message));
-    // No fix for ";".
-    {
-      AnalysisError error = errors[0];
-      expect(error.message, "Expected to find ';'.");
-      List<Fix> fixes = await _computeFixes(error);
-      expect(fixes, isEmpty);
-    }
-    // Has fix for "await".
-    {
-      AnalysisError error = errors[1];
-      expect(error.message, startsWith("Undefined name 'await' in function"));
-      List<Fix> fixes = await _computeFixes(error);
-      // has exactly one fix
-      expect(fixes, hasLength(1));
-      Fix fix = fixes[0];
-      expect(fix.kind, DartFixKind.ADD_ASYNC);
-      // apply to "file"
-      List<SourceFileEdit> fileEdits = fix.change.edits;
-      expect(fileEdits, hasLength(1));
-      resultCode = SourceEdit.applySequence(testCode, fileEdits[0].edits);
-      // verify
-      expect(resultCode, '''
+    await assertHasFix(DartFixKind.ADD_ASYNC, '''
 foo() {}
 main() async {
   await foo();
 }
 ''');
-    }
+  }
+
+  test_addAsync_blockFunctionBody_getter() async {
+    errorFilter = (AnalysisError error) {
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
+    };
+    await resolveTestUnit('''
+int get foo => null;
+int f() {
+  await foo;
+  return 1;
+}
+''');
+    await assertHasFix(DartFixKind.ADD_ASYNC, '''
+import \'dart:async\';
+
+int get foo => null;
+Future<int> f() async {
+  await foo;
+  return 1;
+}
+''');
   }
 
   test_addAsync_closure() async {
@@ -365,10 +374,9 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_addAsync_expressionFunctionBody() async {
     errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+      return error.errorCode == ParserErrorCode.UNEXPECTED_TOKEN;
     };
     await resolveTestUnit('''
 foo() {}
@@ -380,10 +388,10 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_addAsync_returnFuture() async {
     errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
     };
     await resolveTestUnit('''
 foo() {}
@@ -403,10 +411,10 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_addAsync_returnFuture_alreadyFuture() async {
     errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
     };
     await resolveTestUnit('''
 import 'dart:async';
@@ -426,10 +434,10 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_addAsync_returnFuture_dynamic() async {
     errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
     };
     await resolveTestUnit('''
 foo() {}
@@ -447,10 +455,10 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_addAsync_returnFuture_noType() async {
     errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
     };
     await resolveTestUnit('''
 foo() {}
@@ -3527,7 +3535,6 @@
 ''');
   }
 
-  @failingTest
   test_createLocalVariable_functionType_synthetic() async {
     await resolveTestUnit('''
 foo(f(int p)) {}
@@ -3535,7 +3542,13 @@
   foo(bar);
 }
 ''');
-    await assertNoFix(DartFixKind.CREATE_LOCAL_VARIABLE);
+    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
+foo(f(int p)) {}
+main() {
+  Function(int p) bar;
+  foo(bar);
+}
+''');
   }
 
   test_createLocalVariable_read_typeAssignment() async {
@@ -4628,23 +4641,6 @@
 ''');
   }
 
-  @failingTest // This is likely not going to be an error in dart 2.
-  test_illegalAsyncReturnType_void() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
-    };
-    await resolveTestUnit('''
-import 'dart:async';
-void main() async {
-}
-''');
-    await assertHasFix(DartFixKind.REPLACE_RETURN_TYPE_FUTURE, '''
-import 'dart:async';
-Future main() async {
-}
-''');
-  }
-
   test_importLibraryPackage_preferDirectOverExport() async {
     _configureMyPkg({'b.dart': 'class Test {}', 'a.dart': "export 'b.dart';"});
     await resolveTestUnit('''
@@ -5821,7 +5817,6 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/33992')
   test_replaceVarWithDynamic() async {
     errorFilter = (AnalysisError error) {
       return error.errorCode == ParserErrorCode.VAR_AS_TYPE_NAME;
@@ -5853,23 +5848,6 @@
 ''');
   }
 
-  @failingTest
-  test_replaceWithConstInstanceCreation_implicitNew() async {
-    // This test fails because the implicit `new` isn't yet recognized.
-    await resolveTestUnit('''
-class A {
-  const A();
-}
-const a = A();
-''');
-    await assertHasFix(DartFixKind.USE_CONST, '''
-class A {
-  const A();
-}
-const a = const A();
-''');
-  }
-
   test_undefinedClass_useSimilar_BAD_prefixed() async {
     await resolveTestUnit('''
 import 'dart:async' as c;
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 59f1a21..35a31ee 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -2880,7 +2880,7 @@
 
   void _createRefactoring(int offset, int length) {
     refactoring = new ExtractMethodRefactoring(
-        searchEngine, astProvider, testUnit, offset, length);
+        searchEngine, astProvider, testAnalysisResult, offset, length);
     refactoring.name = 'res';
   }
 
diff --git a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
index 55a9cff..c4d46de 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
@@ -1235,7 +1235,7 @@
 
   void _createRefactoring(int offset, int length) {
     refactoring = new ExtractWidgetRefactoring(
-        searchEngine, driver.currentSession, testUnit, offset, length);
+        searchEngine, testAnalysisResult, offset, length);
     refactoring.name = 'Test';
   }
 
diff --git a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
index 3c224ee..0c4ac76 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
@@ -633,7 +633,7 @@
 
   void _createRefactoring(String search) {
     int offset = findOffset(search);
-    refactoring =
-        new InlineLocalRefactoring(searchEngine, astProvider, testUnit, offset);
+    refactoring = new InlineLocalRefactoring(
+        searchEngine, astProvider, testAnalysisResult, offset);
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
index 64c50e0..a508984 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
@@ -1756,6 +1756,6 @@
   void _createRefactoring(String search) {
     int offset = findOffset(search);
     refactoring = new InlineMethodRefactoring(
-        searchEngine, astProvider, testUnit, offset);
+        searchEngine, astProvider, testAnalysisResult, offset);
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/move_file_test.dart b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
index 0faf26a..3710f03 100644
--- a/pkg/analysis_server/test/services/refactoring/move_file_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -4,6 +4,8 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -60,9 +62,7 @@
 ''');
   }
 
-  @failingTest
   test_file_importedLibrary_down() async {
-    _fail('Not yet implemented/tested');
     String pathA = '/project/000/1111/a.dart';
     testFile = '/project/000/1111/test.dart';
     addSource(pathA, '''
@@ -78,40 +78,7 @@
     assertNoFileChange(testFile);
   }
 
-  @failingTest
-  test_file_importedLibrary_package() async {
-    _fail('Not yet implemented/tested');
-    // configure packages
-    testFile = '/packages/my_pkg/lib/aaa/test.dart';
-    newFile(testFile, content: '');
-    // TODO(brianwilkerson) Figure out what this should be replaced with.
-    // TODO(dantup): Change this to use addPackageSource
-//    Map<String, List<Folder>> packageMap = {
-//      'my_pkg': <Folder>[provider.getResource('/packages/my_pkg/lib')]
-//    };
-//    context.sourceFactory = new SourceFactory([
-//      new DartUriResolver(sdk),
-//      new PackageMapUriResolver(provider, packageMap),
-//      resourceResolver
-//    ]);
-    // do testing
-    String pathA = '/project/bin/a.dart';
-    addSource(pathA, '''
-import 'package:my_pkg/aaa/test.dart';
-''');
-    addTestSource('', Uri.parse('package:my_pkg/aaa/test.dart'));
-    // perform refactoring
-    _createRefactoring('/packages/my_pkg/lib/bbb/ccc/new_name.dart');
-    await _assertSuccessfulRefactoring();
-    assertFileChangeResult(pathA, '''
-import 'package:my_pkg/bbb/ccc/new_name.dart';
-''');
-    assertNoFileChange(testFile);
-  }
-
-  @failingTest
   test_file_importedLibrary_sideways() async {
-    _fail('Not yet implemented/tested');
     String pathA = '/project/000/1111/a.dart';
     testFile = '/project/000/1111/sub/folder/test.dart';
     addSource(pathA, '''
@@ -127,9 +94,7 @@
     assertNoFileChange(testFile);
   }
 
-  @failingTest
   test_file_importedLibrary_up() async {
-    _fail('Not yet implemented/tested');
     String pathA = '/project/000/1111/a.dart';
     testFile = '/project/000/1111/22/test.dart';
     addSource(pathA, '''
@@ -147,7 +112,8 @@
 
   @failingTest
   test_file_referenced_by_multiple_libraries() async {
-    _fail('Not yet implemented/tested');
+    // This test fails because the search index doesn't support multiple uris for
+    // a library, so only one of them is updated.
     String pathA = '/project/000/1111/a.dart';
     String pathB = '/project/000/b.dart';
     testFile = '/project/000/1111/22/test.dart';
@@ -201,32 +167,59 @@
     fail('Not yet implemented/tested');
   }
 
-  @failingTest
   test_folder_outside_workspace_returns_failure() async {
-    fail('Not yet implemented/tested');
+    _createRefactoring('/tmp-new', oldName: '/tmp');
+    // TODO(dantup): These paths should all use convertPath so they're as expected
+    // on Windows.
+    await _assertFailedRefactoring(RefactoringProblemSeverity.FATAL,
+        expectedMessage: '/tmp does not belong to an analysis root.');
   }
 
-  @failingTest
-  test_nonexistent_file_returns_suitable_failure() async {
-    fail('Not yet implemented/tested');
+  test_nonexistent_file_returns_failure() async {
+    _createRefactoring(convertPath('/project/test_missing_new.dart'),
+        oldName: convertPath('/project/test_missing.dart'));
+    await _assertFailedRefactoring(RefactoringProblemSeverity.FATAL,
+        expectedMessage:
+            '${convertPath('/project/test_missing.dart')} does not exist.');
   }
 
   @failingTest
   test_project_folder_ancestor() async {
+    // For this, we need the project to not be at top level (/project) so we can
+    // rename an ancestor folder.
     fail('Not yet implemented/tested');
   }
 
-  @failingTest
   test_projectFolder() async {
-    fail('Not yet implemented/tested');
+    _createRefactoring('/project2', oldName: '/project');
+    await _assertFailedRefactoring(RefactoringProblemSeverity.FATAL,
+        expectedMessage:
+            'Renaming an analysis root is not supported (/project)');
   }
 
-  @failingTest
   test_renaming_part_that_uses_uri_in_part_of() async {
     // If the file is a part in a library, and the part-of directive uses a URI
     // rather than a library name, that will need updating too (if the relative
     // path to the parent changes).
-    fail('Not yet implemented/tested');
+    String pathA = '/project/000/1111/a.dart';
+    testFile = '/project/000/1111/22/test.dart';
+    addSource(pathA, '''
+library lib;
+part '22/test.dart';
+''');
+    addTestSource('''
+part of '../a.dart';
+''');
+    // perform refactoring
+    _createRefactoring('/project/000/1111/22/33/test.dart');
+    await _assertSuccessfulRefactoring();
+    assertFileChangeResult(pathA, '''
+library lib;
+part '22/33/test.dart';
+''');
+    assertFileChangeResult(testFile, '''
+part of '../../a.dart';
+''');
   }
 
   /**
@@ -237,15 +230,24 @@
     refactoringChange = await refactoring.createChange();
   }
 
-  void _createRefactoring(String newName) {
+  void _createRefactoring(String newName, {String oldName}) {
     var workspace = new RefactoringWorkspace([driver], searchEngine);
-    refactoring =
-        new MoveFileRefactoring(resourceProvider, workspace, testSource, null);
+    // Allow passing an oldName for when we don't want to rename testSource,
+    // but otherwise fall back to that.
+    if (oldName != null) {
+      refactoring =
+          new MoveFileRefactoring(resourceProvider, workspace, null, oldName);
+    } else {
+      refactoring = new MoveFileRefactoring(
+          resourceProvider, workspace, testSource, null);
+    }
     refactoring.newFile = newName;
   }
 
-  /// Used to disable the dead code warnings.
-  void _fail(String message) {
-    fail(message);
+  Future _assertFailedRefactoring(RefactoringProblemSeverity expectedSeverity,
+      {String expectedMessage}) async {
+    RefactoringStatus status = await refactoring.checkAllConditions();
+    assertRefactoringStatus(status, expectedSeverity,
+        expectedMessage: expectedMessage);
   }
 }
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index c8a7acf..009e5fc 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -15,8 +15,8 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index d6957be..5a8dfcb 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -9,9 +9,7 @@
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/socket_server.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:test/test.dart';
 
@@ -107,13 +105,9 @@
   }
 
   static SocketServer _createSocketServer() {
-    PhysicalResourceProvider resourceProvider =
-        PhysicalResourceProvider.INSTANCE;
     return new SocketServer(
         new AnalysisServerOptions(),
         new DartSdkManager('', false),
-        new FolderBasedDartSdk(resourceProvider,
-            FolderBasedDartSdk.defaultSdkDirectory(resourceProvider)),
         InstrumentationService.NULL_SERVICE,
         null,
         null,
diff --git a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
index 72199c9..3d5f23b 100644
--- a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
@@ -8,7 +8,7 @@
 import 'package:analysis_server/src/computer/import_elements_computer.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:front_end/src/base/source.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -68,7 +68,8 @@
 }
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements('/lib/math/math.dart', '', <String>['Random'])
+      new ImportedElements(
+          convertPath('/lib/math/math.dart'), '', <String>['Random'])
     ]);
     assertChanges('''
 import 'dart:math';
diff --git a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
index fde7e3f..058ee15 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
@@ -18,8 +18,8 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/tool/spec/check_all_test.dart b/pkg/analysis_server/tool/spec/check_all_test.dart
index a19596d..cd313ee 100644
--- a/pkg/analysis_server/tool/spec/check_all_test.dart
+++ b/pkg/analysis_server/tool/spec/check_all_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:io';
 
-import 'package:front_end/src/codegen/tools.dart';
+import 'package:analyzer/src/codegen/tools.dart';
 import 'package:path/path.dart';
 
 import 'generate_all.dart';
diff --git a/pkg/analysis_server/tool/spec/codegen_analysis_server.dart b/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
index 307cf07..2e6969e 100644
--- a/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
+++ b/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
@@ -6,7 +6,6 @@
  * Code generation for the file "AnalysisServer.java".
  */
 import 'package:analyzer/src/codegen/tools.dart';
-import 'package:front_end/src/codegen/tools.dart';
 
 import 'api.dart';
 import 'codegen_java.dart';
@@ -113,7 +112,7 @@
     String methodName = '${request.domainName}_${request.method}';
     publicMethod(methodName, () {
       docComment(toHtmlVisitor.collectHtml(() {
-        toHtmlVisitor.write('{@code ${request.longMethod }}');
+        toHtmlVisitor.write('{@code ${request.longMethod}}');
         toHtmlVisitor.translateHtml(request.html);
         toHtmlVisitor.javadocParams(request.params);
         if (request.deprecated) {
diff --git a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
index 64f387c..681f646 100644
--- a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
@@ -5,7 +5,6 @@
 import 'dart:convert';
 
 import 'package:analyzer/src/codegen/tools.dart';
-import 'package:front_end/src/codegen/tools.dart';
 import 'package:html/dom.dart' as dom;
 import 'package:path/path.dart' as path;
 
diff --git a/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart b/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
index d7e9064..88870a7a 100644
--- a/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
+++ b/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
@@ -8,7 +8,6 @@
 import 'dart:convert';
 
 import 'package:analyzer/src/codegen/tools.dart';
-import 'package:front_end/src/codegen/tools.dart';
 import 'package:path/path.dart' as path;
 
 import 'api.dart';
diff --git a/pkg/analysis_server/tool/spec/codegen_java.dart b/pkg/analysis_server/tool/spec/codegen_java.dart
index 805d06a..6b29f65 100644
--- a/pkg/analysis_server/tool/spec/codegen_java.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java.dart
@@ -6,7 +6,6 @@
  * Tools for Java code generation.
  */
 import 'package:analyzer/src/codegen/tools.dart';
-import 'package:front_end/src/codegen/tools.dart';
 import 'package:html/dom.dart' as dom;
 
 import 'api.dart';
diff --git a/pkg/analysis_server/tool/spec/codegen_java_types.dart b/pkg/analysis_server/tool/spec/codegen_java_types.dart
index 85d6a9a..dd963d0 100644
--- a/pkg/analysis_server/tool/spec/codegen_java_types.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java_types.dart
@@ -6,7 +6,6 @@
  * Code generation for the file "AnalysisServer.java".
  */
 import 'package:analyzer/src/codegen/tools.dart';
-import 'package:front_end/src/codegen/tools.dart';
 import 'package:html/dom.dart' as dom;
 
 import 'api.dart';
diff --git a/pkg/analysis_server/tool/spec/codegen_matchers.dart b/pkg/analysis_server/tool/spec/codegen_matchers.dart
index 9b194ae..480e46f 100644
--- a/pkg/analysis_server/tool/spec/codegen_matchers.dart
+++ b/pkg/analysis_server/tool/spec/codegen_matchers.dart
@@ -8,7 +8,6 @@
 import 'dart:convert';
 
 import 'package:analyzer/src/codegen/tools.dart';
-import 'package:front_end/src/codegen/tools.dart';
 
 import 'api.dart';
 import 'from_html.dart';
diff --git a/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart b/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
index cdb7c6a..d224c46 100644
--- a/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
+++ b/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/codegen/tools.dart';
-import 'package:front_end/src/codegen/tools.dart';
 
 import 'api.dart';
 import 'codegen_dart.dart';
diff --git a/pkg/analysis_server/tool/spec/generate_all.dart b/pkg/analysis_server/tool/spec/generate_all.dart
index c5dd126..8b567a3 100644
--- a/pkg/analysis_server/tool/spec/generate_all.dart
+++ b/pkg/analysis_server/tool/spec/generate_all.dart
@@ -4,7 +4,7 @@
 
 import 'dart:io';
 
-import 'package:front_end/src/codegen/tools.dart';
+import 'package:analyzer/src/codegen/tools.dart';
 import 'package:path/path.dart';
 
 import 'codegen_analysis_server.dart' as codegen_analysis_server;
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index 551d5dd..8ef1779 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -138,6 +138,8 @@
    * generated.
    *
    * @param file The file for which reachable source information is being requested.
+   *
+   * @deprecated
    */
   public void analysis_getReachableSources(String file, GetReachableSourcesConsumer consumer);
 
@@ -413,9 +415,11 @@
    * if a change in a specified source requires it.
    *
    * @param included A list of the files and directories for which edits should be suggested. If a
-   *         request is made for a file which does not exist, or which is not currently subject to
-   *         analysis (e.g. because it is not associated with any analysis root specified to
-   *         analysis.setAnalysisRoots), an error of type FORMAT_INVALID_FILE will be generated.
+   *         request is made with a path that is invalid, e.g. is not absolute and normalized, an
+   *         error of type INVALID_FILE_PATH_FORMAT will be generated. If a request is made for a
+   *         file which does not exist, or which is not currently subject to analysis (e.g. because
+   *         it is not associated with any analysis root specified to analysis.setAnalysisRoots), an
+   *         error of type FILE_NOT_ANALYZED will be generated.
    */
   public void edit_dartfix(List<String> included, DartfixConsumer consumer);
 
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 d2c78ac4..85f526d 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
@@ -165,24 +165,12 @@
   public static final String SORT_MEMBERS_PARSE_ERRORS = "SORT_MEMBERS_PARSE_ERRORS";
 
   /**
-   * An "analysis.setPriorityFiles" request includes one or more files that are not being analyzed.
-   *
-   * This is a legacy error; it will be removed before the API reaches version 1.0.
-   */
-  public static final String UNANALYZED_PRIORITY_FILES = "UNANALYZED_PRIORITY_FILES";
-
-  /**
    * A request was received which the analysis server does not recognize, or cannot handle in its
    * current configuration.
    */
   public static final String UNKNOWN_REQUEST = "UNKNOWN_REQUEST";
 
   /**
-   * The analysis server was requested to perform an action on a source that does not exist.
-   */
-  public static final String UNKNOWN_SOURCE = "UNKNOWN_SOURCE";
-
-  /**
    * The analysis server was requested to perform an action which is not supported.
    *
    * This is a legacy error; it will be removed before the API reaches version 1.0.
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index d5b0623..31d6d51 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -605,7 +605,7 @@
       </field>
     </result>
   </request>
-  <request method="getReachableSources">
+  <request method="getReachableSources" deprecated="true">
     <p>
       Return the transitive closure of reachable sources for a given file.
     </p>
@@ -1947,15 +1947,18 @@
         </list>
         <p>
           A list of the files and directories for which edits should be suggested.
-          If a request is made for a file which does not exist, or which is not
-          currently subject to analysis (e.g. because it is not associated with
-          any analysis root specified to analysis.setAnalysisRoots), an error of
-          type <tt>FORMAT_INVALID_FILE</tt> will be generated.
+        </p>
+        <p>
+          If a request is made with a path that is invalid, e.g. is not absolute and normalized,
+          an error of type <tt>INVALID_FILE_PATH_FORMAT</tt> will be generated.
+          If a request is made for a file which does not exist, or which is not currently subject to analysis
+          (e.g. because it is not associated with any analysis root specified to analysis.setAnalysisRoots),
+          an error of type <tt>FILE_NOT_ANALYZED</tt> will be generated.
         </p>
       </field>
     </params>
     <result>
-      <field name="description">
+      <field name="descriptionOfFixes">
         <list>
           <ref>String</ref>
         </list>
@@ -1963,6 +1966,21 @@
           A list of human readable changes made by applying the fixes.
         </p>
       </field>
+      <field name="otherRecommendations">
+        <list>
+          <ref>String</ref>
+        </list>
+        <p>
+          A list of human readable recommended changes that cannot be made automatically.
+        </p>
+      </field>
+      <field name="hasErrors">
+        <ref>bool</ref>
+        <p>
+          True if the analyzed source contains errors that might impact the correctness
+          of the recommended fixes that can be automatically applied.
+        </p>
+      </field>
       <field name="fixes">
         <list>
           <ref>SourceFileEdit</ref>
@@ -4185,19 +4203,6 @@
         </p>
       </value>
       <value>
-        <code>UNANALYZED_PRIORITY_FILES</code>
-        <p>
-          An "analysis.setPriorityFiles" request includes one or
-          more files that are not being analyzed.
-        </p>
-        <p>
-          This is a legacy error; it will be removed before the
-          API reaches version 1.0.
-        </p>
-        <!-- TODO(paulberry): remove this error and the code that
-                 generates it. -->
-      </value>
-      <value>
         <code>UNKNOWN_REQUEST</code>
         <p>
           A request was received which the analysis server does
@@ -4206,13 +4211,6 @@
         </p>
       </value>
       <value>
-        <code>UNKNOWN_SOURCE</code>
-        <p>
-          The analysis server was requested to perform an action
-          on a source that does not exist.
-        </p>
-      </value>
-      <value>
         <code>UNSUPPORTED_FEATURE</code>
         <p>
           The analysis server was requested to perform an action
diff --git a/pkg/analysis_server/tool/spec/to_html.dart b/pkg/analysis_server/tool/spec/to_html.dart
index 2032b25..a6b897b 100644
--- a/pkg/analysis_server/tool/spec/to_html.dart
+++ b/pkg/analysis_server/tool/spec/to_html.dart
@@ -11,7 +11,6 @@
 
 import 'package:analyzer/src/codegen/html.dart';
 import 'package:analyzer/src/codegen/tools.dart';
-import 'package:front_end/src/codegen/tools.dart';
 import 'package:html/dom.dart' as dom;
 
 import 'api.dart';
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index c2b2c63..f93cc02 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.33.0
+* Support handling 'class C with M', with extends missing.
+* Report ABSTRACT_SUPER_MEMBER_REFERENCE as an error.
+* Further support and bugfixes for Dart 2.1-style mixin declarations.
+* Fixes for int2double support.
+* Performance improvements for analysis and summary generation.
+* Allow "yield" as a label, and "operator" as a static method name (#33672,
+  #33673)
+
 ## 0.33.0-alpha.0
 * Switch to using the parser from front_end.
 * Start implementing the new mixin syntax.
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 397eba4..320f97b 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -874,6 +874,17 @@
    * [expression].
    */
   void set rightOperand(Expression expression);
+
+  /**
+   * The function type of the invocation, or `null` if the AST structure has
+   * not been resolved, or if the invocation could not be resolved.
+   */
+  FunctionType get staticInvokeType;
+
+  /**
+   * Sets the function type of the invocation.
+   */
+  void set staticInvokeType(FunctionType value);
 }
 
 /**
@@ -3728,18 +3739,6 @@
   void set parameters(FormalParameterList parameters);
 
   /**
-   * Return the question mark marking this as a nullable type, or `null` if
-   * the type is non-nullable.
-   */
-  Token get question;
-
-  /**
-   * Return the question mark marking this as a nullable type to the given
-   * [question].
-   */
-  void set question(Token question);
-
-  /**
    * Return the return type of the function, or `null` if the function does not
    * have a return type.
    */
@@ -5286,18 +5285,6 @@
   void set name(Identifier identifier);
 
   /**
-   * Return the question mark marking this as a nullable type, or `null` if
-   * the type is non-nullable.
-   */
-  Token get question;
-
-  /**
-   * Return the question mark marking this as a nullable type to the given
-   * [question].
-   */
-  void set question(Token question);
-
-  /**
    * Set the type being named to the given [type].
    */
   void set type(DartType type);
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index d3e0138..492e8e3 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -600,8 +600,7 @@
       TypeAnnotation returnType,
       SimpleIdentifier identifier,
       TypeParameterList typeParameters,
-      FormalParameterList parameters,
-      {Token question: null});
+      FormalParameterList parameters);
 
   /**
    * Returns a newly created formal parameter. Either or both of the
@@ -616,8 +615,7 @@
       TypeAnnotation returnType,
       @required SimpleIdentifier identifier,
       TypeParameterList typeParameters,
-      @required FormalParameterList parameters,
-      Token question});
+      @required FormalParameterList parameters});
 
   /**
    * Initialize a newly created generic function type.
@@ -1078,8 +1076,7 @@
    * Returns a newly created type name. The [typeArguments] can be `null` if
    * there are no type arguments.
    */
-  TypeName typeName(Identifier name, TypeArgumentList typeArguments,
-      {Token question: null});
+  TypeName typeName(Identifier name, TypeArgumentList typeArguments);
 
   /**
    * Returns a newly created type parameter. Either or both of the [comment]
diff --git a/pkg/analyzer/lib/dart/ast/resolution_map.dart b/pkg/analyzer/lib/dart/ast/resolution_map.dart
index e07cfda..3762587 100644
--- a/pkg/analyzer/lib/dart/ast/resolution_map.dart
+++ b/pkg/analyzer/lib/dart/ast/resolution_map.dart
@@ -167,6 +167,13 @@
    * either this node corresponds to a list of declarations or if the AST
    * structure has not been resolved.
    */
+  ClassElement elementDeclaredByMixinDeclaration(MixinDeclaration node);
+
+  /**
+   * Return the element associated with the declaration [node], or `null` if
+   * either this node corresponds to a list of declarations or if the AST
+   * structure has not been resolved.
+   */
   VariableElement elementDeclaredByVariableDeclaration(
       VariableDeclaration node);
 
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index fdc7100..7bd2f65 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -2,40 +2,38 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Defines the element model. The element model describes the semantic (as
- * opposed to syntactic) structure of Dart code. The syntactic structure of the
- * code is modeled by the [AST
- * structure](../analyzer.dart.ast.ast/analyzer.dart.ast.ast-library.html).
- *
- * The element model consists of two closely related kinds of objects: elements
- * (instances of a subclass of [Element]) and types. This library defines the
- * elements, the types are defined in
- * [type.dart](../dart_element_type/dart_element_type-library.html).
- *
- * Generally speaking, an element represents something that is declared in the
- * code, such as a class, method, or variable. Elements are organized in a tree
- * structure in which the children of an element are the elements that are
- * logically (and often syntactically) part of the declaration of the parent.
- * For example, the elements representing the methods and fields in a class are
- * children of the element representing the class.
- *
- * Every complete element structure is rooted by an instance of the class
- * [LibraryElement]. A library element represents a single Dart library. Every
- * library is defined by one or more compilation units (the library and all of
- * its parts). The compilation units are represented by the class
- * [CompilationUnitElement] and are children of the library that is defined by
- * them. Each compilation unit can contain zero or more top-level declarations,
- * such as classes, functions, and variables. Each of these is in turn
- * represented as an element that is a child of the compilation unit. Classes
- * contain methods and fields, methods can contain local variables, etc.
- *
- * The element model does not contain everything in the code, only those things
- * that are declared by the code. For example, it does not include any
- * representation of the statements in a method body, but if one of those
- * statements declares a local variable then the local variable will be
- * represented by an element.
- */
+/// Defines the element model. The element model describes the semantic (as
+/// opposed to syntactic) structure of Dart code. The syntactic structure of the
+/// code is modeled by the [AST
+/// structure](../analyzer.dart.ast.ast/analyzer.dart.ast.ast-library.html).
+///
+/// The element model consists of two closely related kinds of objects: elements
+/// (instances of a subclass of [Element]) and types. This library defines the
+/// elements, the types are defined in
+/// [type.dart](../dart_element_type/dart_element_type-library.html).
+///
+/// Generally speaking, an element represents something that is declared in the
+/// code, such as a class, method, or variable. Elements are organized in a tree
+/// structure in which the children of an element are the elements that are
+/// logically (and often syntactically) part of the declaration of the parent.
+/// For example, the elements representing the methods and fields in a class are
+/// children of the element representing the class.
+///
+/// Every complete element structure is rooted by an instance of the class
+/// [LibraryElement]. A library element represents a single Dart library. Every
+/// library is defined by one or more compilation units (the library and all of
+/// its parts). The compilation units are represented by the class
+/// [CompilationUnitElement] and are children of the library that is defined by
+/// them. Each compilation unit can contain zero or more top-level declarations,
+/// such as classes, functions, and variables. Each of these is in turn
+/// represented as an element that is a child of the compilation unit. Classes
+/// contain methods and fields, methods can contain local variables, etc.
+///
+/// The element model does not contain everything in the code, only those things
+/// that are declared by the code. For example, it does not include any
+/// representation of the statements in a method body, but if one of those
+/// statements declares a local variable then the local variable will be
+/// represented by an element.
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -47,727 +45,555 @@
 import 'package:analyzer/src/task/api/model.dart' show AnalysisTarget;
 import 'package:analyzer/src/task/dart.dart';
 
-/**
- * An element that represents a class or a mixin. The class can be defined by
- * either a class declaration (with a class body), a mixin application (without
- * a class body), a mixin declaration, or an enum declaration.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An element that represents a class or a mixin. The class can be defined by
+/// either a class declaration (with a class body), a mixin application (without
+/// a class body), a mixin declaration, or an enum declaration.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ClassElement
     implements TypeDefiningElement, TypeParameterizedElement {
-  /**
-   * An empty list of class elements.
-   */
+  /// An empty list of class elements.
   @deprecated
   static const List<ClassElement> EMPTY_LIST = const <ClassElement>[];
 
-  /**
-   * Return a list containing all of the accessors (getters and setters)
-   * declared in this class.
-   */
+  /// Return a list containing all of the accessors (getters and setters)
+  /// declared in this class.
   List<PropertyAccessorElement> get accessors;
 
-  /**
-   * Return a list containing all the supertypes defined for this class and its
-   * supertypes. This includes superclasses, mixins, interfaces and superclass
-   * constraints.
-   */
+  /// Return a list containing all the supertypes defined for this class and its
+  /// supertypes. This includes superclasses, mixins, interfaces and superclass
+  /// constraints.
   List<InterfaceType> get allSupertypes;
 
-  /**
-   * Return a list containing all of the constructors declared in this class.
-   * The list will be empty if there are no constructors defined for this class,
-   * as is the case when this element represents an enum or a mixin.
-   */
+  /// Return a list containing all of the constructors declared in this class.
+  /// The list will be empty if there are no constructors defined for this
+  /// class, as is the case when this element represents an enum or a mixin.
   List<ConstructorElement> get constructors;
 
-  /**
-   * Return a list containing all of the fields declared in this class.
-   */
+  /// Return a list containing all of the fields declared in this class.
   List<FieldElement> get fields;
 
-  /**
-   * Return `true` if this class or its superclass declares a non-final instance
-   * field.
-   */
+  /// Return `true` if this class or its superclass declares a non-final
+  /// instance field.
   bool get hasNonFinalField;
 
-  /**
-   * Return `true` if this class has at least one reference to `super` (and
-   * hence cannot be used as a mixin), or `false` if this element represents a
-   * mixin, even if the mixin has a reference to `super`, because it is allowed
-   * to be used as a mixin.
-   */
+  /// Return `true` if this class has at least one reference to `super` (and
+  /// hence cannot be used as a mixin), or `false` if this element represents a
+  /// mixin, even if the mixin has a reference to `super`, because it is allowed
+  /// to be used as a mixin.
   bool get hasReferenceToSuper;
 
-  /**
-   * Return `true` if this class declares a static member.
-   */
+  /// Return `true` if this class declares a static member.
   bool get hasStaticMember;
 
-  /**
-   * Return a list containing all of the interfaces that are implemented by this
-   * class.
-   *
-   * <b>Note:</b> Because the element model represents the state of the code, it
-   * is possible for it to be semantically invalid. In particular, it is not
-   * safe to assume that the inheritance structure of a class does not contain a
-   * cycle. Clients that traverse the inheritance structure must explicitly
-   * guard against infinite loops.
-   */
+  /// Return a list containing all of the interfaces that are implemented by
+  /// this class.
+  ///
+  /// <b>Note:</b> Because the element model represents the state of the code,
+  /// it is possible for it to be semantically invalid. In particular, it is not
+  /// safe to assume that the inheritance structure of a class does not contain
+  /// a cycle. Clients that traverse the inheritance structure must explicitly
+  /// guard against infinite loops.
   List<InterfaceType> get interfaces;
 
-  /**
-   * Return `true` if this class is abstract. A class is abstract if it has an
-   * explicit `abstract` modifier or if it is implicitly abstract, such as a
-   * class defined by a mixin declaration. Note, that this definition of
-   * <i>abstract</i> is different from <i>has unimplemented members</i>.
-   */
+  /// Return `true` if this class is abstract. A class is abstract if it has an
+  /// explicit `abstract` modifier or if it is implicitly abstract, such as a
+  /// class defined by a mixin declaration. Note, that this definition of
+  /// <i>abstract</i> is different from <i>has unimplemented members</i>.
   bool get isAbstract;
 
-  /**
-   * Return `true` if this class is defined by an enum declaration.
-   */
+  /// Return `true` if this class is defined by an enum declaration.
   bool get isEnum;
 
-  /**
-   * Return `true` if this class is defined by a mixin declaration.
-   */
+  /// Return `true` if this class is defined by a mixin declaration.
   bool get isMixin;
 
-  /**
-   * Return `true` if this class is a mixin application.  A class is a mixin
-   * application if it was declared using the syntax "class A = B with C;".
-   */
+  /// Return `true` if this class is a mixin application.  A class is a mixin
+  /// application if it was declared using the syntax "class A = B with C;".
   bool get isMixinApplication;
 
-  /**
-   * Return `true` if this class [isProxy], or if it inherits the proxy
-   * annotation from a supertype.
-   */
+  /// Return `true` if this class [isProxy], or if it inherits the proxy
+  /// annotation from a supertype.
   bool get isOrInheritsProxy;
 
-  /**
-   * Return `true` if this element has an annotation of the form '@proxy'.
-   */
+  /// Return `true` if this element has an annotation of the form '@proxy'.
   bool get isProxy;
 
-  /**
-   * Return `true` if this class can validly be used as a mixin when defining
-   * another class. For classes defined by a mixin declaration, the result is
-   * always `true`. For classes defined by a class declaration or a mixin
-   * application, the behavior of this method is defined by the Dart Language
-   * Specification in section 9:
-   * <blockquote>
-   * It is a compile-time error if a declared or derived mixin refers to super.
-   * It is a compile-time error if a declared or derived mixin explicitly
-   * declares a constructor. It is a compile-time error if a mixin is derived
-   * from a class whose superclass is not Object.
-   * </blockquote>
-   */
+  /// Return `true` if this class can validly be used as a mixin when defining
+  /// another class. For classes defined by a mixin declaration, the result is
+  /// always `true`. For classes defined by a class declaration or a mixin
+  /// application, the behavior of this method is defined by the Dart Language
+  /// Specification in section 9:
+  /// <blockquote>
+  /// It is a compile-time error if a declared or derived mixin refers to super.
+  /// It is a compile-time error if a declared or derived mixin explicitly
+  /// declares a constructor. It is a compile-time error if a mixin is derived
+  /// from a class whose superclass is not Object.
+  /// </blockquote>
   bool get isValidMixin;
 
-  /**
-   * Return a list containing all of the methods declared in this class.
-   */
+  /// Return a list containing all of the methods declared in this class.
   List<MethodElement> get methods;
 
-  /**
-   * Return a list containing all of the mixins that are applied to the class
-   * being extended in order to derive the superclass of this class.
-   *
-   * <b>Note:</b> Because the element model represents the state of the code, it
-   * is possible for it to be semantically invalid. In particular, it is not
-   * safe to assume that the inheritance structure of a class does not contain a
-   * cycle. Clients that traverse the inheritance structure must explicitly
-   * guard against infinite loops.
-   */
+  /// Return a list containing all of the mixins that are applied to the class
+  /// being extended in order to derive the superclass of this class.
+  ///
+  /// <b>Note:</b> Because the element model represents the state of the code,
+  /// it is possible for it to be semantically invalid. In particular, it is not
+  /// safe to assume that the inheritance structure of a class does not contain
+  /// a cycle. Clients that traverse the inheritance structure must explicitly
+  /// guard against infinite loops.
   List<InterfaceType> get mixins;
 
-  /**
-   * 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`.
-   *
-   * <b>Note:</b> Because the element model represents the state of the code, it
-   * is possible for it to be semantically invalid. In particular, it is not
-   * safe to assume that the inheritance structure of a class does not contain a
-   * cycle. Clients that traverse the inheritance structure must explicitly
-   * guard against infinite loops.
-   */
+  /// 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`.
+  ///
+  /// <b>Note:</b> Because the element model represents the state of the code,
+  /// it is possible for it to be semantically invalid. In particular, it is not
+  /// safe to assume that the inheritance structure of a class does not contain
+  /// a cycle. Clients that traverse the inheritance structure must explicitly
+  /// guard against infinite loops.
   List<InterfaceType> get superclassConstraints;
 
-  /**
-   * Return the superclass of this class, or `null` if either the class
-   * represents the class 'Object' or if the class represents a mixin
-   * declaration. All other classes will have a non-`null` superclass. If the
-   * superclass was not explicitly declared then the implicit superclass
-   * 'Object' will be returned.
-   *
-   * <b>Note:</b> Because the element model represents the state of the code, it
-   * is possible for it to be semantically invalid. In particular, it is not
-   * safe to assume that the inheritance structure of a class does not contain a
-   * cycle. Clients that traverse the inheritance structure must explicitly
-   * guard against infinite loops.
-   */
+  /// Return the superclass of this class, or `null` if either the class
+  /// represents the class 'Object' or if the class represents a mixin
+  /// declaration. All other classes will have a non-`null` superclass. If the
+  /// superclass was not explicitly declared then the implicit superclass
+  /// 'Object' will be returned.
+  ///
+  /// <b>Note:</b> Because the element model represents the state of the code,
+  /// it is possible for it to be semantically invalid. In particular, it is not
+  /// safe to assume that the inheritance structure of a class does not contain
+  /// a cycle. Clients that traverse the inheritance structure must explicitly
+  /// guard against infinite loops.
   InterfaceType get supertype;
 
   @override
   InterfaceType get type;
 
-  /**
-   * Return the unnamed constructor declared in this class, or `null` if either
-   * this class does not declare an unnamed constructor but does declare named
-   * constructors or if this class represents a mixin declaration. The returned
-   * constructor will be synthetic if this class does not declare any
-   * constructors, in which case it will represent the default constructor for
-   * the class.
-   */
+  /// Return the unnamed constructor declared in this class, or `null` if either
+  /// this class does not declare an unnamed constructor but does declare named
+  /// constructors or if this class represents a mixin declaration. The returned
+  /// constructor will be synthetic if this class does not declare any
+  /// constructors, in which case it will represent the default constructor for
+  /// the class.
   ConstructorElement get unnamedConstructor;
 
   @override
   NamedCompilationUnitMember computeNode();
 
-  /**
-   * Return the field (synthetic or explicit) defined in this class that has the
-   * given [name], or `null` if this class does not define a field with the
-   * given name.
-   */
+  /// Return the field (synthetic or explicit) defined in this class that has
+  /// the given [name], or `null` if this class does not define a field with the
+  /// given name.
   FieldElement getField(String name);
 
-  /**
-   * Return the element representing the getter with the given [name] that is
-   * declared in this class, or `null` if this class does not declare a getter
-   * with the given name.
-   */
+  /// Return the element representing the getter with the given [name] that is
+  /// declared in this class, or `null` if this class does not declare a getter
+  /// with the given name.
   PropertyAccessorElement getGetter(String name);
 
-  /**
-   * Return the element representing the method with the given [name] that is
-   * declared in this class, or `null` if this class does not declare a method
-   * with the given name.
-   */
+  /// Return the element representing the method with the given [name] that is
+  /// declared in this class, or `null` if this class does not declare a method
+  /// with the given name.
   MethodElement getMethod(String name);
 
-  /**
-   * Return the named constructor declared in this class with the given [name],
-   * or `null` if this class does not declare a named constructor with the given
-   * name.
-   */
+  /// Return the named constructor declared in this class with the given [name],
+  /// or `null` if this class does not declare a named constructor with the
+  /// given name.
   ConstructorElement getNamedConstructor(String name);
 
-  /**
-   * Return the element representing the setter with the given [name] that is
-   * declared in this class, or `null` if this class does not declare a setter
-   * with the given name.
-   */
+  /// Return the element representing the setter with the given [name] that is
+  /// declared in this class, or `null` if this class does not declare a setter
+  /// with the given name.
   PropertyAccessorElement getSetter(String name);
 
-  /**
-   * Return the element representing the method that results from looking up the
-   * given [methodName] in this class with respect to the given [library],
-   * ignoring abstract methods, or `null` if the look up fails. The behavior of
-   * this method is defined by the Dart Language Specification in section
-   * 16.15.1:
-   * <blockquote>
-   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
-   * library <i>L</i> is: If <i>C</i> declares an instance method named <i>m</i>
-   * that is accessible to <i>L</i>, then that method is the result of the
-   * lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
-   * of the lookup is the result of looking up method <i>m</i> in <i>S</i> with
-   * respect to <i>L</i>. Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   */
+  /// Return the element representing the method that results from looking up
+  /// the given [methodName] in this class with respect to the given [library],
+  /// ignoring abstract methods, or `null` if the look up fails. The behavior of
+  /// this method is defined by the Dart Language Specification in section
+  /// 16.15.1:
+  /// <blockquote>
+  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
+  /// library <i>L</i> is: If <i>C</i> declares an instance method named
+  /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of
+  /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
+  /// result of the lookup is the result of looking up method <i>m</i> in
+  /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
+  /// failed.
+  /// </blockquote>
   MethodElement lookUpConcreteMethod(String methodName, LibraryElement library);
 
-  /**
-   * Return the element representing the getter that results from looking up the
-   * given [getterName] in this class with respect to the given [library], or
-   * `null` if the look up fails. The behavior of this method is defined by the
-   * Dart Language Specification in section 16.15.2:
-   * <blockquote>
-   * The result of looking up getter (respectively setter) <i>m</i> in class
-   * <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
-   * instance getter (respectively setter) named <i>m</i> that is accessible to
-   * <i>L</i>, then that getter (respectively setter) is the result of the
-   * lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
-   * of the lookup is the result of looking up getter (respectively setter)
-   * <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
-   * lookup has failed.
-   * </blockquote>
-   */
+  /// Return the element representing the getter that results from looking up
+  /// the given [getterName] in this class with respect to the given [library],
+  /// or `null` if the look up fails. The behavior of this method is defined by
+  /// the Dart Language Specification in section 16.15.2:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
+  /// instance getter (respectively setter) named <i>m</i> that is accessible to
+  /// <i>L</i>, then that getter (respectively setter) is the result of the
+  /// lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
+  /// of the lookup is the result of looking up getter (respectively setter)
+  /// <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
+  /// lookup has failed.
+  /// </blockquote>
   PropertyAccessorElement lookUpGetter(
       String getterName, LibraryElement library);
 
-  /**
-   * Return the element representing the getter that results from looking up the
-   * given [getterName] in the superclass of this class with respect to the
-   * given [library], ignoring abstract getters, or `null` if the look up fails.
-   * The behavior of this method is defined by the Dart Language Specification
-   * in section 16.15.2:
-   * <blockquote>
-   * The result of looking up getter (respectively setter) <i>m</i> in class
-   * <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
-   * instance getter (respectively setter) named <i>m</i> that is accessible to
-   * <i>L</i>, then that getter (respectively setter) is the result of the
-   * lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
-   * of the lookup is the result of looking up getter (respectively setter)
-   * <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
-   * lookup has failed.
-   * </blockquote>
-   */
+  /// Return the element representing the getter that results from looking up
+  /// the given [getterName] in the superclass of this class with respect to the
+  /// given [library], ignoring abstract getters, or `null` if the look up
+  /// fails.  The behavior of this method is defined by the Dart Language
+  /// Specification in section 16.15.2:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
+  /// instance getter (respectively setter) named <i>m</i> that is accessible to
+  /// <i>L</i>, then that getter (respectively setter) is the result of the
+  /// lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
+  /// of the lookup is the result of looking up getter (respectively setter)
+  /// <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
+  /// lookup has failed.
+  /// </blockquote>
   PropertyAccessorElement lookUpInheritedConcreteGetter(
       String getterName, LibraryElement library);
 
-  /**
-   * Return the element representing the method that results from looking up the
-   * given [methodName] in the superclass of this class with respect to the
-   * given [library], ignoring abstract methods, or `null` if the look up fails.
-   * The behavior of this method is defined by the Dart Language Specification
-   * in section 16.15.1:
-   * <blockquote>
-   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
-   * library <i>L</i> is:  If <i>C</i> declares an instance method named
-   * <i>m</i> that is accessible to <i>L</i>, then that method is the result of
-   * the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
-   * result of the lookup is the result of looking up method <i>m</i> in
-   * <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
-   * failed.
-   * </blockquote>
-   */
+  /// Return the element representing the method that results from looking up
+  /// the given [methodName] in the superclass of this class with respect to the
+  /// given [library], ignoring abstract methods, or `null` if the look up
+  /// fails.  The behavior of this method is defined by the Dart Language
+  /// Specification in section 16.15.1:
+  /// <blockquote>
+  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
+  /// library <i>L</i> is:  If <i>C</i> declares an instance method named
+  /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of
+  /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
+  /// result of the lookup is the result of looking up method <i>m</i> in
+  /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
+  /// failed.
+  /// </blockquote>
   MethodElement lookUpInheritedConcreteMethod(
       String methodName, LibraryElement library);
 
-  /**
-   * Return the element representing the setter that results from looking up the
-   * given [setterName] in the superclass of this class with respect to the
-   * given [library], ignoring abstract setters, or `null` if the look up fails.
-   * The behavior of this method is defined by the Dart Language Specification
-   * in section 16.15.2:
-   * <blockquote>
-   * The result of looking up getter (respectively setter) <i>m</i> in class
-   * <i>C</i> with respect to library <i>L</i> is:  If <i>C</i> declares an
-   * instance getter (respectively setter) named <i>m</i> that is accessible to
-   * <i>L</i>, then that getter (respectively setter) is the result of the
-   * lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
-   * of the lookup is the result of looking up getter (respectively setter)
-   * <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
-   * lookup has failed.
-   * </blockquote>
-   */
+  /// Return the element representing the setter that results from looking up
+  /// the given [setterName] in the superclass of this class with respect to the
+  /// given [library], ignoring abstract setters, or `null` if the look up
+  /// fails.  The behavior of this method is defined by the Dart Language
+  /// Specification in section 16.15.2:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is:  If <i>C</i> declares an
+  /// instance getter (respectively setter) named <i>m</i> that is accessible to
+  /// <i>L</i>, then that getter (respectively setter) is the result of the
+  /// lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
+  /// of the lookup is the result of looking up getter (respectively setter)
+  /// <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
+  /// lookup has failed.
+  /// </blockquote>
   PropertyAccessorElement lookUpInheritedConcreteSetter(
       String setterName, LibraryElement library);
 
-  /**
-   * Return the element representing the method that results from looking up the
-   * given [methodName] in the superclass of this class with respect to the
-   * given [library], or `null` if the look up fails. The behavior of this
-   * method is defined by the Dart Language Specification in section 16.15.1:
-   * <blockquote>
-   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
-   * library <i>L</i> is:  If <i>C</i> declares an instance method named
-   * <i>m</i> that is accessible to <i>L</i>, then that method is the result of
-   * the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
-   * result of the lookup is the result of looking up method <i>m</i> in
-   * <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
-   * failed.
-   * </blockquote>
-   */
+  /// Return the element representing the method that results from looking up
+  /// the given [methodName] in the superclass of this class with respect to the
+  /// given [library], or `null` if the look up fails. The behavior of this
+  /// method is defined by the Dart Language Specification in section 16.15.1:
+  /// <blockquote>
+  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
+  /// library <i>L</i> is:  If <i>C</i> declares an instance method named
+  /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of
+  /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
+  /// result of the lookup is the result of looking up method <i>m</i> in
+  /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
+  /// failed.
+  /// </blockquote>
   MethodElement lookUpInheritedMethod(
       String methodName, LibraryElement library);
 
-  /**
-   * Return the element representing the method that results from looking up the
-   * given [methodName] in this class with respect to the given [library], or
-   * `null` if the look up fails. The behavior of this method is defined by the
-   * Dart Language Specification in section 16.15.1:
-   * <blockquote>
-   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
-   * library <i>L</i> is:  If <i>C</i> declares an instance method named
-   * <i>m</i> that is accessible to <i>L</i>, then that method is the result of
-   * the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
-   * result of the lookup is the result of looking up method <i>m</i> in
-   * <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
-   * failed.
-   * </blockquote>
-   */
+  /// Return the element representing the method that results from looking up
+  /// the given [methodName] in this class with respect to the given [library],
+  /// or `null` if the look up fails. The behavior of this method is defined by
+  /// the Dart Language Specification in section 16.15.1:
+  /// <blockquote>
+  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
+  /// library <i>L</i> is:  If <i>C</i> declares an instance method named
+  /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of
+  /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
+  /// result of the lookup is the result of looking up method <i>m</i> in
+  /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
+  /// failed.
+  /// </blockquote>
   MethodElement lookUpMethod(String methodName, LibraryElement library);
 
-  /**
-   * Return the element representing the setter that results from looking up the
-   * given [setterName] in this class with respect to the given [library], or
-   * `null` if the look up fails. The behavior of this method is defined by the
-   * Dart Language Specification in section 16.15.2:
-   * <blockquote>
-   * The result of looking up getter (respectively setter) <i>m</i> in class
-   * <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
-   * instance getter (respectively setter) named <i>m</i> that is accessible to
-   * <i>L</i>, then that getter (respectively setter) is the result of the
-   * lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
-   * of the lookup is the result of looking up getter (respectively setter)
-   * <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
-   * lookup has failed.
-   * </blockquote>
-   */
+  /// Return the element representing the setter that results from looking up
+  /// the given [setterName] in this class with respect to the given [library],
+  /// or `null` if the look up fails. The behavior of this method is defined by
+  /// the Dart Language Specification in section 16.15.2:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
+  /// instance getter (respectively setter) named <i>m</i> that is accessible to
+  /// <i>L</i>, then that getter (respectively setter) is the result of the
+  /// lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
+  /// of the lookup is the result of looking up getter (respectively setter)
+  /// <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
+  /// lookup has failed.
+  /// </blockquote>
   PropertyAccessorElement lookUpSetter(
       String setterName, LibraryElement library);
 }
 
-/**
- * An element that is contained within a [ClassElement].
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An element that is contained within a [ClassElement].
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ClassMemberElement implements Element {
   @override
   ClassElement get enclosingElement;
 
-  /**
-   * 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.
-   */
+  /// 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;
 }
 
-/**
- * An element representing a compilation unit.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An element representing a compilation unit.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class CompilationUnitElement implements Element, UriReferencedElement {
-  /**
-   * An empty list of compilation unit elements.
-   */
+  /// An empty list of compilation unit elements.
   @deprecated
   static const List<CompilationUnitElement> EMPTY_LIST =
       const <CompilationUnitElement>[];
 
-  /**
-   * Return a list containing all of the top-level accessors (getters and
-   * setters) contained in this compilation unit.
-   */
+  /// Return a list containing all of the top-level accessors (getters and
+  /// setters) contained in this compilation unit.
   List<PropertyAccessorElement> get accessors;
 
   @override
   LibraryElement get enclosingElement;
 
-  /**
-   * Return a list containing all of the enums contained in this compilation
-   * unit.
-   */
+  /// Return a list containing all of the enums contained in this compilation
+  /// unit.
   List<ClassElement> get enums;
 
-  /**
-   * Return a list containing all of the top-level functions contained in this
-   * compilation unit.
-   */
+  /// Return a list containing all of the top-level functions contained in this
+  /// compilation unit.
   List<FunctionElement> get functions;
 
-  /**
-   * Return a list containing all of the function type aliases contained in this
-   * compilation unit.
-   */
+  /// Return a list containing all of the function type aliases contained in
+  /// this compilation unit.
   List<FunctionTypeAliasElement> get functionTypeAliases;
 
-  /**
-   * Return `true` if this compilation unit defines a top-level function named
-   * `loadLibrary`.
-   */
+  /// Return `true` if this compilation unit defines a top-level function named
+  /// `loadLibrary`.
   bool get hasLoadLibraryFunction;
 
-  /**
-   * Return the [LineInfo] for the [source], or `null` if not computed yet.
-   */
+  /// Return the [LineInfo] for the [source], or `null` if not computed yet.
   LineInfo get lineInfo;
 
-  /**
-   * Return a list containing all of the mixins contained in this compilation
-   * unit.
-   */
+  /// Return a list containing all of the mixins contained in this compilation
+  /// unit.
   List<ClassElement> get mixins;
 
-  /**
-   * Return a list containing all of the top-level variables contained in this
-   * compilation unit.
-   */
+  /// Return a list containing all of the top-level variables contained in this
+  /// compilation unit.
   List<TopLevelVariableElement> get topLevelVariables;
 
-  /**
-   * Return a list containing all of the classes contained in this compilation
-   * unit.
-   */
+  /// Return a list containing all of the classes contained in this compilation
+  /// unit.
   List<ClassElement> get types;
 
   @override
   CompilationUnit computeNode();
 
-  /**
-   * Return the enum defined in this compilation unit that has the given [name],
-   * or `null` if this compilation unit does not define an enum with the given
-   * name.
-   */
+  /// Return the enum defined in this compilation unit that has the given
+  /// [name], or `null` if this compilation unit does not define an enum with
+  /// the given name.
   ClassElement getEnum(String name);
 
-  /**
-   * Return the class defined in this compilation unit that has the given
-   * [name], or `null` if this compilation unit does not define a class with the
-   * given name.
-   */
+  /// Return the class defined in this compilation unit that has the given
+  /// [name], or `null` if this compilation unit does not define a class with
+  /// the given name.
   ClassElement getType(String name);
 }
 
-/**
- * An element representing a constructor or a factory method defined within a
- * class.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An element representing a constructor or a factory method defined within a
+/// class.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ConstructorElement
     implements ClassMemberElement, ExecutableElement, ConstantEvaluationTarget {
-  /**
-   * An empty list of constructor elements.
-   */
+  /// An empty list of constructor elements.
   @deprecated
   static const List<ConstructorElement> EMPTY_LIST =
       const <ConstructorElement>[];
 
-  /**
-   * Return `true` if this constructor is a const constructor.
-   */
+  /// Return `true` if this constructor is a const constructor.
   bool get isConst;
 
-  /**
-   * Return `true` if this constructor can be used as a default constructor -
-   * unnamed and has no required parameters.
-   */
+  /// Return `true` if this constructor can be used as a default constructor -
+  /// unnamed and has no required parameters.
   bool get isDefaultConstructor;
 
-  /**
-   * Return `true` if this constructor represents a factory constructor.
-   */
+  /// Return `true` if this constructor represents a factory constructor.
   bool get isFactory;
 
-  /**
-   * Return the offset of the character immediately following the last character
-   * of this constructor's name, or `null` if not named.
-   */
+  /// Return the offset of the character immediately following the last
+  /// character of this constructor's name, or `null` if not named.
   int get nameEnd;
 
-  /**
-   * Return the offset of the `.` before this constructor name, or `null` if
-   * not named.
-   */
+  /// Return the offset of the `.` before this constructor name, or `null` if
+  /// not named.
   int get periodOffset;
 
-  /**
-   * Return the constructor to which this constructor is redirecting, or `null`
-   * if this constructor does not redirect to another constructor or if the
-   * library containing this constructor has not yet been resolved.
-   */
+  /// Return the constructor to which this constructor is redirecting, or `null`
+  /// if this constructor does not redirect to another constructor or if the
+  /// library containing this constructor has not yet been resolved.
   ConstructorElement get redirectedConstructor;
 
   @override
   ConstructorDeclaration computeNode();
 }
 
-/**
- * The base class for all of the elements in the element model. Generally
- * speaking, the element model is a semantic model of the program that
- * represents things that are declared with a name and hence can be referenced
- * elsewhere in the code.
- *
- * There are two exceptions to the general case. First, there are elements in
- * the element model that are created for the convenience of various kinds of
- * analysis but that do not have any corresponding declaration within the source
- * code. Such elements are marked as being <i>synthetic</i>. Examples of
- * synthetic elements include
- * * default constructors in classes that do not define any explicit
- *   constructors,
- * * getters and setters that are induced by explicit field declarations,
- * * fields that are induced by explicit declarations of getters and setters,
- *   and
- * * functions representing the initialization expression for a variable.
- *
- * Second, there are elements in the element model that do not have a name.
- * These correspond to unnamed functions and exist in order to more accurately
- * represent the semantic structure of the program.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The base class for all of the elements in the element model. Generally
+/// speaking, the element model is a semantic model of the program that
+/// represents things that are declared with a name and hence can be referenced
+/// elsewhere in the code.
+///
+/// There are two exceptions to the general case. First, there are elements in
+/// the element model that are created for the convenience of various kinds of
+/// analysis but that do not have any corresponding declaration within the
+/// source code. Such elements are marked as being <i>synthetic</i>. Examples of
+/// synthetic elements include
+/// * default constructors in classes that do not define any explicit
+///   constructors,
+/// * getters and setters that are induced by explicit field declarations,
+/// * fields that are induced by explicit declarations of getters and setters,
+///   and
+/// * functions representing the initialization expression for a variable.
+///
+/// Second, there are elements in the element model that do not have a name.
+/// These correspond to unnamed functions and exist in order to more accurately
+/// represent the semantic structure of the program.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class Element implements AnalysisTarget {
-  /**
-   * A comparator that can be used to sort elements by their name offset.
-   * Elements with a smaller offset will be sorted to be before elements with a
-   * larger name offset.
-   */
+  /// A comparator that can be used to sort elements by their name offset.
+  /// Elements with a smaller offset will be sorted to be before elements with a
+  /// larger name offset.
   static final Comparator<Element> SORT_BY_OFFSET =
       (Element firstElement, Element secondElement) =>
           firstElement.nameOffset - secondElement.nameOffset;
 
-  /**
-   * Return the analysis context in which this element is defined.
-   */
+  /// Return the analysis context in which this element is defined.
   AnalysisContext get context;
 
-  /**
-   * Return the display name of this element, or `null` if this element does not
-   * have a name.
-   *
-   * In most cases the name and the display name are the same. Differences
-   * though are cases such as setters where the name of some setter `set f(x)`
-   * is `f=`, instead of `f`.
-   */
+  /// Return the display name of this element, or `null` if this element does
+  /// not have a name.
+  ///
+  /// In most cases the name and the display name are the same. Differences
+  /// though are cases such as setters where the name of some setter `set f(x)`
+  /// is `f=`, instead of `f`.
   String get displayName;
 
-  /**
-   * Return the content of the documentation comment (including delimiters) for
-   * this element, or `null` if this element does not or cannot have
-   * documentation.
-   */
+  /// Return the content of the documentation comment (including delimiters) for
+  /// this element, or `null` if this element does not or cannot have
+  /// documentation.
   String get documentationComment;
 
-  /**
-   * Return the element that either physically or logically encloses this
-   * element. This will be `null` if this element is a library because libraries
-   * are the top-level elements in the model.
-   */
+  /// Return the element that either physically or logically encloses this
+  /// element. This will be `null` if this element is a library because
+  /// libraries are the top-level elements in the model.
   Element get enclosingElement;
 
-  /**
-   * Return `true` if this element has an annotation of the form
-   * `@alwaysThrows`.
-   */
+  /// Return `true` if this element has an annotation of the form
+  /// `@alwaysThrows`.
   bool get hasAlwaysThrows;
 
-  /**
-   * Return `true` if this element has an annotation of the form `@deprecated`
-   * or `@Deprecated('..')`.
-   */
+  /// Return `true` if this element has an annotation of the form `@deprecated`
+  /// or `@Deprecated('..')`.
   bool get hasDeprecated;
 
-  /**
-   * Return `true` if this element has an annotation of the form `@factory`.
-   */
+  /// Return `true` if this element has an annotation of the form `@factory`.
   bool get hasFactory;
 
-  /**
-   * Return `true` if this element has an annotation of the form `@isTest`.
-   */
+  /// Return `true` if this element has an annotation of the form `@isTest`.
   bool get hasIsTest;
 
-  /**
-   * Return `true` if this element has an annotation of the form `@isTestGroup`.
-   */
+  /// Return `true` if this element has an annotation of the form
+  /// `@isTestGroup`.
   bool get hasIsTestGroup;
 
-  /**
-   * Return `true` if this element has an annotation of the form `@JS(..)`.
-   */
+  /// Return `true` if this element has an annotation of the form `@JS(..)`.
   bool get hasJS;
 
-  /**
-   * Return `true` if this element has an annotation of the form `@override`.
-   */
+  /// Return `true` if this element has an annotation of the form `@override`.
   bool get hasOverride;
 
-  /**
-   * Return `true` if this element has an annotation of the form `@protected`.
-   */
+  /// Return `true` if this element has an annotation of the form `@protected`.
   bool get hasProtected;
 
-  /**
-   * Return `true` if this element has an annotation of the form '@required'.
-   */
+  /// Return `true` if this element has an annotation of the form '@required'.
   bool get hasRequired;
 
-  /**
-   * Return `true` if this element has an annotation of the form '@sealed'.
-   */
+  /// Return `true` if this element has an annotation of the form '@sealed'.
   bool get hasSealed;
 
-  /**
-   * Return `true` if this element has an annotation of the form
-   * `@visibleForTemplate`.
-   */
+  /// Return `true` if this element has an annotation of the form
+  /// `@visibleForTemplate`.
   bool get hasVisibleForTemplate;
 
-  /**
-   * Return `true` if this element has an annotation of the form
-   * `@visibleForTesting`.
-   */
+  /// Return `true` if this element has an annotation of the form
+  /// `@visibleForTesting`.
   bool get hasVisibleForTesting;
 
-  /**
-   * The unique integer identifier of this element.
-   */
+  /// The unique integer identifier of this element.
   int get id;
 
-  /**
-   * Return `true` if this element has an annotation of the form
-   * '@alwaysThrows'.
-   */
+  /// Return `true` if this element has an annotation of the form
+  /// '@alwaysThrows'.
   @deprecated
   bool get isAlwaysThrows;
 
-  /**
-   * Return `true` if this element has an annotation of the form '@deprecated'
-   * or '@Deprecated('..')'.
-   */
+  /// Return `true` if this element has an annotation of the form '@deprecated'
+  /// or '@Deprecated('..')'.
   @deprecated
   bool get isDeprecated;
 
-  /**
-   * Return `true` if this element has an annotation of the form '@factory'.
-   */
+  /// Return `true` if this element has an annotation of the form '@factory'.
   @deprecated
   bool get isFactory;
 
-  /**
-   * Return `true` if this element has an annotation of the form '@JS(..)'.
-   */
+  /// Return `true` if this element has an annotation of the form '@JS(..)'.
   @deprecated
   bool get isJS;
 
-  /**
-   * Return `true` if this element has an annotation of the form '@override'.
-   */
+  /// Return `true` if this element has an annotation of the form '@override'.
   @deprecated
   bool get isOverride;
 
-  /**
-   * Return `true` if this element is private. Private elements are visible only
-   * within the library in which they are declared.
-   */
+  /// Return `true` if this element is private. Private elements are visible
+  /// only within the library in which they are declared.
   bool get isPrivate;
 
-  /**
-   * Return `true` if this element has an annotation of the form '@protected'.
-   */
+  /// Return `true` if this element has an annotation of the form '@protected'.
   @deprecated
   bool get isProtected;
 
-  /**
-   * Return `true` if this element is public. Public elements are visible within
-   * any library that imports the library in which they are declared.
-   */
+  /// Return `true` if this element is public. Public elements are visible
+  /// within any library that imports the library in which they are declared.
   bool get isPublic;
 
-  /**
-   * Return `true` if this element has an annotation of the form '@required'.
-   */
+  /// Return `true` if this element has an annotation of the form '@required'.
   @deprecated
   bool get isRequired;
 
-  /**
-   * Return `true` if this element is synthetic. A synthetic element is an
-   * element that is not represented in the source code explicitly, but is
-   * implied by the source code, such as the default constructor for a class
-   * that does not explicitly define any constructors.
-   */
+  /// Return `true` if this element is synthetic. A synthetic element is an
+  /// element that is not represented in the source code explicitly, but is
+  /// implied by the source code, such as the default constructor for a class
+  /// that does not explicitly define any constructors.
   bool get isSynthetic;
 
   /// Return `true` if this element has an annotation of the form
@@ -775,264 +601,191 @@
   @deprecated
   bool get isVisibleForTesting;
 
-  /**
-   * Return the kind of element that this is.
-   */
+  /// Return the kind of element that this is.
   ElementKind get kind;
 
-  /**
-   * Return the library that contains this element. This will be the element
-   * itself if it is a library element. This will be `null` if this element is
-   * an HTML file because HTML files are not contained in libraries.
-   */
+  /// Return the library that contains this element. This will be the element
+  /// itself if it is a library element. This will be `null` if this element is
+  /// an HTML file because HTML files are not contained in libraries.
   LibraryElement get library;
 
-  /**
-   * Return an object representing the location of this element in the element
-   * model. The object can be used to locate this element at a later time.
-   */
+  /// Return an object representing the location of this element in the element
+  /// model. The object can be used to locate this element at a later time.
   ElementLocation get location;
 
-  /**
-   * Return a list containing all of the metadata associated with this element.
-   * The array will be empty if the element does not have any metadata or if the
-   * library containing this element has not yet been resolved.
-   */
+  /// Return a list containing all of the metadata associated with this element.
+  /// The array will be empty if the element does not have any metadata or if
+  /// the library containing this element has not yet been resolved.
   List<ElementAnnotation> get metadata;
 
-  /**
-   * Return the name of this element, or `null` if this element does not have a
-   * name.
-   */
+  /// Return the name of this element, or `null` if this element does not have a
+  /// name.
   String get name;
 
-  /**
-   * Return the length of the name of this element in the file that contains the
-   * declaration of this element, or `0` if this element does not have a name.
-   */
+  /// Return the length of the name of this element in the file that contains
+  /// the declaration of this element, or `0` if this element does not have a
+  /// name.
   int get nameLength;
 
-  /**
-   * Return the offset of the name of this element in the file that contains the
-   * declaration of this element, or `-1` if this element is synthetic, does not
-   * have a name, or otherwise does not have an offset.
-   */
+  /// Return the offset of the name of this element in the file that contains
+  /// the declaration of this element, or `-1` if this element is synthetic,
+  /// does not have a name, or otherwise does not have an offset.
   int get nameOffset;
 
   @override
   Source get source;
 
-  /**
-   * Return the resolved [CompilationUnit] that declares this element, or `null`
-   * if this element is synthetic.
-   *
-   * This method is expensive, because resolved AST might have been already
-   * evicted from cache, so parsing and resolving will be performed.
-   */
+  /// Return the resolved [CompilationUnit] that declares this element, or
+  /// `null` if this element is synthetic.
+  ///
+  /// This method is expensive, because resolved AST might have been already
+  /// evicted from cache, so parsing and resolving will be performed.
   CompilationUnit get unit;
 
-  /**
-   * Use the given [visitor] to visit this element. Return the value returned by
-   * the visitor as a result of visiting this element.
-   */
+  /// Use the given [visitor] to visit this element. Return the value returned
+  /// by the visitor as a result of visiting this element.
   T accept<T>(ElementVisitor<T> visitor);
 
-  /**
-   * Return the documentation comment for this element as it appears in the
-   * original source (complete with the beginning and ending delimiters), or
-   * `null` if this element does not have a documentation comment associated
-   * with it. This can be a long-running operation if the information needed to
-   * access the comment is not cached.
-   *
-   * Throws [AnalysisException] if the documentation comment could not be
-   * determined because the analysis could not be performed
-   *
-   * Deprecated.  Use [documentationComment] instead.
-   */
+  /// Return the documentation comment for this element as it appears in the
+  /// original source (complete with the beginning and ending delimiters), or
+  /// `null` if this element does not have a documentation comment associated
+  /// with it. This can be a long-running operation if the information needed to
+  /// access the comment is not cached.
+  ///
+  /// Throws [AnalysisException] if the documentation comment could not be
+  /// determined because the analysis could not be performed
+  ///
+  /// Deprecated.  Use [documentationComment] instead.
   @deprecated
   String computeDocumentationComment();
 
-  /**
-   * Return the resolved [AstNode] node that declares this element, or `null` if
-   * this element is synthetic or isn't contained in a compilation unit, such as
-   * a [LibraryElement].
-   *
-   * This method is expensive, because resolved AST might be evicted from cache,
-   * so parsing and resolving will be performed.
-   *
-   * <b>Note:</b> This method cannot be used in an async environment.
-   */
+  /// Return the resolved [AstNode] node that declares this element, or `null`
+  /// if this element is synthetic or isn't contained in a compilation unit,
+  /// such as a [LibraryElement].
+  ///
+  /// This method is expensive, because resolved AST might be evicted from
+  /// cache, so parsing and resolving will be performed.
+  ///
+  /// <b>Note:</b> This method cannot be used in an async environment.
   AstNode computeNode();
 
-  /**
-   * Return the most immediate ancestor of this element for which the
-   * [predicate] returns `true`, or `null` if there is no such ancestor. Note
-   * that this element will never be returned.
-   */
+  /// Return the most immediate ancestor of this element for which the
+  /// [predicate] returns `true`, or `null` if there is no such ancestor. Note
+  /// that this element will never be returned.
   E getAncestor<E extends Element>(Predicate<Element> predicate);
 
-  /**
-   * Return a display name for the given element that includes the path to the
-   * compilation unit in which the type is defined. If [shortName] is `null`
-   * then [displayName] will be used as the name of this element. Otherwise
-   * the provided name will be used.
-   */
+  /// Return a display name for the given element that includes the path to the
+  /// compilation unit in which the type is defined. If [shortName] is `null`
+  /// then [displayName] will be used as the name of this element. Otherwise
+  /// the provided name will be used.
   // TODO(brianwilkerson) Make the parameter optional.
   String getExtendedDisplayName(String shortName);
 
-  /**
-   * Return `true` if this element, assuming that it is within scope, is
-   * accessible to code in the given [library]. This is defined by the Dart
-   * Language Specification in section 3.2:
-   * <blockquote>
-   * A declaration <i>m</i> is accessible to library <i>L</i> if <i>m</i> is
-   * declared in <i>L</i> or if <i>m</i> is public.
-   * </blockquote>
-   */
+  /// Return `true` if this element, assuming that it is within scope, is
+  /// accessible to code in the given [library]. This is defined by the Dart
+  /// Language Specification in section 3.2:
+  /// <blockquote>
+  /// A declaration <i>m</i> is accessible to library <i>L</i> if <i>m</i> is
+  /// declared in <i>L</i> or if <i>m</i> is public.
+  /// </blockquote>
   bool isAccessibleIn(LibraryElement library);
 
-  /**
-   * Use the given [visitor] to visit all of the children of this element. There
-   * is no guarantee of the order in which the children will be visited.
-   */
+  /// Use the given [visitor] to visit all of the children of this element.
+  /// There is no guarantee of the order in which the children will be visited.
   void visitChildren(ElementVisitor visitor);
 }
 
-/**
- * A single annotation associated with an element.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A single annotation associated with an element.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ElementAnnotation implements ConstantEvaluationTarget {
-  /**
-   * An empty list of annotations.
-   */
+  /// An empty list of annotations.
   @deprecated
   static const List<ElementAnnotation> EMPTY_LIST = const <ElementAnnotation>[];
 
-  /**
-   * Return a representation of the value of this annotation.
-   *
-   * Return `null` if the value of this annotation could not be computed because
-   * of errors.
-   */
+  /// Return a representation of the value of this annotation.
+  ///
+  /// Return `null` if the value of this annotation could not be computed
+  /// because of errors.
   DartObject get constantValue;
 
-  /**
-   * Return the element representing the field, variable, or const constructor
-   * being used as an annotation.
-   */
+  /// Return the element representing the field, variable, or const constructor
+  /// being used as an annotation.
   Element get element;
 
-  /**
-   * Return `true` if this annotation marks the associated function as always
-   * throwing.
-   */
+  /// Return `true` if this annotation marks the associated function as always
+  /// throwing.
   bool get isAlwaysThrows;
 
-  /**
-   * Return `true` if this annotation marks the associated element as being
-   * deprecated.
-   */
+  /// Return `true` if this annotation marks the associated element as being
+  /// deprecated.
   bool get isDeprecated;
 
-  /**
-   * Return `true` if this annotation marks the associated member as a factory.
-   */
+  /// Return `true` if this annotation marks the associated member as a factory.
   bool get isFactory;
 
-  /**
-   * Return `true` if this annotation marks the associated class and its
-   * subclasses as being immutable.
-   */
+  /// Return `true` if this annotation marks the associated class and its
+  /// subclasses as being immutable.
   bool get isImmutable;
 
-  /**
-   * Return `true` if this annotation marks the associated member as running
-   * a single test.
-   */
+  /// Return `true` if this annotation marks the associated member as running
+  /// a single test.
   bool get isIsTest;
 
-  /**
-   * Return `true` if this annotation marks the associated member as running
-   * a test group.
-   */
+  /// Return `true` if this annotation marks the associated member as running
+  /// a test group.
   bool get isIsTestGroup;
 
-  /**
-   * Return `true` if this annotation marks the associated element with the `JS`
-   * annotation.
-   */
+  /// Return `true` if this annotation marks the associated element with the
+  /// `JS` annotation.
   bool get isJS;
 
-  /**
-   * Return `true` if this annotation marks the associated member as requiring
-   * overriding methods to call super.
-   */
+  /// Return `true` if this annotation marks the associated member as requiring
+  /// overriding methods to call super.
   bool get isMustCallSuper;
 
-  /**
-   * Return `true` if this annotation marks the associated method as being
-   * expected to override an inherited method.
-   */
+  /// Return `true` if this annotation marks the associated method as being
+  /// expected to override an inherited method.
   bool get isOverride;
 
-  /**
-   * Return `true` if this annotation marks the associated member as being
-   * protected.
-   */
+  /// Return `true` if this annotation marks the associated member as being
+  /// protected.
   bool get isProtected;
 
-  /**
-   * Return `true` if this annotation marks the associated class as implementing
-   * a proxy object.
-   */
+  /// Return `true` if this annotation marks the associated class as
+  /// implementing a proxy object.
   bool get isProxy;
 
-  /**
-   * Return `true` if this annotation marks the associated member as being
-   * required.
-   */
+  /// Return `true` if this annotation marks the associated member as being
+  /// required.
   bool get isRequired;
 
-  /**
-   * Return `true` if this annotation marks the associated class as being
-   * sealed.
-   */
+  /// Return `true` if this annotation marks the associated class as being
+  /// sealed.
   bool get isSealed;
 
-  /**
-   * Return `true` if this annotation marks the associated member as being
-   * visible for template files.
-   */
+  /// Return `true` if this annotation marks the associated member as being
+  /// visible for template files.
   bool get isVisibleForTemplate;
 
-  /**
-   * Return `true` if this annotation marks the associated member as being
-   * visible for testing.
-   */
+  /// Return `true` if this annotation marks the associated member as being
+  /// visible for testing.
   bool get isVisibleForTesting;
 
-  /**
-   * Return a representation of the value of this annotation, forcing the value
-   * to be computed if it had not previously been computed, or `null` if the
-   * value of this annotation could not be computed because of errors.
-   */
+  /// Return a representation of the value of this annotation, forcing the value
+  /// to be computed if it had not previously been computed, or `null` if the
+  /// value of this annotation could not be computed because of errors.
   DartObject computeConstantValue();
 
-  /**
-   * Return a textual description of this annotation in a form approximating
-   * valid source. The returned string will not be valid source primarily in the
-   * case where the annotation itself is not well-formed.
-   */
+  /// Return a textual description of this annotation in a form approximating
+  /// valid source. The returned string will not be valid source primarily in
+  /// the case where the annotation itself is not well-formed.
   String toSource();
 }
 
-/**
- * The kind of elements in the element model.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The kind of elements in the element model.
+///
+/// Clients may not extend, implement or mix-in this class.
 class ElementKind implements Comparable<ElementKind> {
   static const ElementKind CLASS = const ElementKind('CLASS', 0, "class");
 
@@ -1121,24 +874,16 @@
     UNIVERSE
   ];
 
-  /**
-   * The name of this element kind.
-   */
+  /// The name of this element kind.
   final String name;
 
-  /**
-   * The ordinal value of the element kind.
-   */
+  /// The ordinal value of the element kind.
   final int ordinal;
 
-  /**
-   * The name displayed in the UI for this kind of element.
-   */
+  /// The name displayed in the UI for this kind of element.
   final String displayName;
 
-  /**
-   * Initialize a newly created element kind to have the given [displayName].
-   */
+  /// Initialize a newly created element kind to have the given [displayName].
   const ElementKind(this.name, this.ordinal, this.displayName);
 
   @override
@@ -1150,11 +895,9 @@
   @override
   String toString() => name;
 
-  /**
-   * Return the kind of the given [element], or [ERROR] if the element is
-   * `null`. This is a utility method that can reduce the need for null checks
-   * in other places.
-   */
+  /// Return the kind of the given [element], or [ERROR] if the element is
+  /// `null`. This is a utility method that can reduce the need for null checks
+  /// in other places.
   static ElementKind of(Element element) {
     if (element == null) {
       return ERROR;
@@ -1163,37 +906,30 @@
   }
 }
 
-/**
- * The location of an element within the element model.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The location of an element within the element model.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ElementLocation {
-  /**
-   * Return the path to the element whose location is represented by this
-   * object. Clients must not modify the returned array.
-   */
+  /// Return the path to the element whose location is represented by this
+  /// object. Clients must not modify the returned array.
   List<String> get components;
 
-  /**
-   * Return an encoded representation of this location that can be used to
-   * create a location that is equal to this location.
-   */
+  /// Return an encoded representation of this location that can be used to
+  /// create a location that is equal to this location.
   String get encoding;
 }
 
-/**
- * An object that can be used to visit an element structure.
- *
- * Clients may not extend, implement or mix-in this class. There are classes
- * that implement this interface that provide useful default behaviors in
- * `package:analyzer/dart/ast/visitor.dart`. A couple of the most useful include
- * * SimpleElementVisitor which implements every visit method by doing nothing,
- * * RecursiveElementVisitor which will cause every node in a structure to be
- *   visited, and
- * * ThrowingElementVisitor which implements every visit method by throwing an
- *   exception.
- */
+/// An object that can be used to visit an element structure.
+///
+/// Clients may not extend, implement or mix-in this class. There are classes
+/// that implement this interface that provide useful default behaviors in
+/// `package:analyzer/dart/ast/visitor.dart`. A couple of the most useful
+/// include
+/// * SimpleElementVisitor which implements every visit method by doing nothing,
+/// * RecursiveElementVisitor which will cause every node in a structure to be
+///   visited, and
+/// * ThrowingElementVisitor which implements every visit method by throwing an
+///   exception.
 abstract class ElementVisitor<R> {
   R visitClassElement(ClassElement element);
 
@@ -1236,194 +972,138 @@
   R visitTypeParameterElement(TypeParameterElement element);
 }
 
-/**
- * An element representing an executable object, including functions, methods,
- * constructors, getters, and setters.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An element representing an executable object, including functions, methods,
+/// constructors, getters, and setters.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ExecutableElement implements FunctionTypedElement {
-  /**
-   * An empty list of executable elements.
-   */
+  /// An empty list of executable elements.
   @deprecated
   static const List<ExecutableElement> EMPTY_LIST = const <ExecutableElement>[];
 
-  /**
-   * Return `true` if this executable element did not have an explicit return
-   * type specified for it in the original source. Note that if there was no
-   * explicit return type, and if the element model is fully populated, then
-   * the [returnType] will not be `null`.
-   */
+  /// Return `true` if this executable element did not have an explicit return
+  /// type specified for it in the original source. Note that if there was no
+  /// explicit return type, and if the element model is fully populated, then
+  /// the [returnType] will not be `null`.
   bool get hasImplicitReturnType;
 
-  /**
-   * Return `true` if this executable element is abstract. Executable elements
-   * are abstract if they are not external and have no body.
-   */
+  /// Return `true` if this executable element is abstract. Executable elements
+  /// are abstract if they are not external and have no body.
   bool get isAbstract;
 
-  /**
-   * Return `true` if this executable element has body marked as being
-   * asynchronous.
-   */
+  /// Return `true` if this executable element has body marked as being
+  /// asynchronous.
   bool get isAsynchronous;
 
-  /**
-   * Return `true` if this executable element is external. Executable elements
-   * are external if they are explicitly marked as such using the 'external'
-   * keyword.
-   */
+  /// Return `true` if this executable element is external. Executable elements
+  /// are external if they are explicitly marked as such using the 'external'
+  /// keyword.
   bool get isExternal;
 
-  /**
-   * Return `true` if this executable element has a body marked as being a
-   * generator.
-   */
+  /// Return `true` if this executable element has a body marked as being a
+  /// generator.
   bool get isGenerator;
 
-  /**
-   * Return `true` if this executable element is an operator. The test may be
-   * based on the name of the executable element, in which case the result will
-   * be correct when the name is legal.
-   */
+  /// Return `true` if this executable element is an operator. The test may be
+  /// based on the name of the executable element, in which case the result will
+  /// be correct when the name is legal.
   bool get isOperator;
 
-  /**
-   * 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.
-   */
+  /// 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;
 
-  /**
-   * Return `true` if this executable element has a body marked as being
-   * synchronous.
-   */
+  /// Return `true` if this executable element has a body marked as being
+  /// synchronous.
   bool get isSynchronous;
 }
 
-/**
- * An export directive within a library.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An export directive within a library.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ExportElement implements Element, UriReferencedElement {
-  /**
-   * An empty list of export elements.
-   */
+  /// An empty list of export elements.
   @deprecated
   static const List<ExportElement> EMPTY_LIST = const <ExportElement>[];
 
-  /**
-   * Return a list containing the combinators that were specified as part of the
-   * export directive in the order in which they were specified.
-   */
+  /// Return a list containing the combinators that were specified as part of
+  /// the export directive in the order in which they were specified.
   List<NamespaceCombinator> get combinators;
 
-  /**
-   * Return the library that is exported from this library by this export
-   * directive.
-   */
+  /// Return the library that is exported from this library by this export
+  /// directive.
   LibraryElement get exportedLibrary;
 }
 
-/**
- * A field defined within a type.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A field defined within a type.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class FieldElement
     implements ClassMemberElement, PropertyInducingElement {
-  /**
-   * An empty list of field elements.
-   */
+  /// An empty list of field elements.
   @deprecated
   static const List<FieldElement> EMPTY_LIST = const <FieldElement>[];
 
-  /**
-   * Return {@code true} if this element is an enum constant.
-   */
+  /// Return {@code true} if this element is an enum constant.
   bool get isEnumConstant;
 
-  /**
-   * Returns `true` if this field can be overridden in strong mode.
-   */
+  /// Returns `true` if this field can be overridden in strong mode.
+  @deprecated
   bool get isVirtual;
 
   @override
   AstNode computeNode();
 }
 
-/**
- * A field formal parameter defined within a constructor element.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A field formal parameter defined within a constructor element.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class FieldFormalParameterElement implements ParameterElement {
-  /**
-   * Return the field element associated with this field formal parameter, or
-   * `null` if the parameter references a field that doesn't exist.
-   */
+  /// Return the field element associated with this field formal parameter, or
+  /// `null` if the parameter references a field that doesn't exist.
   FieldElement get field;
 }
 
-/**
- * A (non-method) function. This can be either a top-level function, a local
- * function, a closure, or the initialization expression for a field or
- * variable.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A (non-method) function. This can be either a top-level function, a local
+/// function, a closure, or the initialization expression for a field or
+/// variable.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class FunctionElement implements ExecutableElement, LocalElement {
-  /**
-   * An empty list of function elements.
-   */
+  /// An empty list of function elements.
   @deprecated
   static const List<FunctionElement> EMPTY_LIST = const <FunctionElement>[];
 
-  /**
-   * The name of the method that can be implemented by a class to allow its
-   * instances to be invoked as if they were a function.
-   */
+  /// The name of the method that can be implemented by a class to allow its
+  /// instances to be invoked as if they were a function.
   static final String CALL_METHOD_NAME = "call";
 
-  /**
-   * The name of the synthetic function defined for libraries that are deferred.
-   */
+  /// The name of the synthetic function defined for libraries that are
+  /// deferred.
   static final String LOAD_LIBRARY_NAME = "loadLibrary";
 
-  /**
-   * The name of the function used as an entry point.
-   */
+  /// The name of the function used as an entry point.
   static const String MAIN_FUNCTION_NAME = "main";
 
-  /**
-   * The name of the method that will be invoked if an attempt is made to invoke
-   * an undefined method on an object.
-   */
+  /// The name of the method that will be invoked if an attempt is made to
+  /// invoke an undefined method on an object.
   static final String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
 
-  /**
-   * Return `true` if the function is an entry point, i.e. a top-level function
-   * and has the name `main`.
-   */
+  /// Return `true` if the function is an entry point, i.e. a top-level function
+  /// and has the name `main`.
   bool get isEntryPoint;
 
   @override
   FunctionDeclaration computeNode();
 }
 
-/**
- * A function type alias (`typedef`).
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A function type alias (`typedef`).
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class FunctionTypeAliasElement
     implements FunctionTypedElement, TypeDefiningElement {
-  /**
-   * An empty array of type alias elements.
-   */
+  /// An empty array of type alias elements.
   @deprecated
   static List<FunctionTypeAliasElement> EMPTY_LIST =
       new List<FunctionTypeAliasElement>(0);
@@ -1446,123 +1126,87 @@
   FunctionType instantiate(List<DartType> argumentTypes);
 }
 
-/**
- * An element that has a [FunctionType] as its [type].
- *
- * This also provides convenient access to the parameters and return type.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An element that has a [FunctionType] as its [type].
+///
+/// This also provides convenient access to the parameters and return type.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class FunctionTypedElement implements TypeParameterizedElement {
-  /**
-   * Return a list containing all of the parameters defined by this executable
-   * element.
-   */
+  /// Return a list containing all of the parameters defined by this executable
+  /// element.
   List<ParameterElement> get parameters;
 
-  /**
-   * Return the return type defined by this element. If the element model is
-   * fully populated, then the [returnType] will not be `null`, even if no
-   * return type was explicitly specified.
-   */
+  /// Return the return type defined by this element. If the element model is
+  /// fully populated, then the [returnType] will not be `null`, even if no
+  /// return type was explicitly specified.
   DartType get returnType;
 
   @override
   FunctionType get type;
 }
 
-/**
- * The pseudo-declaration that defines a generic function type.
- *
- * Clients may not extend, implement, or mix-in this class.
- */
+/// The pseudo-declaration that defines a generic function type.
+///
+/// Clients may not extend, implement, or mix-in this class.
 abstract class GenericFunctionTypeElement implements FunctionTypedElement {}
 
-/**
- * A [FunctionTypeAliasElement] whose returned function type has a [type]
- * parameter.
- *
- * Clients may not extend, implement, or mix-in this class.
- */
+/// A [FunctionTypeAliasElement] whose returned function type has a [type]
+/// parameter.
+///
+/// Clients may not extend, implement, or mix-in this class.
 abstract class GenericTypeAliasElement implements FunctionTypeAliasElement {
-  /**
-   * Return the generic function type element representing the generic function
-   * type on the right side of the equals.
-   */
+  /// Return the generic function type element representing the generic function
+  /// type on the right side of the equals.
   GenericFunctionTypeElement get function;
 }
 
-/**
- * A combinator that causes some of the names in a namespace to be hidden when
- * being imported.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A combinator that causes some of the names in a namespace to be hidden when
+/// being imported.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class HideElementCombinator implements NamespaceCombinator {
-  /**
-   * Return a list containing the names that are not to be made visible in the
-   * importing library even if they are defined in the imported library.
-   */
+  /// Return a list containing the names that are not to be made visible in the
+  /// importing library even if they are defined in the imported library.
   List<String> get hiddenNames;
 }
 
-/**
- * A single import directive within a library.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A single import directive within a library.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ImportElement implements Element, UriReferencedElement {
-  /**
-   * An empty list of import elements.
-   */
+  /// An empty list of import elements.
   @deprecated
   static const List<ImportElement> EMPTY_LIST = const <ImportElement>[];
 
-  /**
-   * Return a list containing the combinators that were specified as part of the
-   * import directive in the order in which they were specified.
-   */
+  /// Return a list containing the combinators that were specified as part of
+  /// the import directive in the order in which they were specified.
   List<NamespaceCombinator> get combinators;
 
-  /**
-   * Return the library that is imported into this library by this import
-   * directive.
-   */
+  /// Return the library that is imported into this library by this import
+  /// directive.
   LibraryElement get importedLibrary;
 
-  /**
-   * Return `true` if this import is for a deferred library.
-   */
+  /// Return `true` if this import is for a deferred library.
   bool get isDeferred;
 
-  /**
-   * The [Namespace] that this directive contributes to the containing library.
-   */
+  /// The [Namespace] that this directive contributes to the containing library.
   Namespace get namespace;
 
-  /**
-   * Return the prefix that was specified as part of the import directive, or
-   * `null` if there was no prefix specified.
-   */
+  /// Return the prefix that was specified as part of the import directive, or
+  /// `null` if there was no prefix specified.
   PrefixElement get prefix;
 
-  /**
-   * Return the offset of the prefix of this import in the file that contains
-   * this import directive, or `-1` if this import is synthetic, does not have a
-   * prefix, or otherwise does not have an offset.
-   */
+  /// Return the offset of the prefix of this import in the file that contains
+  /// this import directive, or `-1` if this import is synthetic, does not have
+  /// a prefix, or otherwise does not have an offset.
   int get prefixOffset;
 }
 
-/**
- * A label associated with a statement.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A label associated with a statement.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class LabelElement implements Element {
-  /**
-   * An empty list of label elements.
-   */
+  /// An empty list of label elements.
   @deprecated
   static const List<LabelElement> EMPTY_LIST = const <LabelElement>[];
 
@@ -1570,528 +1214,382 @@
   ExecutableElement get enclosingElement;
 }
 
-/**
- * A library.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A library.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class LibraryElement implements Element {
-  /**
-   * An empty list of library elements.
-   */
+  /// An empty list of library elements.
   @deprecated
   static const List<LibraryElement> EMPTY_LIST = const <LibraryElement>[];
 
-  /**
-   * Return the compilation unit that defines this library.
-   */
+  /// Return the compilation unit that defines this library.
   CompilationUnitElement get definingCompilationUnit;
 
-  /**
-   * Return the entry point for this library, or `null` if this library does not
-   * have an entry point. The entry point is defined to be a zero argument
-   * top-level function whose name is `main`.
-   */
+  /// Return the entry point for this library, or `null` if this library does
+  /// not have an entry point. The entry point is defined to be a zero argument
+  /// top-level function whose name is `main`.
   FunctionElement get entryPoint;
 
-  /**
-   * Return a list containing all of the libraries that are exported from this
-   * library.
-   */
+  /// Return a list containing all of the libraries that are exported from this
+  /// library.
   List<LibraryElement> get exportedLibraries;
 
-  /**
-   * The export [Namespace] of this library, `null` if it has not been
-   * computed yet.
-   */
+  /// The export [Namespace] of this library, `null` if it has not been
+  /// computed yet.
   Namespace get exportNamespace;
 
-  /**
-   * Return a list containing all of the exports defined in this library.
-   */
+  /// Return a list containing all of the exports defined in this library.
   List<ExportElement> get exports;
 
-  /**
-   * Return `true` if the defining compilation unit of this library contains at
-   * least one import directive whose URI uses the "dart-ext" scheme.
-   */
+  /// Return `true` if the defining compilation unit of this library contains at
+  /// least one import directive whose URI uses the "dart-ext" scheme.
   bool get hasExtUri;
 
-  /**
-   * Return `true` if this library defines a top-level function named
-   * `loadLibrary`.
-   */
+  /// Return `true` if this library defines a top-level function named
+  /// `loadLibrary`.
   bool get hasLoadLibraryFunction;
 
-  /**
-   * Return an identifier that uniquely identifies this element among the
-   * children of this element's parent.
-   */
+  /// Return an identifier that uniquely identifies this element among the
+  /// children of this element's parent.
   String get identifier;
 
-  /**
-   * Return a list containing all of the libraries that are imported into this
-   * library. This includes all of the libraries that are imported using a
-   * prefix (also available through the prefixes returned by [getPrefixes]) and
-   * those that are imported without a prefix.
-   */
+  /// Return a list containing all of the libraries that are imported into this
+  /// library. This includes all of the libraries that are imported using a
+  /// prefix (also available through the prefixes returned by [getPrefixes]) and
+  /// those that are imported without a prefix.
   List<LibraryElement> get importedLibraries;
 
-  /**
-   * Return a list containing all of the imports defined in this library.
-   */
+  /// Return a list containing all of the imports defined in this library.
   List<ImportElement> get imports;
 
-  /**
-   * Return `true` if this library is an application that can be run in the
-   * browser.
-   */
+  /// Return `true` if this library is an application that can be run in the
+  /// browser.
   bool get isBrowserApplication;
 
-  /**
-   * Return `true` if this library is the dart:async library.
-   */
+  /// Return `true` if this library is the dart:async library.
   bool get isDartAsync;
 
-  /**
-   * Return `true` if this library is the dart:core library.
-   */
+  /// Return `true` if this library is the dart:core library.
   bool get isDartCore;
 
-  /**
-   * Return `true` if this library is part of the SDK.
-   */
+  /// Return `true` if this library is part of the SDK.
   bool get isInSdk;
 
-  /**
-   * Return a list containing the strongly connected component in the
-   * import/export graph in which the current library resides.
-   */
+  /// Return a list containing the strongly connected component in the
+  /// import/export graph in which the current library resides.
   List<LibraryElement> get libraryCycle;
 
-  /**
-   * Return the element representing the synthetic function `loadLibrary` that
-   * is implicitly defined for this library if the library is imported using a
-   * deferred import.
-   */
+  /// Return the element representing the synthetic function `loadLibrary` that
+  /// is implicitly defined for this library if the library is imported using a
+  /// deferred import.
   FunctionElement get loadLibraryFunction;
 
-  /**
-   * Return a list containing all of the compilation units that are included in
-   * this library using a `part` directive. This does not include the defining
-   * compilation unit that contains the `part` directives.
-   */
+  /// Return a list containing all of the compilation units that are included in
+  /// this library using a `part` directive. This does not include the defining
+  /// compilation unit that contains the `part` directives.
   List<CompilationUnitElement> get parts;
 
-  /**
-   * Return a list containing elements for each of the prefixes used to `import`
-   * libraries into this library. Each prefix can be used in more than one
-   * `import` directive.
-   */
+  /// Return a list containing elements for each of the prefixes used to
+  /// `import` libraries into this library. Each prefix can be used in more
+  /// than one `import` directive.
   List<PrefixElement> get prefixes;
 
-  /**
-   * The public [Namespace] of this library, `null` if it has not been
-   * computed yet.
-   */
+  /// The public [Namespace] of this library, `null` if it has not been
+  /// computed yet.
   Namespace get publicNamespace;
 
-  /**
-   * Return a list containing all of the compilation units this library consists
-   * of. This includes the defining compilation unit and units included using
-   * the `part` directive.
-   */
+  /// Return a list containing all of the compilation units this library
+  /// consists of. This includes the defining compilation unit and units
+  /// included using the `part` directive.
   List<CompilationUnitElement> get units;
 
-  /**
-   * Return a list containing all of the imports that share the given [prefix],
-   * or an empty array if there are no such imports.
-   */
+  /// Return a list containing all of the imports that share the given [prefix],
+  /// or an empty array if there are no such imports.
   List<ImportElement> getImportsWithPrefix(PrefixElement prefix);
 
-  /**
-   * Return the class defined in this library that has the given [name], or
-   * `null` if this library does not define a class with the given name.
-   */
+  /// Return the class defined in this library that has the given [name], or
+  /// `null` if this library does not define a class with the given name.
   ClassElement getType(String className);
 }
 
-/**
- * An element that can be (but is not required to be) defined within a method
- * or function (an [ExecutableElement]).
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An element that can be (but is not required to be) defined within a method
+/// or function (an [ExecutableElement]).
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class LocalElement implements Element {
-  /**
-   * Return a source range that covers the approximate portion of the source in
-   * which the name of this element is visible, or `null` if there is no single
-   * range of characters within which the element name is visible.
-   *
-   * * For a local variable, this is the source range of the block that
-   *   encloses the variable declaration.
-   * * For a parameter, this includes the body of the method or function that
-   *   declares the parameter.
-   * * For a local function, this is the source range of the block that
-   *   encloses the variable declaration.
-   * * For top-level functions, `null` will be returned because they are
-   *   potentially visible in multiple sources.
-   */
+  /// Return a source range that covers the approximate portion of the source in
+  /// which the name of this element is visible, or `null` if there is no single
+  /// range of characters within which the element name is visible.
+  ///
+  /// * For a local variable, this is the source range of the block that
+  ///   encloses the variable declaration.
+  /// * For a parameter, this includes the body of the method or function that
+  ///   declares the parameter.
+  /// * For a local function, this is the source range of the block that
+  ///   encloses the variable declaration.
+  /// * For top-level functions, `null` will be returned because they are
+  ///   potentially visible in multiple sources.
   SourceRange get visibleRange;
 }
 
-/**
- * A local variable.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A local variable.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class LocalVariableElement implements LocalElement, VariableElement {
-  /**
-   * An empty list of field elements.
-   */
+  /// An empty list of field elements.
   @deprecated
   static const List<LocalVariableElement> EMPTY_LIST =
       const <LocalVariableElement>[];
 }
 
-/**
- * An element that represents a method defined within a type.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An element that represents a method defined within a type.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class MethodElement implements ClassMemberElement, ExecutableElement {
-  /**
-   * An empty list of method elements.
-   */
+  /// An empty list of method elements.
   @deprecated
   static const List<MethodElement> EMPTY_LIST = const <MethodElement>[];
 
   @override
   MethodDeclaration computeNode();
 
-  /**
-   * Gets the reified type of a tear-off of this method.
-   *
-   * If any of the parameters in the method are covariant, they are replaced
-   * with Object in the returned type. If no covariant parameters are present,
-   * returns `this`.
-   */
+  /// Gets the reified type of a tear-off of this method.
+  ///
+  /// If any of the parameters in the method are covariant, they are replaced
+  /// with Object in the returned type. If no covariant parameters are present,
+  /// returns `this`.
   @deprecated
   FunctionType getReifiedType(DartType objectType);
 }
 
-/**
- * A pseudo-element that represents multiple elements defined within a single
- * scope that have the same name. This situation is not allowed by the language,
- * so objects implementing this interface always represent an error. As a
- * result, most of the normal operations on elements do not make sense and will
- * return useless results.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A pseudo-element that represents multiple elements defined within a single
+/// scope that have the same name. This situation is not allowed by the
+/// language, so objects implementing this interface always represent an error.
+/// As a result, most of the normal operations on elements do not make sense
+/// and will return useless results.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class MultiplyDefinedElement implements Element {
-  /**
-   * Return a list containing all of the elements that were defined within the
-   * scope to have the same name.
-   */
+  /// Return a list containing all of the elements that were defined within the
+  /// scope to have the same name.
   List<Element> get conflictingElements;
 
-  /**
-   * Return the type of this element as the dynamic type.
-   */
+  /// Return the type of this element as the dynamic type.
   DartType get type;
 }
 
-/**
- * An [ExecutableElement], with the additional information of a list of
- * [ExecutableElement]s from which this element was composed.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An [ExecutableElement], with the additional information of a list of
+/// [ExecutableElement]s from which this element was composed.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class MultiplyInheritedExecutableElement implements ExecutableElement {
-  /**
-   * Return a list containing all of the executable elements defined within this
-   * executable element.
-   */
+  /// Return a list containing all of the executable elements defined within
+  /// this executable element.
   List<ExecutableElement> get inheritedElements;
 }
 
-/**
- * An object that controls how namespaces are combined.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An object that controls how namespaces are combined.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class NamespaceCombinator {
-  /**
-   * An empty list of namespace combinators.
-   */
+  /// An empty list of namespace combinators.
   @deprecated
   static const List<NamespaceCombinator> EMPTY_LIST =
       const <NamespaceCombinator>[];
 }
 
-/**
- * A parameter defined within an executable element.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A parameter defined within an executable element.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ParameterElement
     implements LocalElement, VariableElement, ConstantEvaluationTarget {
-  /**
-   * An empty list of parameter elements.
-   */
+  /// An empty list of parameter elements.
   @deprecated
   static const List<ParameterElement> EMPTY_LIST = const <ParameterElement>[];
 
-  /**
-   * Return the Dart code of the default value, or `null` if no default value.
-   */
+  /// Return the Dart code of the default value, or `null` if no default value.
   String get defaultValueCode;
 
-  /**
-   * Return `true` if this parameter is covariant, meaning it is allowed to have
-   * a narrower type in an override.
-   */
+  /// Return `true` if this parameter is covariant, meaning it is allowed to
+  /// have a narrower type in an override.
   bool get isCovariant;
 
-  /**
-   * Return `true` if this parameter is an initializing formal parameter.
-   */
+  /// Return `true` if this parameter is an initializing formal parameter.
   bool get isInitializingFormal;
 
-  /**
-   * Return `true` if this parameter is a named parameter. Named parameters are
-   * always optional, even when they are annotated with the `@required`
-   * annotation.
-   */
+  /// Return `true` if this parameter is a named parameter. Named parameters are
+  /// always optional, even when they are annotated with the `@required`
+  /// annotation.
   bool get isNamed;
 
-  /**
-   * Return `true` if this parameter is a required parameter. Required
-   * parameters are always positional.
-   *
-   * Note: this will return `false` for a named parameter that is annotated with
-   * the `@required` annotation.
-   */
+  /// Return `true` if this parameter is a required parameter. Required
+  /// parameters are always positional.
+  ///
+  /// Note: this will return `false` for a named parameter that is annotated
+  /// with the `@required` annotation.
   // TODO(brianwilkerson) Rename this to `isRequired`.
   bool get isNotOptional;
 
-  /**
-   * Return `true` if this parameter is an optional parameter. Optional
-   * parameters can either be positional or named.
-   */
+  /// Return `true` if this parameter is an optional parameter. Optional
+  /// parameters can either be positional or named.
   bool get isOptional;
 
-  /**
-   * Return `true` if this parameter is both an optional and positional
-   * parameter.
-   */
+  /// Return `true` if this parameter is both an optional and positional
+  /// parameter.
   bool get isOptionalPositional;
 
-  /**
-   * Return `true` if this parameter is a positional parameter. Positional
-   * parameters can either be required or optional.
-   */
+  /// Return `true` if this parameter is a positional parameter. Positional
+  /// parameters can either be required or optional.
   bool get isPositional;
 
-  /**
-   * Return the kind of this parameter.
-   */
+  /// Return the kind of this parameter.
   @deprecated
   ParameterKind get parameterKind;
 
-  /**
-   * Return a list containing all of the parameters defined by this parameter.
-   * A parameter will only define other parameters if it is a function typed
-   * parameter.
-   */
+  /// Return a list containing all of the parameters defined by this parameter.
+  /// A parameter will only define other parameters if it is a function typed
+  /// parameter.
   List<ParameterElement> get parameters;
 
-  /**
-   * Return a list containing all of the type parameters defined by this
-   * parameter. A parameter will only define other parameters if it is a
-   * function typed parameter.
-   */
+  /// Return a list containing all of the type parameters defined by this
+  /// parameter. A parameter will only define other parameters if it is a
+  /// function typed parameter.
   List<TypeParameterElement> get typeParameters;
 
-  /**
-   * Append the type, name and possibly the default value of this parameter to
-   * the given [buffer].
-   */
+  /// Append the type, name and possibly the default value of this parameter to
+  /// the given [buffer].
   void appendToWithoutDelimiters(StringBuffer buffer);
 
   @override
   FormalParameter computeNode();
 }
 
-/**
- * A prefix used to import one or more libraries into another library.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A prefix used to import one or more libraries into another library.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class PrefixElement implements Element {
-  /**
-   * An empty list of prefix elements.
-   */
+  /// An empty list of prefix elements.
   @deprecated
   static const List<PrefixElement> EMPTY_LIST = const <PrefixElement>[];
 
   @override
   LibraryElement get enclosingElement;
 
-  /**
-   * Return the empty list.
-   *
-   * Deprecated: this getter was intended to return a list containing all of
-   * the libraries that are imported using this prefix, but it was never
-   * implemented.  Due to lack of demand, it is being removed.
-   */
+  /// Return the empty list.
+  ///
+  /// Deprecated: this getter was intended to return a list containing all of
+  /// the libraries that are imported using this prefix, but it was never
+  /// implemented.  Due to lack of demand, it is being removed.
   @deprecated
   List<LibraryElement> get importedLibraries;
 }
 
-/**
- * A getter or a setter. Note that explicitly defined property accessors
- * implicitly define a synthetic field. Symmetrically, synthetic accessors are
- * implicitly created for explicitly defined fields. The following rules apply:
- *
- * * Every explicit field is represented by a non-synthetic [FieldElement].
- * * Every explicit field induces a getter and possibly a setter, both of which
- *   are represented by synthetic [PropertyAccessorElement]s.
- * * Every explicit getter or setter is represented by a non-synthetic
- *   [PropertyAccessorElement].
- * * Every explicit getter or setter (or pair thereof if they have the same
- *   name) induces a field that is represented by a synthetic [FieldElement].
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A getter or a setter. Note that explicitly defined property accessors
+/// implicitly define a synthetic field. Symmetrically, synthetic accessors are
+/// implicitly created for explicitly defined fields. The following rules apply:
+///
+/// * Every explicit field is represented by a non-synthetic [FieldElement].
+/// * Every explicit field induces a getter and possibly a setter, both of which
+///   are represented by synthetic [PropertyAccessorElement]s.
+/// * Every explicit getter or setter is represented by a non-synthetic
+///   [PropertyAccessorElement].
+/// * Every explicit getter or setter (or pair thereof if they have the same
+///   name) induces a field that is represented by a synthetic [FieldElement].
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class PropertyAccessorElement implements ExecutableElement {
-  /**
-   * An empty list of property accessor elements.
-   */
+  /// An empty list of property accessor elements.
   @deprecated
   static const List<PropertyAccessorElement> EMPTY_LIST =
       const <PropertyAccessorElement>[];
 
-  /**
-   * Return the accessor representing the getter that corresponds to (has the
-   * same name as) this setter, or `null` if this accessor is not a setter or if
-   * there is no corresponding getter.
-   */
+  /// Return the accessor representing the getter that corresponds to (has the
+  /// same name as) this setter, or `null` if this accessor is not a setter or
+  /// if there is no corresponding getter.
   PropertyAccessorElement get correspondingGetter;
 
-  /**
-   * Return the accessor representing the setter that corresponds to (has the
-   * same name as) this getter, or `null` if this accessor is not a getter or if
-   * there is no corresponding setter.
-   */
+  /// Return the accessor representing the setter that corresponds to (has the
+  /// same name as) this getter, or `null` if this accessor is not a getter or
+  /// if there is no corresponding setter.
   PropertyAccessorElement get correspondingSetter;
 
-  /**
-   * Return `true` if this accessor represents a getter.
-   */
+  /// Return `true` if this accessor represents a getter.
   bool get isGetter;
 
-  /**
-   * Return `true` if this accessor represents a setter.
-   */
+  /// Return `true` if this accessor represents a setter.
   bool get isSetter;
 
-  /**
-   * Return the field or top-level variable associated with this accessor. If
-   * this accessor was explicitly defined (is not synthetic) then the variable
-   * associated with it will be synthetic.
-   */
+  /// Return the field or top-level variable associated with this accessor. If
+  /// this accessor was explicitly defined (is not synthetic) then the variable
+  /// associated with it will be synthetic.
   PropertyInducingElement get variable;
 }
 
-/**
- * A variable that has an associated getter and possibly a setter. Note that
- * explicitly defined variables implicitly define a synthetic getter and that
- * non-`final` explicitly defined variables implicitly define a synthetic
- * setter. Symmetrically, synthetic fields are implicitly created for explicitly
- * defined getters and setters. The following rules apply:
- *
- * * Every explicit variable is represented by a non-synthetic
- *   [PropertyInducingElement].
- * * Every explicit variable induces a getter and possibly a setter, both of
- *   which are represented by synthetic [PropertyAccessorElement]s.
- * * Every explicit getter or setter is represented by a non-synthetic
- *   [PropertyAccessorElement].
- * * Every explicit getter or setter (or pair thereof if they have the same
- *   name) induces a variable that is represented by a synthetic
- *   [PropertyInducingElement].
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A variable that has an associated getter and possibly a setter. Note that
+/// explicitly defined variables implicitly define a synthetic getter and that
+/// non-`final` explicitly defined variables implicitly define a synthetic
+/// setter. Symmetrically, synthetic fields are implicitly created for
+/// explicitly defined getters and setters. The following rules apply:
+///
+/// * Every explicit variable is represented by a non-synthetic
+///   [PropertyInducingElement].
+/// * Every explicit variable induces a getter and possibly a setter, both of
+///   which are represented by synthetic [PropertyAccessorElement]s.
+/// * Every explicit getter or setter is represented by a non-synthetic
+///   [PropertyAccessorElement].
+/// * Every explicit getter or setter (or pair thereof if they have the same
+///   name) induces a variable that is represented by a synthetic
+///   [PropertyInducingElement].
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class PropertyInducingElement implements VariableElement {
-  /**
-   * An empty list of elements.
-   */
+  /// An empty list of elements.
   @deprecated
   static const List<PropertyInducingElement> EMPTY_LIST =
       const <PropertyInducingElement>[];
 
-  /**
-   * Return the getter associated with this variable. If this variable was
-   * explicitly defined (is not synthetic) then the getter associated with it
-   * will be synthetic.
-   */
+  /// Return the getter associated with this variable. If this variable was
+  /// explicitly defined (is not synthetic) then the getter associated with it
+  /// will be synthetic.
   PropertyAccessorElement get getter;
 
-  /**
-   * Return the propagated type of this variable, or `null` if type propagation
-   * has not been performed, for example because the variable is not final.
-   */
+  /// Return the propagated type of this variable, or `null` if type propagation
+  /// has not been performed, for example because the variable is not final.
   @deprecated
   DartType get propagatedType;
 
-  /**
-   * Return the setter associated with this variable, or `null` if the variable
-   * is effectively `final` and therefore does not have a setter associated with
-   * it. (This can happen either because the variable is explicitly defined as
-   * being `final` or because the variable is induced by an explicit getter that
-   * does not have a corresponding setter.) If this variable was explicitly
-   * defined (is not synthetic) then the setter associated with it will be
-   * synthetic.
-   */
+  /// Return the setter associated with this variable, or `null` if the variable
+  /// is effectively `final` and therefore does not have a setter associated
+  /// with it. (This can happen either because the variable is explicitly
+  /// defined as being `final` or because the variable is induced by an
+  /// explicit getter that does not have a corresponding setter.) If this
+  /// variable was explicitly defined (is not synthetic) then the setter
+  /// associated with it will be synthetic.
   PropertyAccessorElement get setter;
 }
 
-/**
- * A combinator that cause some of the names in a namespace to be visible (and
- * the rest hidden) when being imported.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A combinator that cause some of the names in a namespace to be visible (and
+/// the rest hidden) when being imported.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ShowElementCombinator implements NamespaceCombinator {
-  /**
-   * Return the offset of the character immediately following the last character
-   * of this node.
-   */
+  /// Return the offset of the character immediately following the last
+  /// character of this node.
   int get end;
 
-  /**
-   * Return the offset of the 'show' keyword of this element.
-   */
+  /// Return the offset of the 'show' keyword of this element.
   int get offset;
 
-  /**
-   * Return a list containing the names that are to be made visible in the
-   * importing library if they are defined in the imported library.
-   */
+  /// Return a list containing the names that are to be made visible in the
+  /// importing library if they are defined in the imported library.
   List<String> get shownNames;
 }
 
-/**
- * A top-level variable.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A top-level variable.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class TopLevelVariableElement implements PropertyInducingElement {
-  /**
-   * An empty list of top-level variable elements.
-   */
+  /// An empty list of top-level variable elements.
   @deprecated
   static const List<TopLevelVariableElement> EMPTY_LIST =
       const <TopLevelVariableElement>[];
@@ -2100,195 +1598,145 @@
   VariableDeclaration computeNode();
 }
 
-/**
- * An element that defines a type.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An element that defines a type.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class TypeDefiningElement implements Element {
-  /**
-   * Return the type defined by this element.
-   */
+  /// Return the type defined by this element.
   DartType get type;
 }
 
-/**
- * A type parameter.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A type parameter.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class TypeParameterElement implements TypeDefiningElement {
-  /**
-   * An empty list of type parameter elements.
-   */
+  /// An empty list of type parameter elements.
   @deprecated
   static const List<TypeParameterElement> EMPTY_LIST =
       const <TypeParameterElement>[];
 
-  /**
-   * Return the type representing the bound associated with this parameter, or
-   * `null` if this parameter does not have an explicit bound.
-   */
+  /// Return the type representing the bound associated with this parameter, or
+  /// `null` if this parameter does not have an explicit bound.
   DartType get bound;
 
   @override
   TypeParameterType get type;
 }
 
-/**
- * An element that has type parameters, such as a class or a typedef. This also
- * includes functions and methods if support for generic methods is enabled.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An element that has type parameters, such as a class or a typedef. This also
+/// includes functions and methods if support for generic methods is enabled.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class TypeParameterizedElement implements Element {
-  /**
-   * The type of this element, which will be a parameterized type.
-   */
+  /// 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.
-   */
+  /// 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.
   List<TypeParameterElement> get typeParameters;
 }
 
-/**
- * A pseudo-elements that represents names that are undefined. This situation is
- * not allowed by the language, so objects implementing this interface always
- * represent an error. As a result, most of the normal operations on elements do
- * not make sense and will return useless results.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A pseudo-elements that represents names that are undefined. This situation
+/// is not allowed by the language, so objects implementing this interface
+/// always represent an error. As a result, most of the normal operations on
+/// elements do not make sense and will return useless results.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class UndefinedElement implements Element {}
 
-/**
- * An element included into a library using some URI.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An element included into a library using some URI.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class UriReferencedElement implements Element {
-  /**
-   * Return the URI that is used to include this element into the enclosing
-   * library, or `null` if this is the defining compilation unit of a library.
-   */
+  /// Return the URI that is used to include this element into the enclosing
+  /// library, or `null` if this is the defining compilation unit of a library.
   String get uri;
 
-  /**
-   * Return the offset of the character immediately following the last character
-   * of this node's URI, or `-1` for synthetic import.
-   */
+  /// Return the offset of the character immediately following the last
+  /// character of this node's URI, or `-1` for synthetic import.
   int get uriEnd;
 
-  /**
-   * Return the offset of the URI in the file, or `-1` if this element is
-   * synthetic.
-   */
+  /// Return the offset of the URI in the file, or `-1` if this element is
+  /// synthetic.
   int get uriOffset;
 }
 
-/**
- * A variable. There are more specific subclasses for more specific kinds of
- * variables.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A variable. There are more specific subclasses for more specific kinds of
+/// variables.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class VariableElement implements Element, ConstantEvaluationTarget {
-  /**
-   * An empty list of variable elements.
-   */
+  /// An empty list of variable elements.
   @deprecated
   static const List<VariableElement> EMPTY_LIST = const <VariableElement>[];
 
-  /**
-   * Return a representation of the value of this variable.
-   *
-   * Return `null` if either this variable was not declared with the 'const'
-   * modifier or if the value of this variable could not be computed because of
-   * errors.
-   */
+  /// Return a representation of the value of this variable.
+  ///
+  /// Return `null` if either this variable was not declared with the 'const'
+  /// modifier or if the value of this variable could not be computed because of
+  /// errors.
   DartObject get constantValue;
 
-  /**
-   * Return `true` if this variable element did not have an explicit type
-   * specified for it.
-   */
+  /// Return `true` if this variable element did not have an explicit type
+  /// specified for it.
   bool get hasImplicitType;
 
-  /**
-   * Return a synthetic function representing this variable's initializer, or
-   * `null` if this variable does not have an initializer. The function will
-   * have no parameters. The return type of the function will be the
-   * compile-time type of the initialization expression.
-   */
+  /// Return a synthetic function representing this variable's initializer, or
+  /// `null` if this variable does not have an initializer. The function will
+  /// have no parameters. The return type of the function will be the
+  /// compile-time type of the initialization expression.
   FunctionElement get initializer;
 
-  /**
-   * Return `true` if this variable was declared with the 'const' modifier.
-   */
+  /// Return `true` if this variable was declared with the 'const' modifier.
   bool get isConst;
 
-  /**
-   * Return `true` if this variable was declared with the 'final' modifier.
-   * Variables that are declared with the 'const' modifier will return `false`
-   * even though they are implicitly final.
-   */
+  /// Return `true` if this variable was declared with the 'final' modifier.
+  /// Variables that are declared with the 'const' modifier will return `false`
+  /// even though they are implicitly final.
   bool get isFinal;
 
-  /**
-   * Return `true` if this variable is potentially mutated somewhere in a
-   * closure. This information is only available for local variables (including
-   * parameters) and only after the compilation unit containing the variable has
-   * been resolved.
-   *
-   * This getter is deprecated--it now returns `true` for all local variables
-   * and parameters.  Please use [FunctionBody.isPotentiallyMutatedInClosure]
-   * instead.
-   */
+  /// Return `true` if this variable is potentially mutated somewhere in a
+  /// closure. This information is only available for local variables (including
+  /// parameters) and only after the compilation unit containing the variable
+  /// has been resolved.
+  ///
+  /// This getter is deprecated--it now returns `true` for all local variables
+  /// and parameters.  Please use [FunctionBody.isPotentiallyMutatedInClosure]
+  /// instead.
   @deprecated
   bool get isPotentiallyMutatedInClosure;
 
-  /**
-   * Return `true` if this variable is potentially mutated somewhere in its
-   * scope. This information is only available for local variables (including
-   * parameters) and only after the compilation unit containing the variable has
-   * been resolved.
-   *
-   * This getter is deprecated--it now returns `true` for all local variables
-   * and parameters.  Please use [FunctionBody.isPotentiallyMutatedInClosure]
-   * instead.
-   */
+  /// Return `true` if this variable is potentially mutated somewhere in its
+  /// scope. This information is only available for local variables (including
+  /// parameters) and only after the compilation unit containing the variable
+  /// has been resolved.
+  ///
+  /// This getter is deprecated--it now returns `true` for all local variables
+  /// and parameters.  Please use [FunctionBody.isPotentiallyMutatedInClosure]
+  /// instead.
   @deprecated
   bool get isPotentiallyMutatedInScope;
 
-  /**
-   * Return `true` if this element is a static variable, as per section 8 of the
-   * Dart Language Specification:
-   *
-   * > A static variable is a variable that is not associated with a particular
-   * > instance, but rather with an entire library or class. Static variables
-   * > include library variables and class variables. Class variables are
-   * > variables whose declaration is immediately nested inside a class
-   * > declaration and includes the modifier static. A library variable is
-   * > implicitly static.
-   */
+  /// Return `true` if this element is a static variable, as per section 8 of
+  /// the Dart Language Specification:
+  ///
+  /// > A static variable is a variable that is not associated with a particular
+  /// > instance, but rather with an entire library or class. Static variables
+  /// > include library variables and class variables. Class variables are
+  /// > variables whose declaration is immediately nested inside a class
+  /// > declaration and includes the modifier static. A library variable is
+  /// > implicitly static.
   bool get isStatic;
 
-  /**
-   * Return the declared type of this variable, or `null` if the variable did
-   * not have a declared type (such as if it was declared using the keyword
-   * 'var').
-   */
+  /// Return the declared type of this variable, or `null` if the variable did
+  /// not have a declared type (such as if it was declared using the keyword
+  /// 'var').
   DartType get type;
 
-  /**
-   * Return a representation of the value of this variable, forcing the value
-   * to be computed if it had not previously been computed, or `null` if either
-   * this variable was not declared with the 'const' modifier or if the value of
-   * this variable could not be computed because of errors.
-   */
+  /// Return a representation of the value of this variable, forcing the value
+  /// to be computed if it had not previously been computed, or `null` if either
+  /// this variable was not declared with the 'const' modifier or if the value
+  /// of this variable could not be computed because of errors.
   DartObject computeConstantValue();
 }
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 7292017..39dc3ae 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -145,6 +145,8 @@
   CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
   CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY,
   CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
+  CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
+  CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
   CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD,
   CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD,
   CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
@@ -164,6 +166,7 @@
   CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR,
   CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER,
   CompileTimeErrorCode.INVALID_INLINE_FUNCTION_TYPE,
+  CompileTimeErrorCode.INVALID_OVERRIDE,
   CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP,
@@ -375,6 +378,7 @@
   ParserErrorCode.EXPECTED_CASE_OR_DEFAULT,
   ParserErrorCode.EXPECTED_CLASS_MEMBER,
   ParserErrorCode.EXPECTED_EXECUTABLE,
+  ParserErrorCode.EXPECTED_INSTEAD,
   ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL,
   ParserErrorCode.EXPECTED_STRING_LITERAL,
   ParserErrorCode.EXPECTED_TOKEN,
@@ -475,10 +479,6 @@
   ParserErrorCode.NON_STRING_LITERAL_AS_URI,
   ParserErrorCode.NON_USER_DEFINABLE_OPERATOR,
   ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS,
-  ParserErrorCode.NULLABLE_TYPE_IN_EXTENDS,
-  ParserErrorCode.NULLABLE_TYPE_IN_IMPLEMENTS,
-  ParserErrorCode.NULLABLE_TYPE_IN_WITH,
-  ParserErrorCode.NULLABLE_TYPE_PARAMETER,
   ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT,
   ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP,
   ParserErrorCode.PREFIX_AFTER_COMBINATOR,
@@ -532,7 +532,6 @@
   StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE,
   StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
   StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE,
-  StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
   StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
   StaticTypeWarningCode.INVALID_ASSIGNMENT,
   StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
@@ -541,7 +540,6 @@
   StaticTypeWarningCode.NON_BOOL_EXPRESSION,
   StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION,
   StaticTypeWarningCode.NON_BOOL_OPERAND,
-  StaticTypeWarningCode.NON_NULLABLE_FIELD_NOT_INITIALIZED,
   StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT,
   StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
   StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
@@ -591,14 +589,6 @@
   StaticWarningCode.FUNCTION_WITHOUT_CALL,
   StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED,
   StaticWarningCode.IMPORT_OF_NON_LIBRARY,
-  StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
-  StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE,
-  StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE,
-  StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE,
-  StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE,
-  StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE,
-  StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS,
-  StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND,
   StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED,
   StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
   StaticWarningCode.INVALID_OVERRIDE_NAMED,
@@ -674,9 +664,6 @@
   StrongModeCode.INVALID_CAST_METHOD,
   StrongModeCode.INVALID_CAST_FUNCTION,
   StrongModeCode.INVALID_FIELD_OVERRIDE,
-  StrongModeCode.INVALID_METHOD_OVERRIDE,
-  StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_BASE,
-  StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_MIXIN,
   StrongModeCode.INVALID_PARAMETER_DECLARATION,
   StrongModeCode.INVALID_SUPER_INVOCATION,
   StrongModeCode.NO_DEFAULT_BOUNDS,
diff --git a/pkg/analyzer/lib/file_system/file_system.dart b/pkg/analyzer/lib/file_system/file_system.dart
index 89da122..7a714b6 100644
--- a/pkg/analyzer/lib/file_system/file_system.dart
+++ b/pkg/analyzer/lib/file_system/file_system.dart
@@ -55,6 +55,8 @@
    * Synchronously rename this file.
    * Return a [File] instance for the renamed file.
    *
+   * The [newPath] must be absolute and normalized.
+   *
    * If [newPath] identifies an existing file, that file is replaced.
    * If [newPath] identifies an existing resource the operation might fail and
    * an exception is thrown.
@@ -112,7 +114,9 @@
   String canonicalizePath(String path);
 
   /**
-   * Return `true` if absolute [path] references a resource in this folder.
+   * Return `true` if the [path] references a resource in this folder.
+   *
+   * The [path] must be absolute and normalized.
    */
   bool contains(String path);
 
@@ -204,6 +208,8 @@
   /**
    * Return `true` if absolute [path] references this resource or a resource in
    * this folder.
+   *
+   * The [path] must be absolute and normalized.
    */
   bool isOrContains(String path);
 
@@ -232,6 +238,8 @@
   /**
    * Return a [File] that corresponds to the given [path].
    *
+   * The [path] must be absolute and normalized.
+   *
    * A file may or may not exist at this location.
    */
   File getFile(String path);
@@ -239,6 +247,8 @@
   /**
    * Return a [Folder] that corresponds to the given [path].
    *
+   * The [path] must be absolute and normalized.
+   *
    * A folder may or may not exist at this location.
    */
   Folder getFolder(String path);
@@ -253,6 +263,8 @@
 
   /**
    * Return the [Resource] that corresponds to the given [path].
+   *
+   * The [path] must be absolute and normalized.
    */
   Resource getResource(String path);
 
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index ea86f5a..0bf9a34 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -92,14 +92,14 @@
   }
 
   @override
-  File getFile(String path) => new _MemoryFile(this, path);
+  File getFile(String path) {
+    _ensureAbsoluteAndNormalized(path);
+    return new _MemoryFile(this, path);
+  }
 
   @override
   Folder getFolder(String path) {
-    path = pathContext.normalize(path);
-    if (!pathContext.isAbsolute(path)) {
-      throw new ArgumentError("Path must be absolute : $path");
-    }
+    _ensureAbsoluteAndNormalized(path);
     return new _MemoryFolder(this, path);
   }
 
@@ -115,7 +115,7 @@
 
   @override
   Resource getResource(String path) {
-    path = pathContext.normalize(path);
+    _ensureAbsoluteAndNormalized(path);
     Resource resource = _pathToResource[path];
     if (resource == null) {
       resource = new _MemoryFile(this, path);
@@ -125,7 +125,8 @@
 
   @override
   Folder getStateLocation(String pluginId) {
-    return newFolder('/user/home/$pluginId');
+    var path = convertPath('/user/home/$pluginId');
+    return newFolder(path);
   }
 
   void modifyFile(String path, String content) {
@@ -140,7 +141,7 @@
    * appears in its parent directory, but whose `exists` property is false)
    */
   File newDummyLink(String path) {
-    path = pathContext.normalize(path);
+    _ensureAbsoluteAndNormalized(path);
     newFolder(pathContext.dirname(path));
     _MemoryDummyLink link = new _MemoryDummyLink(this, path);
     _pathToResource[path] = link;
@@ -150,7 +151,7 @@
   }
 
   File newFile(String path, String content, [int stamp]) {
-    path = pathContext.normalize(path);
+    _ensureAbsoluteAndNormalized(path);
     _MemoryFile file = _newFile(path);
     _pathToBytes[path] = utf8.encode(content);
     _pathToTimestamp[path] = stamp ?? nextStamp++;
@@ -159,7 +160,7 @@
   }
 
   File newFileWithBytes(String path, List<int> bytes, [int stamp]) {
-    path = pathContext.normalize(path);
+    _ensureAbsoluteAndNormalized(path);
     _MemoryFile file = _newFile(path);
     _pathToBytes[path] = bytes;
     _pathToTimestamp[path] = stamp ?? nextStamp++;
@@ -168,7 +169,7 @@
   }
 
   Folder newFolder(String path) {
-    path = pathContext.normalize(path);
+    _ensureAbsoluteAndNormalized(path);
     if (!pathContext.isAbsolute(path)) {
       throw new ArgumentError("Path must be absolute : $path");
     }
@@ -194,7 +195,7 @@
   }
 
   File updateFile(String path, String content, [int stamp]) {
-    path = pathContext.normalize(path);
+    _ensureAbsoluteAndNormalized(path);
     newFolder(pathContext.dirname(path));
     _MemoryFile file = new _MemoryFile(this, path);
     _pathToResource[path] = file;
@@ -233,6 +234,19 @@
   }
 
   /**
+   * The file system abstraction supports only absolute and normalized paths.
+   * This method is used to validate any input paths to prevent errors later.
+   */
+  void _ensureAbsoluteAndNormalized(String path) {
+    if (!pathContext.isAbsolute(path)) {
+      throw new ArgumentError("Path must be absolute : $path");
+    }
+    if (pathContext.normalize(path) != path) {
+      throw new ArgumentError("Path must be normalized : $path");
+    }
+  }
+
+  /**
    * Create a new [_MemoryFile] without any content.
    */
   _MemoryFile _newFile(String path) {
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index f1a2511..818790b 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -90,13 +90,13 @@
 
   @override
   File getFile(String path) {
-    path = normalize(path);
+    _ensureAbsoluteAndNormalized(path);
     return new _PhysicalFile(new io.File(path));
   }
 
   @override
   Folder getFolder(String path) {
-    path = normalize(path);
+    _ensureAbsoluteAndNormalized(path);
     return new _PhysicalFolder(new io.Directory(path));
   }
 
@@ -110,6 +110,7 @@
 
   @override
   Resource getResource(String path) {
+    _ensureAbsoluteAndNormalized(path);
     if (io.FileSystemEntity.isDirectorySync(path)) {
       return getFolder(path);
     } else {
@@ -126,6 +127,22 @@
     }
     return null;
   }
+
+  /**
+   * The file system abstraction supports only absolute and normalized paths.
+   * This method is used to validate any input paths to prevent errors later.
+   */
+  void _ensureAbsoluteAndNormalized(String path) {
+    assert(() {
+      if (!pathContext.isAbsolute(path)) {
+        throw new ArgumentError("Path must be absolute : $path");
+      }
+      if (pathContext.normalize(path) != path) {
+        throw new ArgumentError("Path must be normalized : $path");
+      }
+      return true;
+    }());
+  }
 }
 
 /**
@@ -261,6 +278,7 @@
 
   @override
   bool contains(String path) {
+    PhysicalResourceProvider.INSTANCE._ensureAbsoluteAndNormalized(path);
     return pathContext.isWithin(this.path, path);
   }
 
@@ -366,7 +384,7 @@
   }
 
   @override
-  String get path => _entry.absolute.path;
+  String get path => _entry.path;
 
   /**
    * Return the path context used by this resource provider.
diff --git a/pkg/analyzer/lib/src/codegen/tools.dart b/pkg/analyzer/lib/src/codegen/tools.dart
index 34b2cc9..327d173 100644
--- a/pkg/analyzer/lib/src/codegen/tools.dart
+++ b/pkg/analyzer/lib/src/codegen/tools.dart
@@ -7,10 +7,13 @@
  */
 library analyzer.src.codegen.tools;
 
+import 'dart:async';
+import 'dart:io';
+
 import 'package:analyzer/src/codegen/html.dart';
 import 'package:analyzer/src/codegen/text_formatter.dart';
 import 'package:html/dom.dart' as dom;
-export 'package:front_end/src/codegen/tools.dart';
+import 'package:path/path.dart';
 
 final RegExp trailingSpacesInLineRegExp = new RegExp(r' +$', multiLine: true);
 final RegExp trailingWhitespaceRegExp = new RegExp(r'[\n ]+$');
@@ -383,3 +386,265 @@
     }
   }
 }
+
+/**
+ * Type of functions used to compute the contents of a set of generated files.
+ * [pkgPath] is the path to the current package.
+ */
+typedef Map<String, FileContentsComputer> DirectoryContentsComputer(
+    String pkgPath);
+
+/**
+ * Type of functions used to compute the contents of a generated file.
+ * [pkgPath] is the path to the current package.
+ */
+typedef Future<String> FileContentsComputer(String pkgPath);
+
+/**
+ * Abstract base class representing behaviors common to generated files and
+ * generated directories.
+ */
+abstract class GeneratedContent {
+  /**
+   * Check whether the [output] has the correct contents, and return true if it
+   * does.  [pkgPath] is the path to the current package.
+   */
+  Future<bool> check(String pkgPath);
+
+  /**
+   * Replace the [output] with the correct contents.  [pkgPath] is the path to
+   * the current package.
+   */
+  Future<Null> generate(String pkgPath);
+
+  /**
+   * Get a [FileSystemEntity] representing the output file or directory.
+   * [pkgPath] is the path to the current package.
+   */
+  FileSystemEntity output(String pkgPath);
+
+  /**
+   * Check that all of the [targets] are up to date.  If they are not, print
+   * out a message instructing the user to regenerate them, and exit with a
+   * nonzero error code.
+   *
+   * [pkgPath] is the path to the current package.  [generatorRelPath] is the
+   * path to a .dart script the user may use to regenerate the targets.
+   *
+   * To avoid mistakes when run on Windows, [generatorRelPath] always uses
+   * POSIX directory separators.
+   */
+  static Future<Null> checkAll(String pkgPath, String generatorRelPath,
+      Iterable<GeneratedContent> targets) async {
+    bool generateNeeded = false;
+    for (GeneratedContent target in targets) {
+      bool ok = await target.check(pkgPath);
+      if (!ok) {
+        print("${target.output(pkgPath).absolute}"
+            " doesn't have expected contents.");
+        generateNeeded = true;
+      }
+    }
+    if (generateNeeded) {
+      print('Please regenerate using:');
+      String executable = Platform.executable;
+      String packageRoot = '';
+      // ignore: deprecated_member_use
+      if (Platform.packageRoot != null) {
+        // ignore: deprecated_member_use
+        packageRoot = ' --package-root=${Platform.packageRoot}';
+      }
+      String generateScript =
+          join(pkgPath, joinAll(posix.split(generatorRelPath)));
+      print('  $executable$packageRoot $generateScript');
+      exit(1);
+    } else {
+      print('All generated files up to date.');
+    }
+  }
+
+  /**
+   * Regenerate all of the [targets].  [pkgPath] is the path to the current
+   * package.
+   */
+  static Future<Null> generateAll(
+      String pkgPath, Iterable<GeneratedContent> targets) async {
+    print("Generating...");
+    for (GeneratedContent target in targets) {
+      await target.generate(pkgPath);
+    }
+  }
+}
+
+/**
+ * Class representing a single output directory (either generated code or
+ * generated HTML). No other content should exist in the directory.
+ */
+class GeneratedDirectory extends GeneratedContent {
+  /**
+   * The path to the directory that will have the generated content.
+   */
+  final String outputDirPath;
+
+  /**
+   * Callback function that computes the directory contents.
+   */
+  final DirectoryContentsComputer directoryContentsComputer;
+
+  GeneratedDirectory(this.outputDirPath, this.directoryContentsComputer);
+
+  @override
+  Future<bool> check(String pkgPath) async {
+    Directory outputDirectory = output(pkgPath);
+    Map<String, FileContentsComputer> map = directoryContentsComputer(pkgPath);
+    try {
+      for (String file in map.keys) {
+        FileContentsComputer fileContentsComputer = map[file];
+        String expectedContents = await fileContentsComputer(pkgPath);
+        File outputFile = new File(posix.join(outputDirectory.path, file));
+        String actualContents = outputFile.readAsStringSync();
+        // Normalize Windows line endings to Unix line endings so that the
+        // comparison doesn't fail on Windows.
+        actualContents = actualContents.replaceAll('\r\n', '\n');
+        if (expectedContents != actualContents) {
+          return false;
+        }
+      }
+      int nonHiddenFileCount = 0;
+      outputDirectory
+          .listSync(recursive: false, followLinks: false)
+          .forEach((FileSystemEntity fileSystemEntity) {
+        if (fileSystemEntity is File &&
+            !basename(fileSystemEntity.path).startsWith('.')) {
+          nonHiddenFileCount++;
+        }
+      });
+      if (nonHiddenFileCount != map.length) {
+        // The number of files generated doesn't match the number we expected to
+        // generate.
+        return false;
+      }
+    } catch (e) {
+      // There was a problem reading the file (most likely because it didn't
+      // exist).  Treat that the same as if the file doesn't have the expected
+      // contents.
+      return false;
+    }
+    return true;
+  }
+
+  @override
+  Future<Null> generate(String pkgPath) async {
+    Directory outputDirectory = output(pkgPath);
+    try {
+      // delete the contents of the directory (and the directory itself)
+      outputDirectory.deleteSync(recursive: true);
+    } catch (e) {
+      // Error caught while trying to delete the directory, this can happen if
+      // it didn't yet exist.
+    }
+    // re-create the empty directory
+    outputDirectory.createSync(recursive: true);
+
+    // generate all of the files in the directory
+    Map<String, FileContentsComputer> map = directoryContentsComputer(pkgPath);
+    for (String file in map.keys) {
+      FileContentsComputer fileContentsComputer = map[file];
+      File outputFile = new File(posix.join(outputDirectory.path, file));
+      print('  ${outputFile.path}');
+      String contents = await fileContentsComputer(pkgPath);
+      outputFile.writeAsStringSync(contents);
+    }
+  }
+
+  @override
+  Directory output(String pkgPath) =>
+      new Directory(join(pkgPath, joinAll(posix.split(outputDirPath))));
+}
+
+/**
+ * Class representing a single output file (either generated code or generated
+ * HTML).
+ */
+class GeneratedFile extends GeneratedContent {
+  /**
+   * The output file to which generated output should be written, relative to
+   * the "tool/spec" directory.  This filename uses the posix path separator
+   * ('/') regardless of the OS.
+   */
+  final String outputPath;
+
+  /**
+   * Callback function which computes the file.
+   */
+  final FileContentsComputer computeContents;
+
+  GeneratedFile(this.outputPath, this.computeContents);
+
+  bool get isDartFile => outputPath.endsWith('.dart');
+
+  @override
+  Future<bool> check(String pkgPath) async {
+    File outputFile = output(pkgPath);
+    String expectedContents = await computeContents(pkgPath);
+    if (isDartFile) {
+      expectedContents = DartFormat.formatText(expectedContents);
+    }
+    try {
+      String actualContents = outputFile.readAsStringSync();
+      // Normalize Windows line endings to Unix line endings so that the
+      // comparison doesn't fail on Windows.
+      actualContents = actualContents.replaceAll('\r\n', '\n');
+      return expectedContents == actualContents;
+    } catch (e) {
+      // There was a problem reading the file (most likely because it didn't
+      // exist).  Treat that the same as if the file doesn't have the expected
+      // contents.
+      return false;
+    }
+  }
+
+  @override
+  Future<Null> generate(String pkgPath) async {
+    File outputFile = output(pkgPath);
+    print('  ${outputFile.path}');
+    String contents = await computeContents(pkgPath);
+    outputFile.writeAsStringSync(contents);
+    if (isDartFile) {
+      DartFormat.formatFile(outputFile);
+    }
+  }
+
+  @override
+  File output(String pkgPath) =>
+      new File(join(pkgPath, joinAll(posix.split(outputPath))));
+}
+
+/**
+ * A utility class for invoking dartfmt.
+ */
+class DartFormat {
+  static String get _dartfmtPath {
+    String binName = Platform.isWindows ? 'dartfmt.bat' : 'dartfmt';
+    for (var loc in [binName, join('dart-sdk', 'bin', binName)]) {
+      var candidatePath = join(dirname(Platform.resolvedExecutable), loc);
+      if (new File(candidatePath).existsSync()) {
+        return candidatePath;
+      }
+    }
+    throw new StateError('Could not find dartfmt executable');
+  }
+
+  static void formatFile(File file) {
+    ProcessResult result = Process.runSync(_dartfmtPath, ['-w', file.path]);
+    if (result.exitCode != 0) throw result.stderr;
+  }
+
+  static String formatText(String text) {
+    File file = new File(join(Directory.systemTemp.path, 'gen.dart'));
+    file.writeAsStringSync(text);
+    ProcessResult result = Process.runSync(_dartfmtPath, ['-w', file.path]);
+    if (result.exitCode != 0) throw result.stderr;
+    return file.readAsStringSync();
+  }
+}
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index 6e91ddd..8c7104e 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -32,9 +32,10 @@
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
 import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:args/args.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:package_config/packages.dart';
 import 'package:package_config/packages_file.dart';
 import 'package:package_config/src/packages_impl.dart';
@@ -194,8 +195,9 @@
   Map<String, List<Folder>> convertPackagesToMap(Packages packages) {
     Map<String, List<Folder>> folderMap = new HashMap<String, List<Folder>>();
     if (packages != null && packages != Packages.noPackages) {
+      var pathContext = resourceProvider.pathContext;
       packages.asMap().forEach((String packageName, Uri uri) {
-        String path = resourceProvider.pathContext.fromUri(uri);
+        String path = fileUriToNormalizedPath(pathContext, uri);
         folderMap[packageName] = [resourceProvider.getFolder(path)];
       });
     }
@@ -543,8 +545,9 @@
   void resolveSymbolicLinks(Map<String, Uri> map) {
     Context pathContext = resourceProvider.pathContext;
     for (String packageName in map.keys) {
-      Folder folder =
-          resourceProvider.getFolder(pathContext.fromUri(map[packageName]));
+      var uri = map[packageName];
+      String path = fileUriToNormalizedPath(pathContext, uri);
+      Folder folder = resourceProvider.getFolder(path);
       String folderPath = resolveSymbolicLink(folder);
       // Add a '.' so that the URI is suitable for resolving relative URI's
       // against it.
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index c8bf328..490d6e0 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -289,9 +289,6 @@
             ? this._options.implicitCasts != options.implicitCasts
             : false) ||
         ((options is AnalysisOptionsImpl)
-            ? this._options.nonnullableTypes != options.nonnullableTypes
-            : false) ||
-        ((options is AnalysisOptionsImpl)
             ? this._options.implicitDynamic != options.implicitDynamic
             : false) ||
         this._options.enableSuperMixins != options.enableSuperMixins ||
@@ -320,7 +317,6 @@
       this._options.strongModeHints = options.strongModeHints;
       this._options.declarationCasts = options.declarationCasts;
       this._options.implicitCasts = options.implicitCasts;
-      this._options.nonnullableTypes = options.nonnullableTypes;
       this._options.implicitDynamic = options.implicitDynamic;
       this._options.isMixinSupportEnabled = options.isMixinSupportEnabled;
     }
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index e08cc78..6c3b58e 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart' as utils;
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:package_config/packages.dart';
 
 /**
@@ -83,11 +84,11 @@
     // Start by looking in .packages.
     if (_packages != null) {
       Map<String, List<Folder>> packageMap = <String, List<Folder>>{};
+      var pathContext = _resourceProvider.pathContext;
       _packages.asMap().forEach((String name, Uri uri) {
         if (uri.scheme == 'file' || uri.scheme == '' /* unspecified */) {
-          packageMap[name] = <Folder>[
-            _resourceProvider.getFolder(uri.toFilePath())
-          ];
+          String path = fileUriToNormalizedPath(pathContext, uri);
+          packageMap[name] = <Folder>[_resourceProvider.getFolder(path)];
         }
       });
       return packageMap;
diff --git a/pkg/analyzer/lib/src/dart/analysis/byte_store.dart b/pkg/analyzer/lib/src/dart/analysis/byte_store.dart
index ba051918..80f7b32 100644
--- a/pkg/analyzer/lib/src/dart/analysis/byte_store.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/byte_store.dart
@@ -1,9 +1,80 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// 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 library re-exports the parts of front_end's byte_store.dart whose API is
-// stable enough to be relied upon by clients.
+import 'cache.dart';
 
-export 'package:front_end/src/api_prototype/byte_store.dart'
-    show ByteStore, MemoryByteStore, MemoryCachingByteStore;
+/**
+ * Store of bytes associated with string keys.
+ *
+ * Each key must be not longer than 100 characters and consist of only `[a-z]`,
+ * `[0-9]`, `.` and `_` characters. The key cannot be an empty string, the
+ * literal `.`, or contain the sequence `..`.
+ *
+ * Note that associations are not guaranteed to be persistent. The value
+ * associated with a key can change or become `null` at any point in time.
+ *
+ * TODO(scheglov) Research using asynchronous API.
+ */
+abstract class ByteStore {
+  /**
+   * Return the bytes associated with the given [key].
+   * Return `null` if the association does not exist.
+   */
+  List<int> get(String key);
+
+  /**
+   * Associate the given [bytes] with the [key].
+   */
+  void put(String key, List<int> bytes);
+}
+
+/**
+ * [ByteStore] which stores data only in memory.
+ */
+class MemoryByteStore implements ByteStore {
+  final Map<String, List<int>> _map = {};
+
+  @override
+  List<int> get(String key) {
+    return _map[key];
+  }
+
+  @override
+  void put(String key, List<int> bytes) {
+    _map[key] = bytes;
+  }
+}
+
+/**
+ * A wrapper around [ByteStore] which adds an in-memory LRU cache to it.
+ */
+class MemoryCachingByteStore implements ByteStore {
+  final ByteStore _store;
+  final Cache<String, List<int>> _cache;
+
+  MemoryCachingByteStore(this._store, int maxSizeBytes)
+      : _cache = new Cache<String, List<int>>(maxSizeBytes, (v) => v.length);
+
+  @override
+  List<int> get(String key) {
+    return _cache.get(key, () => _store.get(key));
+  }
+
+  @override
+  void put(String key, List<int> bytes) {
+    _store.put(key, bytes);
+    _cache.put(key, bytes);
+  }
+}
+
+/**
+ * [ByteStore] which does not store any data.
+ */
+class NullByteStore implements ByteStore {
+  @override
+  List<int> get(String key) => null;
+
+  @override
+  void put(String key, List<int> bytes) {}
+}
diff --git a/pkg/front_end/lib/src/byte_store/cache.dart b/pkg/analyzer/lib/src/dart/analysis/cache.dart
similarity index 100%
rename from pkg/front_end/lib/src/byte_store/cache.dart
rename to pkg/analyzer/lib/src/dart/analysis/cache.dart
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index 3ede35d..f835eb6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -19,8 +19,10 @@
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdkManager;
 import 'package:analyzer/src/generated/source.dart' show ContentCache;
-import 'package:front_end/src/base/performance_logger.dart' show PerformanceLog;
-import 'package:front_end/src/byte_store/byte_store.dart' show MemoryByteStore;
+import 'package:analyzer/src/dart/analysis/performance_logger.dart'
+    show PerformanceLog;
+import 'package:analyzer/src/dart/analysis/byte_store.dart'
+    show ByteStore, MemoryByteStore;
 import 'package:meta/meta.dart';
 
 /**
@@ -50,18 +52,25 @@
 
   @override
   AnalysisContext createContext(
-      {@required ContextRoot contextRoot,
+      {@deprecated ByteStore byteStore,
+      @required ContextRoot contextRoot,
       DeclaredVariables declaredVariables,
+      @deprecated PerformanceLog performanceLog,
+      @deprecated AnalysisDriverScheduler scheduler,
       String sdkPath}) {
-    PerformanceLog performanceLog = new PerformanceLog(new StringBuffer());
-    AnalysisDriverScheduler scheduler =
-        new AnalysisDriverScheduler(performanceLog);
+    byteStore ??= new MemoryByteStore();
+    performanceLog ??= new PerformanceLog(new StringBuffer());
+
     sdkPath ??= _defaultSdkPath;
     if (sdkPath == null) {
       throw new ArgumentError('Cannot find path to the SDK');
     }
     DartSdkManager sdkManager = new DartSdkManager(sdkPath, true);
-    scheduler.start();
+
+    if (scheduler == null) {
+      scheduler = new AnalysisDriverScheduler(performanceLog);
+      scheduler.start();
+    }
 
     // TODO(brianwilkerson) Move the required implementation from the old
     // ContextBuilder to this class and remove the old class.
@@ -75,7 +84,7 @@
         resourceProvider, sdkManager, new ContentCache(),
         options: options);
     builder.analysisDriverScheduler = scheduler;
-    builder.byteStore = new MemoryByteStore();
+    builder.byteStore = byteStore;
     builder.fileContentOverlay = new FileContentOverlay();
     builder.performanceLog = performanceLog;
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index 5f36fcb..4422823 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -22,8 +22,10 @@
 import 'package:analyzer/src/dart/sdk/sdk.dart' show FolderBasedDartSdk;
 import 'package:analyzer/src/generated/sdk.dart' show DartSdkManager;
 import 'package:analyzer/src/generated/source.dart' show ContentCache;
-import 'package:front_end/src/base/performance_logger.dart' show PerformanceLog;
-import 'package:front_end/src/byte_store/byte_store.dart' show MemoryByteStore;
+import 'package:analyzer/src/dart/analysis/performance_logger.dart'
+    show PerformanceLog;
+import 'package:analyzer/src/dart/analysis/byte_store.dart'
+    show MemoryByteStore;
 import 'package:meta/meta.dart';
 
 /**
diff --git a/pkg/front_end/lib/src/byte_store/crc32.dart b/pkg/analyzer/lib/src/dart/analysis/crc32.dart
similarity index 100%
rename from pkg/front_end/lib/src/byte_store/crc32.dart
rename to pkg/analyzer/lib/src/dart/analysis/crc32.dart
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 3269d69..3872362 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -17,11 +17,13 @@
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/context_root.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/file_tracker.dart';
 import 'package:analyzer/src/dart/analysis/index.dart';
 import 'package:analyzer/src/dart/analysis/library_analyzer.dart';
 import 'package:analyzer/src/dart/analysis/library_context.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/search.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/analysis/status.dart';
@@ -38,12 +40,10 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/lint/registry.dart' as linter;
+import 'package:analyzer/src/summary/api_signature.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/api_signature.dart';
-import 'package:front_end/src/base/performance_logger.dart';
 import 'package:meta/meta.dart';
 
 /**
@@ -93,7 +93,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 70;
+  static const int DATA_VERSION = 72;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
@@ -586,6 +586,10 @@
    * potentially available is done, so that they are included in [knownFiles].
    */
   Future<void> discoverAvailableFiles() {
+    if (_discoverAvailableFilesTask != null &&
+        _discoverAvailableFilesTask.isCompleted) {
+      return new Future.value();
+    }
     _discoverAvailableFiles();
     _scheduler.notify(this);
     return _discoverAvailableFilesTask.completer.future;
@@ -2213,9 +2217,9 @@
   static const int _MS_WORK_INTERVAL = 5;
 
   final AnalysisDriver driver;
-  final Completer<void> completer = new Completer<void>();
 
   bool isCompleted = false;
+  Completer<void> completer = new Completer<void>();
 
   Iterator<Folder> folderIterator;
   List<String> files = [];
@@ -2236,7 +2240,8 @@
       var dartSdk = driver._sourceFactory.dartSdk;
       if (dartSdk != null) {
         for (var sdkLibrary in dartSdk.sdkLibraries) {
-          files.add(sdkLibrary.path);
+          var file = dartSdk.mapDartUri(sdkLibrary.shortName).fullName;
+          files.add(file);
         }
       }
 
@@ -2272,10 +2277,13 @@
     }
 
     // The task is done, clean up.
-    isCompleted = true;
     folderIterator = null;
     files = null;
+
+    // Complete and clean up.
+    isCompleted = true;
     completer.complete();
+    completer = null;
   }
 
   void _appendFilesRecursively(Folder folder) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart b/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
index 54ddf7e..7c1a7fe 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
@@ -1,8 +1,296 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// 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 library re-exports the parts of front_end's file_byte_store.dart whose
-// API is stable enough to be relied upon by clients.
+import 'dart:async';
+import 'dart:io';
+import 'dart:isolate';
+import 'dart:typed_data';
 
-export 'package:front_end/src/api_prototype/byte_store.dart' show FileByteStore;
+import 'package:path/path.dart';
+
+import 'byte_store.dart';
+import 'fletcher16.dart';
+
+/**
+ * The request that is sent from the main isolate to the clean-up isolate.
+ */
+class CacheCleanUpRequest {
+  final String cachePath;
+  final int maxSizeBytes;
+  final SendPort replyTo;
+
+  CacheCleanUpRequest(this.cachePath, this.maxSizeBytes, this.replyTo);
+}
+
+/**
+ * [ByteStore] that stores values as files and performs cache eviction.
+ *
+ * Only the process that manages the cache, e.g. Analysis Server, should use
+ * this class. Other processes, e.g. Analysis Server plugins, should use
+ * [FileByteStore] instead and let the main process to perform eviction.
+ */
+class EvictingFileByteStore implements ByteStore {
+  static bool _cleanUpSendPortShouldBePrepared = true;
+  static SendPort _cleanUpSendPort;
+
+  final String _cachePath;
+  final int _maxSizeBytes;
+  final FileByteStore _fileByteStore;
+
+  int _bytesWrittenSinceCleanup = 0;
+  bool _evictionIsolateIsRunning = false;
+
+  EvictingFileByteStore(this._cachePath, this._maxSizeBytes)
+      : _fileByteStore = new FileByteStore(_cachePath) {
+    _requestCacheCleanUp();
+  }
+
+  @override
+  List<int> get(String key) => _fileByteStore.get(key);
+
+  @override
+  void put(String key, List<int> bytes) {
+    _fileByteStore.put(key, bytes);
+    // Update the current size.
+    _bytesWrittenSinceCleanup += bytes.length;
+    if (_bytesWrittenSinceCleanup > _maxSizeBytes ~/ 8) {
+      _requestCacheCleanUp();
+    }
+  }
+
+  /**
+   * If the cache clean up process has not been requested yet, request it.
+   */
+  Future<Null> _requestCacheCleanUp() async {
+    if (_cleanUpSendPortShouldBePrepared) {
+      _cleanUpSendPortShouldBePrepared = false;
+      ReceivePort response = new ReceivePort();
+      await Isolate.spawn(_cacheCleanUpFunction, response.sendPort);
+      _cleanUpSendPort = await response.first as SendPort;
+    } else {
+      while (_cleanUpSendPort == null) {
+        await new Future.delayed(new Duration(milliseconds: 100), () {});
+      }
+    }
+
+    if (!_evictionIsolateIsRunning) {
+      _evictionIsolateIsRunning = true;
+      try {
+        ReceivePort response = new ReceivePort();
+        _cleanUpSendPort.send(new CacheCleanUpRequest(
+            _cachePath, _maxSizeBytes, response.sendPort));
+        await response.first;
+      } finally {
+        _evictionIsolateIsRunning = false;
+        _bytesWrittenSinceCleanup = 0;
+      }
+    }
+  }
+
+  /**
+   * This function is started in a new isolate, receives cache folder clean up
+   * requests and evicts older files from the folder.
+   */
+  static void _cacheCleanUpFunction(message) {
+    SendPort initialReplyTo = message;
+    ReceivePort port = new ReceivePort();
+    initialReplyTo.send(port.sendPort);
+    port.listen((request) {
+      if (request is CacheCleanUpRequest) {
+        _cleanUpFolder(request.cachePath, request.maxSizeBytes);
+        // Let the client know that we're done.
+        request.replyTo.send(true);
+      }
+    });
+  }
+
+  static void _cleanUpFolder(String cachePath, int maxSizeBytes) {
+    // Prepare the list of files and their statistics.
+    List<File> files = <File>[];
+    Map<File, FileStat> fileStatMap = {};
+    int currentSizeBytes = 0;
+    List<FileSystemEntity> resources = new Directory(cachePath).listSync();
+    for (FileSystemEntity resource in resources) {
+      if (resource is File) {
+        try {
+          final FileStat fileStat = resource.statSync();
+          // Make sure that the file was not deleted out from under us (a return
+          // value of FileSystemEntityType.notFound).
+          if (fileStat.type == FileSystemEntityType.file) {
+            files.add(resource);
+            fileStatMap[resource] = fileStat;
+            currentSizeBytes += fileStat.size;
+          }
+        } catch (_) {}
+      }
+    }
+    files.sort((a, b) {
+      return fileStatMap[a].accessed.millisecondsSinceEpoch -
+          fileStatMap[b].accessed.millisecondsSinceEpoch;
+    });
+
+    // Delete files until the current size is less than the max.
+    for (File file in files) {
+      if (currentSizeBytes < maxSizeBytes) {
+        break;
+      }
+      try {
+        file.deleteSync();
+      } catch (_) {}
+      currentSizeBytes -= fileStatMap[file].size;
+    }
+  }
+}
+
+/**
+ * [ByteStore] that stores values as files.
+ */
+class FileByteStore implements ByteStore {
+  static final FileByteStoreValidator _validator = new FileByteStoreValidator();
+
+  final String _cachePath;
+  final String _tempSuffix;
+  final Map<String, List<int>> _writeInProgress = {};
+  final FuturePool _pool = new FuturePool(20);
+
+  /**
+   * If the same cache path is used from more than one isolate of the same
+   * process, then a unique [tempNameSuffix] must be provided for each isolate.
+   */
+  FileByteStore(this._cachePath, {String tempNameSuffix: ''})
+      : _tempSuffix =
+            '-temp-$pid${tempNameSuffix.isEmpty ? '' : '-$tempNameSuffix'}';
+
+  @override
+  List<int> get(String key) {
+    List<int> bytes = _writeInProgress[key];
+    if (bytes != null) {
+      return bytes;
+    }
+
+    try {
+      final File file = _getFileForKey(key);
+      if (!file.existsSync()) {
+        return null;
+      }
+      return _validator.getData(file.readAsBytesSync());
+    } catch (_) {
+      // ignore exceptions
+      return null;
+    }
+  }
+
+  @override
+  void put(String key, List<int> bytes) {
+    _writeInProgress[key] = bytes;
+
+    final List<int> wrappedBytes = _validator.wrapData(bytes);
+
+    // We don't wait for the write and rename to complete.
+    _pool.execute(() {
+      final File tempFile = _getFileForKey('$key$_tempSuffix');
+      return tempFile.writeAsBytes(wrappedBytes).then((_) {
+        return tempFile.rename(join(_cachePath, key));
+      }).catchError((_) {
+        // ignore exceptions
+      }).whenComplete(() {
+        if (_writeInProgress[key] == bytes) {
+          _writeInProgress.remove(key);
+        }
+      });
+    });
+  }
+
+  File _getFileForKey(String key) => new File(join(_cachePath, key));
+}
+
+/**
+ * Generally speaking, we cannot guarantee that any data written into a file
+ * will stay the same - there is always a chance of a hardware problem, file
+ * system problem, truncated data, etc.
+ *
+ * So, we need to embed some validation into data itself. This class append the
+ * version and the checksum to data.
+ */
+class FileByteStoreValidator {
+  static const List<int> _VERSION = const [0x01, 0x00];
+
+  /**
+   * If the [rawBytes] have the valid version and checksum, extract and
+   * return the data from it. Otherwise return `null`.
+   */
+  List<int> getData(List<int> rawBytes) {
+    // There must be at least the version and the checksum in the raw bytes.
+    if (rawBytes.length < 4) {
+      return null;
+    }
+    int len = rawBytes.length - 4;
+
+    // Check the version.
+    if (rawBytes[len + 0] != _VERSION[0] || rawBytes[len + 1] != _VERSION[1]) {
+      return null;
+    }
+
+    // Check the checksum of the data.
+    List<int> data = rawBytes.sublist(0, len);
+    int checksum = fletcher16(data);
+    if (rawBytes[len + 2] != checksum & 0xFF ||
+        rawBytes[len + 3] != (checksum >> 8) & 0xFF) {
+      return null;
+    }
+
+    // OK, the data is probably valid.
+    return data;
+  }
+
+  /**
+   * Return bytes that include the given [data] plus the current version and
+   * the checksum of the [data].
+   */
+  List<int> wrapData(List<int> data) {
+    int len = data.length;
+    var bytes = new Uint8List(len + 4);
+
+    // Put the data.
+    bytes.setRange(0, len, data);
+
+    // Put the version.
+    bytes[len + 0] = _VERSION[0];
+    bytes[len + 1] = _VERSION[1];
+
+    // Put the checksum of the data.
+    int checksum = fletcher16(data);
+    bytes[len + 2] = checksum & 0xFF;
+    bytes[len + 3] = (checksum >> 8) & 0xFF;
+
+    return bytes;
+  }
+}
+
+class FuturePool {
+  int _available;
+  List waiting = [];
+
+  FuturePool(this._available);
+
+  void execute(Future Function() fn) {
+    if (_available > 0) {
+      _run(fn);
+    } else {
+      waiting.add(fn);
+    }
+  }
+
+  void _run(Future Function() fn) {
+    _available--;
+
+    fn().whenComplete(() {
+      _available++;
+
+      if (waiting.isNotEmpty) {
+        _run(waiting.removeAt(0));
+      }
+    });
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 5d62f06..fe5cec4 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -29,9 +29,9 @@
 import 'package:analyzer/src/summary/summarize_ast.dart';
 import 'package:convert/convert.dart';
 import 'package:crypto/crypto.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/api_signature.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/summary/api_signature.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:front_end/src/fasta/scanner/token.dart';
 import 'package:meta/meta.dart';
 
@@ -102,11 +102,6 @@
   final Uri uri;
 
   /**
-   * The absolute file URI of the file.
-   */
-  final Uri fileUri;
-
-  /**
    * The [Source] of the file with the [uri].
    */
   final Source source;
@@ -136,7 +131,7 @@
   List<FileState> _libraryFiles;
   List<NameFilter> _exportFilters;
 
-  Set<FileState> _directReferencedFiles = new Set<FileState>();
+  Set<FileState> _directReferencedFiles;
   Set<FileState> _transitiveFiles;
   String _transitiveSignature;
 
@@ -150,13 +145,12 @@
    */
   bool hasErrorOrWarning = false;
 
-  FileState._(this._fsState, this.path, this.uri, this.fileUri, this.source)
+  FileState._(this._fsState, this.path, this.uri, this.source)
       : isInExternalSummaries = false;
 
   FileState._external(this._fsState, this.uri)
       : isInExternalSummaries = true,
         path = null,
-        fileUri = null,
         source = null,
         _exists = true {
     _apiSignature = new Uint8List(16);
@@ -332,7 +326,7 @@
 
       void appendReferenced(FileState file) {
         if (_transitiveFiles.add(file)) {
-          file._directReferencedFiles.forEach(appendReferenced);
+          file._directReferencedFiles?.forEach(appendReferenced);
         }
       }
 
@@ -524,12 +518,14 @@
     // If the set of directly referenced files of this file is changed,
     // then the transitive sets of files that include this file are also
     // changed. Reset these transitive sets.
-    if (_directReferencedFiles.length != oldDirectReferencedFiles.length ||
-        !_directReferencedFiles.containsAll(oldDirectReferencedFiles)) {
-      for (FileState file in _fsState._uriToFile.values) {
-        if (file._transitiveFiles != null &&
-            file._transitiveFiles.contains(this)) {
-          file._transitiveFiles = null;
+    if (oldDirectReferencedFiles != null) {
+      if (_directReferencedFiles.length != oldDirectReferencedFiles.length ||
+          !_directReferencedFiles.containsAll(oldDirectReferencedFiles)) {
+        for (FileState file in _fsState._uriToFile.values) {
+          if (file._transitiveFiles != null &&
+              file._transitiveFiles.contains(this)) {
+            file._transitiveFiles = null;
+          }
         }
       }
     }
@@ -828,7 +824,7 @@
    */
   FileState get unresolvedFile {
     if (_unresolvedFile == null) {
-      _unresolvedFile = new FileState._(this, null, null, null, null);
+      _unresolvedFile = new FileState._(this, null, null, null);
       _unresolvedFile.refresh();
     }
     return _unresolvedFile;
@@ -856,8 +852,7 @@
       }
       // Create a new file.
       FileSource uriSource = new FileSource(resource, uri);
-      file = new FileState._(
-          this, path, uri, _absolutePathToFileUri(path), uriSource);
+      file = new FileState._(this, path, uri, uriSource);
       _uriToFile[uri] = file;
       _addFileWithPath(path, file);
       _pathToCanonicalFile[path] = file;
@@ -897,8 +892,7 @@
       String path = uriSource.fullName;
       File resource = _resourceProvider.getFile(path);
       FileSource source = new FileSource(resource, uri);
-      file = new FileState._(
-          this, path, uri, _absolutePathToFileUri(path), source);
+      file = new FileState._(this, path, uri, source);
       _uriToFile[uri] = file;
       _addFileWithPath(path, file);
       file.refresh(allowCached: true);
@@ -971,18 +965,6 @@
     _subtypedNameToFiles.clear();
   }
 
-  /**
-   * A specialized version of package:path context.toUri(). This assumes the
-   * path is absolute as does a performant conversion to a file: uri.
-   */
-  Uri _absolutePathToFileUri(String path) {
-    if (path.contains(r'\')) {
-      return new Uri(scheme: 'file', path: path.replaceAll(r'\', '/'));
-    } else {
-      return new Uri(scheme: 'file', path: path);
-    }
-  }
-
   void _addFileWithPath(String path, FileState file) {
     var files = _pathToFiles[path];
     if (files == null) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
index 6c08079..c49cf71 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
@@ -5,7 +5,7 @@
 import 'dart:collection';
 
 import 'package:analyzer/src/dart/analysis/file_state.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 
 /**
  * Callback used by [FileTracker] to report to its client that files have been
diff --git a/pkg/front_end/lib/src/byte_store/fletcher16.dart b/pkg/analyzer/lib/src/dart/analysis/fletcher16.dart
similarity index 100%
rename from pkg/front_end/lib/src/byte_store/fletcher16.dart
rename to pkg/analyzer/lib/src/dart/analysis/fletcher16.dart
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 3de1ee3..bdd8592 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -14,11 +14,14 @@
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dart/constant/constant_verifier.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 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/error/codes.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';
@@ -28,18 +31,19 @@
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/linter_visitor.dart';
 import 'package:analyzer/src/services/lint.dart';
+import 'package:analyzer/src/summary/link.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/task/strong/checker.dart';
-import 'package:front_end/src/dependency_walker.dart';
 
 /**
  * Analyzer of a single library.
  */
 class LibraryAnalyzer {
-  final AnalysisOptions _analysisOptions;
+  final AnalysisOptionsImpl _analysisOptions;
   final DeclaredVariables _declaredVariables;
   final SourceFactory _sourceFactory;
   final FileState _library;
+  final InheritanceManager2 _inheritance;
 
   final bool Function(Uri) _isLibraryUri;
   final AnalysisContextImpl _context;
@@ -56,7 +60,7 @@
   final List<UsedImportedElements> _usedImportedElementsList = [];
   final List<UsedLocalElements> _usedLocalElementsList = [];
   final Map<FileState, List<PendingError>> _fileToPendingErrors = {};
-  final List<ConstantEvaluationTarget> _constants = [];
+  final Set<ConstantEvaluationTarget> _constants = new Set();
 
   LibraryAnalyzer(
       this._analysisOptions,
@@ -66,7 +70,8 @@
       this._context,
       this._resynthesizer,
       this._library)
-      : _typeProvider = _context.typeProvider;
+      : _inheritance = new InheritanceManager2(_context.typeSystem),
+        _typeProvider = _context.typeProvider;
 
   /**
    * Compute analysis results for all units of the library.
@@ -157,7 +162,8 @@
   void _computeConstantErrors(
       ErrorReporter errorReporter, CompilationUnit unit) {
     ConstantVerifier constantVerifier = new ConstantVerifier(
-        errorReporter, _libraryElement, _typeProvider, _declaredVariables);
+        errorReporter, _libraryElement, _typeProvider, _declaredVariables,
+        forAnalysisDriver: true);
     unit.accept(constantVerifier);
   }
 
@@ -167,7 +173,7 @@
   void _computeConstants() {
     ConstantEvaluationEngine evaluationEngine = new ConstantEvaluationEngine(
         _typeProvider, _declaredVariables,
-        typeSystem: _context.typeSystem);
+        forAnalysisDriver: true, typeSystem: _context.typeSystem);
 
     List<_ConstantNode> nodes = [];
     Map<ConstantEvaluationTarget, _ConstantNode> nodeMap = {};
@@ -207,15 +213,14 @@
       unit.accept(new Dart2JSVerifier(errorReporter));
     }
 
-    InheritanceManager inheritanceManager = new InheritanceManager(
-        _libraryElement,
-        includeAbstractFromSuperclasses: true);
-
     unit.accept(new BestPracticesVerifier(
-        errorReporter, _typeProvider, _libraryElement, inheritanceManager,
+        errorReporter, _typeProvider, _libraryElement,
         typeSystem: _context.typeSystem));
 
-    unit.accept(new OverrideVerifier(errorReporter, inheritanceManager));
+    unit.accept(new OverrideVerifier(
+        errorReporter,
+        new InheritanceManager(_libraryElement,
+            includeAbstractFromSuperclasses: true)));
 
     new ToDoFinder(errorReporter).findIn(unit);
 
@@ -293,15 +298,12 @@
 
     RecordingErrorListener errorListener = _getErrorListener(file);
 
-    AnalysisOptionsImpl options = _analysisOptions as AnalysisOptionsImpl;
     CodeChecker checker = new CodeChecker(
-        _typeProvider,
-        new StrongTypeSystemImpl(_typeProvider,
-            implicitCasts: options.implicitCasts,
-            declarationCasts: options.declarationCasts,
-            nonnullableTypes: options.nonnullableTypes),
-        errorListener,
-        options);
+      _typeProvider,
+      _context.typeSystem,
+      errorListener,
+      _analysisOptions,
+    );
     checker.visitCompilationUnit(unit);
 
     ErrorReporter errorReporter = _getErrorReporter(file);
@@ -317,6 +319,13 @@
     _computeConstantErrors(errorReporter, unit);
 
     //
+    // Compute inheritance and override errors.
+    //
+    var inheritanceOverrideVerifier = new InheritanceOverrideVerifier(
+        _context.typeSystem, _inheritance, errorReporter);
+    inheritanceOverrideVerifier.verifyUnit(unit);
+
+    //
     // Use the ErrorVerifier to compute errors.
     //
     ErrorVerifier errorVerifier = new ErrorVerifier(
@@ -324,6 +333,7 @@
         _libraryElement,
         _typeProvider,
         new InheritanceManager(_libraryElement),
+        _inheritance,
         _analysisOptions.enableSuperMixins);
     unit.accept(errorVerifier);
   }
@@ -565,8 +575,10 @@
 
     new DeclarationResolver().resolve(unit, unitElement);
 
+    LibraryScope libraryScope = new LibraryScope(_libraryElement);
     unit.accept(new AstRewriteVisitor(_context.typeSystem, _libraryElement,
-        source, _typeProvider, errorListener));
+        source, _typeProvider, errorListener,
+        nameScope: libraryScope));
 
     // TODO(scheglov) remove EnumMemberBuilder class
 
@@ -577,20 +589,19 @@
     unit.accept(new TypeResolverVisitor(
         _libraryElement, source, _typeProvider, errorListener));
 
-    LibraryScope libraryScope = new LibraryScope(_libraryElement);
     unit.accept(new VariableResolverVisitor(
         _libraryElement, source, _typeProvider, errorListener,
         nameScope: libraryScope));
 
-    unit.accept(new PartialResolverVisitor(_libraryElement, source,
-        _typeProvider, AnalysisErrorListener.NULL_LISTENER));
+    unit.accept(new PartialResolverVisitor(_inheritance, _libraryElement,
+        source, _typeProvider, AnalysisErrorListener.NULL_LISTENER));
 
     // Nothing for RESOLVED_UNIT8?
     // Nothing for RESOLVED_UNIT9?
     // Nothing for RESOLVED_UNIT10?
 
     unit.accept(new ResolverVisitor(
-        _libraryElement, source, _typeProvider, errorListener));
+        _inheritance, _libraryElement, source, _typeProvider, errorListener));
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index 559ed4d..643c870 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -21,8 +21,8 @@
 import 'package:analyzer/src/summary/one_phase.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary/summarize_elements.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 
 /**
  * Context information necessary to analyze one or more libraries within an
diff --git a/pkg/analyzer/lib/src/dart/analysis/performance_logger.dart b/pkg/analyzer/lib/src/dart/analysis/performance_logger.dart
index 9e5ad9a..47af4cd 100644
--- a/pkg/analyzer/lib/src/dart/analysis/performance_logger.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/performance_logger.dart
@@ -1,8 +1,91 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
-// This library re-exports the parts of front_end's performance_logger.dart
-// whose API is stable enough to be relied upon by clients.
+import 'dart:async';
 
-export 'package:front_end/src/base/performance_logger.dart' show PerformanceLog;
+/// This class is used to gather and print performance information.
+class PerformanceLog {
+  final StringSink sink;
+  int _level = 0;
+
+  PerformanceLog(this.sink);
+
+  /// Enter a new execution section, which starts at one point of code, runs
+  /// some time, and then ends at the other point of code.
+  ///
+  /// The client must call [PerformanceLogSection.exit] for every [enter].
+  PerformanceLogSection enter(String msg) {
+    writeln('+++ $msg.');
+    _level++;
+    return new PerformanceLogSection(this, msg);
+  }
+
+  /// Return the result of the function [f] invocation and log the elapsed time.
+  ///
+  /// Each invocation of [run] creates a new enclosed section in the log,
+  /// which begins with printing [msg], then any log output produced during
+  /// [f] invocation, and ends with printing [msg] with the elapsed time.
+  T run<T>(String msg, T f()) {
+    Stopwatch timer = new Stopwatch()..start();
+    try {
+      writeln('+++ $msg.');
+      _level++;
+      return f();
+    } finally {
+      _level--;
+      int ms = timer.elapsedMilliseconds;
+      writeln('--- $msg in $ms ms.');
+    }
+  }
+
+  /// Return the result of the function [f] invocation and log the elapsed time.
+  ///
+  /// Each invocation of [run] creates a new enclosed section in the log,
+  /// which begins with printing [msg], then any log output produced during
+  /// [f] invocation, and ends with printing [msg] with the elapsed time.
+  Future<T> runAsync<T>(String msg, Future<T> f()) async {
+    Stopwatch timer = new Stopwatch()..start();
+    try {
+      writeln('+++ $msg.');
+      _level++;
+      return await f();
+    } finally {
+      _level--;
+      int ms = timer.elapsedMilliseconds;
+      writeln('--- $msg in $ms ms.');
+    }
+  }
+
+  /// Write a new line into the log.
+  void writeln(String msg) {
+    if (sink != null) {
+      String indent = '\t' * _level;
+      sink.writeln('$indent$msg');
+    }
+  }
+}
+
+/**
+ * The performance measurement section for operations that start and end
+ * at different place in code, so cannot be run using [PerformanceLog.run].
+ *
+ * The client must call [exit] for every [PerformanceLog.enter].
+ */
+class PerformanceLogSection {
+  final PerformanceLog _logger;
+  final String _msg;
+  final Stopwatch _timer = new Stopwatch()..start();
+
+  PerformanceLogSection(this._logger, this._msg);
+
+  /**
+   * Stop the timer, log the time.
+   */
+  void exit() {
+    _timer.stop();
+    _logger._level--;
+    int ms = _timer.elapsedMilliseconds;
+    _logger.writeln('--- $_msg in $ms ms.');
+  }
+}
diff --git a/pkg/front_end/lib/src/byte_store/protected_file_byte_store.dart b/pkg/analyzer/lib/src/dart/analysis/protected_file_byte_store.dart
similarity index 97%
rename from pkg/front_end/lib/src/byte_store/protected_file_byte_store.dart
rename to pkg/analyzer/lib/src/dart/analysis/protected_file_byte_store.dart
index 690f1de..b5ec4e1 100644
--- a/pkg/front_end/lib/src/byte_store/protected_file_byte_store.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/protected_file_byte_store.dart
@@ -111,8 +111,8 @@
   /// just read, and where it is important to keep system unlocked.
   String _keysReadTextLocked() {
     File keysFile = new File(join(_cachePath, PROTECTED_FILE_NAME));
-    RandomAccessFile keysLock = keysFile.openSync(mode: FileMode.APPEND);
-    keysLock.lockSync(FileLock.BLOCKING_EXCLUSIVE);
+    RandomAccessFile keysLock = keysFile.openSync(mode: FileMode.append);
+    keysLock.lockSync(FileLock.blockingExclusive);
     try {
       return _keysReadText(keysLock);
     } finally {
@@ -148,8 +148,8 @@
   static void _withProtectedKeysLockSync(
       String cachePath, void f(ProtectedKeys keys)) {
     String path = join(cachePath, PROTECTED_FILE_NAME);
-    RandomAccessFile file = new File(path).openSync(mode: FileMode.APPEND);
-    file.lockSync(FileLock.BLOCKING_EXCLUSIVE);
+    RandomAccessFile file = new File(path).openSync(mode: FileMode.append);
+    file.lockSync(FileLock.blockingExclusive);
     try {
       ProtectedKeys keys = _keysRead(file);
       f(keys);
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index 75f75bd..ebbbf1d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -84,6 +84,9 @@
     return _uriConverter ??= new DriverBasedUriConverter(_driver);
   }
 
+  @deprecated
+  driver.AnalysisDriver getDriver() => _driver;
+
   @override
   Future<ErrorsResult> getErrors(String path) {
     _checkConsistency();
diff --git a/pkg/analyzer/lib/src/dart/analysis/top_level_declaration.dart b/pkg/analyzer/lib/src/dart/analysis/top_level_declaration.dart
index 8f1d640..b32e636 100644
--- a/pkg/analyzer/lib/src/dart/analysis/top_level_declaration.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/top_level_declaration.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 'package:front_end/src/base/source.dart';
+import 'package:analyzer/src/generated/source.dart';
 
 /**
  * Information about a single top-level declaration.
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 e9b3c93..95fea50 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
@@ -38,7 +38,12 @@
           (lastInitializer ?? member.parameters ?? member.name).endToken,
         );
       } else if (member is FieldDeclaration) {
-        addVariables(member, member.fields, hasConstConstructor);
+        var variableList = member.fields;
+        addVariables(
+          member,
+          variableList,
+          !member.isStatic && variableList.isFinal && hasConstConstructor,
+        );
       } else if (member is MethodDeclaration) {
         addTokens(
           member.beginToken,
@@ -78,11 +83,11 @@
   void addVariables(
     AstNode node,
     VariableDeclarationList variableList,
-    bool includeFinalInitializers,
+    bool includeInitializers,
   ) {
     if (variableList.type == null ||
         variableList.isConst ||
-        variableList.isFinal && includeFinalInitializers) {
+        includeInitializers) {
       addTokens(node.beginToken, node.endToken);
     } else {
       addTokens(node.beginToken, variableList.type.endToken);
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index c725c8b..6ab7b93 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dart/constant/constant_verifier.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -23,7 +24,6 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/parser.dart';
-import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
 import 'package:analyzer/src/generated/utilities_dart.dart';
 
@@ -1003,7 +1003,7 @@
   }
 
   @override
-  int get precedence => 0;
+  int get precedence => 14;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitAwaitExpression(this);
@@ -1045,6 +1045,9 @@
   @override
   MethodElement staticElement;
 
+  @override
+  FunctionType staticInvokeType;
+
   /**
    * Initialize a newly created binary expression.
    */
@@ -1095,23 +1098,6 @@
     _rightOperand = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  /**
-   * If the AST structure has been resolved, and the function being invoked is
-   * known based on static type information, then return the parameter element
-   * representing the parameter to which the value of the right operand will be
-   * bound. Otherwise, return `null`.
-   */
-  ParameterElement get _staticParameterElementForRightOperand {
-    if (staticElement == null) {
-      return null;
-    }
-    List<ParameterElement> parameters = staticElement.parameters;
-    if (parameters.length < 1) {
-      return null;
-    }
-    return parameters[0];
-  }
-
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitBinaryExpression(this);
 
@@ -4163,7 +4149,11 @@
       }
     } else if (parent is BinaryExpressionImpl) {
       if (identical(parent.rightOperand, this)) {
-        return parent._staticParameterElementForRightOperand;
+        var parameters = parent.staticInvokeType?.parameters;
+        if (parameters != null && parameters.isNotEmpty) {
+          return parameters[0];
+        }
+        return null;
       }
     } else if (parent is AssignmentExpressionImpl) {
       if (identical(parent.rightHandSide, this)) {
@@ -5583,9 +5573,6 @@
    */
   FormalParameterListImpl _parameters;
 
-  @override
-  Token question;
-
   /**
    * Initialize a newly created formal parameter. Either or both of the
    * [comment] and [metadata] can be `null` if the parameter does not have the
@@ -5599,8 +5586,7 @@
       TypeAnnotationImpl returnType,
       SimpleIdentifierImpl identifier,
       TypeParameterListImpl typeParameters,
-      FormalParameterListImpl parameters,
-      this.question)
+      FormalParameterListImpl parameters)
       : super(comment, metadata, covariantKeyword, identifier) {
     _returnType = _becomeParentOf(returnType);
     _typeParameters = _becomeParentOf(typeParameters);
@@ -10938,9 +10924,6 @@
    */
   TypeArgumentListImpl _typeArguments;
 
-  @override
-  Token question;
-
   /**
    * The type being named, or `null` if the AST structure has not been resolved.
    */
@@ -10950,8 +10933,7 @@
    * Initialize a newly created type name. The [typeArguments] can be `null` if
    * there are no type arguments.
    */
-  TypeNameImpl(
-      IdentifierImpl name, TypeArgumentListImpl typeArguments, this.question) {
+  TypeNameImpl(IdentifierImpl name, TypeArgumentListImpl typeArguments) {
     _name = _becomeParentOf(name);
     _typeArguments = _becomeParentOf(typeArguments);
   }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index 7adb96a..cb337f7 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -525,10 +525,9 @@
           TypeAnnotation returnType,
           SimpleIdentifier identifier,
           TypeParameterList typeParameters,
-          FormalParameterList parameters,
-          {Token question: null}) =>
+          FormalParameterList parameters) =>
       new FunctionTypedFormalParameterImpl(comment, metadata, null, returnType,
-          identifier, typeParameters, parameters, question);
+          identifier, typeParameters, parameters);
 
   @override
   FunctionTypedFormalParameter functionTypedFormalParameter2(
@@ -538,10 +537,9 @@
           TypeAnnotation returnType,
           @required SimpleIdentifier identifier,
           TypeParameterList typeParameters,
-          @required FormalParameterList parameters,
-          Token question}) =>
+          @required FormalParameterList parameters}) =>
       new FunctionTypedFormalParameterImpl(comment, metadata, covariantKeyword,
-          returnType, identifier, typeParameters, parameters, question);
+          returnType, identifier, typeParameters, parameters);
 
   @override
   GenericFunctionType genericFunctionType(
@@ -947,9 +945,8 @@
       new TypeArgumentListImpl(leftBracket, arguments, rightBracket);
 
   @override
-  TypeName typeName(Identifier name, TypeArgumentList typeArguments,
-          {Token question: null}) =>
-      new TypeNameImpl(name, typeArguments, question);
+  TypeName typeName(Identifier name, TypeArgumentList typeArguments) =>
+      new TypeNameImpl(name, typeArguments);
 
   @override
   TypeParameter typeParameter(Comment comment, List<Annotation> metadata,
diff --git a/pkg/analyzer/lib/src/dart/ast/resolution_map.dart b/pkg/analyzer/lib/src/dart/ast/resolution_map.dart
index f6811e3..8d59a9e 100644
--- a/pkg/analyzer/lib/src/dart/ast/resolution_map.dart
+++ b/pkg/analyzer/lib/src/dart/ast/resolution_map.dart
@@ -90,6 +90,10 @@
       node.declaredElement;
 
   @override
+  ClassElement elementDeclaredByMixinDeclaration(MixinDeclaration node) =>
+      node.declaredElement;
+
+  @override
   VariableElement elementDeclaredByVariableDeclaration(
           VariableDeclaration node) =>
       node.declaredElement;
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index d014ecd..f7e6832 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -7598,9 +7598,6 @@
     _visitNode(node.identifier);
     _visitNode(node.typeParameters);
     _visitNode(node.parameters);
-    if (node.question != null) {
-      _writer.print('?');
-    }
     return null;
   }
 
@@ -8092,9 +8089,6 @@
   Object visitTypeName(TypeName node) {
     _visitNode(node.name);
     _visitNode(node.typeArguments);
-    if (node.question != null) {
-      _writer.print('?');
-    }
     return null;
   }
 
@@ -8934,9 +8928,6 @@
     safelyVisitNode(node.identifier);
     safelyVisitNode(node.typeParameters);
     safelyVisitNode(node.parameters);
-    if (node.question != null) {
-      sink.write('?');
-    }
     return null;
   }
 
@@ -9428,9 +9419,6 @@
   Object visitTypeName(TypeName node) {
     safelyVisitNode(node.name);
     safelyVisitNode(node.typeArguments);
-    if (node.question != null) {
-      sink.write('?');
-    }
     return null;
   }
 
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
new file mode 100644
index 0000000..d333f97
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -0,0 +1,662 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/constant/value.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dart/constant/evaluation.dart';
+import 'package:analyzer/src/dart/constant/value.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+/// Instances of the class `ConstantVerifier` traverse an AST structure looking
+/// for additional errors and warnings not covered by the parser and resolver.
+/// In particular, it looks for errors and warnings related to constant
+/// expressions.
+class ConstantVerifier extends RecursiveAstVisitor<Object> {
+  /// The error reporter by which errors will be reported.
+  final ErrorReporter _errorReporter;
+
+  /// The type provider used to access the known types.
+  final TypeProvider _typeProvider;
+
+  /// The type system in use.
+  final TypeSystem _typeSystem;
+
+  /// The set of variables declared using '-D' on the command line.
+  final DeclaredVariables declaredVariables;
+
+  /// The type representing the type 'bool'.
+  InterfaceType _boolType;
+
+  /// The type representing the type 'int'.
+  InterfaceType _intType;
+
+  /// The type representing the type 'num'.
+  InterfaceType _numType;
+
+  /// The type representing the type 'string'.
+  InterfaceType _stringType;
+
+  /// The current library that is being analyzed.
+  final LibraryElement _currentLibrary;
+
+  ConstantEvaluationEngine _evaluationEngine;
+
+  /// Initialize a newly created constant verifier.
+  ///
+  /// @param errorReporter the error reporter by which errors will be reported
+  ConstantVerifier(this._errorReporter, LibraryElement currentLibrary,
+      this._typeProvider, this.declaredVariables,
+      {bool forAnalysisDriver: false})
+      : _currentLibrary = currentLibrary,
+        _typeSystem = currentLibrary.context.typeSystem {
+    this._boolType = _typeProvider.boolType;
+    this._intType = _typeProvider.intType;
+    this._numType = _typeProvider.numType;
+    this._stringType = _typeProvider.stringType;
+    this._evaluationEngine = new ConstantEvaluationEngine(
+        _typeProvider, declaredVariables,
+        forAnalysisDriver: forAnalysisDriver, typeSystem: _typeSystem);
+  }
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    super.visitAnnotation(node);
+    // check annotation creation
+    Element element = node.element;
+    if (element is ConstructorElement) {
+      // should be 'const' constructor
+      if (!element.isConst) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR, node);
+        return null;
+      }
+      // should have arguments
+      ArgumentList argumentList = node.arguments;
+      if (argumentList == null) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS, node);
+        return null;
+      }
+      // arguments should be constants
+      _validateConstantArguments(argumentList);
+    }
+    if (node.elementAnnotation?.isSealed == true &&
+        !(node.parent is ClassDeclaration ||
+            node.parent is ClassTypeAlias ||
+            node.parent is MixinDeclaration)) {
+      _errorReporter.reportErrorForNode(
+          HintCode.INVALID_SEALED_ANNOTATION, node.parent, [node.element.name]);
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (node.constKeyword != null) {
+      _validateConstructorInitializers(node);
+      _validateFieldInitializers(node.parent as ClassDeclaration, node);
+    }
+    _validateDefaultValues(node.parameters);
+    return super.visitConstructorDeclaration(node);
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    super.visitFunctionExpression(node);
+    _validateDefaultValues(node.parameters);
+    return null;
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    if (node.isConst) {
+      TypeName typeName = node.constructorName.type;
+      _checkForConstWithTypeParameters(typeName);
+
+      // We need to evaluate the constant to see if any errors occur during its
+      // evaluation.
+      ConstructorElement constructor = node.staticElement;
+      if (constructor != null) {
+        ConstantVisitor constantVisitor =
+            new ConstantVisitor(_evaluationEngine, _errorReporter);
+        _evaluationEngine.evaluateConstructorCall(
+            node,
+            node.argumentList.arguments,
+            constructor,
+            constantVisitor,
+            _errorReporter);
+      }
+      return null;
+    } else {
+      return super.visitInstanceCreationExpression(node);
+    }
+  }
+
+  @override
+  Object visitListLiteral(ListLiteral node) {
+    super.visitListLiteral(node);
+    if (node.isConst) {
+      DartObjectImpl result;
+      for (Expression element in node.elements) {
+        result =
+            _validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
+        if (result != null) {
+          _reportErrorIfFromDeferredLibrary(
+              element,
+              CompileTimeErrorCode
+                  .NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY);
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    super.visitMapLiteral(node);
+    bool isConst = node.isConst;
+    bool reportEqualKeys = true;
+    HashSet<DartObject> keys = new HashSet<DartObject>();
+    List<Expression> invalidKeys = new List<Expression>();
+    for (MapLiteralEntry entry in node.entries) {
+      Expression key = entry.key;
+      if (isConst) {
+        DartObjectImpl keyResult =
+            _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
+        Expression valueExpression = entry.value;
+        DartObjectImpl valueResult = _validate(
+            valueExpression, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
+        if (valueResult != null) {
+          _reportErrorIfFromDeferredLibrary(
+              valueExpression,
+              CompileTimeErrorCode
+                  .NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY);
+        }
+        if (keyResult != null) {
+          _reportErrorIfFromDeferredLibrary(key,
+              CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY);
+          if (keys.contains(keyResult)) {
+            invalidKeys.add(key);
+          } else {
+            keys.add(keyResult);
+          }
+          DartType type = keyResult.type;
+          if (_implementsEqualsWhenNotAllowed(type)) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode
+                    .CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
+                key,
+                [type.displayName]);
+          }
+        }
+      } else {
+        // Note: we throw the errors away because this isn't actually a const.
+        AnalysisErrorListener errorListener =
+            AnalysisErrorListener.NULL_LISTENER;
+        ErrorReporter subErrorReporter =
+            new ErrorReporter(errorListener, _errorReporter.source);
+        DartObjectImpl result = key
+            .accept(new ConstantVisitor(_evaluationEngine, subErrorReporter));
+        if (result != null) {
+          if (keys.contains(result)) {
+            invalidKeys.add(key);
+          } else {
+            keys.add(result);
+          }
+        } else {
+          reportEqualKeys = false;
+        }
+      }
+    }
+    if (reportEqualKeys) {
+      int length = invalidKeys.length;
+      for (int i = 0; i < length; i++) {
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.EQUAL_KEYS_IN_MAP, invalidKeys[i]);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    super.visitMethodDeclaration(node);
+    _validateDefaultValues(node.parameters);
+    return null;
+  }
+
+  @override
+  Object visitSwitchStatement(SwitchStatement node) {
+    // TODO(paulberry): to minimize error messages, it would be nice to
+    // compare all types with the most popular type rather than the first
+    // type.
+    NodeList<SwitchMember> switchMembers = node.members;
+    bool foundError = false;
+    DartType firstType = null;
+    for (SwitchMember switchMember in switchMembers) {
+      if (switchMember is SwitchCase) {
+        Expression expression = switchMember.expression;
+        DartObjectImpl caseResult = _validate(
+            expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION);
+        if (caseResult != null) {
+          _reportErrorIfFromDeferredLibrary(
+              expression,
+              CompileTimeErrorCode
+                  .NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY);
+          DartObject value = caseResult;
+          if (firstType == null) {
+            firstType = value.type;
+          } else {
+            DartType nType = value.type;
+            if (firstType != nType) {
+              _errorReporter.reportErrorForNode(
+                  CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
+                  expression,
+                  [expression.toSource(), firstType.displayName]);
+              foundError = true;
+            }
+          }
+        }
+      }
+    }
+    if (!foundError) {
+      _checkForCaseExpressionTypeImplementsEquals(node, firstType);
+    }
+    return super.visitSwitchStatement(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    super.visitVariableDeclaration(node);
+    Expression initializer = node.initializer;
+    if (initializer != null && (node.isConst || node.isFinal)) {
+      VariableElementImpl element = node.declaredElement as VariableElementImpl;
+      EvaluationResultImpl result = element.evaluationResult;
+      if (result == null) {
+        // Variables marked "const" should have had their values computed by
+        // ConstantValueComputer.  Other variables will only have had their
+        // values computed if the value was needed (e.g. final variables in a
+        // class containing const constructors).
+        assert(!node.isConst);
+        return null;
+      }
+      _reportErrors(result.errors,
+          CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
+      _reportErrorIfFromDeferredLibrary(
+          initializer,
+          CompileTimeErrorCode
+              .CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY);
+    }
+    return null;
+  }
+
+  /// This verifies that the passed switch statement does not have a case
+  /// expression with the operator '==' overridden.
+  ///
+  /// @param node the switch statement to evaluate
+  /// @param type the common type of all 'case' expressions
+  /// @return `true` if and only if an error code is generated on the passed
+  ///         node.
+  /// See [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS].
+  bool _checkForCaseExpressionTypeImplementsEquals(
+      SwitchStatement node, DartType type) {
+    if (!_implementsEqualsWhenNotAllowed(type)) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForToken(
+        CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
+        node.switchKeyword,
+        [type.displayName]);
+    return true;
+  }
+
+  /// Verify that the given [type] does not reference any type parameters.
+  ///
+  /// See [CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS].
+  void _checkForConstWithTypeParameters(TypeAnnotation type) {
+    // something wrong with AST
+    if (type is! TypeName) {
+      return;
+    }
+    TypeName typeName = type;
+    Identifier name = typeName.name;
+    if (name == null) {
+      return;
+    }
+    // should not be a type parameter
+    if (name.staticElement is TypeParameterElement) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name);
+    }
+    // check type arguments
+    TypeArgumentList typeArguments = typeName.typeArguments;
+    if (typeArguments != null) {
+      for (TypeAnnotation argument in typeArguments.arguments) {
+        _checkForConstWithTypeParameters(argument);
+      }
+    }
+  }
+
+  /// @return `true` if given [Type] implements operator <i>==</i>, and it is
+  ///         not <i>int</i> or <i>String</i>.
+  bool _implementsEqualsWhenNotAllowed(DartType type) {
+    // ignore int or String
+    if (type == null || type == _intType || type == _typeProvider.stringType) {
+      return false;
+    } else if (type == _typeProvider.doubleType) {
+      return true;
+    }
+    // prepare ClassElement
+    Element element = type.element;
+    if (element is ClassElement) {
+      // lookup for ==
+      MethodElement method =
+          element.lookUpConcreteMethod("==", _currentLibrary);
+      if (method == null || method.enclosingElement.type.isObject) {
+        return false;
+      }
+      // there is == that we don't like
+      return true;
+    }
+    return false;
+  }
+
+  /// Given some computed [Expression], this method generates the passed
+  /// [ErrorCode] on the node if its' value consists of information from a
+  /// deferred library.
+  ///
+  /// @param expression the expression to be tested for a deferred library
+  ///        reference
+  /// @param errorCode the error code to be used if the expression is or
+  ///        consists of a reference to a deferred library
+  void _reportErrorIfFromDeferredLibrary(
+      Expression expression, ErrorCode errorCode) {
+    DeferredLibraryReferenceDetector referenceDetector =
+        new DeferredLibraryReferenceDetector();
+    expression.accept(referenceDetector);
+    if (referenceDetector.result) {
+      _errorReporter.reportErrorForNode(errorCode, expression);
+    }
+  }
+
+  /// Report any errors in the given list. Except for special cases, use the
+  /// given error code rather than the one reported in the error.
+  ///
+  /// @param errors the errors that need to be reported
+  /// @param errorCode the error code to be used
+  void _reportErrors(List<AnalysisError> errors, ErrorCode errorCode) {
+    int length = errors.length;
+    for (int i = 0; i < length; i++) {
+      AnalysisError data = errors[i];
+      ErrorCode dataErrorCode = data.errorCode;
+      if (identical(dataErrorCode,
+              CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) ||
+          identical(
+              dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE) ||
+          identical(dataErrorCode,
+              CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) ||
+          identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) ||
+          identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) ||
+          identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM) ||
+          identical(dataErrorCode,
+              CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT) ||
+          identical(dataErrorCode,
+              CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) ||
+          identical(
+              dataErrorCode,
+              CheckedModeCompileTimeErrorCode
+                  .CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH) ||
+          identical(
+              dataErrorCode,
+              CheckedModeCompileTimeErrorCode
+                  .CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH) ||
+          identical(dataErrorCode,
+              CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH)) {
+        _errorReporter.reportError(data);
+      } else if (errorCode != null) {
+        _errorReporter.reportError(new AnalysisError(
+            data.source, data.offset, data.length, errorCode));
+      }
+    }
+  }
+
+  /// Validate that the given expression is a compile time constant. Return the
+  /// value of the compile time constant, or `null` if the expression is not a
+  /// compile time constant.
+  ///
+  /// @param expression the expression to be validated
+  /// @param errorCode the error code to be used if the expression is not a
+  ///        compile time constant
+  /// @return the value of the compile time constant
+  DartObjectImpl _validate(Expression expression, ErrorCode errorCode) {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    ErrorReporter subErrorReporter =
+        new ErrorReporter(errorListener, _errorReporter.source);
+    DartObjectImpl result = expression
+        .accept(new ConstantVisitor(_evaluationEngine, subErrorReporter));
+    _reportErrors(errorListener.errors, errorCode);
+    return result;
+  }
+
+  /// Validate that if the passed arguments are constant expressions.
+  ///
+  /// @param argumentList the argument list to evaluate
+  void _validateConstantArguments(ArgumentList argumentList) {
+    for (Expression argument in argumentList.arguments) {
+      Expression realArgument =
+          argument is NamedExpression ? argument.expression : argument;
+      _validate(
+          realArgument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT);
+    }
+  }
+
+  /// Validates that the expressions of the initializers of the given constant
+  /// [constructor] are all compile time constants.
+  void _validateConstructorInitializers(ConstructorDeclaration constructor) {
+    List<ParameterElement> parameterElements =
+        constructor.parameters.parameterElements;
+    NodeList<ConstructorInitializer> initializers = constructor.initializers;
+    for (ConstructorInitializer initializer in initializers) {
+      if (initializer is AssertInitializer) {
+        _validateInitializerExpression(
+            parameterElements, initializer.condition);
+        Expression message = initializer.message;
+        if (message != null) {
+          _validateInitializerExpression(parameterElements, message);
+        }
+      } else if (initializer is ConstructorFieldInitializer) {
+        _validateInitializerExpression(
+            parameterElements, initializer.expression);
+      } else if (initializer is RedirectingConstructorInvocation) {
+        _validateInitializerInvocationArguments(
+            parameterElements, initializer.argumentList);
+      } else if (initializer is SuperConstructorInvocation) {
+        _validateInitializerInvocationArguments(
+            parameterElements, initializer.argumentList);
+      }
+    }
+  }
+
+  /// Validate that the default value associated with each of the parameters in
+  /// the given list is a compile time constant.
+  ///
+  /// @param parameters the list of parameters to be validated
+  void _validateDefaultValues(FormalParameterList parameters) {
+    if (parameters == null) {
+      return;
+    }
+    for (FormalParameter parameter in parameters.parameters) {
+      if (parameter is DefaultFormalParameter) {
+        Expression defaultValue = parameter.defaultValue;
+        DartObjectImpl result;
+        if (defaultValue == null) {
+          result =
+              new DartObjectImpl(_typeProvider.nullType, NullState.NULL_STATE);
+        } else {
+          result = _validate(
+              defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE);
+          if (result != null) {
+            _reportErrorIfFromDeferredLibrary(
+                defaultValue,
+                CompileTimeErrorCode
+                    .NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY);
+          }
+        }
+        VariableElementImpl element =
+            parameter.declaredElement as VariableElementImpl;
+        element.evaluationResult = new EvaluationResultImpl(result);
+      }
+    }
+  }
+
+  /// Validates that the expressions of any field initializers in the class
+  /// declaration are all compile time constants. Since this is only required if
+  /// the class has a constant constructor, the error is reported at the
+  /// constructor site.
+  ///
+  /// @param classDeclaration the class which should be validated
+  /// @param errorSite the site at which errors should be reported.
+  void _validateFieldInitializers(
+      ClassDeclaration classDeclaration, ConstructorDeclaration errorSite) {
+    NodeList<ClassMember> members = classDeclaration.members;
+    for (ClassMember member in members) {
+      if (member is FieldDeclaration && !member.isStatic) {
+        for (VariableDeclaration variableDeclaration
+            in member.fields.variables) {
+          Expression initializer = variableDeclaration.initializer;
+          if (initializer != null) {
+            // Ignore any errors produced during validation--if the constant
+            // can't be evaluated we'll just report a single error.
+            AnalysisErrorListener errorListener =
+                AnalysisErrorListener.NULL_LISTENER;
+            ErrorReporter subErrorReporter =
+                new ErrorReporter(errorListener, _errorReporter.source);
+            DartObjectImpl result = initializer.accept(
+                new ConstantVisitor(_evaluationEngine, subErrorReporter));
+            if (result == null) {
+              _errorReporter.reportErrorForNode(
+                  CompileTimeErrorCode
+                      .CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
+                  errorSite,
+                  [variableDeclaration.name.name]);
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /// Validates that the given expression is a compile time constant.
+  ///
+  /// @param parameterElements the elements of parameters of constant
+  ///        constructor, they are considered as a valid potentially constant
+  ///        expressions
+  /// @param expression the expression to validate
+  void _validateInitializerExpression(
+      List<ParameterElement> parameterElements, Expression expression) {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    ErrorReporter subErrorReporter =
+        new ErrorReporter(errorListener, _errorReporter.source);
+    DartObjectImpl result = expression.accept(
+        new _ConstantVerifier_validateInitializerExpression(_typeSystem,
+            _evaluationEngine, subErrorReporter, this, parameterElements));
+    _reportErrors(errorListener.errors,
+        CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
+    if (result != null) {
+      _reportErrorIfFromDeferredLibrary(
+          expression,
+          CompileTimeErrorCode
+              .NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY);
+    }
+  }
+
+  /// Validates that all of the arguments of a constructor initializer are
+  /// compile time constants.
+  ///
+  /// @param parameterElements the elements of parameters of constant
+  ///        constructor, they are considered as a valid potentially constant
+  ///        expressions
+  /// @param argumentList the argument list to validate
+  void _validateInitializerInvocationArguments(
+      List<ParameterElement> parameterElements, ArgumentList argumentList) {
+    if (argumentList == null) {
+      return;
+    }
+    for (Expression argument in argumentList.arguments) {
+      _validateInitializerExpression(parameterElements, argument);
+    }
+  }
+}
+
+class _ConstantVerifier_validateInitializerExpression extends ConstantVisitor {
+  final TypeSystem typeSystem;
+  final ConstantVerifier verifier;
+
+  List<ParameterElement> parameterElements;
+
+  _ConstantVerifier_validateInitializerExpression(
+      this.typeSystem,
+      ConstantEvaluationEngine evaluationEngine,
+      ErrorReporter errorReporter,
+      this.verifier,
+      this.parameterElements)
+      : super(evaluationEngine, errorReporter);
+
+  @override
+  DartObjectImpl visitSimpleIdentifier(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    int length = parameterElements.length;
+    for (int i = 0; i < length; i++) {
+      ParameterElement parameterElement = parameterElements[i];
+      if (identical(parameterElement, element) && parameterElement != null) {
+        DartType type = parameterElement.type;
+        if (type != null) {
+          if (type.isDynamic) {
+            return new DartObjectImpl(
+                verifier._typeProvider.objectType, DynamicState.DYNAMIC_STATE);
+          } else if (typeSystem.isSubtypeOf(type, verifier._boolType)) {
+            return new DartObjectImpl(
+                verifier._typeProvider.boolType, BoolState.UNKNOWN_VALUE);
+          } else if (typeSystem.isSubtypeOf(
+              type, verifier._typeProvider.doubleType)) {
+            return new DartObjectImpl(
+                verifier._typeProvider.doubleType, DoubleState.UNKNOWN_VALUE);
+          } else if (typeSystem.isSubtypeOf(type, verifier._intType)) {
+            return new DartObjectImpl(
+                verifier._typeProvider.intType, IntState.UNKNOWN_VALUE);
+          } else if (typeSystem.isSubtypeOf(type, verifier._numType)) {
+            return new DartObjectImpl(
+                verifier._typeProvider.numType, NumState.UNKNOWN_VALUE);
+          } else if (typeSystem.isSubtypeOf(type, verifier._stringType)) {
+            return new DartObjectImpl(
+                verifier._typeProvider.stringType, StringState.UNKNOWN_VALUE);
+          }
+          //
+          // We don't test for other types of objects (such as List, Map,
+          // Function or Type) because there are no operations allowed on such
+          // types other than '==' and '!=', which means that we don't need to
+          // know the type when there is no specific data about the state of
+          // such objects.
+          //
+        }
+        return new DartObjectImpl(
+            type is InterfaceType ? type : verifier._typeProvider.objectType,
+            GenericState.UNKNOWN_VALUE);
+      }
+    }
+    return super.visitSimpleIdentifier(node);
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 64ad7bf..c016009 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -25,7 +25,6 @@
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/generated/type_system.dart'
     show StrongTypeSystemImpl, TypeSystem;
-import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/task/dart.dart';
 
 /**
@@ -37,20 +36,36 @@
    * Parameter to "fromEnvironment" methods that denotes the default value.
    */
   static String _DEFAULT_VALUE_PARAM = "defaultValue";
+  /**
+   * Source of RegExp matching declarable operator names.
+   * From sdk/lib/internal/symbol.dart.
+   */
+  static String _OPERATOR_RE =
+      "(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)";
+
+  /**
+   * Source of RegExp matching Dart reserved words.
+   * From sdk/lib/internal/symbol.dart.
+   */
+  static String _RESERVED_WORD_RE =
+      "(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|"
+      "d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|"
+      "i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|"
+      "r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))";
 
   /**
    * Source of RegExp matching any public identifier.
    * From sdk/lib/internal/symbol.dart.
    */
   static String _PUBLIC_IDENTIFIER_RE =
-      "(?!${ConstantValueComputer._RESERVED_WORD_RE}\\b(?!\\\$))[a-zA-Z\$][\\w\$]*";
+      "(?!$_RESERVED_WORD_RE\\b(?!\\\$))[a-zA-Z\$][\\w\$]*";
 
   /**
    * RegExp that validates a non-empty non-private symbol.
    * From sdk/lib/internal/symbol.dart.
    */
   static RegExp _PUBLIC_SYMBOL_PATTERN = new RegExp(
-      "^(?:${ConstantValueComputer._OPERATOR_RE}\$|$_PUBLIC_IDENTIFIER_RE(?:=?\$|[.](?!\$)))+?\$");
+      "^(?:$_OPERATOR_RE\$|$_PUBLIC_IDENTIFIER_RE(?:=?\$|[.](?!\$)))+?\$");
 
   /**
    * The type provider used to access the known types.
@@ -75,6 +90,11 @@
   final ConstantEvaluationValidator validator;
 
   /**
+   * Whether this engine is used inside Analysis Driver.
+   */
+  final bool forAnalysisDriver;
+
+  /**
    * Initialize a newly created [ConstantEvaluationEngine].  The [typeProvider]
    * is used to access known types.  [_declaredVariables] is the set of
    * variables declared on the command line using '-D'.  The [validator], if
@@ -82,7 +102,9 @@
    * tests.
    */
   ConstantEvaluationEngine(TypeProvider typeProvider, this._declaredVariables,
-      {ConstantEvaluationValidator validator, TypeSystem typeSystem})
+      {ConstantEvaluationValidator validator,
+      TypeSystem typeSystem,
+      this.forAnalysisDriver: false})
       : typeProvider = typeProvider,
         validator =
             validator ?? new ConstantEvaluationValidator_ForProduction(),
@@ -958,119 +980,6 @@
 }
 
 /**
- * An object used to compute the values of constant variables and constant
- * constructor invocations in one or more compilation units. The expected usage
- * pattern is for the compilation units to be added to this computer using the
- * method [add] and then for the method [computeValues] to be invoked exactly
- * once. Any use of an instance after invoking the method [computeValues] will
- * result in unpredictable behavior.
- */
-class ConstantValueComputer {
-  /**
-   * Source of RegExp matching declarable operator names.
-   * From sdk/lib/internal/symbol.dart.
-   */
-  static String _OPERATOR_RE =
-      "(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)";
-
-  /**
-   * Source of RegExp matching Dart reserved words.
-   * From sdk/lib/internal/symbol.dart.
-   */
-  static String _RESERVED_WORD_RE =
-      "(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))";
-
-  /**
-   * A graph in which the nodes are the constants, and the edges are from each
-   * constant to the other constants that are referenced by it.
-   */
-  DirectedGraph<ConstantEvaluationTarget> referenceGraph =
-      new DirectedGraph<ConstantEvaluationTarget>();
-
-  /**
-   * The elements whose constant values need to be computed.  Any elements
-   * which appear in [referenceGraph] but not in this set either belong to a
-   * different library cycle (and hence don't need to be recomputed) or were
-   * computed during a previous stage of resolution stage (e.g. constants
-   * associated with enums).
-   */
-  HashSet<ConstantEvaluationTarget> _constantsToCompute =
-      new HashSet<ConstantEvaluationTarget>();
-
-  /**
-   * The evaluation engine that does the work of evaluating instance creation
-   * expressions.
-   */
-  final ConstantEvaluationEngine evaluationEngine;
-
-  /**
-   * Initialize a newly created constant value computer. The [typeProvider] is
-   * the type provider used to access known types. The [declaredVariables] is
-   * the set of variables declared on the command line using '-D'.
-   */
-  ConstantValueComputer(
-      TypeProvider typeProvider, DeclaredVariables declaredVariables,
-      [ConstantEvaluationValidator validator, TypeSystem typeSystem])
-      : evaluationEngine = new ConstantEvaluationEngine(
-            typeProvider, declaredVariables,
-            validator: validator, typeSystem: typeSystem);
-
-  /**
-   * Add the constants in the given compilation [unit] to the list of constants
-   * whose value needs to be computed.
-   */
-  void add(CompilationUnit unit) {
-    ConstantFinder constantFinder = new ConstantFinder();
-    unit.accept(constantFinder);
-    _constantsToCompute.addAll(constantFinder.constantsToCompute);
-  }
-
-  /**
-   * Compute values for all of the constants in the compilation units that were
-   * added.
-   */
-  void computeValues() {
-    for (ConstantEvaluationTarget constant in _constantsToCompute) {
-      referenceGraph.addNode(constant);
-      evaluationEngine.computeDependencies(constant,
-          (ConstantEvaluationTarget dependency) {
-        referenceGraph.addEdge(constant, dependency);
-      });
-    }
-    List<List<ConstantEvaluationTarget>> topologicalSort =
-        referenceGraph.computeTopologicalSort();
-    for (List<ConstantEvaluationTarget> constantsInCycle in topologicalSort) {
-      if (constantsInCycle.length == 1) {
-        ConstantEvaluationTarget constant = constantsInCycle[0];
-        if (!referenceGraph.getTails(constant).contains(constant)) {
-          _computeValueFor(constant);
-          continue;
-        }
-      }
-      for (ConstantEvaluationTarget constant in constantsInCycle) {
-        evaluationEngine.generateCycleError(constantsInCycle, constant);
-      }
-    }
-  }
-
-  /**
-   * Compute a value for the given [constant].
-   */
-  void _computeValueFor(ConstantEvaluationTarget constant) {
-    if (!_constantsToCompute.contains(constant)) {
-      // Element is in the dependency graph but should have been computed by
-      // a previous stage of analysis.
-      // TODO(paulberry): once we have moved over to the new task model, this
-      // should only occur for constants associated with enum members.  Once
-      // that happens we should add an assertion to verify that it doesn't
-      // occur in any other cases.
-      return;
-    }
-    evaluationEngine.computeConstantValue(constant);
-  }
-}
-
-/**
  * A visitor used to evaluate constant expressions to produce their compile-time
  * value. According to the Dart Language Specification: <blockquote> A constant
  * expression is one of the following:
@@ -1168,7 +1077,7 @@
   /**
    * Convenience getter to gain access to the [evaluationEngine]'s type system.
    */
-  TypeSystem get _typeSystem => evaluationEngine.typeSystem;
+  TypeSystem get typeSystem => evaluationEngine.typeSystem;
 
   /**
    * Given a [type] that may contain free type variables, evaluate them against
@@ -1309,8 +1218,8 @@
     }
     ParameterizedType thenType = thenResult.type;
     ParameterizedType elseType = elseResult.type;
-    return new DartObjectImpl.validWithUnknownValue(_typeSystem
-        .getLeastUpperBound(thenType, elseType) as ParameterizedType);
+    return new DartObjectImpl.validWithUnknownValue(
+        typeSystem.getLeastUpperBound(thenType, elseType) as ParameterizedType);
   }
 
   @override
@@ -1576,6 +1485,17 @@
    * given error [code].
    */
   void _error(AstNode node, ErrorCode code) {
+    if (code == null) {
+      var parent = node?.parent;
+      var parent2 = parent?.parent;
+      if (parent is ArgumentList &&
+          parent2 is InstanceCreationExpression &&
+          parent2.isConst) {
+        code = CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT;
+      } else {
+        code = CompileTimeErrorCode.INVALID_CONSTANT;
+      }
+    }
     _errorReporter.reportErrorForNode(
         code ?? CompileTimeErrorCode.INVALID_CONSTANT, node);
   }
@@ -1589,11 +1509,23 @@
     Element variableElement =
         element is PropertyAccessorElement ? element.variable : element;
     if (variableElement is VariableElementImpl) {
-      evaluationEngine.validator.beforeGetEvaluationResult(variableElement);
-      variableElement.computeConstantValue();
-      EvaluationResultImpl value = variableElement.evaluationResult;
-      if (variableElement.isConst && value != null) {
-        return value.value;
+      // We access values of constant variables here in two cases: when we
+      // compute values of other constant  variables, or when we compute values
+      // and errors for other constant expressions. In any case, with Analysis
+      // Driver, we compute values of all dependencies first (or detect  cycle).
+      // So, the value has already been computed. Just return it.
+      if (evaluationEngine.forAnalysisDriver) {
+        if (variableElement.isConst) {
+          return variableElement.evaluationResult.value;
+        }
+      } else {
+        // TODO(scheglov) Once we remove task model, we can remove this code.
+        evaluationEngine.validator.beforeGetEvaluationResult(variableElement);
+        variableElement.computeConstantValue();
+        EvaluationResultImpl value = variableElement.evaluationResult;
+        if (variableElement.isConst && value != null) {
+          return value.value;
+        }
       }
     } else if (variableElement is ExecutableElement) {
       ExecutableElement function = element;
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index 81f3e41..50480ad 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -164,6 +164,10 @@
     if (node.isConst) {
       _find(node);
     } else {
+      // Values of keys are computed to check that they are unique.
+      for (var entry in node.entries) {
+        _find(entry.key);
+      }
       super.visitMapLiteral(node);
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index 76bec62..64722d9 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -806,8 +806,7 @@
         return null;
       }
       ElementHolder holder = new ElementHolder();
-      CompilationUnitElementImpl element =
-          new CompilationUnitElementImpl(source.shortName);
+      CompilationUnitElementImpl element = new CompilationUnitElementImpl();
       ElementBuilder builder = new ElementBuilder(holder, element);
       unit.accept(builder);
       element.accessors = holder.accessors;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 63b3281..39a3964 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1385,24 +1385,19 @@
    * Initialize a newly created compilation unit element to have the given
    * [name].
    */
-  CompilationUnitElementImpl(String name)
+  CompilationUnitElementImpl()
       : resynthesizerContext = null,
         _unlinkedUnit = null,
         _unlinkedPart = null,
-        super(name, -1);
+        super(null, -1);
 
   /**
    * Initialize using the given serialized information.
    */
-  CompilationUnitElementImpl.forSerialized(
-      LibraryElementImpl enclosingLibrary,
-      this.resynthesizerContext,
-      this._unlinkedUnit,
-      this._unlinkedPart,
-      String name)
+  CompilationUnitElementImpl.forSerialized(LibraryElementImpl enclosingLibrary,
+      this.resynthesizerContext, this._unlinkedUnit, this._unlinkedPart)
       : super.forSerialized(null) {
     _enclosingElement = enclosingLibrary;
-    _name = name;
     _nameOffset = -1;
   }
 
@@ -4364,6 +4359,7 @@
     setModifier(Modifier.STATIC, isStatic);
   }
 
+  @deprecated
   @override
   bool get isVirtual => true;
 
diff --git a/pkg/analyzer/lib/src/dart/element/handle.dart b/pkg/analyzer/lib/src/dart/element/handle.dart
index 8d6f5f0..4c34687 100644
--- a/pkg/analyzer/lib/src/dart/element/handle.dart
+++ b/pkg/analyzer/lib/src/dart/element/handle.dart
@@ -629,6 +629,7 @@
   @override
   bool get isEnumConstant => actualElement.isEnumConstant;
 
+  @deprecated
   @override
   bool get isVirtual => actualElement.isVirtual;
 
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
new file mode 100644
index 0000000..37e183d
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
@@ -0,0 +1,414 @@
+// 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/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<FunctionType> candidates;
+
+  /// The getter that conflicts with the [method], or `null`, if the conflict
+  /// is inconsistent inheritance.
+  final FunctionType getter;
+
+  /// The method tha conflicts with the [getter], or `null`, if the conflict
+  /// is inconsistent inheritance.
+  final FunctionType method;
+
+  Conflict(this.name, this.candidates, [this.getter, this.method]);
+}
+
+/// Manages knowledge about interface types and their members.
+class InheritanceManager2 {
+  final StrongTypeSystemImpl _typeSystem;
+
+  /// Cached instance interfaces for [InterfaceType].
+  final Map<InterfaceType, Interface> _interfaces = {};
+
+  /// Cached implemented members for [InterfaceType].
+  final Map<InterfaceType, Map<Name, FunctionType>> _implemented = {};
+
+  /// Cached member implemented in the mixin.
+  final Map<InterfaceType, Map<Name, FunctionType>> _mixinMembers = {};
+
+  InheritanceManager2(this._typeSystem);
+
+  /// 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 const Interface._(const {}, const [{}], const []);
+    }
+
+    var result = _interfaces[type];
+    if (result != null) {
+      return result;
+    }
+
+    _interfaces[type] = const Interface._(const {}, const [{}], const []);
+    Map<Name, FunctionType> map = {};
+    List<Map<Name, FunctionType>> supers = [];
+    List<Conflict> conflicts = null;
+
+    // If a class declaration has a member declaration, the signature of that
+    // member declaration becomes the signature in the interface.
+    _addTypeMembers(map, type);
+
+    Map<Name, List<FunctionType>> namedCandidates = {};
+    if (type.element.isMixin) {
+      for (var constraint in type.superclassConstraints) {
+        _addCandidates(namedCandidates, constraint);
+      }
+
+      // `mixin M on S1, S2 {}` can call using `super` any instance member
+      // from its superclass constraints, whether it is abstract or concrete.
+      Map<Name, FunctionType> mixinSuperClass = {};
+      _findMostSpecificFromNamedCandidates(mixinSuperClass, namedCandidates);
+      supers.add(mixinSuperClass);
+    } else {
+      Map<Name, FunctionType> implemented;
+
+      if (type.superclass != null) {
+        _addCandidates(namedCandidates, type.superclass);
+
+        implemented = _getImplemented(type.superclass);
+        supers.add(implemented);
+      }
+
+      for (var mixin in type.mixins) {
+        _addCandidates(namedCandidates, mixin);
+
+        var implementedInMixin = _getImplemented(mixin);
+        implemented = <Name, FunctionType>{}
+          ..addAll(implemented)
+          ..addAll(implementedInMixin);
+        supers.add(implemented);
+      }
+    }
+
+    for (var interface in type.interfaces) {
+      _addCandidates(namedCandidates, interface);
+    }
+
+    // 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.
+    conflicts = _findMostSpecificFromNamedCandidates(map, namedCandidates);
+
+    var interface = new Interface._(map, supers, 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.
+  FunctionType getMember(
+    InterfaceType type,
+    Name name, {
+    bool concrete: false,
+    int forMixinIndex: -1,
+    bool forSuper: false,
+  }) {
+    if (forSuper) {
+      var supers = getInterface(type)._supers;
+      if (forMixinIndex >= 0) {
+        return supers[forMixinIndex][name];
+      }
+      return supers.last[name];
+    }
+    if (concrete) {
+      return _getImplemented(type)[name];
+    }
+    return getInterface(type).map[name];
+  }
+
+  void _addCandidate(Map<Name, List<FunctionType>> namedCandidates, Name name,
+      FunctionType candidate) {
+    var candidates = namedCandidates[name];
+    if (candidates == null) {
+      candidates = <FunctionType>[];
+      namedCandidates[name] = candidates;
+    }
+
+    candidates.add(candidate);
+  }
+
+  void _addCandidates(
+      Map<Name, List<FunctionType>> namedCandidates, InterfaceType type) {
+    getInterface(type).map.forEach((name, candidate) {
+      _addCandidate(namedCandidates, name, candidate);
+    });
+  }
+
+  void _addTypeMembers(Map<Name, FunctionType> map, InterfaceType type) {
+    var libraryUri = type.element.librarySource.uri;
+
+    void addTypeMember(ExecutableElement member) {
+      if (!member.isStatic) {
+        var name = new Name(libraryUri, member.name);
+        map[name] = member.type;
+      }
+    }
+
+    type.methods.forEach(addTypeMember);
+    type.accessors.forEach(addTypeMember);
+  }
+
+  /// 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<FunctionType> candidates) {
+    assert(candidates.length > 1);
+
+    bool allGetters = true;
+    bool allMethods = true;
+    bool allSetters = true;
+    for (var candidate in candidates) {
+      var kind = candidate.element.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;
+    }
+
+    FunctionType getterType;
+    FunctionType methodType;
+    for (var candidate in candidates) {
+      var kind = candidate.element.kind;
+      if (kind == ElementKind.GETTER) {
+        getterType ??= candidate;
+      }
+      if (kind == ElementKind.METHOD) {
+        methodType ??= candidate;
+      }
+    }
+    return new Conflict(name, candidates, getterType, methodType);
+  }
+
+  /// 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, FunctionType> map,
+      Map<Name, List<FunctionType>> 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);
+      }
+
+      FunctionType validOverride;
+      for (var i = 0; i < candidates.length; i++) {
+        validOverride = candidates[i];
+        for (var j = 0; j < candidates.length; j++) {
+          var candidate = candidates[j];
+          if (!_typeSystem.isOverrideSubtypeOf(validOverride, candidate)) {
+            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, FunctionType> _getImplemented(InterfaceType type) {
+    var implemented = _implemented[type];
+    if (implemented != null) {
+      return implemented;
+    }
+
+    _implemented[type] = const {};
+    implemented = <Name, FunctionType>{};
+
+    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.type;
+      }
+    }
+
+    void addMembers(InterfaceType type) {
+      type.methods.forEach(addMember);
+      type.accessors.forEach(addMember);
+    }
+
+    if (type.superclass != null) {
+      var superImplemented = _getImplemented(type.superclass);
+      implemented.addAll(superImplemented);
+    }
+
+    // Mixins override the nominal superclass and previous mixins.
+    for (var mixin in type.mixins) {
+      var superImplemented = _getImplementedInMixin(mixin);
+      implemented.addAll(superImplemented);
+    }
+
+    // This type overrides everything from its actual superclass.
+    addMembers(type);
+
+    _implemented[type] = implemented;
+    return implemented;
+  }
+
+  /// TODO(scheglov) This repeats a lot of code from [_getImplemented].
+  Map<Name, FunctionType> _getImplementedInMixin(InterfaceType type) {
+    var implemented = _mixinMembers[type];
+    if (implemented != null) {
+      return implemented;
+    }
+
+    _mixinMembers[type] = const {};
+    implemented = <Name, FunctionType>{};
+
+    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.type;
+      }
+    }
+
+    void addMembers(InterfaceType type) {
+      type.methods.forEach(addMember);
+      type.accessors.forEach(addMember);
+    }
+
+    for (var mixin in type.mixins) {
+      var superImplemented = _getImplementedInMixin(mixin);
+      implemented.addAll(superImplemented);
+    }
+
+    // This type overrides everything from its actual superclass.
+    addMembers(type);
+
+    _mixinMembers[type] = implemented;
+    return implemented;
+  }
+}
+
+/// The instance interface of an [InterfaceType].
+class Interface {
+  /// The map of names to their signature in the interface.
+  final Map<Name, FunctionType> map;
+
+  /// 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, FunctionType>> _supers;
+
+  /// 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;
+
+  const Interface._(this.map, this._supers, this.conflicts);
+}
+
+/// 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 5692687..68d6c62 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -246,6 +246,7 @@
   @override
   bool get isEnumConstant => baseElement.isEnumConstant;
 
+  @deprecated
   @override
   bool get isVirtual => baseElement.isVirtual;
 
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 617f5a5..08a3048 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisEngine;
+import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/type_system.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -88,6 +89,24 @@
   TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
 
   @override
+  DartType replaceTopAndBottom(TypeProvider typeProvider,
+      {bool isCovariant = true}) {
+    if (isCovariant) {
+      return this;
+    } else {
+      // In theory this should never happen, since we only need to do this
+      // replacement when checking super-boundedness of explicitly-specified
+      // types, or types produced by mixin inference or instantiate-to-bounds,
+      // and bottom can't occur in any of those cases.
+      assert(false,
+          'Attempted to check super-boundedness of a type including "bottom"');
+      // But just in case it does, return `dynamic` since that's similar to what
+      // we do with Null.
+      return typeProvider.objectType;
+    }
+  }
+
+  @override
   BottomTypeImpl substitute2(
           List<DartType> argumentTypes, List<DartType> parameterTypes,
           [List<FunctionTypeAliasElement> prune]) =>
@@ -338,6 +357,16 @@
   TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
 
   @override
+  DartType replaceTopAndBottom(TypeProvider typeProvider,
+      {bool isCovariant = true}) {
+    if (isCovariant) {
+      return typeProvider.nullType;
+    } else {
+      return this;
+    }
+  }
+
+  @override
   DartType substitute2(
       List<DartType> argumentTypes, List<DartType> parameterTypes,
       [List<FunctionTypeAliasElement> prune]) {
@@ -373,6 +402,9 @@
    * [element].
    *
    * If [typeArguments] are provided, they are used to instantiate the typedef.
+   *
+   * Note: this constructor mishandles generics.
+   * See https://github.com/dart-lang/sdk/issues/34657.
    */
   factory FunctionTypeImpl.forTypedef(FunctionTypeAliasElement element,
       {List<DartType> typeArguments}) {
@@ -776,6 +808,32 @@
   }
 
   @override
+  DartType replaceTopAndBottom(TypeProvider typeProvider,
+      {bool isCovariant: true}) {
+    var returnType = (this.returnType as TypeImpl)
+        .replaceTopAndBottom(typeProvider, isCovariant: isCovariant);
+    ParameterElement transformParameter(ParameterElement p) {
+      TypeImpl type = p.type;
+      var newType =
+          type.replaceTopAndBottom(typeProvider, isCovariant: !isCovariant);
+      if (identical(newType, type)) return p;
+      return new ParameterElementImpl.synthetic(
+          p.name,
+          newType,
+          // ignore: deprecated_member_use
+          p.parameterKind);
+    }
+
+    var parameters = _transformOrShare(this.parameters, transformParameter);
+    if (identical(returnType, this.returnType) &&
+        identical(parameters, this.parameters)) {
+      return this;
+    } else {
+      return new _FunctionTypeImplStrict._(returnType, typeFormals, parameters);
+    }
+  }
+
+  @override
   FunctionType substitute2(
       List<DartType> argumentTypes, List<DartType> parameterTypes,
       [List<FunctionTypeAliasElement> prune]);
@@ -1651,6 +1709,14 @@
           return true;
         }
       }
+      if (element.isMixin) {
+        for (InterfaceType constraint in superclassConstraints) {
+          if ((constraint as InterfaceTypeImpl)
+              .isMoreSpecificThan(type, withDynamic, visitedElements)) {
+            return true;
+          }
+        }
+      }
       // If a type I includes an instance method named `call`, and the type of
       // `call` is the function type F, then I is considered to be more specific
       // than F.
@@ -1766,13 +1832,20 @@
   }
 
   ExecutableElement lookUpInheritedMember(String name, LibraryElement library,
-      {bool concrete: false, int stopMixinIndex, bool setter: false}) {
+      {bool concrete: false,
+      bool forSuperInvocation: false,
+      int startMixinIndex,
+      bool setter: false,
+      bool thisType: false}) {
     HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
 
+    /// TODO(scheglov) Remove [includeSupers]. It is used only to work around
+    /// the problem with Flutter code base (using old super-mixins).
     ExecutableElement lookUpImpl(InterfaceTypeImpl type,
         {bool acceptAbstract: false,
         bool includeType: true,
-        int stopMixinIndex}) {
+        bool inMixin: false,
+        int startMixinIndex}) {
       if (type == null || !visitedClasses.add(type.element)) {
         return null;
       }
@@ -1792,14 +1865,28 @@
         }
       }
 
-      var mixins = type.mixins;
-      for (var i = 0; i < mixins.length; i++) {
-        if (stopMixinIndex != null && i >= stopMixinIndex) {
-          break;
+      if (forSuperInvocation) {
+        bool inOldStyleSuperMixin = inMixin &&
+            type.superclass != null &&
+            !type.superclass.isObject &&
+            element.context.analysisOptions.enableSuperMixins;
+        if (inOldStyleSuperMixin) {
+          acceptAbstract = true;
         }
-        var result = lookUpImpl(mixins[i], acceptAbstract: acceptAbstract);
-        if (result != null) {
-          return result;
+      }
+
+      if (!inMixin || acceptAbstract) {
+        var mixins = type.mixins;
+        startMixinIndex ??= mixins.length;
+        for (var i = startMixinIndex - 1; i >= 0; i--) {
+          var result = lookUpImpl(
+            mixins[i],
+            acceptAbstract: acceptAbstract,
+            inMixin: true,
+          );
+          if (result != null) {
+            return result;
+          }
         }
       }
 
@@ -1814,10 +1901,17 @@
         }
       }
 
-      return lookUpImpl(type.superclass, acceptAbstract: acceptAbstract);
+      if (!inMixin || acceptAbstract) {
+        return lookUpImpl(type.superclass,
+            acceptAbstract: acceptAbstract, inMixin: inMixin);
+      }
+
+      return null;
     }
 
     if (element.isMixin) {
+      // TODO(scheglov) We should choose the most specific signature.
+      // Not just the first signature.
       for (InterfaceType constraint in superclassConstraints) {
         var result = lookUpImpl(constraint, acceptAbstract: true);
         if (result != null) {
@@ -1828,8 +1922,8 @@
     } else {
       return lookUpImpl(
         this,
-        includeType: false,
-        stopMixinIndex: stopMixinIndex,
+        includeType: thisType,
+        startMixinIndex: startMixinIndex,
       );
     }
   }
@@ -1976,6 +2070,21 @@
   }
 
   @override
+  DartType replaceTopAndBottom(TypeProvider typeProvider,
+      {bool isCovariant: true}) {
+    var typeArguments = _transformOrShare(
+        this.typeArguments,
+        (t) => (t as TypeImpl)
+            .replaceTopAndBottom(typeProvider, isCovariant: isCovariant));
+    if (identical(typeArguments, this.typeArguments)) {
+      return this;
+    } else {
+      return new InterfaceTypeImpl._(element, name, prunedTypedefs)
+        ..typeArguments = typeArguments;
+    }
+  }
+
+  @override
   InterfaceTypeImpl substitute2(
       List<DartType> argumentTypes, List<DartType> parameterTypes,
       [List<FunctionTypeAliasElement> prune]) {
@@ -2606,6 +2715,14 @@
    */
   TypeImpl pruned(List<FunctionTypeAliasElement> prune);
 
+  /// Replaces all covariant occurrences of `dynamic`, `Object`, and `void` with
+  /// `Null` and all contravariant occurrences of `Null` with `Object`.
+  ///
+  /// The boolean `isCovariant` indicates whether this type is in covariant or
+  /// contravariant position.
+  DartType replaceTopAndBottom(TypeProvider typeProvider,
+      {bool isCovariant = true});
+
   @override
   DartType resolveToBound(DartType objectType) => this;
 
@@ -2849,6 +2966,12 @@
   TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
 
   @override
+  DartType replaceTopAndBottom(TypeProvider typeProvider,
+      {bool isCovariant = true}) {
+    return this;
+  }
+
+  @override
   DartType resolveToBound(DartType objectType) {
     if (element.bound == null) {
       return objectType;
@@ -2940,6 +3063,16 @@
   TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
 
   @override
+  DartType replaceTopAndBottom(TypeProvider typeProvider,
+      {bool isCovariant = true}) {
+    if (isCovariant) {
+      return typeProvider.nullType;
+    } else {
+      return this;
+    }
+  }
+
+  @override
   DartType substitute2(
       List<DartType> argumentTypes, List<DartType> parameterTypes,
       [List<FunctionTypeAliasElement> prune]) {
@@ -3003,6 +3136,16 @@
   TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
 
   @override
+  DartType replaceTopAndBottom(TypeProvider typeProvider,
+      {bool isCovariant = true}) {
+    if (isCovariant) {
+      return typeProvider.nullType;
+    } else {
+      return this;
+    }
+  }
+
+  @override
   VoidTypeImpl substitute2(
           List<DartType> argumentTypes, List<DartType> parameterTypes,
           [List<FunctionTypeAliasElement> prune]) =>
@@ -3299,7 +3442,12 @@
           "argumentTypes.length (${argumentTypes.length}) != parameterTypes.length (${parameterTypes.length})");
     }
     Element element = this.element;
-    if (prune != null && prune.contains(element)) {
+    Element forCircularity = this.element;
+    if (element is GenericFunctionTypeElement &&
+        element.enclosingElement is FunctionTypeAliasElement) {
+      forCircularity = element.enclosingElement;
+    }
+    if (prune != null && prune.contains(forCircularity)) {
       // Circularity found.  Prune the type declaration.
       return new CircularFunctionTypeImpl();
     }
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index 45a79c0..adbc8d3 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -20,10 +20,7 @@
  * is wrong and, when appropriate, how the problem can be corrected.
  */
 class ParserErrorCode extends ErrorCode {
-  static const ParserErrorCode ABSTRACT_CLASS_MEMBER = const ParserErrorCode(
-      'ABSTRACT_CLASS_MEMBER',
-      "Members of classes can't be declared to be 'abstract'.",
-      correction: "Try removing the keyword 'abstract'.");
+  static const ParserErrorCode ABSTRACT_CLASS_MEMBER = _ABSTRACT_CLASS_MEMBER;
 
   static const ParserErrorCode ABSTRACT_ENUM = const ParserErrorCode(
       'ABSTRACT_ENUM', "Enums can't be declared to be 'abstract'.",
@@ -59,10 +56,7 @@
           "The keywords 'async', 'await', and 'yield' can't be used as "
           "identifiers in an asynchronous or generator function.");
 
-  static const ParserErrorCode BREAK_OUTSIDE_OF_LOOP = const ParserErrorCode(
-      'BREAK_OUTSIDE_OF_LOOP',
-      "A break statement can't be used outside of a loop or switch statement.",
-      correction: "Try removing the break statement.");
+  static const ParserErrorCode BREAK_OUTSIDE_OF_LOOP = _BREAK_OUTSIDE_OF_LOOP;
 
   static const ParserErrorCode CATCH_SYNTAX = const ParserErrorCode(
       'CATCH_SYNTAX',
@@ -70,40 +64,19 @@
       correction:
           "No types are needed, the first is given by 'on', the second is always 'StackTrace'.");
 
-  static const ParserErrorCode CLASS_IN_CLASS = const ParserErrorCode(
-      'CLASS_IN_CLASS', "Classes can't be declared inside other classes.",
-      correction: "Try moving the class to the top-level.");
+  static const ParserErrorCode CLASS_IN_CLASS = _CLASS_IN_CLASS;
 
-  static const ParserErrorCode COLON_IN_PLACE_OF_IN = const ParserErrorCode(
-      'COLON_IN_PLACE_OF_IN', "For-in loops use 'in' rather than a colon.",
-      correction: "Try replacing the colon with the keyword 'in'.");
+  static const ParserErrorCode COLON_IN_PLACE_OF_IN = _COLON_IN_PLACE_OF_IN;
 
-  static const ParserErrorCode CONST_AFTER_FACTORY = const ParserErrorCode(
-      'CONST_AFTER_FACTORY',
-      "The modifier 'const' should be before the modifier 'factory'.",
-      correction: "Try re-ordering the modifiers.");
+  static const ParserErrorCode CONST_AFTER_FACTORY = _CONST_AFTER_FACTORY;
 
-  static const ParserErrorCode CONST_AND_COVARIANT = const ParserErrorCode(
-      'CONST_AND_COVARIANT',
-      "Members can't be declared to be both 'const' and 'covariant'.",
-      correction: "Try removing either the 'const' or 'covariant' keyword.");
+  static const ParserErrorCode CONST_AND_COVARIANT = _CONST_AND_COVARIANT;
 
-  static const ParserErrorCode CONST_AND_FINAL = const ParserErrorCode(
-      'CONST_AND_FINAL',
-      "Members can't be declared to be both 'const' and 'final'.",
-      correction: "Try removing either the 'const' or 'final' keyword.");
+  static const ParserErrorCode CONST_AND_FINAL = _CONST_AND_FINAL;
 
-  static const ParserErrorCode CONST_AND_VAR = const ParserErrorCode(
-      'CONST_AND_VAR',
-      "Members can't be declared to be both 'const' and 'var'.",
-      correction: "Try removing either the 'const' or 'var' keyword.");
+  static const ParserErrorCode CONST_AND_VAR = _CONST_AND_VAR;
 
-  static const ParserErrorCode CONST_CLASS = const ParserErrorCode(
-      'CONST_CLASS', "Classes can't be declared to be 'const'.",
-      correction:
-          "Try removing the 'const' keyword. If you're trying to indicate that "
-          "instances of the class can be constants, place the 'const' keyword on "
-          "the class' constructor(s).");
+  static const ParserErrorCode CONST_CLASS = _CONST_CLASS;
 
   static const ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY =
       const ParserErrorCode('CONST_CONSTRUCTOR_WITH_BODY',
@@ -130,9 +103,7 @@
       correction: "Try removing the 'const' keyword.");
 
   static const ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE =
-      const ParserErrorCode('CONSTRUCTOR_WITH_RETURN_TYPE',
-          "Constructors can't have a return type.",
-          correction: "Try removing the return type.");
+      _CONSTRUCTOR_WITH_RETURN_TYPE;
 
   static const ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP =
       _CONTINUE_OUTSIDE_OF_LOOP;
@@ -253,6 +224,8 @@
   static const ParserErrorCode EXPECTED_TOKEN =
       const ParserErrorCode('EXPECTED_TOKEN', "Expected to find '{0}'.");
 
+  static const ParserErrorCode EXPECTED_INSTEAD = _EXPECTED_INSTEAD;
+
   static const ParserErrorCode EXPECTED_TYPE_NAME =
       const ParserErrorCode('EXPECTED_TYPE_NAME', "Expected a type name.");
 
@@ -262,20 +235,11 @@
           correction:
               "Try moving the export directives before the part directives.");
 
-  static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode(
-      'EXTERNAL_AFTER_CONST',
-      "The modifier 'external' should be before the modifier 'const'.",
-      correction: "Try re-ordering the modifiers.");
+  static const ParserErrorCode EXTERNAL_AFTER_CONST = _EXTERNAL_AFTER_CONST;
 
-  static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode(
-      'EXTERNAL_AFTER_FACTORY',
-      "The modifier 'external' should be before the modifier 'factory'.",
-      correction: "Try re-ordering the modifiers.");
+  static const ParserErrorCode EXTERNAL_AFTER_FACTORY = _EXTERNAL_AFTER_FACTORY;
 
-  static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode(
-      'EXTERNAL_AFTER_STATIC',
-      "The modifier 'external' should be before the modifier 'static'.",
-      correction: "Try re-ordering the modifiers.");
+  static const ParserErrorCode EXTERNAL_AFTER_STATIC = _EXTERNAL_AFTER_STATIC;
 
   static const ParserErrorCode EXTERNAL_CLASS = _EXTERNAL_CLASS;
 
@@ -287,9 +251,7 @@
 
   static const ParserErrorCode EXTERNAL_ENUM = _EXTERNAL_ENUM;
 
-  static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode(
-      'EXTERNAL_FIELD', "Fields can't be declared to be 'external'.",
-      correction: "Try removing the keyword 'external'.");
+  static const ParserErrorCode EXTERNAL_FIELD = _EXTERNAL_FIELD;
 
   static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY =
       const ParserErrorCode(
@@ -298,10 +260,7 @@
               "removing the keyword 'external'.");
 
   static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY =
-      const ParserErrorCode('EXTERNAL_METHOD_WITH_BODY',
-          "An external or native method can't have a body.",
-          correction: "Try removing the body of the method, or "
-              "removing the keyword 'external'.");
+      _EXTERNAL_METHOD_WITH_BODY;
 
   static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY =
       const ParserErrorCode('EXTERNAL_OPERATOR_WITH_BODY',
@@ -395,24 +354,14 @@
           "removing the keyword 'get' to define a method rather than a getter.");
 
   static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE =
-      const ParserErrorCode('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE',
-          "Illegal assignment to non-assignable expression.");
+      _ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE;
 
   static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS =
-      const ParserErrorCode('IMPLEMENTS_BEFORE_EXTENDS',
-          "The extends clause must be before the implements clause.",
-          correction:
-              "Try moving the extends clause before the implements clause.");
+      _IMPLEMENTS_BEFORE_EXTENDS;
 
-  static const ParserErrorCode IMPLEMENTS_BEFORE_ON = const ParserErrorCode(
-      'IMPLEMENTS_BEFORE_ON',
-      "The on clause must be before the implements clause.",
-      correction: "Try moving the on clause before the implements clause.");
+  static const ParserErrorCode IMPLEMENTS_BEFORE_ON = _IMPLEMENTS_BEFORE_ON;
 
-  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode(
-      'IMPLEMENTS_BEFORE_WITH',
-      "The with clause must be before the implements clause.",
-      correction: "Try moving the with clause before the implements clause.");
+  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = _IMPLEMENTS_BEFORE_WITH;
 
   static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
       _IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE;
@@ -722,25 +671,6 @@
           correction:
               "Try moving all of the normal parameters before the optional parameters.");
 
-  static const ParserErrorCode NULLABLE_TYPE_IN_EXTENDS = const ParserErrorCode(
-      'NULLABLE_TYPE_IN_EXTENDS',
-      "A nullable type can't be used in an extends clause.",
-      correction: "Try removing the '?' from the type name.");
-
-  static const ParserErrorCode NULLABLE_TYPE_IN_IMPLEMENTS =
-      const ParserErrorCode('NULLABLE_TYPE_IN_IMPLEMENTS',
-          "A nullable type can't be used in an implements clause.",
-          correction: "Try removing the '?' from the type name.");
-
-  static const ParserErrorCode NULLABLE_TYPE_IN_WITH = const ParserErrorCode(
-      'NULLABLE_TYPE_IN_WITH',
-      "A nullable type can't be used in a with clause.",
-      correction: "Try removing the '?' from the type name.");
-
-  static const ParserErrorCode NULLABLE_TYPE_PARAMETER = const ParserErrorCode(
-      'NULLABLE_TYPE_PARAMETER', "Type parameters can't be nullable.",
-      correction: "Try removing the '?' from the type name.");
-
   static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT =
       const ParserErrorCode('POSITIONAL_AFTER_NAMED_ARGUMENT',
           "Positional arguments must occur before named arguments.",
@@ -849,9 +779,7 @@
       "Variables can't be declared using both 'var' and a type name.",
       correction: "Try removing the keyword 'var'.");
 
-  static const ParserErrorCode VAR_AS_TYPE_NAME = const ParserErrorCode(
-      'VAR_AS_TYPE_NAME', "The keyword 'var' can't be used as a type name.",
-      correction: "Try using 'dynamic' instead of 'var'.");
+  static const ParserErrorCode VAR_AS_TYPE_NAME = _VAR_AS_TYPE_NAME;
 
   static const ParserErrorCode VAR_CLASS = const ParserErrorCode(
       'VAR_CLASS', "Classes can't be declared to be 'var'.",
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index ad89d34..15b00e7 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -48,8 +48,76 @@
   _INVALID_UNICODE_ESCAPE,
   _INVALID_OPERATOR,
   _INVALID_HEX_ESCAPE,
+  _EXPECTED_INSTEAD,
+  _IMPLEMENTS_BEFORE_WITH,
+  _IMPLEMENTS_BEFORE_ON,
+  _IMPLEMENTS_BEFORE_EXTENDS,
+  _ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE,
+  _EXTERNAL_AFTER_CONST,
+  _EXTERNAL_AFTER_FACTORY,
+  _EXTERNAL_AFTER_STATIC,
+  _EXTERNAL_METHOD_WITH_BODY,
+  _EXTERNAL_FIELD,
+  _ABSTRACT_CLASS_MEMBER,
+  _BREAK_OUTSIDE_OF_LOOP,
+  _CLASS_IN_CLASS,
+  _COLON_IN_PLACE_OF_IN,
+  _CONSTRUCTOR_WITH_RETURN_TYPE,
+  _CONST_AFTER_FACTORY,
+  _CONST_AND_COVARIANT,
+  _CONST_AND_FINAL,
+  _CONST_AND_VAR,
+  _CONST_CLASS,
+  _VAR_AS_TYPE_NAME,
 ];
 
+const ParserErrorCode _ABSTRACT_CLASS_MEMBER = const ParserErrorCode(
+    'ABSTRACT_CLASS_MEMBER',
+    r"Members of classes can't be declared to be 'abstract'.",
+    correction:
+        "Try removing the 'abstract' keyword. You can add the 'abstract' keyword before the class declaration.");
+
+const ParserErrorCode _BREAK_OUTSIDE_OF_LOOP = const ParserErrorCode(
+    'BREAK_OUTSIDE_OF_LOOP',
+    r"A break statement can't be used outside of a loop or switch statement.",
+    correction: "Try removing the break statement.");
+
+const ParserErrorCode _CLASS_IN_CLASS = const ParserErrorCode(
+    'CLASS_IN_CLASS', r"Classes can't be declared inside other classes.",
+    correction: "Try moving the class to the top-level.");
+
+const ParserErrorCode _COLON_IN_PLACE_OF_IN = const ParserErrorCode(
+    'COLON_IN_PLACE_OF_IN', r"For-in loops use 'in' rather than a colon.",
+    correction: "Try replacing the colon with the keyword 'in'.");
+
+const ParserErrorCode _CONSTRUCTOR_WITH_RETURN_TYPE = const ParserErrorCode(
+    'CONSTRUCTOR_WITH_RETURN_TYPE', r"Constructors can't have a return type.",
+    correction: "Try removing the return type.");
+
+const ParserErrorCode _CONST_AFTER_FACTORY = const ParserErrorCode(
+    'CONST_AFTER_FACTORY',
+    r"The modifier 'const' should be before the modifier 'factory'.",
+    correction: "Try re-ordering the modifiers.");
+
+const ParserErrorCode _CONST_AND_COVARIANT = const ParserErrorCode(
+    'CONST_AND_COVARIANT',
+    r"Members can't be declared to be both 'const' and 'covariant'.",
+    correction: "Try removing either the 'const' or 'covariant' keyword.");
+
+const ParserErrorCode _CONST_AND_FINAL = const ParserErrorCode(
+    'CONST_AND_FINAL',
+    r"Members can't be declared to be both 'const' and 'final'.",
+    correction: "Try removing either the 'const' or 'final' keyword.");
+
+const ParserErrorCode _CONST_AND_VAR = const ParserErrorCode(
+    'CONST_AND_VAR', r"Members can't be declared to be both 'const' and 'var'.",
+    correction: "Try removing either the 'const' or 'var' keyword.");
+
+const ParserErrorCode _CONST_CLASS = const ParserErrorCode(
+    'CONST_CLASS', r"Classes can't be declared to be 'const'.",
+    correction:
+        "Try removing the 'const' keyword. If you're trying to indicate that instances of the class can be constants, place the 'const' keyword on  the class' constructor(s).");
+
 const ParserErrorCode _CONTINUE_OUTSIDE_OF_LOOP = const ParserErrorCode(
     'CONTINUE_OUTSIDE_OF_LOOP',
     r"A continue statement can't be used outside of a loop or switch statement.",
@@ -65,6 +133,24 @@
     r"An equality expression can't be an operand of another equality expression.",
     correction: "Try re-writing the expression.");
 
+const ParserErrorCode _EXPECTED_INSTEAD = const ParserErrorCode(
+    'EXPECTED_INSTEAD', r"Expected '#string' instead of this.");
+
+const ParserErrorCode _EXTERNAL_AFTER_CONST = const ParserErrorCode(
+    'EXTERNAL_AFTER_CONST',
+    r"The modifier 'external' should be before the modifier 'const'.",
+    correction: "Try re-ordering the modifiers.");
+
+const ParserErrorCode _EXTERNAL_AFTER_FACTORY = const ParserErrorCode(
+    'EXTERNAL_AFTER_FACTORY',
+    r"The modifier 'external' should be before the modifier 'factory'.",
+    correction: "Try re-ordering the modifiers.");
+
+const ParserErrorCode _EXTERNAL_AFTER_STATIC = const ParserErrorCode(
+    'EXTERNAL_AFTER_STATIC',
+    r"The modifier 'external' should be before the modifier 'static'.",
+    correction: "Try re-ordering the modifiers.");
+
 const ParserErrorCode _EXTERNAL_CLASS = const ParserErrorCode(
     'EXTERNAL_CLASS', r"Classes can't be declared to be 'external'.",
     correction: "Try removing the keyword 'external'.");
@@ -73,6 +159,33 @@
     'EXTERNAL_ENUM', r"Enums can't be declared to be 'external'.",
     correction: "Try removing the keyword 'external'.");
 
+const ParserErrorCode _EXTERNAL_FIELD = const ParserErrorCode(
+    'EXTERNAL_FIELD', r"Fields can't be declared to be 'external'.",
+    correction: "Try removing the keyword 'external'.");
+
+const ParserErrorCode _EXTERNAL_METHOD_WITH_BODY = const ParserErrorCode(
+    'EXTERNAL_METHOD_WITH_BODY',
+    r"An external or native method can't have a body.");
+
+const ParserErrorCode _ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE =
+    const ParserErrorCode('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE',
+        r"Illegal assignment to non-assignable expression.");
+
+const ParserErrorCode _IMPLEMENTS_BEFORE_EXTENDS = const ParserErrorCode(
+    'IMPLEMENTS_BEFORE_EXTENDS',
+    r"The extends clause must be before the implements clause.",
+    correction: "Try moving the extends clause before the implements clause.");
+
+const ParserErrorCode _IMPLEMENTS_BEFORE_ON = const ParserErrorCode(
+    'IMPLEMENTS_BEFORE_ON',
+    r"The on clause must be before the implements clause.",
+    correction: "Try moving the on clause before the implements clause.");
+
+const ParserErrorCode _IMPLEMENTS_BEFORE_WITH = const ParserErrorCode(
+    'IMPLEMENTS_BEFORE_WITH',
+    r"The with clause must be before the implements clause.",
+    correction: "Try moving the with clause before the implements clause.");
+
 const ParserErrorCode _IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
     const ParserErrorCode('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE',
         r"Import directives must preceed part directives.",
@@ -236,6 +349,9 @@
     r"Can't use type arguments with type variable '#name'.",
     correction: "Try removing the type arguments.");
 
+const ParserErrorCode _VAR_AS_TYPE_NAME = const ParserErrorCode(
+    'VAR_AS_TYPE_NAME', r"The keyword 'var' can't be used as a type name.");
+
 const ParserErrorCode _VAR_RETURN_TYPE = const ParserErrorCode(
     'VAR_RETURN_TYPE', r"The return type can't be 'var'.",
     correction:
diff --git a/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart b/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
index db3945b..da60a97 100644
--- a/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
@@ -9,13 +9,11 @@
 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/error.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/dart/ast/token.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/error/codes.dart';
 import 'package:analyzer/src/generated/type_system.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 
@@ -48,29 +46,12 @@
   Map<ClassElement, Map<String, ExecutableElement>> _interfaceLookup;
 
   /**
-   * A map between each visited [ClassElement] and the set of [AnalysisError]s found on
-   * the class element.
-   */
-  Map<ClassElement, Set<AnalysisError>> _errorsInClassElement =
-      new HashMap<ClassElement, Set<AnalysisError>>();
-
-  /**
-   * Indicates whether errors should be ignored.
-   *
-   * When this bool is `true`, we skip the logic that figures out which error
-   * to report; this avoids a crash when the inheritance manager is used in the
-   * context of summary linking (where there is not enough information available
-   * to determine error locations).
-   */
-  final bool ignoreErrors;
-
-  /**
    * Initialize a newly created inheritance manager.
    *
    * @param library the library element context that the inheritance mappings are being generated
    */
   InheritanceManager(LibraryElement library,
-      {bool includeAbstractFromSuperclasses: false, this.ignoreErrors: false}) {
+      {bool includeAbstractFromSuperclasses: false}) {
     this._library = library;
     _includeAbstractFromSuperclasses = includeAbstractFromSuperclasses;
     _classLookup = new HashMap<ClassElement, Map<String, ExecutableElement>>();
@@ -88,17 +69,6 @@
   }
 
   /**
-   * Return the set of [AnalysisError]s found on the passed [ClassElement], or
-   * `null` if there are none.
-   *
-   * @param classElt the class element to query
-   * @return the set of [AnalysisError]s found on the passed [ClassElement], or
-   *         `null` if there are none
-   */
-  Set<AnalysisError> getErrors(ClassElement classElt) =>
-      _errorsInClassElement[classElt];
-
-  /**
    * Get and return a mapping between the set of all string names of the members inherited from the
    * passed [ClassElement] superclass hierarchy, and the associated [ExecutableElement].
    *
@@ -129,6 +99,7 @@
    * passed [ClassElement]'s superclass hierarchy, and the associated executable
    * element.
    */
+  @deprecated
   Map<String, ExecutableElement> getMembersInheritedFromClasses(
           ClassElement classElt) =>
       _computeClassChainLookupMap(classElt, new HashSet<ClassElement>());
@@ -138,6 +109,7 @@
    * passed [ClassElement]'s interface hierarchy, and the associated executable
    * element.
    */
+  @deprecated
   Map<String, ExecutableElement> getMembersInheritedFromInterfaces(
           ClassElement classElt) =>
       _computeInterfaceLookupMap(classElt, new HashSet<ClassElement>());
@@ -717,33 +689,9 @@
   }
 
   /**
-   * This method is used to report errors on when they are found computing inheritance information.
-   * See [ErrorVerifier.checkForInconsistentMethodInheritance] to see where these generated
-   * error codes are reported back into the analysis engine.
-   *
-   * @param classElt the location of the source for which the exception occurred
-   * @param offset the offset of the location of the error
-   * @param length the length of the location of the error
-   * @param errorCode the error code to be associated with this error
-   * @param arguments the arguments used to build the error message
-   */
-  void _reportError(
-      ClassElement classElt, ErrorCode errorCode, List<Object> arguments) {
-    if (ignoreErrors) {
-      return;
-    }
-    HashSet<AnalysisError> errorSet = _errorsInClassElement.putIfAbsent(
-        classElt, () => new HashSet<AnalysisError>());
-    errorSet.add(new AnalysisError(classElt.source, classElt.nameOffset,
-        classElt.nameLength, errorCode, arguments));
-  }
-
-  /**
    * Given the set of methods defined by classes above [classElt] in the class hierarchy,
    * apply the appropriate inheritance rules to determine those methods inherited by or overridden
-   * by [classElt]. Also report static warnings
-   * [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE] and
-   * [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD] if appropriate.
+   * by [classElt].
    *
    * @param classElt the class element to query.
    * @param unionMap a mapping from method name to the set of unique (in terms of signature) methods
@@ -838,38 +786,7 @@
             //
             resultMap[key] = elements[subtypesOfAllOtherTypesIndexes[0]];
           } else {
-            if (subtypesOfAllOtherTypesIndexes.isEmpty) {
-              //
-              // Determine if the current class has a method or accessor with
-              // the member name, if it does then then this class does not
-              // "inherit" from any of the supertypes. See issue 16134.
-              //
-              bool classHasMember = false;
-              if (allMethods) {
-                classHasMember = classElt.getMethod(key) != null;
-              } else {
-                List<PropertyAccessorElement> accessors = classElt.accessors;
-                for (int i = 0; i < accessors.length; i++) {
-                  if (accessors[i].name == key) {
-                    classHasMember = true;
-                  }
-                }
-              }
-              //
-              // Example: class A inherited only 2 method named 'm'.
-              // One has the function type '() -> int' and one has the function
-              // type '() -> String'. Since neither is a subtype of the other,
-              // we create a warning, and have this class inherit nothing.
-              //
-              if (!classHasMember) {
-                String firstTwoFunctionTypesStr =
-                    "${executableElementTypes[0]}, ${executableElementTypes[1]}";
-                _reportError(
-                    classElt,
-                    StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
-                    [key, firstTwoFunctionTypesStr]);
-              }
-            } else {
+            if (!subtypesOfAllOtherTypesIndexes.isEmpty) {
               //
               // Example: class A inherits 2 methods named 'm'.
               // One has the function type '(int) -> dynamic' and one has the
@@ -896,12 +813,6 @@
               resultMap[key] = mergedExecutableElement;
             }
           }
-        } else {
-          _reportError(
-              classElt,
-              StaticWarningCode
-                  .INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
-              [key]);
         }
       }
     });
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 37b838c..3bfa270 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1261,6 +1261,46 @@
           "Case expressions must have the same types, '{0}' isn't a '{1}'.");
 
   /**
+   * 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.
+   *
+   * Parameters:
+   * 0: the name of the instance member with inconsistent inheritance.
+   * 1: the list of all inherited signatures for this member.
+   */
+  static const CompileTimeErrorCode INCONSISTENT_INHERITANCE =
+      const CompileTimeErrorCode('INCONSISTENT_INHERITANCE',
+          "Superinterfaces don't have a valid override for '{0}': {1}.",
+          correction:
+              "Try adding an explicit override that is consistent with all "
+              "of the inherited members.");
+
+  /**
+   * 11.1.1 Inheritance and Overriding. Let `I` be the implicit interface of a
+   * class `C` declared in library `L`. `I` inherits all members of
+   * `inherited(I, L)` and `I` overrides `m'` if `m' ∈ overrides(I, L)`. It is
+   * a compile-time error if `m` is a method and `m'` is a getter, or if `m`
+   * is a getter and `m'` is a method.
+   *
+   * Parameters:
+   * 0: the name of the the instance member with inconsistent inheritance.
+   * 1: the name of the superinterface that declares the name as a getter.
+   * 2: the name of the superinterface that declares the name as a method.
+   */
+  static const CompileTimeErrorCode INCONSISTENT_INHERITANCE_GETTER_AND_METHOD =
+      const CompileTimeErrorCode(
+          'INCONSISTENT_INHERITANCE_GETTER_AND_METHOD',
+          "'{0}' is inherited as a getter (from '{1}') and also a "
+          "method (from '{2}').",
+          correction:
+              "Try adjusting the supertypes of this class to remove the "
+              "inconsistency.");
+
+  /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It
    * is a compile-time error if <i>k</i>'s initializer list contains an
    * initializer for a variable that is not an instance variable declared in the
@@ -1488,6 +1528,26 @@
               "Try using a generic function type (returnType 'Function(' parameters ')').");
 
   /**
+   * If a class declaration has a member declaration, the signature of that
+   * member declaration becomes the signature in the interface. It's a
+   * compile-time error if that signature is not a valid override of all
+   * super-interface member signatures with the same name. (Not just the
+   * members of the immediate super-interfaces, but all of them. For
+   * non-covariant parameters, it's sufficient to check just the immediate
+   * super-interfaces).
+   *
+   * Parameters:
+   * 0: the name of the declared member that is not a valid override.
+   * 1: the name of the interface that declares the member.
+   * 2: the type of the declared member in the interface.
+   * 3. the name of the interface with the overridden member.
+   * 4. the type of the overridden member.
+   */
+  static const CompileTimeErrorCode INVALID_OVERRIDE =
+      const CompileTimeErrorCode('INVALID_OVERRIDE',
+          "'{1}.{0}' ('{2}') isn't a valid override of '{3}.{0}' ('{4}').");
+
+  /**
    * 12.10 This: It is a compile-time error if this appears in a top-level
    * function or variable initializer, in a factory constructor, or in a static
    * method or variable initializer, or in the initializer of an instance
@@ -2796,41 +2856,6 @@
               "removing the modifier 'sync*' from the function body.");
 
   /**
-   * 8.1.1 Inheritance and Overriding: However, if the above rules would cause
-   * multiple members <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> with the
-   * same name <i>n</i> that would be inherited (because identically named
-   * members existed in several superinterfaces) then at most one member is
-   * inherited.
-   *
-   * If the static types <i>T<sub>1</sub>, &hellip;, T<sub>k</sub></i> of the
-   * members <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> are not identical,
-   * then there must be a member <i>m<sub>x</sub></i> such that <i>T<sub>x</sub>
-   * &lt;: T<sub>i</sub>, 1 &lt;= x &lt;= k</i> for all <i>i, 1 &lt;= i &lt;=
-   * k</i>, or a static type warning occurs. The member that is inherited is
-   * <i>m<sub>x</sub></i>, if it exists; otherwise:
-   * * Let <i>numberOfPositionals</i>(<i>f</i>) denote the number of positional
-   *   parameters of a function <i>f</i>, and let
-   *   <i>numberOfRequiredParams</i>(<i>f</i>) denote the number of required
-   *   parameters of a function <i>f</i>. Furthermore, let <i>s</i> denote the
-   *   set of all named parameters of the <i>m<sub>1</sub>, &hellip;,
-   *   m<sub>k</sub></i>. Then let
-   * * <i>h = max(numberOfPositionals(m<sub>i</sub>)),</i>
-   * * <i>r = min(numberOfRequiredParams(m<sub>i</sub>)), for all <i>i</i>, 1 <=
-   *   i <= k.</i> If <i>r <= h</i> then <i>I</i> has a method named <i>n</i>,
-   *   with <i>r</i> required parameters of type <b>dynamic</b>, <i>h</i>
-   *   positional parameters of type <b>dynamic</b>, named parameters <i>s</i>
-   *   of type <b>dynamic</b> and return type <b>dynamic</b>.
-   * * Otherwise none of the members <i>m<sub>1</sub>, &hellip;,
-   *   m<sub>k</sub></i> is inherited.
-   */
-  static const StaticTypeWarningCode INCONSISTENT_METHOD_INHERITANCE =
-      const StaticTypeWarningCode('INCONSISTENT_METHOD_INHERITANCE',
-          "Inconsistent declarations of '{0}' are inherited from {1}.",
-          correction:
-              "Try adjusting the supertypes of this class to remove the "
-              "inconsistency.");
-
-  /**
    * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does
    * not have an accessible (3.2) instance member named <i>m</i>.
    *
@@ -2967,17 +2992,6 @@
           "The operands of the '{0}' operator must be assignable to 'bool'.");
 
   /**
-   * Parameters:
-   * 0: the name of the variable
-   * 1: the type of the variable
-   */
-  static const StaticTypeWarningCode NON_NULLABLE_FIELD_NOT_INITIALIZED =
-      const StaticTypeWarningCode('NON_NULLABLE_FIELD_NOT_INITIALIZED',
-          "Variable '{0}' of non-nullable type '{1}' must be initialized.",
-          correction: "Try adding an initializer to the declaration, or "
-              "making the variable nullable by adding a '?' after the type name.");
-
-  /**
    * 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.
    */
@@ -3807,158 +3821,6 @@
           correction: "Try importing the library that the part is a part of.");
 
   /**
-   * 11.1.1 Inheritance and Overriding. Let `I` be the implicit interface of a
-   * class `C` declared in library `L`. `I` inherits all members of
-   * `inherited(I, L)` and `I` overrides `m'` if `m' ∈ overrides(I, L)`. It is
-   * a compile-time error if `m` is a method and `m'` is a getter, or if `m`
-   * is a getter and `m'` is a method.
-   */
-  static const StaticWarningCode
-      INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD =
-      const StaticWarningCode(
-          'INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD',
-          "'{0}' is inherited as a getter and also a method.",
-          correction:
-              "Try adjusting the supertypes of this class to remove the "
-              "inconsistency.");
-
-  /**
-   * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a
-   * getter <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of
-   * <i>m2</i>.
-   *
-   * Parameters:
-   * 0: the name of the actual return type
-   * 1: the name of the expected return type, not assignable to the actual
-   *    return type
-   * 2: the name of the class where the overridden getter is declared
-   *
-   * See [INVALID_METHOD_OVERRIDE_RETURN_TYPE].
-   */
-  static const StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE =
-      const StaticWarningCode(
-          'INVALID_GETTER_OVERRIDE_RETURN_TYPE',
-          "The return type '{0}' isn't assignable to '{1}' as required by the "
-          "getter it is overriding from '{2}'.",
-          correction:
-              "Try changing the return types so that they are compatible.");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method
-   * <i>m1</i> overrides an instance method <i>m2</i> and the type of <i>m1</i>
-   * is not a subtype of the type of <i>m2</i>.
-   *
-   * Parameters:
-   * 0: the name of the actual parameter type
-   * 1: the name of the expected parameter type, not assignable to the actual
-   *    parameter type
-   * 2: the name of the class where the overridden method is declared
-   */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE =
-      const StaticWarningCode(
-          'INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE',
-          "The parameter type '{0}' isn't assignable to '{1}' as required by "
-          "the method it is overriding from '{2}'.",
-          correction:
-              "Try changing the parameter types so that they are compatible.");
-
-  /**
-   * Generic Method DEP: number of type parameters must match.
-   * <https://github.com/leafpetersen/dep-generic-methods/blob/master/proposal.md#function-subtyping>
-   *
-   * Parameters:
-   * 0: the number of type parameters in the method
-   * 1: the number of type parameters in the overridden method
-   * 2: the name of the class where the overridden method is declared
-   */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS =
-      const StaticWarningCode(
-          'INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS',
-          "The method has {0} type parameters, but it is overriding a method "
-          "with {1} type parameters from '{2}'.",
-          correction:
-              "Try changing the number of type parameters so that they are the same.");
-
-  /**
-   * Generic Method DEP: bounds of type parameters must be compatible.
-   * <https://github.com/leafpetersen/dep-generic-methods/blob/master/proposal.md#function-subtyping>
-   *
-   * Parameters:
-   * 0: the type parameter name
-   * 1: the type parameter bound
-   * 2: the overridden type parameter name
-   * 3: the overridden type parameter bound
-   * 4: the name of the class where the overridden method is declared
-   */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND =
-      const StaticWarningCode(
-          'INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND',
-          "The type parameter '{0}' extends '{1}', but that is stricter than "
-          "'{2}' extends '{3}' in the overridden method from '{4}'.",
-          correction:
-              "Try changing the bounds on the type parameters so that they are compatible.");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method
-   * <i>m1</i> overrides an instance method <i>m2</i> and the type of <i>m1</i>
-   * is not a subtype of the type of <i>m2</i>.
-   *
-   * Parameters:
-   * 0: the name of the actual parameter type
-   * 1: the name of the expected parameter type, not assignable to the actual
-   *    parameter type
-   * 2: the name of the class where the overridden method is declared
-   * See [INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE].
-   */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE =
-      const StaticWarningCode(
-          'INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE',
-          "The parameter type '{0}' isn't assignable to '{1}' as required by "
-          "the method it is overriding from '{2}'.",
-          correction:
-              "Try changing the parameter types so that they are compatible.");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method
-   * <i>m1</i> overrides an instance method <i>m2</i> and the type of <i>m1</i>
-   * is not a subtype of the type of <i>m2</i>.
-   *
-   * Parameters:
-   * 0: the name of the actual parameter type
-   * 1: the name of the expected parameter type, not assignable to the actual
-   *    parameter type
-   * 2: the name of the class where the overridden method is declared
-   */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE =
-      const StaticWarningCode(
-          'INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE',
-          "The parameter type '{0}' isn't assignable to '{1}' as required by "
-          "the method it is overriding from '{2}'.",
-          correction:
-              "Try changing the parameter types so that they are compatible.");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method
-   * <i>m1</i> overrides an instance method <i>m2</i> and the type of <i>m1</i>
-   * is not a subtype of the type of <i>m2</i>.
-   *
-   * Parameters:
-   * 0: the name of the actual return type
-   * 1: the name of the expected return type, not assignable to the actual
-   *    return type
-   * 2: the name of the class where the overridden method is declared
-   *
-   * See [INVALID_GETTER_OVERRIDE_RETURN_TYPE].
-   */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE =
-      const StaticWarningCode(
-          'INVALID_METHOD_OVERRIDE_RETURN_TYPE',
-          "The return type '{0}' isn't assignable to '{1}' as required by the "
-          "method it is overriding from '{2}'.",
-          correction:
-              "Try changing the return types so that they are compatible.");
-
-  /**
    * 7.1 Instance Methods: It is a static warning if an instance method
    * <i>m1</i> overrides an instance member <i>m2</i>, the signature of
    * <i>m2</i> explicitly specifies a default value for a formal parameter
@@ -4712,9 +4574,6 @@
   static const String _implicitCastCorrection =
       "Try adding an explicit cast to '{1}' or improving the type of '{0}'.";
 
-  static const String _invalidOverrideMessage =
-      "The type of '{0}.{1}' ('{2}') isn't a subtype of '{3}.{1}' ('{4}').";
-
   /**
    * This is appended to the end of an error message about implicit dynamic.
    *
@@ -4830,23 +4689,6 @@
   static const StrongModeCode DYNAMIC_INVOKE = const StrongModeCode(
       ErrorType.HINT, 'DYNAMIC_INVOKE', "'{0}' requires a dynamic invoke.");
 
-  static const StrongModeCode INVALID_METHOD_OVERRIDE = const StrongModeCode(
-      ErrorType.COMPILE_TIME_ERROR,
-      'INVALID_METHOD_OVERRIDE',
-      "Invalid override. $_invalidOverrideMessage");
-
-  static const StrongModeCode INVALID_METHOD_OVERRIDE_FROM_BASE =
-      const StrongModeCode(
-          ErrorType.COMPILE_TIME_ERROR,
-          'INVALID_METHOD_OVERRIDE_FROM_BASE',
-          "Base class introduces an invalid override. $_invalidOverrideMessage");
-
-  static const StrongModeCode INVALID_METHOD_OVERRIDE_FROM_MIXIN =
-      const StrongModeCode(
-          ErrorType.COMPILE_TIME_ERROR,
-          'INVALID_METHOD_OVERRIDE_FROM_MIXIN',
-          "Mixin introduces an invalid override. $_invalidOverrideMessage");
-
   static const StrongModeCode INVALID_FIELD_OVERRIDE = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_FIELD_OVERRIDE',
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
new file mode 100644
index 0000000..638416d
--- /dev/null
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -0,0 +1,467 @@
+// 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/analyzer.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/error/listener.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/type_system.dart';
+
+class InheritanceOverrideVerifier {
+  static const _missingOverridesKey = 'missingOverrides';
+
+  final StrongTypeSystemImpl _typeSystem;
+  final TypeProvider _typeProvider;
+  final InheritanceManager2 _inheritance;
+  final ErrorReporter _reporter;
+
+  InheritanceOverrideVerifier(
+      this._typeSystem, this._inheritance, this._reporter)
+      : _typeProvider = _typeSystem.typeProvider;
+
+  void verifyUnit(CompilationUnit unit) {
+    var library = unit.declaredElement.library;
+    for (var declaration in unit.declarations) {
+      if (declaration is ClassDeclaration) {
+        new _ClassVerifier(
+          typeSystem: _typeSystem,
+          typeProvider: _typeProvider,
+          inheritance: _inheritance,
+          reporter: _reporter,
+          library: library,
+          classNameNode: declaration.name,
+          implementsClause: declaration.implementsClause,
+          members: declaration.members,
+          superclass: declaration.extendsClause?.superclass,
+          withClause: declaration.withClause,
+        ).verify();
+      } else if (declaration is ClassTypeAlias) {
+        new _ClassVerifier(
+          typeSystem: _typeSystem,
+          typeProvider: _typeProvider,
+          inheritance: _inheritance,
+          reporter: _reporter,
+          library: library,
+          classNameNode: declaration.name,
+          implementsClause: declaration.implementsClause,
+          superclass: declaration.superclass,
+          withClause: declaration.withClause,
+        ).verify();
+      } else if (declaration is MixinDeclaration) {
+        new _ClassVerifier(
+          typeSystem: _typeSystem,
+          typeProvider: _typeProvider,
+          inheritance: _inheritance,
+          reporter: _reporter,
+          library: library,
+          classNameNode: declaration.name,
+          implementsClause: declaration.implementsClause,
+          members: declaration.members,
+          onClause: declaration.onClause,
+        ).verify();
+      }
+    }
+  }
+
+  /// Returns [ExecutableElement]s that are in the interface of the given
+  /// class, but don't have concrete implementations.
+  static List<ExecutableElement> missingOverrides(ClassDeclaration node) {
+    return node.name.getProperty(_missingOverridesKey) ?? const [];
+  }
+}
+
+class _ClassVerifier {
+  final StrongTypeSystemImpl typeSystem;
+  final TypeProvider typeProvider;
+  final InheritanceManager2 inheritance;
+  final ErrorReporter reporter;
+
+  final LibraryElement library;
+  final ClassElementImpl classElement;
+
+  final SimpleIdentifier classNameNode;
+  final List<ClassMember> members;
+  final ImplementsClause implementsClause;
+  final OnClause onClause;
+  final TypeName superclass;
+  final WithClause withClause;
+
+  /// The list of all superinterfaces, collected so far.
+  final List<InterfaceType> allSuperinterfaces = [];
+
+  _ClassVerifier({
+    this.typeSystem,
+    this.typeProvider,
+    this.inheritance,
+    this.reporter,
+    this.library,
+    this.classNameNode,
+    this.implementsClause,
+    this.members: const [],
+    this.onClause,
+    this.superclass,
+    this.withClause,
+  }) : classElement =
+            AbstractClassElementImpl.getImpl(classNameNode.staticElement);
+
+  void verify() {
+    if (_checkDirectSuperTypes()) {
+      return;
+    }
+
+    InterfaceTypeImpl type = classElement.type;
+
+    // Add all superinterfaces of the direct supertype.
+    if (type.superclass != null) {
+      ClassElementImpl.collectAllSupertypes(
+          allSuperinterfaces, type.superclass, null);
+    }
+
+    // Each mixin in `class C extends S with M0, M1, M2 {}` is equivalent to:
+    //   class S&M0 extends S { ...members of M0... }
+    //   class S&M1 extends S&M0 { ...members of M1... }
+    //   class S&M2 extends S&M1 { ...members of M2... }
+    //   class C extends S&M2 { ...members of C... }
+    // So, we need to check members of each mixin against superinterfaces
+    // of `S`, and superinterfaces of all previous mixins.
+    var mixinNodes = withClause?.mixinTypes;
+    var mixinTypes = type.mixins;
+    for (var i = 0; i < mixinTypes.length; i++) {
+      _checkDeclaredMembers(mixinNodes[i], mixinTypes[i]);
+      ClassElementImpl.collectAllSupertypes(
+          allSuperinterfaces, mixinTypes[i], null);
+    }
+
+    // Add all superinterfaces of the direct class interfaces.
+    for (var interface in type.interfaces) {
+      ClassElementImpl.collectAllSupertypes(
+          allSuperinterfaces, interface, null);
+    }
+
+    // Check the members if the class itself, against all the previously
+    // collected superinterfaces of the supertype, mixins, and interfaces.
+    var libraryUri = library.source.uri;
+    for (var member in members) {
+      if (member is FieldDeclaration) {
+        var fieldList = member.fields;
+        for (var field in fieldList.variables) {
+          FieldElement fieldElement = field.declaredElement;
+          _checkDeclaredMember(fieldList, libraryUri, fieldElement.getter);
+          _checkDeclaredMember(fieldList, libraryUri, fieldElement.setter);
+        }
+      } else if (member is MethodDeclaration) {
+        _checkDeclaredMember(member, libraryUri, member.declaredElement);
+      }
+    }
+
+    // Compute the interface of the class.
+    var interfaceMembers = inheritance.getInterface(type);
+
+    // Report conflicts between direct superinterfaces of the class.
+    for (var conflict in interfaceMembers.conflicts) {
+      _reportInconsistentInheritance(classNameNode, conflict);
+    }
+
+    if (!classElement.isAbstract) {
+      List<ExecutableElement> inheritedAbstractMembers = null;
+
+      for (var name in interfaceMembers.map.keys) {
+        if (!name.isAccessibleFor(libraryUri)) {
+          continue;
+        }
+
+        var interfaceType = interfaceMembers.map[name];
+        var concreteType = inheritance.getMember(type, name, concrete: true);
+
+        // No concrete implementation of the name.
+        if (concreteType == null) {
+          if (!classElement.hasNoSuchMethod) {
+            if (!_reportConcreteClassWithAbstractMember(name.name)) {
+              inheritedAbstractMembers ??= [];
+              inheritedAbstractMembers.add(interfaceType.element);
+            }
+          }
+          continue;
+        }
+
+        // The case when members have different kinds is reported in verifier.
+        if (concreteType.element.kind != interfaceType.element.kind) {
+          continue;
+        }
+
+        // If a class declaration is not abstract, and the interface has a
+        // member declaration named `m`, then:
+        // 1. if the class contains a non-overridden member whose signature is
+        //    not a valid override of the interface member signature for `m`,
+        //    then it's a compile-time error.
+        // 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)) {
+          reporter.reportErrorForNode(
+            CompileTimeErrorCode.INVALID_OVERRIDE,
+            classNameNode,
+            [
+              name.name,
+              concreteType.element.enclosingElement.name,
+              concreteType.displayName,
+              interfaceType.element.enclosingElement.name,
+              interfaceType.displayName,
+            ],
+          );
+        }
+      }
+
+      _reportInheritedAbstractMembers(inheritedAbstractMembers);
+    }
+  }
+
+  /// Check that the given [member] is a valid override of the corresponding
+  /// instance members in each of [allSuperinterfaces].  The [libraryUri] is
+  /// the URI of the library containing the [member].
+  void _checkDeclaredMember(
+    AstNode node,
+    Uri libraryUri,
+    ExecutableElement member,
+  ) {
+    if (member == null) return;
+    if (member.isStatic) return;
+
+    var name = new Name(libraryUri, member.name);
+    for (var superType in allSuperinterfaces) {
+      var superMemberType = inheritance.getInterface(superType).map[name];
+      if (superMemberType != null) {
+        // The case when members have different kinds is reported in verifier.
+        // TODO(scheglov) Do it here?
+        if (member.kind != superMemberType.element.kind) {
+          continue;
+        }
+
+        if (!typeSystem.isOverrideSubtypeOf(member.type, superMemberType)) {
+          reporter.reportErrorForNode(
+            CompileTimeErrorCode.INVALID_OVERRIDE,
+            node,
+            [
+              name.name,
+              member.enclosingElement.name,
+              member.type.displayName,
+              superMemberType.element.enclosingElement.name,
+              superMemberType.displayName
+            ],
+          );
+        }
+      }
+    }
+  }
+
+  /// Check that instance members of [type] are valid overrides of the
+  /// corresponding instance members in each of [allSuperinterfaces].
+  void _checkDeclaredMembers(AstNode node, InterfaceTypeImpl type) {
+    var libraryUri = type.element.library.source.uri;
+    for (var method in type.methods) {
+      _checkDeclaredMember(node, libraryUri, method);
+    }
+    for (var accessor in type.accessors) {
+      _checkDeclaredMember(node, libraryUri, accessor);
+    }
+  }
+
+  /// Verify that the given [typeName] does not extend, implement, or mixes-in
+  /// types such as `num` or `String`.
+  bool _checkDirectSuperType(TypeName typeName, ErrorCode errorCode) {
+    if (typeName.isSynthetic) {
+      return false;
+    }
+
+    // The SDK implementation may implement disallowed types. For example,
+    // JSNumber in dart2js and _Smi in Dart VM both implement int.
+    if (library.source.isInSystemLibrary) {
+      return false;
+    }
+
+    DartType type = typeName.type;
+    if (typeProvider.nonSubtypableTypes.contains(type)) {
+      reporter.reportErrorForNode(errorCode, typeName, [type.displayName]);
+      return true;
+    }
+
+    return false;
+  }
+
+  /// Verify that direct supertypes are valid, and return `false`.  If there
+  /// are direct supertypes that are not valid, report corresponding errors,
+  /// and return `true`.
+  bool _checkDirectSuperTypes() {
+    var hasError = false;
+    if (implementsClause != null) {
+      for (var typeName in implementsClause.interfaces) {
+        if (_checkDirectSuperType(
+          typeName,
+          CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+        )) {
+          hasError = true;
+        }
+      }
+    }
+    if (onClause != null) {
+      for (var typeName in onClause.superclassConstraints) {
+        if (_checkDirectSuperType(
+          typeName,
+          CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS,
+        )) {
+          hasError = true;
+        }
+      }
+    }
+    if (superclass != null) {
+      if (_checkDirectSuperType(
+        superclass,
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+      )) {
+        hasError = true;
+      }
+    }
+    if (withClause != null) {
+      for (var typeName in withClause.mixinTypes) {
+        if (_checkDirectSuperType(
+          typeName,
+          CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
+        )) {
+          hasError = true;
+        }
+      }
+    }
+    return hasError;
+  }
+
+  /// We identified that the current non-abstract class does not have the
+  /// concrete implementation of a method with the given [name].  If this is
+  /// because the class itself defines an abstract method with this [name],
+  /// report the more specific error, and return `true`.
+  bool _reportConcreteClassWithAbstractMember(String name) {
+    for (var member in members) {
+      if (member is MethodDeclaration) {
+        var name2 = member.name.name;
+        if (member.isSetter) {
+          name2 += '=';
+        }
+        if (name2 == name) {
+          reporter.reportErrorForNode(
+              StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
+              member,
+              [name, classElement.name]);
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  void _reportInconsistentInheritance(AstNode node, Conflict conflict) {
+    var name = conflict.name;
+
+    if (conflict.getter != null && conflict.method != null) {
+      reporter.reportErrorForNode(
+        CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
+        node,
+        [
+          name.name,
+          conflict.getter.element.enclosingElement.name,
+          conflict.method.element.enclosingElement.name
+        ],
+      );
+    } else {
+      var candidatesStr = conflict.candidates.map((candidate) {
+        var className = candidate.element.enclosingElement.name;
+        return '$className.${name.name} (${candidate.displayName})';
+      }).join(', ');
+
+      reporter.reportErrorForNode(
+        CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
+        node,
+        [name.name, candidatesStr],
+      );
+    }
+  }
+
+  void _reportInheritedAbstractMembers(List<ExecutableElement> elements) {
+    if (elements == null) {
+      return;
+    }
+
+    classNameNode.setProperty(
+      InheritanceOverrideVerifier._missingOverridesKey,
+      elements,
+    );
+
+    var descriptions = <String>[];
+    for (ExecutableElement element in elements) {
+      String prefix = '';
+      if (element is PropertyAccessorElement) {
+        if (element.isGetter) {
+          prefix = 'getter ';
+        } else {
+          prefix = 'setter ';
+        }
+      }
+
+      String description;
+      var elementName = element.displayName;
+      var enclosingElement = element.enclosingElement;
+      if (enclosingElement != null) {
+        var enclosingName = element.enclosingElement.displayName;
+        description = "$prefix$enclosingName.$elementName";
+      } else {
+        description = "$prefix$elementName";
+      }
+
+      descriptions.add(description);
+    }
+    descriptions.sort();
+
+    if (descriptions.length == 1) {
+      reporter.reportErrorForNode(
+        StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+        classNameNode,
+        [descriptions[0]],
+      );
+    } else if (descriptions.length == 2) {
+      reporter.reportErrorForNode(
+        StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
+        classNameNode,
+        [descriptions[0], descriptions[1]],
+      );
+    } else if (descriptions.length == 3) {
+      reporter.reportErrorForNode(
+        StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
+        classNameNode,
+        [descriptions[0], descriptions[1], descriptions[2]],
+      );
+    } else if (descriptions.length == 4) {
+      reporter.reportErrorForNode(
+        StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
+        classNameNode,
+        [descriptions[0], descriptions[1], descriptions[2], descriptions[3]],
+      );
+    } else {
+      reporter.reportErrorForNode(
+        StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
+        classNameNode,
+        [
+          descriptions[0],
+          descriptions[1],
+          descriptions[2],
+          descriptions[3],
+          descriptions.length - 4
+        ],
+      );
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 3740609..0408313 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -25,7 +25,7 @@
 import 'package:front_end/src/fasta/scanner.dart' hide StringToken;
 import 'package:front_end/src/scanner/errors.dart' show translateErrorToken;
 import 'package:front_end/src/scanner/token.dart'
-    show BeginToken, SyntheticBeginToken, SyntheticStringToken, SyntheticToken;
+    show SyntheticStringToken, SyntheticToken;
 
 import 'package:front_end/src/fasta/problems.dart' show unhandled;
 import 'package:front_end/src/fasta/messages.dart'
@@ -1771,7 +1771,7 @@
 
   @override
   void handleClassExtends(Token extendsKeyword) {
-    assert(optionalOrNull('extends', extendsKeyword));
+    assert(extendsKeyword == null || extendsKeyword.isKeywordOrIdentifier);
     debugEvent("ClassExtends");
 
     TypeName supertype = pop();
@@ -1857,7 +1857,7 @@
     WithClause withClause = pop(NullValue.WithClause);
     ExtendsClause extendsClause = pop(NullValue.ExtendsClause);
     ClassDeclaration declaration = declarations.last;
-    if (extendsClause != null && !extendsClause.extendsKeyword.isSynthetic) {
+    if (extendsClause != null) {
       if (declaration.extendsClause?.superclass == null) {
         declaration.extendsClause = extendsClause;
       }
@@ -1892,7 +1892,7 @@
 
   @override
   void handleMixinOn(Token onKeyword, int typeCount) {
-    assert(optionalOrNull('on', onKeyword));
+    assert(onKeyword == null || onKeyword.isKeywordOrIdentifier);
     debugEvent("MixinOn");
 
     if (onKeyword != null) {
@@ -2040,7 +2040,7 @@
       return;
     }
     debugEvent("Error: ${message.message}");
-    if (message.code.analyzerCode == null && startToken is ErrorToken) {
+    if (message.code.analyzerCodes == null && startToken is ErrorToken) {
       translateErrorToken(startToken, errorReporter.reportScannerError);
     } else {
       int offset = startToken.offset;
@@ -2162,6 +2162,8 @@
     List<Annotation> metadata = pop();
     Comment comment = _findComment(metadata, beginToken);
 
+    assert(parameters != null);
+
     if (typeParameters != null) {
       // TODO(danrubel): Update OutlineBuilder to report this error message.
       handleRecoverableError(messageConstructorWithTypeParameters,
@@ -2366,6 +2368,8 @@
     List<Annotation> metadata = pop();
     Comment comment = _findComment(metadata, beginToken);
 
+    assert(parameters != null || optional('get', getOrSet));
+
     ConstructorName redirectedConstructor;
     FunctionBody body;
     if (bodyObject is FunctionBody) {
@@ -2379,30 +2383,6 @@
           beginToken.charOffset, uri);
     }
 
-    if (parameters == null && (getOrSet == null || optional('set', getOrSet))) {
-      Token token = typeParameters?.endToken;
-      if (token == null) {
-        if (name is AstNode) {
-          token = name.endToken;
-        } else if (name is _OperatorName) {
-          token = name.name.endToken;
-        } else {
-          throw new UnimplementedError();
-        }
-      }
-      Token next = token.next;
-      int offset = next.charOffset;
-      BeginToken leftParen =
-          new SyntheticBeginToken(TokenType.OPEN_PAREN, offset);
-      token.setNext(leftParen);
-      Token rightParen =
-          leftParen.setNext(new SyntheticToken(TokenType.CLOSE_PAREN, offset));
-      leftParen.endGroup = rightParen;
-      rightParen.setNext(next);
-      parameters = ast.formalParameterList(
-          leftParen, <FormalParameter>[], null, null, rightParen);
-    }
-
     ClassOrMixinDeclarationImpl declaration =
         classDeclaration ?? mixinDeclaration;
 
@@ -2773,7 +2753,9 @@
   void addProblem(Message message, int charOffset, int length,
       {bool wasHandled: false, List<LocatedMessage> context}) {
     if (directives.isEmpty &&
-        message.code.analyzerCode == 'NON_PART_OF_DIRECTIVE_IN_PART') {
+        (message.code.analyzerCodes
+                ?.contains('NON_PART_OF_DIRECTIVE_IN_PART') ??
+            false)) {
       message = messageDirectiveAfterDeclaration;
     }
     errorReporter.reportMessage(message, charOffset, length);
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index eb12686..11189b1 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -5,8 +5,6 @@
 import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/ast/token.dart' show Token;
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:analyzer/src/generated/resolver.dart' show ResolverErrorCode;
-import 'package:front_end/src/api_prototype/compilation_message.dart';
 import 'package:front_end/src/fasta/messages.dart' show Code, Message;
 
 /// An error reporter that knows how to convert a Fasta error into an analyzer
@@ -26,10 +24,6 @@
     String lexeme() => (arguments['token'] as Token).lexeme;
 
     switch (analyzerCode) {
-      case "ABSTRACT_CLASS_MEMBER":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.ABSTRACT_CLASS_MEMBER, offset, length);
-        return;
       case "ANNOTATION_WITH_TYPE_ARGUMENTS":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.ANNOTATION_WITH_TYPE_ARGUMENTS,
@@ -44,10 +38,6 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, offset, length);
         return;
-      case "BREAK_OUTSIDE_OF_LOOP":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, offset, length);
-        return;
       case "BUILT_IN_IDENTIFIER_AS_TYPE":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE,
@@ -59,40 +49,12 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.CATCH_SYNTAX, offset, length);
         return;
-      case "CLASS_IN_CLASS":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.CLASS_IN_CLASS, offset, length);
-        return;
-      case "COLON_IN_PLACE_OF_IN":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.COLON_IN_PLACE_OF_IN, offset, length);
-        return;
       case "CONCRETE_CLASS_WITH_ABSTRACT_MEMBER":
         errorReporter?.reportErrorForOffset(
             StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
             offset,
             length);
         return;
-      case "CONST_AFTER_FACTORY":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.CONST_AFTER_FACTORY, offset, length);
-        return;
-      case "CONST_AND_COVARIANT":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.CONST_AND_COVARIANT, offset, length);
-        return;
-      case "CONST_AND_FINAL":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.CONST_AND_FINAL, offset, length);
-        return;
-      case "CONST_AND_VAR":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.CONST_AND_VAR, offset, length);
-        return;
-      case "CONST_CLASS":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.CONST_CLASS, offset, length);
-        return;
       case "CONST_CONSTRUCTOR_WITH_BODY":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, offset, length);
@@ -110,10 +72,6 @@
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.CONST_NOT_INITIALIZED, offset, length, [name]);
         return;
-      case "CONSTRUCTOR_WITH_RETURN_TYPE":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, offset, length);
-        return;
       case "CONTINUE_WITHOUT_LABEL_IN_CASE":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, offset, length);
@@ -202,30 +160,10 @@
             offset,
             length);
         return;
-      case "EXTERNAL_AFTER_CONST":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.EXTERNAL_AFTER_CONST, offset, length);
-        return;
-      case "EXTERNAL_AFTER_FACTORY":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.EXTERNAL_AFTER_FACTORY, offset, length);
-        return;
-      case "EXTERNAL_AFTER_STATIC":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.EXTERNAL_AFTER_STATIC, offset, length);
-        return;
       case "EXTERNAL_CONSTRUCTOR_WITH_BODY":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, offset, length);
         return;
-      case "EXTERNAL_FIELD":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.EXTERNAL_FIELD, offset, length);
-        return;
-      case "EXTERNAL_METHOD_WITH_BODY":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.EXTERNAL_METHOD_WITH_BODY, offset, length);
-        return;
       case "EXTERNAL_TYPEDEF":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.EXTERNAL_TYPEDEF, offset, length);
@@ -279,12 +217,6 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.GETTER_WITH_PARAMETERS, offset, length);
         return;
-      case "ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE,
-            offset,
-            length);
-        return;
       case "ILLEGAL_CHARACTER":
         errorReporter?.reportErrorForOffset(
             ScannerErrorCode.ILLEGAL_CHARACTER, offset, length);
@@ -310,18 +242,6 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.INVALID_LITERAL_IN_CONFIGURATION, offset, length);
         return;
-      case "IMPLEMENTS_BEFORE_EXTENDS":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, offset, length);
-        return;
-      case "IMPLEMENTS_BEFORE_ON":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.IMPLEMENTS_BEFORE_ON, offset, length);
-        return;
-      case "IMPLEMENTS_BEFORE_WITH":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.IMPLEMENTS_BEFORE_WITH, offset, length);
-        return;
       case "IMPORT_OF_NON_LIBRARY":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY, offset, length);
@@ -364,7 +284,7 @@
         return;
       case "INVALID_METHOD_OVERRIDE":
         errorReporter?.reportErrorForOffset(
-            StrongModeCode.INVALID_METHOD_OVERRIDE, offset, length);
+            CompileTimeErrorCode.INVALID_OVERRIDE, offset, length);
         return;
       case "INVALID_MODIFIER_ON_SETTER":
         _reportByCode(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, message,
@@ -530,27 +450,6 @@
     }
   }
 
-  void reportCompilationMessage(CompilationMessage message) {
-    String errorCodeStr = message.analyzerCode;
-    ErrorCode errorCode = _getErrorCode(errorCodeStr);
-    if (errorCode != null) {
-      errorReporter.reportError(new AnalysisError.forValues(
-          errorReporter.source,
-          message.span.start.offset,
-          message.span.length,
-          errorCode,
-          message.message,
-          message.tip));
-    } else if (message.severity != Severity.context) {
-      // Messages with [Severity.context] are supposed to give extra information
-      // to messages of other kinds, and it should be possible to ignore them
-      // without affecting the discoverability of compile-time errors.  See also
-      // https://github.com/dart-lang/sdk/issues/33730.
-      throw new StateError('Unable to convert (${message.code}, $errorCodeStr, '
-          '@${message.span.start.offset}, $message)');
-    }
-  }
-
   /// Report an error based on the given [message] whose range is described by
   /// the given [offset] and [length].
   void reportMessage(Message message, int offset, int length) {
@@ -569,7 +468,7 @@
         return;
       }
     }
-    reportByCode(code.analyzerCode, offset, length, message);
+    reportByCode(code.analyzerCodes?.first, offset, length, message);
   }
 
   void reportScannerError(
@@ -591,25 +490,4 @@
           null));
     }
   }
-
-  /// Return the [ErrorCode] for the given [shortName], or `null` if not found.
-  static ErrorCode _getErrorCode(String shortName) {
-    const prefixes = const {
-      CompileTimeErrorCode: 'CompileTimeErrorCode.',
-      StrongModeCode: 'StrongModeCode.STRONG_MODE_',
-      ResolverErrorCode: 'ResolverErrorCode.',
-      ParserErrorCode: 'ParserErrorCode.',
-      ScannerErrorCode: 'ScannerErrorCode.',
-      StaticTypeWarningCode: 'StaticTypeWarningCode.',
-      StaticWarningCode: 'StaticWarningCode.'
-    };
-    for (var prefix in prefixes.values) {
-      var uniqueName = '$prefix$shortName';
-      var errorCode = errorCodeByUniqueName(uniqueName);
-      if (errorCode != null) {
-        return errorCode;
-      }
-    }
-    return null;
-  }
 }
diff --git a/pkg/analyzer/lib/src/file_system/file_system.dart b/pkg/analyzer/lib/src/file_system/file_system.dart
index 8a6ea4b..183b8d1 100644
--- a/pkg/analyzer/lib/src/file_system/file_system.dart
+++ b/pkg/analyzer/lib/src/file_system/file_system.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/util/uri.dart';
 
 /**
  * A [UriResolver] for [Resource]s.
@@ -25,12 +26,9 @@
     if (!isFileUri(uri)) {
       return null;
     }
-    String path = _provider.pathContext.fromUri(uri);
-    Resource resource = _provider.getResource(path);
-    if (resource is File) {
-      return resource.createSource(actualUri ?? uri);
-    }
-    return null;
+    String path = fileUriToNormalizedPath(_provider.pathContext, uri);
+    File file = _provider.getFile(path);
+    return file.createSource(actualUri ?? uri);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/bazel.dart b/pkg/analyzer/lib/src/generated/bazel.dart
index ae17e37..68e19fb 100644
--- a/pkg/analyzer/lib/src/generated/bazel.dart
+++ b/pkg/analyzer/lib/src/generated/bazel.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/workspace.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:path/path.dart';
 
 /**
@@ -30,7 +31,7 @@
     if (!ResourceUriResolver.isFileUri(uri)) {
       return null;
     }
-    String path = provider.pathContext.fromUri(uri);
+    String path = fileUriToNormalizedPath(provider.pathContext, uri);
     File file = workspace.findFile(path);
     if (file != null) {
       return file.createSource(actualUri ?? uri);
@@ -205,6 +206,9 @@
     Context context = provider.pathContext;
     try {
       String relative = context.relative(absolutePath, from: root);
+      if (relative == '.') {
+        return null;
+      }
       // genfiles
       if (genfiles != null) {
         File file = provider.getFile(context.join(genfiles, relative));
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 286a2f7..b759dd0 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -17,6 +17,7 @@
         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/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -83,6 +84,11 @@
  */
 class ElementResolver extends SimpleAstVisitor<Object> {
   /**
+   * The manager for the inheritance mappings.
+   */
+  final InheritanceManager2 _inheritance;
+
+  /**
    * The resolver driving this participant.
    */
   final ResolverVisitor _resolver;
@@ -90,7 +96,7 @@
   /**
    * The element for the library containing the compilation unit being visited.
    */
-  LibraryElement _definingLibrary;
+  final LibraryElement _definingLibrary;
 
   /**
    * The type representing the type 'dynamic'.
@@ -114,8 +120,9 @@
    * Initialize a newly created visitor to work for the given [_resolver] to
    * resolve the nodes in a compilation unit.
    */
-  ElementResolver(this._resolver, {this.reportConstEvaluationErrors: true}) {
-    this._definingLibrary = _resolver.definingLibrary;
+  ElementResolver(this._resolver, {this.reportConstEvaluationErrors: true})
+      : _inheritance = _resolver.inheritance,
+        _definingLibrary = _resolver.definingLibrary {
     _dynamicType = _resolver.typeProvider.dynamicType;
     _typeType = _resolver.typeProvider.typeType;
     _promoteManager = _resolver.promoteManager;
@@ -598,7 +605,7 @@
           if (staticType is InterfaceTypeImpl) {
             staticElement = staticType.lookUpInheritedMember(
                 methodName.name, _definingLibrary,
-                concrete: true);
+                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.
@@ -649,8 +656,8 @@
     //
     // Then check for error conditions.
     //
-    ErrorCode errorCode =
-        _checkForInvocationError(target, true, staticElement, staticType);
+    ErrorCode errorCode = _checkForInvocationError(
+        target, true, staticElement, staticType, methodName.name);
     if (errorCode != null &&
         target is SimpleIdentifier &&
         target.staticElement is PrefixElement) {
@@ -1122,7 +1129,7 @@
    * invocation is in a static constant (does not have access to instance state).
    */
   ErrorCode _checkForInvocationError(Expression target, bool useStaticContext,
-      Element element, DartType type) {
+      Element element, DartType type, String name) {
     // Prefix is not declared, instead "prefix.id" are declared.
     if (element is PrefixElement) {
       return CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT;
@@ -1194,6 +1201,12 @@
             // Proxy-conditional warning, based on state of
             // targetType.getElement()
             return StaticTypeWarningCode.UNDEFINED_METHOD;
+          } else if (targetType.isDynamic) {
+            PropertyAccessorElement getter =
+                _resolver.typeProvider.objectType.getGetter(name);
+            if (getter != null && getter.returnType is! FunctionType) {
+              return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+            }
           }
         }
       }
@@ -1568,6 +1581,25 @@
   }
 
   /**
+   * Look up the [FunctionType] of a getter or a method with the given [name]
+   * in the given [targetType].  The [target] is the target of the invocation,
+   * or `null` if there is no target.
+   */
+  FunctionType _lookUpGetterType(
+      Expression target, DartType targetType, String name) {
+    targetType = _resolveTypeParameter(targetType);
+    if (targetType is InterfaceType) {
+      var nameObject = new Name(_definingLibrary.source.uri, name);
+      return _inheritance.getMember(
+        targetType,
+        nameObject,
+        forSuper: target is SuperExpression,
+      );
+    }
+    return null;
+  }
+
+  /**
    * Look up the method with the given [methodName] 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
@@ -1861,23 +1893,24 @@
   void _resolveBinaryExpression(BinaryExpression node, String methodName) {
     Expression leftOperand = node.leftOperand;
     if (leftOperand != null) {
-      DartType staticType = _getStaticType(leftOperand);
-      MethodElement staticMethod =
-          _lookUpMethod(leftOperand, staticType, methodName);
-      node.staticElement = staticMethod;
-      if (_shouldReportMissingMember(staticType, staticMethod)) {
+      DartType leftType = _getStaticType(leftOperand);
+      var invokeType = _lookUpGetterType(leftOperand, leftType, methodName);
+      var invokeElement = invokeType?.element;
+      node.staticElement = invokeElement;
+      node.staticInvokeType = invokeType;
+      if (_shouldReportMissingMember(leftType, invokeElement)) {
         if (leftOperand is SuperExpression) {
           _recordUndefinedToken(
-              staticType.element,
+              leftType.element,
               StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
               node.operator,
-              [methodName, staticType.displayName]);
+              [methodName, leftType.displayName]);
         } else {
           _recordUndefinedToken(
-              staticType.element,
+              leftType.element,
               StaticTypeWarningCode.UNDEFINED_OPERATOR,
               node.operator,
-              [methodName, staticType.displayName]);
+              [methodName, leftType.displayName]);
         }
       }
     }
@@ -2090,7 +2123,9 @@
         if (staticType is InterfaceTypeImpl) {
           staticElement = staticType.lookUpInheritedMember(
               propertyName.name, _definingLibrary,
-              setter: propertyName.inSetterContext(), concrete: true);
+              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.
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 75b6951..5c1d7ec 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -33,8 +33,8 @@
 import 'package:analyzer/src/task/manager.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/src/task/yaml.dart';
-import 'package:front_end/src/base/api_signature.dart';
-import 'package:front_end/src/base/timestamped_data.dart';
+import 'package:analyzer/src/summary/api_signature.dart';
+import 'package:analyzer/src/generated/timestamped_data.dart';
 import 'package:front_end/src/fasta/scanner/token.dart';
 import 'package:html/dom.dart' show Document;
 import 'package:path/path.dart' as pathos;
@@ -42,7 +42,8 @@
 import 'package:plugin/plugin.dart';
 
 export 'package:analyzer/error/listener.dart' show RecordingErrorListener;
-export 'package:front_end/src/base/timestamped_data.dart' show TimestampedData;
+export 'package:analyzer/src/generated/timestamped_data.dart'
+    show TimestampedData;
 
 /**
  * Used by [AnalysisOptions] to allow function bodies to be analyzed in some
@@ -1372,11 +1373,6 @@
   static const int DEFAULT_CACHE_SIZE = 64;
 
   /**
-   * The default list of non-nullable type names.
-   */
-  static const List<String> NONNULLABLE_TYPES = const <String>[];
-
-  /**
    * The length of the list returned by [unlinkedSignature].
    */
   static const int unlinkedSignatureLength = 4;
@@ -1486,12 +1482,6 @@
   bool implicitCasts = true;
 
   /**
-   * A list of non-nullable type names, prefixed by the library URI they belong
-   * to, e.g., 'dart:core,int', 'dart:core,bool', 'file:///foo.dart,bar', etc.
-   */
-  List<String> nonnullableTypes = NONNULLABLE_TYPES;
-
-  /**
    * A flag indicating whether implicit dynamic type is allowed, on by default.
    *
    * This flag can be used without necessarily enabling [strongMode], but it is
@@ -1539,7 +1529,6 @@
       declarationCasts = options.declarationCasts;
       strongModeHints = options.strongModeHints;
       implicitCasts = options.implicitCasts;
-      nonnullableTypes = options.nonnullableTypes;
       implicitDynamic = options.implicitDynamic;
       isMixinSupportEnabled = options.isMixinSupportEnabled;
     }
@@ -1753,7 +1742,6 @@
     implicitDynamic = true;
     lint = false;
     _lintRules = null;
-    nonnullableTypes = NONNULLABLE_TYPES;
     patchPaths = {};
     preserveComments = true;
     strongModeHints = false;
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index cf3cc20..6849b9a 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -16,7 +16,7 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.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/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
@@ -37,24 +37,6 @@
  */
 class ErrorVerifier extends RecursiveAstVisitor<Object> {
   /**
-   * Static final string with value `"getter "` used in the construction of the
-   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and
-   * similar, error code messages.
-   *
-   * See [_checkForNonAbstractClassInheritsAbstractMember].
-   */
-  static String _GETTER_SPACE = "getter ";
-
-  /**
-   * Static final string with value `"setter "` used in the construction of the
-   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and
-   * similar, error code messages.
-   *
-   * See [_checkForNonAbstractClassInheritsAbstractMember].
-   */
-  static String _SETTER_SPACE = "setter ";
-
-  /**
    * The error reporter by which errors will be reported.
    */
   final ErrorReporter _errorReporter;
@@ -95,6 +77,11 @@
   final InheritanceManager _inheritanceManager;
 
   /**
+   * The manager for the inheritance mappings.
+   */
+  final InheritanceManager2 _inheritanceManager2;
+
+  /**
    * A flag indicating whether the visitor is currently within a constructor
    * declaration that is 'const'.
    *
@@ -305,8 +292,13 @@
   /**
    * Initialize a newly created error verifier.
    */
-  ErrorVerifier(ErrorReporter errorReporter, this._currentLibrary,
-      this._typeProvider, this._inheritanceManager, this.enableSuperMixins,
+  ErrorVerifier(
+      ErrorReporter errorReporter,
+      this._currentLibrary,
+      this._typeProvider,
+      this._inheritanceManager,
+      this._inheritanceManager2,
+      this.enableSuperMixins,
       {this.disableConflictingGenericsCheck: false})
       : _errorReporter = errorReporter,
         _uninstantiatedBoundChecker =
@@ -411,6 +403,7 @@
           StaticTypeWarningCode.NON_BOOL_OPERAND, [lexeme]);
       _checkForAssignability(node.rightOperand, _boolType,
           StaticTypeWarningCode.NON_BOOL_OPERAND, [lexeme]);
+      _checkForUseOfVoidResult(node.rightOperand);
     } else {
       _checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
     }
@@ -927,6 +920,12 @@
   }
 
   @override
+  Object visitInterpolationExpression(InterpolationExpression node) {
+    _checkForUseOfVoidResult(node.expression);
+    return super.visitInterpolationExpression(node);
+  }
+
+  @override
   Object visitIsExpression(IsExpression node) {
     _checkForTypeAnnotationDeferredClass(node.type);
     _checkForUseOfVoidResult(node.expression);
@@ -996,7 +995,6 @@
         _checkForWrongNumberOfParametersForOperator(node);
         _checkForNonVoidReturnTypeForOperator(node);
       }
-      _checkForConcreteClassWithAbstractMember(node);
       _checkForTypeAnnotationDeferredClass(returnType);
       _checkForIllegalReturnType(returnType);
       _checkForImplicitDynamicReturn(node, node.declaredElement);
@@ -1329,6 +1327,7 @@
       }
       _errorReporter.reportErrorForNode(errorCode, node);
     }
+    _checkForUseOfVoidResult(node.expression);
     return super.visitYieldStatement(node);
   }
 
@@ -1349,8 +1348,6 @@
         !_checkForAllMixinErrorCodes(withClause)) {
       _checkForImplicitDynamicType(superclass);
       _checkForExtendsDeferredClass(superclass);
-      _checkForNonAbstractClassInheritsAbstractMember(node.name);
-      _checkForInconsistentMethodInheritance();
       _checkForRecursiveInterfaceInheritance(_enclosingClass);
       _checkForConflictingClassMembers();
       _checkForRepeatedType(implementsClause?.interfaces,
@@ -1911,10 +1908,14 @@
       return false;
     }
     bool problemReported = false;
-    for (int i = 0; i < withClause.mixinTypes.length; i++) {
-      TypeName mixinName = withClause.mixinTypes[i];
+    int mixinTypeIndex = -1;
+    for (int mixinNameIndex = 0;
+        mixinNameIndex < withClause.mixinTypes.length;
+        mixinNameIndex++) {
+      TypeName mixinName = withClause.mixinTypes[mixinNameIndex];
       DartType mixinType = mixinName.type;
       if (mixinType is InterfaceType) {
+        mixinTypeIndex++;
         if (_checkForExtendsOrImplementsDisallowedClass(
             mixinName, CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
           problemReported = true;
@@ -1925,10 +1926,12 @@
             problemReported = true;
           }
           if (mixinElement.isMixin) {
-            if (_checkForMixinSuperclassConstraints(mixinName, i)) {
+            if (_checkForMixinSuperclassConstraints(
+                mixinNameIndex, mixinName)) {
               problemReported = true;
             }
-            if (_checkForMixinSuperInvokedMembers(i, mixinName, mixinElement)) {
+            if (_checkForMixinSuperInvokedMembers(
+                mixinTypeIndex, mixinName, mixinElement, mixinType)) {
               problemReported = true;
             }
           } else {
@@ -2087,8 +2090,8 @@
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.AMBIGUOUS_EXPORT, directive, [
           name,
-          prevElement.library.definingCompilationUnit.displayName,
-          element.library.definingCompilationUnit.displayName
+          prevElement.library.definingCompilationUnit.source.uri,
+          element.library.definingCompilationUnit.source.uri
         ]);
         return;
       } else {
@@ -2435,38 +2438,6 @@
   }
 
   /**
-   * Verify that the given [method] declaration is abstract only if the
-   * enclosing class is also abstract.
-   *
-   * See [StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER].
-   */
-  void _checkForConcreteClassWithAbstractMember(MethodDeclaration method) {
-    if (method.isAbstract &&
-        _enclosingClass != null &&
-        !_enclosingClass.isAbstract) {
-      SimpleIdentifier nameNode = method.name;
-      String memberName = nameNode.name;
-      ExecutableElement overriddenMember;
-      if (method.isGetter) {
-        overriddenMember = _enclosingClass.lookUpInheritedConcreteGetter(
-            memberName, _currentLibrary);
-      } else if (method.isSetter) {
-        overriddenMember = _enclosingClass.lookUpInheritedConcreteSetter(
-            memberName, _currentLibrary);
-      } else {
-        overriddenMember = _enclosingClass.lookUpInheritedConcreteMethod(
-            memberName, _currentLibrary);
-      }
-      if (overriddenMember == null && !_enclosingClass.hasNoSuchMethod) {
-        _errorReporter.reportErrorForNode(
-            StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
-            nameNode,
-            [memberName, _enclosingClass.displayName]);
-      }
-    }
-  }
-
-  /**
    * Verify that the [_enclosingClass] does not have a method and getter pair
    * with the same name on, via inheritance.
    *
@@ -2958,8 +2929,8 @@
         if (!name.isEmpty) {
           _errorReporter.reportErrorForNode(
               StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAMED, directive, [
-            prevLibrary.definingCompilationUnit.displayName,
-            exportedLibrary.definingCompilationUnit.displayName,
+            prevLibrary.definingCompilationUnit.source.uri.toString(),
+            exportedLibrary.definingCompilationUnit.source.uri.toString(),
             name
           ]);
         }
@@ -3061,13 +3032,10 @@
    * Verify that the given [typeName] does not extend, implement or mixin
    * classes such as 'num' or 'String'.
    *
-   * See [_checkForExtendsDisallowedClass],
-   * [_checkForExtendsDisallowedClassInTypeAlias],
-   * [_checkForImplementsClauseErrorCodes],
-   * [_checkForAllMixinErrorCodes],
-   * [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS],
-   * [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS], and
-   * [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS].
+   * TODO(scheglov) Remove this method, when all inheritance / override
+   * is concentrated. We keep it for now only because we need to know when
+   * inheritance is completely wrong, so that we don't need to check anything
+   * else.
    */
   bool _checkForExtendsOrImplementsDisallowedClass(
       TypeName typeName, ErrorCode errorCode) {
@@ -3079,36 +3047,7 @@
     if (_currentLibrary.source.isInSystemLibrary) {
       return false;
     }
-    DartType superType = typeName.type;
-    for (InterfaceType disallowedType
-        in _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT) {
-      if (superType != null && superType == disallowedType) {
-        // if the violating type happens to be 'num', we need to rule out the
-        // case where the enclosing class is 'int' or 'double'
-        if (superType == _typeProvider.numType) {
-          AstNode grandParent = typeName.parent.parent;
-          // Note: this is a corner case that won't happen often, so adding a
-          // field currentClass (see currentFunction) to ErrorVerifier isn't
-          // worth if for this case, but if the field currentClass is added,
-          // then this message should become a to-do to not lookup the
-          // grandparent node.
-          if (grandParent is ClassDeclaration) {
-            ClassElement classElement = grandParent.declaredElement;
-            DartType classType = classElement.type;
-            if (classType != null &&
-                (classType == _intType ||
-                    classType == _typeProvider.doubleType)) {
-              return false;
-            }
-          }
-        }
-        // otherwise, report the error
-        _errorReporter.reportErrorForNode(
-            errorCode, typeName, [disallowedType.displayName]);
-        return true;
-      }
-    }
-    return false;
+    return _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT.contains(typeName.type);
   }
 
   /**
@@ -3572,8 +3511,8 @@
       if (prevLibrary != nodeLibrary && !name.isEmpty) {
         _errorReporter.reportErrorForNode(
             StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED, directive, [
-          prevLibrary.definingCompilationUnit.displayName,
-          nodeLibrary.definingCompilationUnit.displayName,
+          prevLibrary.definingCompilationUnit.source.uri,
+          nodeLibrary.definingCompilationUnit.source.uri,
           name
         ]);
       }
@@ -3616,27 +3555,6 @@
   }
 
   /**
-   * For each class declaration, this method is called which verifies that all
-   * inherited members are inherited consistently.
-   *
-   * See [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE].
-   */
-  void _checkForInconsistentMethodInheritance() {
-    // Ensure that the inheritance manager has a chance to generate all errors
-    // we may care about, note that we ensure that the interfaces data since
-    // there are no errors.
-    _inheritanceManager.getMembersInheritedFromInterfaces(_enclosingClass);
-    Set<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
-    if (errors == null || errors.isEmpty) {
-      return;
-    }
-    for (AnalysisError error in errors) {
-      _errorReporter.reportError(error);
-    }
-    return;
-  }
-
-  /**
    * Check for a type mis-match between the iterable expression and the
    * assigned variable in a for-in statement.
    */
@@ -4246,15 +4164,15 @@
   }
 
   /// Check that superclass constrains for the mixin type of [mixinName] at
-  /// the [index] position in the mixins list are satisfied by the
+  /// the [mixinIndex] position in the mixins list are satisfied by the
   /// [_enclosingClass], or a previous mixin.
-  bool _checkForMixinSuperclassConstraints(TypeName mixinName, int index) {
+  bool _checkForMixinSuperclassConstraints(int mixinIndex, TypeName mixinName) {
     InterfaceType mixinType = mixinName.type;
     for (var constraint in mixinType.superclassConstraints) {
       bool isSatisfied =
           _typeSystem.isSubtypeOf(_enclosingClass.supertype, constraint);
       if (!isSatisfied) {
-        for (int i = 0; i < index && !isSatisfied; i++) {
+        for (int i = 0; i < mixinIndex && !isSatisfied; i++) {
           isSatisfied =
               _typeSystem.isSubtypeOf(_enclosingClass.mixins[i], constraint);
         }
@@ -4273,19 +4191,24 @@
   /// Check that the superclass of the given [mixinElement] at the given
   /// [mixinIndex] in the list of mixins of [_enclosingClass] has concrete
   /// implementations of all the super-invoked members of the [mixinElement].
-  bool _checkForMixinSuperInvokedMembers(
-      int mixinIndex, TypeName mixinName, ClassElement mixinElement) {
-    ClassElementImpl mixinElementImpl = mixinElement is ClassElementHandle
-        ? mixinElement.actualElement
-        : mixinElement;
+  bool _checkForMixinSuperInvokedMembers(int mixinIndex, TypeName mixinName,
+      ClassElement mixinElement, InterfaceType mixinType) {
+    ClassElementImpl mixinElementImpl =
+        AbstractClassElementImpl.getImpl(mixinElement);
+    if (mixinElementImpl.superInvokedNames.isEmpty) {
+      return false;
+    }
+
     InterfaceTypeImpl enclosingType = _enclosingClass.type;
+    Uri mixinLibraryUri = mixinElement.librarySource.uri;
     for (var name in mixinElementImpl.superInvokedNames) {
-      var superMember = enclosingType.lookUpInheritedMember(
-          name, _currentLibrary,
-          concrete: true,
-          stopMixinIndex: mixinIndex,
-          setter: name.endsWith('='));
-      if (superMember == null) {
+      var nameObject = new Name(mixinLibraryUri, name);
+
+      var superMemberType = _inheritanceManager2.getMember(
+          enclosingType, nameObject,
+          forMixinIndex: mixinIndex, forSuper: true);
+
+      if (superMemberType == null) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode
                 .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
@@ -4294,12 +4217,11 @@
         return true;
       }
 
-      var mixinMember =
-          _inheritanceManager.lookupInheritance(mixinElement, name);
-      var superMemberType = superMember.type;
-      var mixinMemberType = mixinMember?.type;
+      FunctionType mixinMemberType =
+          _inheritanceManager2.getMember(mixinType, nameObject);
+
       if (mixinMemberType != null &&
-          !_typeSystem.isSubtypeOf(superMemberType, mixinMemberType)) {
+          !_typeSystem.isOverrideSubtypeOf(superMemberType, mixinMemberType)) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode
                 .MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE,
@@ -4516,98 +4438,6 @@
   }
 
   /**
-   * Check that the given class declaration overrides all members required by
-   * its superclasses and interfaces. The [classNameNode] is the
-   * [SimpleIdentifier] to be used if there is a violation, this is either the
-   * named from the [ClassDeclaration] or from the [ClassTypeAlias].
-   *
-   * See [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE],
-   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO],
-   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE],
-   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR], and
-   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS].
-   */
-  void _checkForNonAbstractClassInheritsAbstractMember(
-      SimpleIdentifier classNameNode) {
-    if (_enclosingClass.isAbstract) {
-      return;
-    } else if (_enclosingClass.hasNoSuchMethod) {
-      return;
-    }
-
-    Set<ExecutableElement> missingOverrides = computeMissingOverrides(
-        _typeProvider, _typeSystem, _inheritanceManager, _enclosingClass);
-    if (missingOverrides.isEmpty) {
-      return;
-    }
-
-    List<String> missingOverrideNames = <String>[];
-    for (ExecutableElement element in missingOverrides) {
-      Element enclosingElement = element.enclosingElement;
-      String prefix = StringUtilities.EMPTY;
-      if (element is PropertyAccessorElement) {
-        if (element.isGetter) {
-          prefix = _GETTER_SPACE;
-          // "getter "
-        } else {
-          prefix = _SETTER_SPACE;
-          // "setter "
-        }
-      }
-      String newStrMember;
-      if (enclosingElement != null) {
-        newStrMember =
-            "$prefix'${enclosingElement.displayName}.${element.displayName}'";
-      } else {
-        newStrMember = "$prefix'${element.displayName}'";
-      }
-      missingOverrideNames.add(newStrMember);
-    }
-    missingOverrideNames.sort();
-
-    if (missingOverrideNames.length == 1) {
-      _errorReporter.reportErrorForNode(
-          StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          classNameNode,
-          [missingOverrideNames[0]]);
-    } else if (missingOverrideNames.length == 2) {
-      _errorReporter.reportErrorForNode(
-          StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
-          classNameNode,
-          [missingOverrideNames[0], missingOverrideNames[1]]);
-    } else if (missingOverrideNames.length == 3) {
-      _errorReporter.reportErrorForNode(
-          StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
-          classNameNode, [
-        missingOverrideNames[0],
-        missingOverrideNames[1],
-        missingOverrideNames[2]
-      ]);
-    } else if (missingOverrideNames.length == 4) {
-      _errorReporter.reportErrorForNode(
-          StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
-          classNameNode, [
-        missingOverrideNames[0],
-        missingOverrideNames[1],
-        missingOverrideNames[2],
-        missingOverrideNames[3]
-      ]);
-    } else {
-      _errorReporter.reportErrorForNode(
-          StaticWarningCode
-              .NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
-          classNameNode,
-          [
-            missingOverrideNames[0],
-            missingOverrideNames[1],
-            missingOverrideNames[2],
-            missingOverrideNames[3],
-            missingOverrideNames.length - 4
-          ]);
-    }
-  }
-
-  /**
    * Check to ensure that the [condition] is of type bool, are. Otherwise an
    * error is reported on the expression.
    *
@@ -5355,29 +5185,47 @@
    * [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_BOUND].
    */
   void _checkForTypeArgumentNotMatchingBounds(TypeName typeName) {
-    if (typeName.typeArguments == null) {
-      return;
-    }
     // prepare Type
     DartType type = typeName.type;
     if (type == null) {
       return;
     }
-    Element element = type.element;
-    if (element is ClassElement) {
+    if (type is ParameterizedType) {
+      var element = type.element;
       // prepare type parameters
-      List<TypeParameterElement> parameterElements = element.typeParameters;
-      List<DartType> parameterTypes = element.type.typeArguments;
-      List<DartType> arguments = (type as ParameterizedType).typeArguments;
+      List<TypeParameterElement> parameterElements;
+      if (element is ClassElement) {
+        parameterElements = element.typeParameters;
+      } else if (element is GenericTypeAliasElement) {
+        parameterElements = element.typeParameters;
+      } else if (element is GenericFunctionTypeElement) {
+        // TODO(paulberry): it seems like either this case or the one above
+        // should be unnecessary.
+        FunctionTypeAliasElement typedefElement = element.enclosingElement;
+        parameterElements = typedefElement.typeParameters;
+      } else {
+        // There are no other kinds of parameterized types.
+        throw new UnimplementedError(
+            'Unexpected element associated with parameterized type: '
+            '${element.runtimeType}');
+      }
+      var parameterTypes =
+          parameterElements.map<DartType>((p) => p.type).toList();
+      List<DartType> arguments = type.typeArguments;
       // iterate over each bounded type parameter and corresponding argument
-      NodeList<TypeAnnotation> argumentNodes = typeName.typeArguments.arguments;
+      NodeList<TypeAnnotation> argumentNodes =
+          typeName.typeArguments?.arguments;
+      var typeArguments = type.typeArguments;
       int loopThroughIndex =
-          math.min(argumentNodes.length, parameterElements.length);
+          math.min(typeArguments.length, parameterElements.length);
       bool shouldSubstitute =
           arguments.length != 0 && arguments.length == parameterTypes.length;
       for (int i = 0; i < loopThroughIndex; i++) {
-        TypeAnnotation argumentNode = argumentNodes[i];
-        DartType argType = argumentNode.type;
+        DartType argType = typeArguments[i];
+        TypeAnnotation argumentNode =
+            argumentNodes != null && i < argumentNodes.length
+                ? argumentNodes[i]
+                : typeName;
         if (argType is FunctionType && argType.typeFormals.isNotEmpty) {
           _errorReporter.reportTypeErrorForNode(
               CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT,
@@ -5400,6 +5248,15 @@
               errorCode =
                   StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
             }
+            if (_shouldAllowSuperBoundedTypes(typeName)) {
+              var replacedType =
+                  (argType as TypeImpl).replaceTopAndBottom(_typeProvider);
+              if (!identical(replacedType, argType) &&
+                  _typeSystem.isSubtypeOf(replacedType, boundType)) {
+                // Bound is satisfied under super-bounded rules, so we're ok.
+                continue;
+              }
+            }
             _errorReporter.reportTypeErrorForNode(
                 errorCode, argumentNode, [argType, boundType]);
           }
@@ -5861,7 +5718,6 @@
     if (!_checkForOnClauseErrorCodes(onClause) &&
         !_checkForImplementsClauseErrorCodes(implementsClause)) {
 //      _checkForImplicitDynamicType(superclass);
-      _checkForInconsistentMethodInheritance();
       _checkForRecursiveInterfaceInheritance(_enclosingClass);
       _checkForConflictingClassMembers();
       _checkForRepeatedType(
@@ -6116,7 +5972,7 @@
     int count = imports.length;
     for (int i = 0; i < count; i++) {
       if (identical(imports[i].importedLibrary, library)) {
-        return library.definingCompilationUnit.displayName;
+        return library.definingCompilationUnit.source.uri.toString();
       }
     }
     List<String> indirectSources = new List<String>();
@@ -6126,15 +5982,15 @@
         for (LibraryElement exportedLibrary
             in importedLibrary.exportedLibraries) {
           if (identical(exportedLibrary, library)) {
-            indirectSources
-                .add(importedLibrary.definingCompilationUnit.displayName);
+            indirectSources.add(
+                importedLibrary.definingCompilationUnit.source.uri.toString());
           }
         }
       }
     }
     int indirectCount = indirectSources.length;
     StringBuffer buffer = new StringBuffer();
-    buffer.write(library.definingCompilationUnit.displayName);
+    buffer.write(library.definingCompilationUnit.source.uri.toString());
     if (indirectCount > 0) {
       buffer.write(" (via ");
       if (indirectCount > 1) {
@@ -6298,87 +6154,17 @@
     return false;
   }
 
-  /**
-   * Returns [ExecutableElement]s that are declared in interfaces implemented
-   * by the [classElement], but not implemented by the [classElement] or its
-   * superclasses.
-   */
-  static Set<ExecutableElement> computeMissingOverrides(
-      TypeProvider typeProvider,
-      TypeSystem typeSystem,
-      InheritanceManager inheritanceManager,
-      ClassElement classElement) {
-    //
-    // Store in local sets the set of all method and accessor names
-    //
-    HashSet<ExecutableElement> missingOverrides =
-        new HashSet<ExecutableElement>();
-    //
-    // Loop through the set of all executable elements declared in the implicit
-    // interface.
-    //
-    Map<String, ExecutableElement> membersInheritedFromInterfaces =
-        inheritanceManager.getMembersInheritedFromInterfaces(classElement);
-    Map<String, ExecutableElement> membersInheritedFromSuperclasses =
-        inheritanceManager.getMembersInheritedFromClasses(classElement);
-    for (String memberName in membersInheritedFromInterfaces.keys) {
-      ExecutableElement executableElt =
-          membersInheritedFromInterfaces[memberName];
-      if (memberName == null) {
-        break;
-      }
-      // If the element is not synthetic and can be determined to be defined in
-      // Object, skip it.
-      if (executableElt.enclosingElement != null &&
-          (executableElt.enclosingElement as ClassElement).type.isObject) {
-        continue;
-      }
-      // Check to see if some element is in local enclosing class that matches
-      // the name of the required member.
-      if (_isMemberInClassOrMixin(executableElt, classElement)) {
-        // We do not have to verify that this implementation of the found method
-        // matches the required function type: the set of
-        // StaticWarningCode.INVALID_METHOD_OVERRIDE_* warnings break out the
-        // different specific situations.
-        continue;
-      }
-      // First check to see if this element was declared in the superclass
-      // chain, in which case there is already a concrete implementation.
-      ExecutableElement elt = membersInheritedFromSuperclasses[memberName];
-      // Check to see if an element was found in the superclass chain with the
-      // correct name.
-      if (elt != null) {
-        // Reference the types, if any are null then continue.
-        InterfaceType enclosingType = classElement.type;
-        FunctionType concreteType = elt.type;
-        FunctionType requiredMemberType = executableElt.type;
-        if (enclosingType == null ||
-            concreteType == null ||
-            requiredMemberType == null) {
-          continue;
-        }
-        // Some element was found in the superclass chain that matches the name
-        // of the required member.
-        // If it is not abstract and it is the correct one (types match- the
-        // version of this method that we have has the correct number of
-        // parameters, etc), then this class has a valid implementation of this
-        // method, so skip it.
-        if ((elt is MethodElement && !elt.isAbstract) ||
-            (elt is PropertyAccessorElement && !elt.isAbstract)) {
-          // Override checking for types is done in CodeChecker, so
-          // we can skip it here. Doing it here leads to unnecessary duplicate
-          // error messages in subclasses that inherit from one that has an
-          // override error.
-          //
-          // See: https://github.com/dart-lang/sdk/issues/25232
-          continue;
-        }
-      }
-      // The not qualifying concrete executable element was found, add it to the
-      // list.
-      missingOverrides.add(executableElt);
-    }
-    return missingOverrides;
+  /// Determines if the given [typeName] occurs in a context where super-bounded
+  /// types are allowed.
+  bool _shouldAllowSuperBoundedTypes(TypeName typeName) {
+    var parent = typeName.parent;
+    if (parent is ExtendsClause) return false;
+    if (parent is OnClause) return false;
+    if (parent is ClassTypeAlias) return false;
+    if (parent is WithClause) return false;
+    if (parent is ConstructorName) return false;
+    if (parent is ImplementsClause) return false;
+    return true;
   }
 
   /**
@@ -6446,57 +6232,6 @@
     }
     return null;
   }
-
-  /**
-   * Return `true` iff the given [classElement] has a concrete method, getter or
-   * setter that matches the name of the given [executableElement] in either the
-   * class itself, or one of its' mixins.
-   *
-   * By "match", only the name of the member is tested to match, it does not
-   * have to equal or be a subtype of the given executable element, this is due
-   * to the specific use where this method is used in
-   * [_checkForNonAbstractClassInheritsAbstractMember].
-   */
-  static bool _isMemberInClassOrMixin(
-      ExecutableElement executableElement, ClassElement classElement) {
-    ExecutableElement foundElt = null;
-    String executableName = executableElement.name;
-    if (executableElement is MethodElement) {
-      foundElt = classElement.getMethod(executableName);
-      if (foundElt != null && !foundElt.isAbstract) {
-        return true;
-      }
-      List<InterfaceType> mixins = classElement.mixins;
-      for (int i = 0; i < mixins.length && foundElt == null; i++) {
-        foundElt = mixins[i].getMethod(executableName);
-      }
-      if (foundElt != null && !foundElt.isAbstract) {
-        return true;
-      }
-    } else if (executableElement is PropertyAccessorElement) {
-      if (executableElement.isGetter) {
-        foundElt = classElement.getGetter(executableName);
-      }
-      if (foundElt == null && executableElement.isSetter) {
-        foundElt = classElement.getSetter(executableName);
-      }
-      if (foundElt != null &&
-          !(foundElt as PropertyAccessorElement).isAbstract) {
-        return true;
-      }
-      List<InterfaceType> mixins = classElement.mixins;
-      for (int i = 0; i < mixins.length && foundElt == null; i++) {
-        foundElt = mixins[i].getGetter(executableName);
-        if (foundElt == null) {
-          foundElt = mixins[i].getSetter(executableName);
-        }
-      }
-      if (foundElt != null && !foundElt.isAbstract) {
-        return true;
-      }
-    }
-    return false;
-  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/gn.dart b/pkg/analyzer/lib/src/generated/gn.dart
index ae31823..d703c1c 100644
--- a/pkg/analyzer/lib/src/generated/gn.dart
+++ b/pkg/analyzer/lib/src/generated/gn.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/workspace.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:package_config/packages.dart';
 import 'package:package_config/packages_file.dart';
 import 'package:package_config/src/packages_impl.dart';
@@ -100,8 +101,9 @@
   Map<String, List<Folder>> _convertPackagesToMap(Packages packages) {
     Map<String, List<Folder>> folderMap = new HashMap<String, List<Folder>>();
     if (packages != null && packages != Packages.noPackages) {
+      var pathContext = provider.pathContext;
       packages.asMap().forEach((String packageName, Uri uri) {
-        String path = provider.pathContext.fromUri(uri);
+        String path = fileUriToNormalizedPath(pathContext, uri);
         folderMap[packageName] = [provider.getFolder(path)];
       });
     }
@@ -142,7 +144,8 @@
   void _resolveSymbolicLinks(Map<String, Uri> map) {
     Context pathContext = provider.pathContext;
     for (String packageName in map.keys) {
-      Folder folder = provider.getFolder(pathContext.fromUri(map[packageName]));
+      String path = fileUriToNormalizedPath(pathContext, map[packageName]);
+      Folder folder = provider.getFolder(path);
       String folderPath = _resolveSymbolicLink(folder);
       // Add a '.' so that the URI is suitable for resolving relative URI's
       // against it.
diff --git a/pkg/analyzer/lib/src/generated/package_build.dart b/pkg/analyzer/lib/src/generated/package_build.dart
index 96e2dcf..8effaf9 100644
--- a/pkg/analyzer/lib/src/generated/package_build.dart
+++ b/pkg/analyzer/lib/src/generated/package_build.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/workspace.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:package_config/packages.dart';
 import 'package:path/path.dart';
 import 'package:yaml/yaml.dart';
@@ -34,7 +35,7 @@
     if (!ResourceUriResolver.isFileUri(uri)) {
       return null;
     }
-    String path = provider.pathContext.fromUri(uri);
+    String path = fileUriToNormalizedPath(provider.pathContext, uri);
     File file = workspace.findFile(path);
     if (file != null) {
       return file.createSource(actualUri ?? uri);
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 50e1c08..dcaf2a5 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -204,12 +204,6 @@
   int _errorListenerLock = 0;
 
   /**
-   * A flag indicating whether the parser is to parse the non-nullable modifier
-   * in type names.
-   */
-  bool _enableNnbd = false;
-
-  /**
    * A flag indicating whether the parser should parse instance creation
    * expressions that lack either the `new` or `const` keyword.
    */
@@ -309,20 +303,6 @@
   void set enableAssertInitializer(bool enable) {}
 
   /**
-   * Return `true` if the parser is to parse the non-nullable modifier in type
-   * names.
-   */
-  bool get enableNnbd => _enableNnbd;
-
-  /**
-   * Set whether the parser is to parse the non-nullable modifier in type names
-   * to match the given [enable] flag.
-   */
-  void set enableNnbd(bool enable) {
-    _enableNnbd = enable;
-  }
-
-  /**
    * Return `true` if the parser should parse instance creation expressions that
    * lack either the `new` or `const` keyword.
    */
@@ -2889,7 +2869,6 @@
   ExtendsClause parseExtendsClause() {
     Token keyword = getAndAdvance();
     TypeName superclass = parseTypeName(false);
-    _mustNotBeNullable(superclass, ParserErrorCode.NULLABLE_TYPE_IN_EXTENDS);
     return astFactory.extendsClause(keyword, superclass);
   }
 
@@ -3631,7 +3610,6 @@
     List<TypeName> interfaces = <TypeName>[];
     do {
       TypeName typeName = parseTypeName(false);
-      _mustNotBeNullable(typeName, ParserErrorCode.NULLABLE_TYPE_IN_IMPLEMENTS);
       interfaces.add(typeName);
     } while (_optional(TokenType.COMMA));
     return astFactory.implementsClause(keyword, interfaces);
@@ -4352,10 +4330,6 @@
           _reportErrorForToken(
               ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword);
         }
-        Token question = null;
-        if (enableNnbd && _matches(TokenType.QUESTION)) {
-          question = getAndAdvance();
-        }
         return astFactory.functionTypedFormalParameter2(
             comment: commentAndMetadata.comment,
             metadata: commentAndMetadata.metadata,
@@ -4364,8 +4338,7 @@
             identifier: astFactory.simpleIdentifier(identifier.token,
                 isDeclaration: true),
             typeParameters: typeParameters,
-            parameters: parameters,
-            question: question);
+            parameters: parameters);
       } else {
         return astFactory.fieldFormalParameter2(
             comment: commentAndMetadata.comment,
@@ -5305,10 +5278,6 @@
   TypeParameter parseTypeParameter() {
     CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
     SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
-    if (_matches(TokenType.QUESTION)) {
-      _reportErrorForCurrentToken(ParserErrorCode.NULLABLE_TYPE_PARAMETER);
-      _advance();
-    }
     if (_matchesKeyword(Keyword.EXTENDS)) {
       Token keyword = getAndAdvance();
       TypeAnnotation bound = parseTypeNotVoid(false);
@@ -5564,7 +5533,6 @@
     List<TypeName> types = <TypeName>[];
     do {
       TypeName typeName = parseTypeName(false);
-      _mustNotBeNullable(typeName, ParserErrorCode.NULLABLE_TYPE_IN_WITH);
       types.add(typeName);
     } while (_optional(TokenType.COMMA));
     return astFactory.withClause(withKeyword, types);
@@ -5886,28 +5854,6 @@
   }
 
   /**
-   * Clone all token starting from the given [token] up to the end of the token
-   * stream, and return the first token in the new token stream.
-   */
-  Token _cloneTokens(Token token) {
-    if (token == null) {
-      return null;
-    }
-    token = token is CommentToken ? token.parent : token;
-    Token head = new Token.eof(-1);
-    Token current = head;
-    while (token.type != TokenType.EOF) {
-      Token clone = token.copy();
-      current.setNext(clone);
-      current = clone;
-      token = token.next;
-    }
-    Token tail = new Token.eof(0);
-    current.setNext(tail);
-    return head.next;
-  }
-
-  /**
    * Convert the given [method] declaration into the nearest valid top-level
    * function declaration (that is, the function declaration that most closely
    * captures the components of the given method declaration).
@@ -6196,23 +6142,6 @@
   }
 
   /**
-   * Return `true` if the current token could be the question mark in a
-   * condition expression. The current token is assumed to be a question mark.
-   */
-  bool _isConditionalOperator() {
-    void parseOperation(Parser parser) {
-      parser.parseExpressionWithoutCascade();
-    }
-
-    Token token = _skip(_currentToken.next, parseOperation);
-    if (token == null || !_tokenMatches(token, TokenType.COLON)) {
-      return false;
-    }
-    token = _skip(token.next, parseOperation);
-    return token != null;
-  }
-
-  /**
    * Return `true` if the given [character] is a valid hexadecimal digit.
    */
   bool _isHexDigit(int character) =>
@@ -6414,16 +6343,6 @@
       _tokenMatchesKeyword(_currentToken, keyword);
 
   /**
-   * Report an error with the given [errorCode] if the given [typeName] has been
-   * marked as nullable.
-   */
-  void _mustNotBeNullable(TypeName typeName, ParserErrorCode errorCode) {
-    if (typeName.question != null) {
-      _reportErrorForToken(errorCode, typeName.question);
-    }
-  }
-
-  /**
    * If the current token has the given [type], then advance to the next token
    * and return `true`. Otherwise, return `false` without advancing. This method
    * should not be invoked with an argument value of [TokenType.GT].
@@ -7528,13 +7447,7 @@
       _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TYPE_NAME);
     }
     TypeArgumentList typeArguments = _parseOptionalTypeArguments();
-    Token question = null;
-    if (enableNnbd && _matches(TokenType.QUESTION)) {
-      if (!inExpression || !_isConditionalOperator()) {
-        question = getAndAdvance();
-      }
-    }
-    return astFactory.typeName(typeName, typeArguments, question: question);
+    return astFactory.typeName(typeName, typeArguments);
   }
 
   /**
@@ -7700,39 +7613,6 @@
   }
 
   /**
-   * Execute the given [parseOperation] in a temporary parser whose current
-   * token has been set to the given [startToken]. If the parse does not
-   * generate any errors or exceptions, then return the token following the
-   * matching portion of the token stream. Otherwise, return `null`.
-   *
-   * Note: This is an extremely inefficient way of testing whether the tokens in
-   * the token stream match a given production. It should not be used for
-   * production code.
-   */
-  Token _skip(Token startToken, parseOperation(Parser parser)) {
-    BooleanErrorListener listener = new BooleanErrorListener();
-    Parser parser = new Parser(_source, listener);
-    parser._currentToken = _cloneTokens(startToken);
-    parser._enableNnbd = _enableNnbd;
-    parser._enableOptionalNewAndConst = _enableOptionalNewAndConst;
-    parser._inAsync = _inAsync;
-    parser._inGenerator = _inGenerator;
-    parser._inInitializer = _inInitializer;
-    parser._inLoop = _inLoop;
-    parser._inSwitch = _inSwitch;
-    parser._parseFunctionBodies = _parseFunctionBodies;
-    try {
-      parseOperation(parser);
-    } catch (exception) {
-      return null;
-    }
-    if (listener.errorReported) {
-      return null;
-    }
-    return parser._currentToken;
-  }
-
-  /**
    * Skips a block with all containing blocks.
    */
   void _skipBlock() {
diff --git a/pkg/analyzer/lib/src/generated/parser_fasta.dart b/pkg/analyzer/lib/src/generated/parser_fasta.dart
index 43b0b5f..946f327 100644
--- a/pkg/analyzer/lib/src/generated/parser_fasta.dart
+++ b/pkg/analyzer/lib/src/generated/parser_fasta.dart
@@ -371,9 +371,6 @@
   @override
   bool enableUriInPartOf = true;
 
-  @override
-  bool enableNnbd = false;
-
   factory _Parser2(Source source, AnalysisErrorListener errorListener,
       {bool allowNativeClause: false}) {
     var errorReporter = new ErrorReporter(errorListener, source);
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 2a8bf95..6b40f10 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -19,6 +19,7 @@
 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/member.dart' show ConstructorMember;
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
@@ -34,6 +35,7 @@
 import 'package:analyzer/src/generated/type_system.dart';
 import 'package:path/path.dart' as path;
 
+export 'package:analyzer/src/dart/constant/constant_verifier.dart';
 export 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
 export 'package:analyzer/src/dart/resolver/scope.dart';
 export 'package:analyzer/src/generated/type_system.dart';
@@ -83,7 +85,7 @@
         InstanceCreationExpression instanceCreationExpression =
             astFactory.instanceCreationExpression(
                 _getKeyword(node), constructorName, node.argumentList);
-        InterfaceType type = _getType(element, node.typeArguments);
+        InterfaceType type = getType(typeSystem, element, node.typeArguments);
         ConstructorElement constructorElement =
             type.lookUpConstructor(null, definingLibrary);
         methodName.staticElement = element;
@@ -120,7 +122,7 @@
           InstanceCreationExpression instanceCreationExpression =
               astFactory.instanceCreationExpression(
                   _getKeyword(node), constructorName, node.argumentList);
-          InterfaceType type = _getType(element, typeArguments);
+          InterfaceType type = getType(typeSystem, element, typeArguments);
           constructorElement =
               type.lookUpConstructor(methodName.name, definingLibrary);
           methodName.staticElement = element;
@@ -150,7 +152,8 @@
           InstanceCreationExpression instanceCreationExpression =
               astFactory.instanceCreationExpression(
                   _getKeyword(node), constructorName, node.argumentList);
-          InterfaceType type = _getType(prefixedElement, node.typeArguments);
+          InterfaceType type =
+              getType(typeSystem, prefixedElement, node.typeArguments);
           ConstructorElement constructorElement =
               type.lookUpConstructor(null, definingLibrary);
           methodName.staticElement = element;
@@ -186,7 +189,7 @@
             InstanceCreationExpression instanceCreationExpression =
                 astFactory.instanceCreationExpression(
                     _getKeyword(node), constructorName, node.argumentList);
-            InterfaceType type = _getType(element, typeArguments);
+            InterfaceType type = getType(typeSystem, element, typeArguments);
             constructorElement =
                 type.lookUpConstructor(methodName.name, definingLibrary);
             methodName.staticElement = element;
@@ -214,7 +217,8 @@
 
   /// Return the type of the given class [element] after substituting any type
   /// arguments from the list of [typeArguments] for the class' type parameters.
-  DartType _getType(ClassElement element, TypeArgumentList typeArguments) {
+  static InterfaceType getType(TypeSystem typeSystem, ClassElement element,
+      TypeArgumentList typeArguments) {
     DartType type = element.type;
     List<TypeParameterElement> typeParameters = element.typeParameters;
     if (typeArguments != null &&
@@ -273,14 +277,11 @@
   /// The current library
   LibraryElement _currentLibrary;
 
-  /// The inheritance manager used to find overridden methods.
-  InheritanceManager _manager;
-
   /// Create a new instance of the [BestPracticesVerifier].
   ///
   /// @param errorReporter the error reporter
-  BestPracticesVerifier(this._errorReporter, TypeProvider typeProvider,
-      this._currentLibrary, this._manager,
+  BestPracticesVerifier(
+      this._errorReporter, TypeProvider typeProvider, this._currentLibrary,
       {TypeSystem typeSystem})
       : _nullType = typeProvider.nullType,
         _futureNullType = typeProvider.futureNullType,
@@ -879,8 +880,8 @@
         return;
       }
       ClassElement definingClass = element.enclosingElement;
-      ClassDeclaration accessingClass =
-          identifier.getAncestor((AstNode node) => node is ClassDeclaration);
+      ClassOrMixinDeclaration accessingClass = identifier
+          .getAncestor((AstNode node) => node is ClassOrMixinDeclaration);
       if (_hasTypeOrSuperType(
           accessingClass?.declaredElement, definingClass.type)) {
         return;
@@ -915,19 +916,19 @@
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
           identifier,
-          [identifier.name.toString(), definingClass.name]);
+          [identifier.name.toString(), definingClass.source.uri]);
     }
     if (isVisibleForTemplate(element)) {
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER,
           identifier,
-          [identifier.name.toString(), definingClass.name]);
+          [identifier.name.toString(), definingClass.source.uri]);
     }
     if (isVisibleForTesting(element)) {
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER,
           identifier,
-          [identifier.name.toString(), definingClass.name]);
+          [identifier.name.toString(), definingClass.source.uri]);
     }
   }
 
@@ -1415,606 +1416,6 @@
   }
 }
 
-/// Instances of the class `ConstantVerifier` traverse an AST structure looking
-/// for additional errors and warnings not covered by the parser and resolver.
-/// In particular, it looks for errors and warnings related to constant
-/// expressions.
-class ConstantVerifier extends RecursiveAstVisitor<Object> {
-  /// The error reporter by which errors will be reported.
-  final ErrorReporter _errorReporter;
-
-  /// The type provider used to access the known types.
-  final TypeProvider _typeProvider;
-
-  /// The type system in use.
-  final TypeSystem _typeSystem;
-
-  /// The set of variables declared using '-D' on the command line.
-  final DeclaredVariables declaredVariables;
-
-  /// The type representing the type 'bool'.
-  InterfaceType _boolType;
-
-  /// The type representing the type 'int'.
-  InterfaceType _intType;
-
-  /// The type representing the type 'num'.
-  InterfaceType _numType;
-
-  /// The type representing the type 'string'.
-  InterfaceType _stringType;
-
-  /// The current library that is being analyzed.
-  final LibraryElement _currentLibrary;
-
-  /// Initialize a newly created constant verifier.
-  ///
-  /// @param errorReporter the error reporter by which errors will be reported
-  ConstantVerifier(this._errorReporter, LibraryElement currentLibrary,
-      this._typeProvider, this.declaredVariables)
-      : _currentLibrary = currentLibrary,
-        _typeSystem = currentLibrary.context.typeSystem {
-    this._boolType = _typeProvider.boolType;
-    this._intType = _typeProvider.intType;
-    this._numType = _typeProvider.numType;
-    this._stringType = _typeProvider.stringType;
-  }
-
-  @override
-  Object visitAnnotation(Annotation node) {
-    super.visitAnnotation(node);
-    // check annotation creation
-    Element element = node.element;
-    if (element is ConstructorElement) {
-      // should be 'const' constructor
-      if (!element.isConst) {
-        _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR, node);
-        return null;
-      }
-      // should have arguments
-      ArgumentList argumentList = node.arguments;
-      if (argumentList == null) {
-        _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS, node);
-        return null;
-      }
-      // arguments should be constants
-      _validateConstantArguments(argumentList);
-    }
-    if (node.elementAnnotation?.isSealed == true &&
-        !(node.parent is ClassDeclaration ||
-            node.parent is ClassTypeAlias ||
-            node.parent is MixinDeclaration)) {
-      _errorReporter.reportErrorForNode(
-          HintCode.INVALID_SEALED_ANNOTATION, node.parent, [node.element.name]);
-    }
-    return null;
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    if (node.constKeyword != null) {
-      _validateConstructorInitializers(node);
-      _validateFieldInitializers(node.parent as ClassDeclaration, node);
-    }
-    _validateDefaultValues(node.parameters);
-    return super.visitConstructorDeclaration(node);
-  }
-
-  @override
-  Object visitFunctionExpression(FunctionExpression node) {
-    super.visitFunctionExpression(node);
-    _validateDefaultValues(node.parameters);
-    return null;
-  }
-
-  @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    if (node.isConst) {
-      TypeName typeName = node.constructorName.type;
-      _checkForConstWithTypeParameters(typeName);
-
-      // We need to evaluate the constant to see if any errors occur during its
-      // evaluation.
-      ConstructorElement constructor = node.staticElement;
-      if (constructor != null) {
-        ConstantEvaluationEngine evaluationEngine =
-            new ConstantEvaluationEngine(_typeProvider, declaredVariables,
-                typeSystem: _typeSystem);
-        ConstantVisitor constantVisitor =
-            new ConstantVisitor(evaluationEngine, _errorReporter);
-        evaluationEngine.evaluateConstructorCall(
-            node,
-            node.argumentList.arguments,
-            constructor,
-            constantVisitor,
-            _errorReporter);
-      }
-    }
-    _validateInstanceCreationArguments(node);
-    return super.visitInstanceCreationExpression(node);
-  }
-
-  @override
-  Object visitListLiteral(ListLiteral node) {
-    super.visitListLiteral(node);
-    if (node.isConst) {
-      DartObjectImpl result;
-      for (Expression element in node.elements) {
-        result =
-            _validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
-        if (result != null) {
-          _reportErrorIfFromDeferredLibrary(
-              element,
-              CompileTimeErrorCode
-                  .NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY);
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitMapLiteral(MapLiteral node) {
-    super.visitMapLiteral(node);
-    bool isConst = node.isConst;
-    bool reportEqualKeys = true;
-    HashSet<DartObject> keys = new HashSet<DartObject>();
-    List<Expression> invalidKeys = new List<Expression>();
-    for (MapLiteralEntry entry in node.entries) {
-      Expression key = entry.key;
-      if (isConst) {
-        DartObjectImpl keyResult =
-            _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
-        Expression valueExpression = entry.value;
-        DartObjectImpl valueResult = _validate(
-            valueExpression, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
-        if (valueResult != null) {
-          _reportErrorIfFromDeferredLibrary(
-              valueExpression,
-              CompileTimeErrorCode
-                  .NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY);
-        }
-        if (keyResult != null) {
-          _reportErrorIfFromDeferredLibrary(key,
-              CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY);
-          if (keys.contains(keyResult)) {
-            invalidKeys.add(key);
-          } else {
-            keys.add(keyResult);
-          }
-          DartType type = keyResult.type;
-          if (_implementsEqualsWhenNotAllowed(type)) {
-            _errorReporter.reportErrorForNode(
-                CompileTimeErrorCode
-                    .CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
-                key,
-                [type.displayName]);
-          }
-        }
-      } else {
-        // Note: we throw the errors away because this isn't actually a const.
-        AnalysisErrorListener errorListener =
-            AnalysisErrorListener.NULL_LISTENER;
-        ErrorReporter subErrorReporter =
-            new ErrorReporter(errorListener, _errorReporter.source);
-        DartObjectImpl result = key.accept(new ConstantVisitor(
-            new ConstantEvaluationEngine(_typeProvider, declaredVariables,
-                typeSystem: _typeSystem),
-            subErrorReporter));
-        if (result != null) {
-          if (keys.contains(result)) {
-            invalidKeys.add(key);
-          } else {
-            keys.add(result);
-          }
-        } else {
-          reportEqualKeys = false;
-        }
-      }
-    }
-    if (reportEqualKeys) {
-      int length = invalidKeys.length;
-      for (int i = 0; i < length; i++) {
-        _errorReporter.reportErrorForNode(
-            StaticWarningCode.EQUAL_KEYS_IN_MAP, invalidKeys[i]);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    super.visitMethodDeclaration(node);
-    _validateDefaultValues(node.parameters);
-    return null;
-  }
-
-  @override
-  Object visitSwitchStatement(SwitchStatement node) {
-    // TODO(paulberry): to minimize error messages, it would be nice to
-    // compare all types with the most popular type rather than the first
-    // type.
-    NodeList<SwitchMember> switchMembers = node.members;
-    bool foundError = false;
-    DartType firstType = null;
-    for (SwitchMember switchMember in switchMembers) {
-      if (switchMember is SwitchCase) {
-        Expression expression = switchMember.expression;
-        DartObjectImpl caseResult = _validate(
-            expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION);
-        if (caseResult != null) {
-          _reportErrorIfFromDeferredLibrary(
-              expression,
-              CompileTimeErrorCode
-                  .NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY);
-          DartObject value = caseResult;
-          if (firstType == null) {
-            firstType = value.type;
-          } else {
-            DartType nType = value.type;
-            if (firstType != nType) {
-              _errorReporter.reportErrorForNode(
-                  CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
-                  expression,
-                  [expression.toSource(), firstType.displayName]);
-              foundError = true;
-            }
-          }
-        }
-      }
-    }
-    if (!foundError) {
-      _checkForCaseExpressionTypeImplementsEquals(node, firstType);
-    }
-    return super.visitSwitchStatement(node);
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    super.visitVariableDeclaration(node);
-    Expression initializer = node.initializer;
-    if (initializer != null && (node.isConst || node.isFinal)) {
-      VariableElementImpl element = node.declaredElement as VariableElementImpl;
-      EvaluationResultImpl result = element.evaluationResult;
-      if (result == null) {
-        // Variables marked "const" should have had their values computed by
-        // ConstantValueComputer.  Other variables will only have had their
-        // values computed if the value was needed (e.g. final variables in a
-        // class containing const constructors).
-        assert(!node.isConst);
-        return null;
-      }
-      _reportErrors(result.errors,
-          CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
-      _reportErrorIfFromDeferredLibrary(
-          initializer,
-          CompileTimeErrorCode
-              .CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY);
-    }
-    return null;
-  }
-
-  /// This verifies that the passed switch statement does not have a case
-  /// expression with the operator '==' overridden.
-  ///
-  /// @param node the switch statement to evaluate
-  /// @param type the common type of all 'case' expressions
-  /// @return `true` if and only if an error code is generated on the passed
-  ///         node.
-  /// See [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS].
-  bool _checkForCaseExpressionTypeImplementsEquals(
-      SwitchStatement node, DartType type) {
-    if (!_implementsEqualsWhenNotAllowed(type)) {
-      return false;
-    }
-    // report error
-    _errorReporter.reportErrorForToken(
-        CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
-        node.switchKeyword,
-        [type.displayName]);
-    return true;
-  }
-
-  /// Verify that the given [type] does not reference any type parameters.
-  ///
-  /// See [CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS].
-  void _checkForConstWithTypeParameters(TypeAnnotation type) {
-    // something wrong with AST
-    if (type is! TypeName) {
-      return;
-    }
-    TypeName typeName = type;
-    Identifier name = typeName.name;
-    if (name == null) {
-      return;
-    }
-    // should not be a type parameter
-    if (name.staticElement is TypeParameterElement) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name);
-    }
-    // check type arguments
-    TypeArgumentList typeArguments = typeName.typeArguments;
-    if (typeArguments != null) {
-      for (TypeAnnotation argument in typeArguments.arguments) {
-        _checkForConstWithTypeParameters(argument);
-      }
-    }
-  }
-
-  /// @return `true` if given [Type] implements operator <i>==</i>, and it is
-  ///         not <i>int</i> or <i>String</i>.
-  bool _implementsEqualsWhenNotAllowed(DartType type) {
-    // ignore int or String
-    if (type == null || type == _intType || type == _typeProvider.stringType) {
-      return false;
-    } else if (type == _typeProvider.doubleType) {
-      return true;
-    }
-    // prepare ClassElement
-    Element element = type.element;
-    if (element is ClassElement) {
-      // lookup for ==
-      MethodElement method =
-          element.lookUpConcreteMethod("==", _currentLibrary);
-      if (method == null || method.enclosingElement.type.isObject) {
-        return false;
-      }
-      // there is == that we don't like
-      return true;
-    }
-    return false;
-  }
-
-  /// Given some computed [Expression], this method generates the passed
-  /// [ErrorCode] on the node if its' value consists of information from a
-  /// deferred library.
-  ///
-  /// @param expression the expression to be tested for a deferred library
-  ///        reference
-  /// @param errorCode the error code to be used if the expression is or
-  ///        consists of a reference to a deferred library
-  void _reportErrorIfFromDeferredLibrary(
-      Expression expression, ErrorCode errorCode) {
-    DeferredLibraryReferenceDetector referenceDetector =
-        new DeferredLibraryReferenceDetector();
-    expression.accept(referenceDetector);
-    if (referenceDetector.result) {
-      _errorReporter.reportErrorForNode(errorCode, expression);
-    }
-  }
-
-  /// Report any errors in the given list. Except for special cases, use the
-  /// given error code rather than the one reported in the error.
-  ///
-  /// @param errors the errors that need to be reported
-  /// @param errorCode the error code to be used
-  void _reportErrors(List<AnalysisError> errors, ErrorCode errorCode) {
-    int length = errors.length;
-    for (int i = 0; i < length; i++) {
-      AnalysisError data = errors[i];
-      ErrorCode dataErrorCode = data.errorCode;
-      if (identical(dataErrorCode,
-              CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) ||
-          identical(
-              dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE) ||
-          identical(dataErrorCode,
-              CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) ||
-          identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) ||
-          identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) ||
-          identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM) ||
-          identical(dataErrorCode,
-              CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT) ||
-          identical(dataErrorCode,
-              CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) ||
-          identical(
-              dataErrorCode,
-              CheckedModeCompileTimeErrorCode
-                  .CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH) ||
-          identical(
-              dataErrorCode,
-              CheckedModeCompileTimeErrorCode
-                  .CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH) ||
-          identical(dataErrorCode,
-              CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH)) {
-        _errorReporter.reportError(data);
-      } else if (errorCode != null) {
-        _errorReporter.reportError(new AnalysisError(
-            data.source, data.offset, data.length, errorCode));
-      }
-    }
-  }
-
-  /// Validate that the given expression is a compile time constant. Return the
-  /// value of the compile time constant, or `null` if the expression is not a
-  /// compile time constant.
-  ///
-  /// @param expression the expression to be validated
-  /// @param errorCode the error code to be used if the expression is not a
-  ///        compile time constant
-  /// @return the value of the compile time constant
-  DartObjectImpl _validate(Expression expression, ErrorCode errorCode) {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    ErrorReporter subErrorReporter =
-        new ErrorReporter(errorListener, _errorReporter.source);
-    DartObjectImpl result = expression.accept(new ConstantVisitor(
-        new ConstantEvaluationEngine(_typeProvider, declaredVariables,
-            typeSystem: _typeSystem),
-        subErrorReporter));
-    _reportErrors(errorListener.errors, errorCode);
-    return result;
-  }
-
-  /// Validate that if the passed arguments are constant expressions.
-  ///
-  /// @param argumentList the argument list to evaluate
-  void _validateConstantArguments(ArgumentList argumentList) {
-    for (Expression argument in argumentList.arguments) {
-      Expression realArgument =
-          argument is NamedExpression ? argument.expression : argument;
-      _validate(
-          realArgument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT);
-    }
-  }
-
-  /// Validates that the expressions of the initializers of the given constant
-  /// [constructor] are all compile time constants.
-  void _validateConstructorInitializers(ConstructorDeclaration constructor) {
-    List<ParameterElement> parameterElements =
-        constructor.parameters.parameterElements;
-    NodeList<ConstructorInitializer> initializers = constructor.initializers;
-    for (ConstructorInitializer initializer in initializers) {
-      if (initializer is AssertInitializer) {
-        _validateInitializerExpression(
-            parameterElements, initializer.condition);
-        Expression message = initializer.message;
-        if (message != null) {
-          _validateInitializerExpression(parameterElements, message);
-        }
-      } else if (initializer is ConstructorFieldInitializer) {
-        _validateInitializerExpression(
-            parameterElements, initializer.expression);
-      } else if (initializer is RedirectingConstructorInvocation) {
-        _validateInitializerInvocationArguments(
-            parameterElements, initializer.argumentList);
-      } else if (initializer is SuperConstructorInvocation) {
-        _validateInitializerInvocationArguments(
-            parameterElements, initializer.argumentList);
-      }
-    }
-  }
-
-  /// Validate that the default value associated with each of the parameters in
-  /// the given list is a compile time constant.
-  ///
-  /// @param parameters the list of parameters to be validated
-  void _validateDefaultValues(FormalParameterList parameters) {
-    if (parameters == null) {
-      return;
-    }
-    for (FormalParameter parameter in parameters.parameters) {
-      if (parameter is DefaultFormalParameter) {
-        Expression defaultValue = parameter.defaultValue;
-        DartObjectImpl result;
-        if (defaultValue == null) {
-          result =
-              new DartObjectImpl(_typeProvider.nullType, NullState.NULL_STATE);
-        } else {
-          result = _validate(
-              defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE);
-          if (result != null) {
-            _reportErrorIfFromDeferredLibrary(
-                defaultValue,
-                CompileTimeErrorCode
-                    .NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY);
-          }
-        }
-        VariableElementImpl element =
-            parameter.declaredElement as VariableElementImpl;
-        element.evaluationResult = new EvaluationResultImpl(result);
-      }
-    }
-  }
-
-  /// Validates that the expressions of any field initializers in the class
-  /// declaration are all compile time constants. Since this is only required if
-  /// the class has a constant constructor, the error is reported at the
-  /// constructor site.
-  ///
-  /// @param classDeclaration the class which should be validated
-  /// @param errorSite the site at which errors should be reported.
-  void _validateFieldInitializers(
-      ClassDeclaration classDeclaration, ConstructorDeclaration errorSite) {
-    NodeList<ClassMember> members = classDeclaration.members;
-    for (ClassMember member in members) {
-      if (member is FieldDeclaration && !member.isStatic) {
-        for (VariableDeclaration variableDeclaration
-            in member.fields.variables) {
-          Expression initializer = variableDeclaration.initializer;
-          if (initializer != null) {
-            // Ignore any errors produced during validation--if the constant
-            // can't be evaluated we'll just report a single error.
-            AnalysisErrorListener errorListener =
-                AnalysisErrorListener.NULL_LISTENER;
-            ErrorReporter subErrorReporter =
-                new ErrorReporter(errorListener, _errorReporter.source);
-            DartObjectImpl result = initializer.accept(new ConstantVisitor(
-                new ConstantEvaluationEngine(_typeProvider, declaredVariables,
-                    typeSystem: _typeSystem),
-                subErrorReporter));
-            if (result == null) {
-              _errorReporter.reportErrorForNode(
-                  CompileTimeErrorCode
-                      .CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
-                  errorSite,
-                  [variableDeclaration.name.name]);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  /// Validates that the given expression is a compile time constant.
-  ///
-  /// @param parameterElements the elements of parameters of constant
-  ///        constructor, they are considered as a valid potentially constant
-  ///        expressions
-  /// @param expression the expression to validate
-  void _validateInitializerExpression(
-      List<ParameterElement> parameterElements, Expression expression) {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    ErrorReporter subErrorReporter =
-        new ErrorReporter(errorListener, _errorReporter.source);
-    DartObjectImpl result = expression.accept(
-        new _ConstantVerifier_validateInitializerExpression(_typeProvider,
-            subErrorReporter, this, parameterElements, declaredVariables,
-            typeSystem: _typeSystem));
-    _reportErrors(errorListener.errors,
-        CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
-    if (result != null) {
-      _reportErrorIfFromDeferredLibrary(
-          expression,
-          CompileTimeErrorCode
-              .NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY);
-    }
-  }
-
-  /// Validates that all of the arguments of a constructor initializer are
-  /// compile time constants.
-  ///
-  /// @param parameterElements the elements of parameters of constant
-  ///        constructor, they are considered as a valid potentially constant
-  ///        expressions
-  /// @param argumentList the argument list to validate
-  void _validateInitializerInvocationArguments(
-      List<ParameterElement> parameterElements, ArgumentList argumentList) {
-    if (argumentList == null) {
-      return;
-    }
-    for (Expression argument in argumentList.arguments) {
-      _validateInitializerExpression(parameterElements, argument);
-    }
-  }
-
-  /// Validate that if the passed instance creation is 'const' then all its
-  /// arguments are constant expressions.
-  ///
-  /// @param node the instance creation evaluate
-  void _validateInstanceCreationArguments(InstanceCreationExpression node) {
-    if (!node.isConst) {
-      return;
-    }
-    ArgumentList argumentList = node.argumentList;
-    if (argumentList == null) {
-      return;
-    }
-    _validateConstantArguments(argumentList);
-  }
-}
-
 /// Instances of the class `Dart2JSVerifier` traverse an AST structure looking
 /// for hints for code that will be compiled to JS, such as
 /// [HintCode.IS_DOUBLE].
@@ -4415,10 +3816,14 @@
   /// resolution. The [nameScope] is the scope used to resolve identifiers in
   /// the node that will first be visited.  If `null` or unspecified, a new
   /// [LibraryScope] will be created based on the [definingLibrary].
-  InstanceFieldResolverVisitor(LibraryElement definingLibrary, Source source,
-      TypeProvider typeProvider, AnalysisErrorListener errorListener,
+  InstanceFieldResolverVisitor(
+      InheritanceManager2 inheritance,
+      LibraryElement definingLibrary,
+      Source source,
+      TypeProvider typeProvider,
+      AnalysisErrorListener errorListener,
       {Scope nameScope})
-      : super(definingLibrary, source, typeProvider, errorListener,
+      : super(inheritance, definingLibrary, source, typeProvider, errorListener,
             nameScope: nameScope);
 
   /// Resolve the instance fields in the given compilation unit [node].
@@ -4593,10 +3998,14 @@
   /// created based on [definingLibrary]. The [typeAnalyzerFactory] is used to
   /// create the type analyzer.  If `null` or unspecified, a type analyzer of
   /// type [StaticTypeAnalyzer] will be created.
-  PartialResolverVisitor(LibraryElement definingLibrary, Source source,
-      TypeProvider typeProvider, AnalysisErrorListener errorListener,
+  PartialResolverVisitor(
+      InheritanceManager2 inheritance,
+      LibraryElement definingLibrary,
+      Source source,
+      TypeProvider typeProvider,
+      AnalysisErrorListener errorListener,
       {Scope nameScope})
-      : super(definingLibrary, source, typeProvider, errorListener,
+      : super(inheritance, definingLibrary, source, typeProvider, errorListener,
             nameScope: nameScope);
 
   @override
@@ -4749,6 +4158,11 @@
 /// Instances of the class `ResolverVisitor` are used to resolve the nodes
 /// within a single compilation unit.
 class ResolverVisitor extends ScopedVisitor {
+  /**
+   * The manager for the inheritance mappings.
+   */
+  final InheritanceManager2 inheritance;
+
   /// The object used to resolve the element associated with the current node.
   ElementResolver elementResolver;
 
@@ -4814,8 +4228,12 @@
   /// created based on [definingLibrary]. The [typeAnalyzerFactory] is used to
   /// create the type analyzer.  If `null` or unspecified, a type analyzer of
   /// type [StaticTypeAnalyzer] will be created.
-  ResolverVisitor(LibraryElement definingLibrary, Source source,
-      TypeProvider typeProvider, AnalysisErrorListener errorListener,
+  ResolverVisitor(
+      this.inheritance,
+      LibraryElement definingLibrary,
+      Source source,
+      TypeProvider typeProvider,
+      AnalysisErrorListener errorListener,
       {Scope nameScope,
       bool propagateTypes: true,
       reportConstEvaluationErrors: true})
@@ -5169,6 +4587,7 @@
           _overrideManager.exitScope();
         }
       }
+      node.accept(elementResolver);
     } else if (operatorType == TokenType.BAR_BAR) {
       InferenceContext.setType(leftOperand, typeProvider.boolType);
       InferenceContext.setType(rightOperand, typeProvider.boolType);
@@ -5182,13 +4601,17 @@
           _overrideManager.exitScope();
         }
       }
+      node.accept(elementResolver);
     } else {
-      // TODO(leafp): Do downwards inference using the declared type
-      // of the binary operator for other cases.
       if (operatorType == TokenType.QUESTION_QUESTION) {
         InferenceContext.setTypeFromNode(leftOperand, node);
       }
       leftOperand?.accept(this);
+
+      // Call ElementResolver.visitBinaryExpression to resolve the user-defined
+      // operator method, if applicable.
+      node.accept(elementResolver);
+
       if (operatorType == TokenType.QUESTION_QUESTION) {
         // Set the right side, either from the context, or using the information
         // from the left side if it is more precise.
@@ -5198,10 +4621,17 @@
           contextType = leftType;
         }
         InferenceContext.setType(rightOperand, contextType);
+      } else {
+        var invokeType = node.staticInvokeType;
+        if (invokeType != null && invokeType.parameters.isNotEmpty) {
+          // If this is a user-defined operator, set the right operand context
+          // using the operator method's parameter type.
+          var rightParam = invokeType.parameters[0];
+          InferenceContext.setType(rightOperand, rightParam.type);
+        }
       }
       rightOperand?.accept(this);
     }
-    node.accept(elementResolver);
     node.accept(typeAnalyzer);
     return null;
   }
@@ -5827,6 +5257,20 @@
   }
 
   @override
+  Object visitIndexExpression(IndexExpression node) {
+    node.target?.accept(this);
+    node.accept(elementResolver);
+    var method = node.staticElement;
+    if (method != null && method.parameters.isNotEmpty) {
+      var indexParam = node.staticElement.parameters[0];
+      InferenceContext.setType(node.index, indexParam.type);
+    }
+    node.index?.accept(this);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     node.constructorName?.accept(this);
     _inferArgumentTypesForInstanceCreate(node);
@@ -10020,72 +9464,6 @@
   }
 }
 
-class _ConstantVerifier_validateInitializerExpression extends ConstantVisitor {
-  final ConstantVerifier verifier;
-
-  List<ParameterElement> parameterElements;
-
-  TypeSystem _typeSystem;
-
-  _ConstantVerifier_validateInitializerExpression(
-      TypeProvider typeProvider,
-      ErrorReporter errorReporter,
-      this.verifier,
-      this.parameterElements,
-      DeclaredVariables declaredVariables,
-      {TypeSystem typeSystem})
-      : _typeSystem = typeSystem ?? new StrongTypeSystemImpl(typeProvider),
-        super(
-            new ConstantEvaluationEngine(typeProvider, declaredVariables,
-                typeSystem: typeSystem),
-            errorReporter);
-
-  @override
-  DartObjectImpl visitSimpleIdentifier(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    int length = parameterElements.length;
-    for (int i = 0; i < length; i++) {
-      ParameterElement parameterElement = parameterElements[i];
-      if (identical(parameterElement, element) && parameterElement != null) {
-        DartType type = parameterElement.type;
-        if (type != null) {
-          if (type.isDynamic) {
-            return new DartObjectImpl(
-                verifier._typeProvider.objectType, DynamicState.DYNAMIC_STATE);
-          } else if (_typeSystem.isSubtypeOf(type, verifier._boolType)) {
-            return new DartObjectImpl(
-                verifier._typeProvider.boolType, BoolState.UNKNOWN_VALUE);
-          } else if (_typeSystem.isSubtypeOf(
-              type, verifier._typeProvider.doubleType)) {
-            return new DartObjectImpl(
-                verifier._typeProvider.doubleType, DoubleState.UNKNOWN_VALUE);
-          } else if (_typeSystem.isSubtypeOf(type, verifier._intType)) {
-            return new DartObjectImpl(
-                verifier._typeProvider.intType, IntState.UNKNOWN_VALUE);
-          } else if (_typeSystem.isSubtypeOf(type, verifier._numType)) {
-            return new DartObjectImpl(
-                verifier._typeProvider.numType, NumState.UNKNOWN_VALUE);
-          } else if (_typeSystem.isSubtypeOf(type, verifier._stringType)) {
-            return new DartObjectImpl(
-                verifier._typeProvider.stringType, StringState.UNKNOWN_VALUE);
-          }
-          //
-          // We don't test for other types of objects (such as List, Map,
-          // Function or Type) because there are no operations allowed on such
-          // types other than '==' and '!=', which means that we don't need to
-          // know the type when there is no specific data about the state of
-          // such objects.
-          //
-        }
-        return new DartObjectImpl(
-            type is InterfaceType ? type : verifier._typeProvider.objectType,
-            GenericState.UNKNOWN_VALUE);
-      }
-    }
-    return super.visitSimpleIdentifier(node);
-  }
-}
-
 /// An object used to track the usage of labels within a single label scope.
 class _LabelTracker {
   /// The tracker for the outer label scope.
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index c7e14c8..dc13e5f 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -10,15 +10,38 @@
 import 'package:analyzer/src/generated/java_io.dart' show JavaFile;
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
 import 'package:analyzer/src/generated/source_io.dart' show FileBasedSource;
-import 'package:front_end/src/base/source.dart';
-import 'package:front_end/src/base/uri_kind.dart';
+import 'package:analyzer/src/task/api/model.dart';
 import 'package:package_config/packages.dart';
 import 'package:path/path.dart' as pathos;
 
 export 'package:analyzer/source/line_info.dart' show LineInfo;
 export 'package:analyzer/source/source_range.dart';
-export 'package:front_end/src/base/source.dart' show Source;
-export 'package:front_end/src/base/uri_kind.dart' show UriKind;
+
+/// Base class providing implementations for the methods in [Source] that don't
+/// require filesystem access.
+abstract class BasicSource extends Source {
+  final Uri uri;
+
+  BasicSource(this.uri);
+
+  @override
+  String get encoding => uri.toString();
+
+  @override
+  String get fullName => encoding;
+
+  @override
+  int get hashCode => uri.hashCode;
+
+  @override
+  bool get isInSystemLibrary => uri.scheme == 'dart';
+
+  @override
+  String get shortName => pathos.basename(fullName);
+
+  @override
+  bool operator ==(Object object) => object is Source && object.uri == uri;
+}
 
 /**
  * A function that is used to visit [ContentCache] entries.
@@ -322,6 +345,155 @@
 }
 
 /**
+ * The interface `Source` defines the behavior of objects representing source
+ * code that can be analyzed by the analysis engine.
+ *
+ * Implementations of this interface need to be aware of some assumptions made
+ * by the analysis engine concerning sources:
+ *
+ * * Sources are not required to be unique. That is, there can be multiple
+ * instances representing the same source.
+ * * Sources are long lived. That is, the engine is allowed to hold on to a
+ * source for an extended period of time and that source must continue to
+ * report accurate and up-to-date information.
+ *
+ * Because of these assumptions, most implementations will not maintain any
+ * state but will delegate to an authoritative system of record in order to
+ * implement this API. For example, a source that represents files on disk
+ * would typically query the file system to determine the state of the file.
+ *
+ * If the instances that implement this API are the system of record, then they
+ * will typically be unique. In that case, sources that are created that
+ * represent non-existent files must also be retained so that if those files
+ * are created at a later date the long-lived sources representing those files
+ * will know that they now exist.
+ */
+abstract class Source implements AnalysisTarget {
+  /**
+   * An empty list of sources.
+   */
+  static const List<Source> EMPTY_LIST = const <Source>[];
+
+  /**
+   * Get the contents and timestamp of this source.
+   *
+   * Clients should consider using the method [AnalysisContext.getContents]
+   * because contexts can have local overrides of the content of a source that
+   * the source is not aware of.
+   *
+   * @return the contents and timestamp of the source
+   * @throws Exception if the contents of this source could not be accessed
+   */
+  TimestampedData<String> get contents;
+
+  /**
+   * Return an encoded representation of this source that can be used to create
+   * a source that is equal to this source.
+   *
+   * @return an encoded representation of this source
+   * See [SourceFactory.fromEncoding].
+   */
+  String get encoding;
+
+  /**
+   * Return the full (long) version of the name that can be displayed to the
+   * user to denote this source. For example, for a source representing a file
+   * this would typically be the absolute path of the file.
+   *
+   * @return a name that can be displayed to the user to denote this source
+   */
+  String get fullName;
+
+  /**
+   * Return a hash code for this source.
+   *
+   * @return a hash code for this source
+   * See [Object.hashCode].
+   */
+  @override
+  int get hashCode;
+
+  /**
+   * Return `true` if this source is in one of the system libraries.
+   *
+   * @return `true` if this is in a system library
+   */
+  bool get isInSystemLibrary;
+
+  @override
+  Source get librarySource => null;
+
+  /**
+   * Return the modification stamp for this source, or a negative value if the
+   * source does not exist. A modification stamp is a non-negative integer with
+   * the property that if the contents of the source have not been modified
+   * since the last time the modification stamp was accessed then the same
+   * value will be returned, but if the contents of the source have been
+   * modified one or more times (even if the net change is zero) the stamps
+   * will be different.
+   *
+   * Clients should consider using the method
+   * [AnalysisContext.getModificationStamp] because contexts can have local
+   * overrides of the content of a source that the source is not aware of.
+   */
+  int get modificationStamp;
+
+  /**
+   * Return a short version of the name that can be displayed to the user to
+   * denote this source. For example, for a source representing a file this
+   * would typically be the name of the file.
+   *
+   * @return a name that can be displayed to the user to denote this source
+   */
+  String get shortName;
+
+  @override
+  Source get source => this;
+
+  /**
+   * Return the URI from which this source was originally derived.
+   *
+   * @return the URI from which this source was originally derived
+   */
+  Uri get uri;
+
+  /**
+   * Return the kind of URI from which this source was originally derived. If
+   * this source was created from an absolute URI, then the returned kind will
+   * reflect the scheme of the absolute URI. If it was created from a relative
+   * URI, then the returned kind will be the same as the kind of the source
+   * against which the relative URI was resolved.
+   *
+   * @return the kind of URI from which this source was originally derived
+   */
+  UriKind get uriKind;
+
+  /**
+   * Return `true` if the given object is a source that represents the same
+   * source code as this source.
+   *
+   * @param object the object to be compared with this object
+   * @return `true` if the given object is a source that represents the same
+   *         source code as this source
+   * See [Object.==].
+   */
+  @override
+  bool operator ==(Object object);
+
+  /**
+   * Return `true` if this source exists.
+   *
+   * Clients should consider using the method [AnalysisContext.exists] because
+   * contexts can have local overrides of the content of a source that the
+   * source is not aware of and a source with local content is considered to
+   * exist even if there is no file on disk.
+   *
+   * @return `true` if this source exists
+   */
+  bool exists();
+}
+
+/**
  * The interface `ContentReceiver` defines the behavior of objects that can receive the
  * content of a source.
  */
@@ -508,6 +680,91 @@
 }
 
 /**
+ * The enumeration `UriKind` defines the different kinds of URI's that are
+ * known to the analysis engine. These are used to keep track of the kind of
+ * URI associated with a given source.
+ */
+class UriKind implements Comparable<UriKind> {
+  /**
+   * A 'dart:' URI.
+   */
+  static const UriKind DART_URI = const UriKind('DART_URI', 0, 0x64);
+
+  /**
+   * A 'file:' URI.
+   */
+  static const UriKind FILE_URI = const UriKind('FILE_URI', 1, 0x66);
+
+  /**
+   * A 'package:' URI.
+   */
+  static const UriKind PACKAGE_URI = const UriKind('PACKAGE_URI', 2, 0x70);
+
+  static const List<UriKind> values = const [DART_URI, FILE_URI, PACKAGE_URI];
+
+  /**
+   * The name of this URI kind.
+   */
+  final String name;
+
+  /**
+   * The ordinal value of the URI kind.
+   */
+  final int ordinal;
+
+  /**
+   * The single character encoding used to identify this kind of URI.
+   */
+  final int encoding;
+
+  /**
+   * Initialize a newly created URI kind to have the given encoding.
+   */
+  const UriKind(this.name, this.ordinal, this.encoding);
+
+  @override
+  int get hashCode => ordinal;
+
+  @override
+  int compareTo(UriKind other) => ordinal - other.ordinal;
+
+  @override
+  String toString() => name;
+
+  /**
+   * Return the URI kind represented by the given [encoding], or `null` if there
+   * is no kind with the given encoding.
+   */
+  static UriKind fromEncoding(int encoding) {
+    while (true) {
+      if (encoding == 0x64) {
+        return DART_URI;
+      } else if (encoding == 0x66) {
+        return FILE_URI;
+      } else if (encoding == 0x70) {
+        return PACKAGE_URI;
+      }
+      break;
+    }
+    return null;
+  }
+
+  /**
+   * Return the URI kind corresponding to the given scheme string.
+   */
+  static UriKind fromScheme(String scheme) {
+    if (scheme == 'package') {
+      return UriKind.PACKAGE_URI;
+    } else if (scheme == 'dart') {
+      return UriKind.DART_URI;
+    } else if (scheme == 'file') {
+      return UriKind.FILE_URI;
+    }
+    return UriKind.FILE_URI;
+  }
+}
+
+/**
  * The abstract class `UriResolver` defines the behavior of objects that are used to resolve
  * URI's for a source factory. Subclasses of this class are expected to resolve a single scheme of
  * absolute URI.
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index ca8ec1c..8dd7310 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -35,8 +35,7 @@
     JavaFile file = uriToFileMap[uri];
     actualUri ??= uri;
     if (file == null) {
-      return new NonExistingSource(
-          uri.toString(), actualUri, UriKind.fromScheme(actualUri.scheme));
+      return null;
     } else {
       return new FileBasedSource(file, actualUri);
     }
@@ -413,8 +412,8 @@
             String pkgCanonicalUri = _toFileUri(pkgFolder.getCanonicalPath());
             if (sourceUri.startsWith(pkgCanonicalUri)) {
               String relPath = sourceUri.substring(pkgCanonicalUri.length);
-              return Uri
-                  .parse("$PACKAGE_SCHEME:${pkgFolder.getName()}$relPath");
+              return Uri.parse(
+                  "$PACKAGE_SCHEME:${pkgFolder.getName()}$relPath");
             }
           } catch (e) {}
         }
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index e95f2da..dfc94e4 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -368,8 +368,7 @@
       _analyzeLeastUpperBound(node, node.leftOperand, node.rightOperand);
       return null;
     }
-    ExecutableElement staticMethodElement = node.staticElement;
-    DartType staticType = _computeStaticReturnType(staticMethodElement);
+    DartType staticType = node.staticInvokeType?.returnType ?? _dynamicType;
     staticType = _typeSystem.refineBinaryExpressionType(
         node.leftOperand.staticType,
         node.operator.type,
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index d6c07ff..bf58278 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -72,7 +72,7 @@
       [Source librarySource]) {
     Source source =
         new NonExistingSource(fileName, toUri(fileName), UriKind.FILE_URI);
-    CompilationUnitElementImpl unit = new CompilationUnitElementImpl(fileName);
+    CompilationUnitElementImpl unit = new CompilationUnitElementImpl();
     unit.source = source;
     if (librarySource == null) {
       librarySource = source;
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 e8b2f1f..17afba9 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -175,8 +175,9 @@
     if (_boolType == null) {
       ClassElementImpl boolElement = ElementFactory.classElement2("bool");
       _boolType = boolElement.type;
-      ConstructorElementImpl fromEnvironment = ElementFactory
-          .constructorElement(boolElement, "fromEnvironment", true);
+      ConstructorElementImpl fromEnvironment =
+          ElementFactory.constructorElement(
+              boolElement, "fromEnvironment", true);
       fromEnvironment.parameters = <ParameterElement>[
         ElementFactory.requiredParameter2("name", stringType),
         ElementFactory.namedParameter3("defaultValue",
@@ -210,8 +211,8 @@
       deprecatedElement.accessors = <PropertyAccessorElement>[
         expiresField.getter
       ];
-      ConstructorElementImpl constructor = ElementFactory
-          .constructorElement(deprecatedElement, '', true, [stringType]);
+      ConstructorElementImpl constructor = ElementFactory.constructorElement(
+          deprecatedElement, '', true, [stringType]);
       (constructor.parameters[0] as ParameterElementImpl).name = 'expires';
       ConstructorFieldInitializer expiresInit =
           AstTestFactory.constructorFieldInitializer(
@@ -366,8 +367,8 @@
       ]);
       listElement.methods = <MethodElement>[
         ElementFactory.methodElement("[]", eType, [intType]),
-        ElementFactory
-            .methodElement("[]=", VoidTypeImpl.instance, [intType, eType]),
+        ElementFactory.methodElement(
+            "[]=", VoidTypeImpl.instance, [intType, eType]),
         ElementFactory.methodElement("add", VoidTypeImpl.instance, [eType])
       ];
       _propagateTypeArguments(listElement);
@@ -388,8 +389,8 @@
       ]);
       mapElement.methods = <MethodElement>[
         ElementFactory.methodElement("[]", vType, [objectType]),
-        ElementFactory
-            .methodElement("[]=", VoidTypeImpl.instance, [kType, vType])
+        ElementFactory.methodElement(
+            "[]=", VoidTypeImpl.instance, [kType, vType])
       ];
       mapElement.constructors = <ConstructorElement>[
         ElementFactory.constructorElement(mapElement, '', false)
@@ -422,7 +423,7 @@
       // This enables the "isDartCoreNull" getter.
       var library = new LibraryElementImpl.forNode(
           _context, AstTestFactory.libraryIdentifier2(["dart.core"]));
-      var unit = new CompilationUnitElementImpl("core.dart");
+      var unit = new CompilationUnitElementImpl();
       library.definingCompilationUnit = unit;
       unit.librarySource = unit.source = new StringSource('', null);
 
@@ -507,8 +508,9 @@
         ElementFactory.methodElement("toLowerCase", _stringType),
         ElementFactory.methodElement("toUpperCase", _stringType)
       ];
-      ConstructorElementImpl fromEnvironment = ElementFactory
-          .constructorElement(stringElement, "fromEnvironment", true);
+      ConstructorElementImpl fromEnvironment =
+          ElementFactory.constructorElement(
+              stringElement, "fromEnvironment", true);
       fromEnvironment.parameters = <ParameterElement>[
         ElementFactory.requiredParameter2("name", stringType),
         ElementFactory.namedParameter3("defaultValue", type: _stringType)
@@ -524,8 +526,8 @@
   InterfaceType get symbolType {
     if (_symbolType == null) {
       ClassElementImpl symbolClass = ElementFactory.classElement2("Symbol");
-      ConstructorElementImpl constructor = ElementFactory
-          .constructorElement(symbolClass, '', true, [stringType]);
+      ConstructorElementImpl constructor = ElementFactory.constructorElement(
+          symbolClass, '', true, [stringType]);
       constructor.factory = true;
       constructor.isCycleFree = true;
       symbolClass.constructors = <ConstructorElement>[constructor];
@@ -558,8 +560,7 @@
   void _initDartAsync() {
     Source asyncSource = _context.sourceFactory.forUri(DartSdk.DART_ASYNC);
     _context.setContents(asyncSource, "");
-    CompilationUnitElementImpl asyncUnit =
-        new CompilationUnitElementImpl("async.dart");
+    CompilationUnitElementImpl asyncUnit = new CompilationUnitElementImpl();
     LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode(
         _context, AstTestFactory.libraryIdentifier2(["dart.async"]));
     asyncLibrary.definingCompilationUnit = asyncUnit;
@@ -620,10 +621,10 @@
       ElementFactory.methodElement("toInt", _intType),
       ElementFactory.methodElement("toDouble", _doubleType),
       ElementFactory.methodElement("toStringAsFixed", _stringType, [_intType]),
-      ElementFactory
-          .methodElement("toStringAsExponential", _stringType, [_intType]),
-      ElementFactory
-          .methodElement("toStringAsPrecision", _stringType, [_intType]),
+      ElementFactory.methodElement(
+          "toStringAsExponential", _stringType, [_intType]),
+      ElementFactory.methodElement(
+          "toStringAsPrecision", _stringType, [_intType]),
       ElementFactory.methodElement("toRadixString", _stringType, [_intType])
     ];
     numElement.accessors = [
diff --git a/pkg/analyzer/lib/src/generated/timestamped_data.dart b/pkg/analyzer/lib/src/generated/timestamped_data.dart
index 917fb1f..18e6323 100644
--- a/pkg/analyzer/lib/src/generated/timestamped_data.dart
+++ b/pkg/analyzer/lib/src/generated/timestamped_data.dart
@@ -2,7 +2,23 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// This library re-exports front_end's timestamped_data.dart, since its API is
-// stable enough to be relied upon by clients.
+/**
+ * Analysis data for which we have a modification time.
+ */
+class TimestampedData<E> {
+  /**
+   * The modification time of the source from which the data was created.
+   */
+  final int modificationTime;
 
-export 'package:front_end/src/base/timestamped_data.dart' show TimestampedData;
+  /**
+   * The data that was created from the source.
+   */
+  final E data;
+
+  /**
+   * Initialize a newly created holder to associate the given [data] with the
+   * given [modificationTime].
+   */
+  TimestampedData(this.modificationTime, this.data);
+}
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index d2ce780..90e46f0 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -402,7 +402,6 @@
         // GLB(A, FutureOr<B>) ==  GLB(FutureOr<A>, B)
         return _getGreatestLowerBound(t2, t1);
       }
-      // TODO(jmesserly): fix this rule once we support non-nullable types.
       return typeProvider.nullType;
     }
     return result;
@@ -740,17 +739,10 @@
    */
   final bool implicitCasts;
 
-  /**
-   * A list of non-nullable type names (e.g., 'int', 'bool', etc.).
-   */
-  final List<String> nonnullableTypes;
-
   final TypeProvider typeProvider;
 
   StrongTypeSystemImpl(this.typeProvider,
-      {this.declarationCasts: true,
-      this.implicitCasts: true,
-      this.nonnullableTypes: AnalysisOptionsImpl.NONNULLABLE_TYPES});
+      {this.declarationCasts: true, this.implicitCasts: true});
 
   @override
   bool get isStrong => true;
@@ -836,37 +828,6 @@
   }
 
   /**
-   * Compute the least supertype of [type], which is known to be an interface
-   * type.
-   *
-   * In the event that the algorithm fails (which might occur due to a bug in
-   * the analyzer), `null` is returned.
-   */
-  DartType getLeastNullableSupertype(InterfaceType type) {
-    // compute set of supertypes
-    List<InterfaceType> s = InterfaceTypeImpl.computeSuperinterfaceSet(type)
-        .where(isNullableType)
-        .toList();
-    return InterfaceTypeImpl.computeTypeAtMaxUniqueDepth(s);
-  }
-
-  /**
-   * Compute the least upper bound of two types.
-   */
-  @override
-  DartType getLeastUpperBound(DartType type1, DartType type2) {
-    if (isNullableType(type1) && isNonNullableType(type2)) {
-      assert(type2 is InterfaceType);
-      type2 = getLeastNullableSupertype(type2 as InterfaceType);
-    }
-    if (isNullableType(type2) && isNonNullableType(type1)) {
-      assert(type1 is InterfaceType);
-      type1 = getLeastNullableSupertype(type1 as InterfaceType);
-    }
-    return super.getLeastUpperBound(type1, type2);
-  }
-
-  /**
    * 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.
    *
@@ -1171,23 +1132,7 @@
   @override
   bool isMoreSpecificThan(DartType t1, DartType t2) => isSubtypeOf(t1, t2);
 
-  /// Check if [type] is in a set of preselected non-nullable types.
-  /// [FunctionType]s are always nullable.
-  bool isNonNullableType(DartType type) {
-    return !isNullableType(type);
-  }
-
-  /// Opposite of [isNonNullableType].
-  bool isNullableType(DartType type) {
-    return type is FunctionType ||
-        !nonnullableTypes.contains(_getTypeFullyQualifiedName(type));
-  }
-
-  /// Check that [f1] is a subtype of [f2] for a member override.
-  ///
-  /// This is different from the normal function subtyping in two ways:
-  /// - we know the function types are strict arrows,
-  /// - it allows opt-in covariant parameters.
+  @override
   bool isOverrideSubtypeOf(FunctionType f1, FunctionType f2) {
     return FunctionTypeImpl.relate(f1, f2, isSubtypeOf, instantiateToBounds,
         parameterRelation: isOverrideSubtypeOfParameter,
@@ -1477,12 +1422,6 @@
   DartType _functionParameterBound(DartType f, DartType g) =>
       getGreatestLowerBound(f, g);
 
-  /// Given a type return its name prepended with the URI to its containing
-  /// library and separated by a comma.
-  String _getTypeFullyQualifiedName(DartType type) {
-    return "${type?.element?.library?.identifier},$type";
-  }
-
   /**
    * This currently does not implement a very complete least upper bound
    * algorithm, but handles a couple of the very common cases that are
@@ -1888,6 +1827,13 @@
    */
   bool isMoreSpecificThan(DartType leftType, DartType rightType);
 
+  /// Check that [f1] is a subtype of [f2] for a member override.
+  ///
+  /// This is different from the normal function subtyping in two ways:
+  /// - we know the function types are strict arrows,
+  /// - it allows opt-in covariant parameters.
+  bool isOverrideSubtypeOf(FunctionType f1, FunctionType f2);
+
   /**
    * Return `true` if the [leftType] is a subtype of the [rightType] (that is,
    * if leftType <: rightType).
@@ -2148,8 +2094,7 @@
     var options = context.analysisOptions as AnalysisOptionsImpl;
     return new StrongTypeSystemImpl(context.typeProvider,
         declarationCasts: options.declarationCasts,
-        implicitCasts: options.implicitCasts,
-        nonnullableTypes: options.nonnullableTypes);
+        implicitCasts: options.implicitCasts);
   }
 }
 
@@ -2200,6 +2145,11 @@
       t1.isMoreSpecificThan(t2);
 
   @override
+  bool isOverrideSubtypeOf(FunctionType leftType, FunctionType rightType) {
+    return isSubtypeOf(leftType, rightType);
+  }
+
+  @override
   bool isSubtypeOf(DartType leftType, DartType rightType) {
     return leftType.isSubtypeOf(rightType);
   }
@@ -2278,6 +2228,23 @@
   TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
 
   @override
+  DartType replaceTopAndBottom(TypeProvider typeProvider,
+      {bool isCovariant = true}) {
+    // In theory this should never happen, since we only need to do this
+    // replacement when checking super-boundedness of explicitly-specified
+    // types, or types produced by mixin inference or instantiate-to-bounds, and
+    // the unknown type can't occur in any of those cases.
+    assert(
+        false, 'Attempted to check super-boundedness of a type including "?"');
+    // But just in case it does, behave similar to `dynamic`.
+    if (isCovariant) {
+      return typeProvider.nullType;
+    } else {
+      return this;
+    }
+  }
+
+  @override
   DartType substitute2(
       List<DartType> argumentTypes, List<DartType> parameterTypes,
       [List<FunctionTypeAliasElement> prune]) {
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index d27ac93..aad32b8 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -5,7 +5,6 @@
 library analyzer.src.generated.utilities_collection;
 
 import 'dart:collection';
-import "dart:math" as math;
 
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/src/generated/java_core.dart';
@@ -85,390 +84,6 @@
 }
 
 /**
- * Instances of the class `DirectedGraph` implement a directed graph in which the nodes are
- * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an
- * edge from any node to any other node, including itself, but will not represent multiple edges
- * between the same pair of nodes.
- *
- * @param N the type of the nodes in the graph
- */
-class DirectedGraph<N> {
-  /**
-   * The table encoding the edges in the graph. An edge is represented by an entry mapping the head
-   * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping
-   * the node to an empty set of tails.
-   */
-  Map<N, HashSet<N>> _edges = new HashMap<N, HashSet<N>>();
-
-  /**
-   * Return `true` if this graph is empty.
-   *
-   * @return `true` if this graph is empty
-   */
-  bool get isEmpty => _edges.isEmpty;
-
-  /**
-   * Return the number of nodes in this graph.
-   *
-   * @return the number of nodes in this graph
-   */
-  int get nodeCount => _edges.length;
-
-  /**
-   * Return a set of all nodes in the graph.
-   */
-  Set<N> get nodes => _edges.keys.toSet();
-
-  /**
-   * Add an edge from the given head node to the given tail node. Both nodes will be a part of the
-   * graph after this method is invoked, whether or not they were before.
-   *
-   * @param head the node at the head of the edge
-   * @param tail the node at the tail of the edge
-   */
-  void addEdge(N head, N tail) {
-    //
-    // First, ensure that the tail is a node known to the graph.
-    //
-    if (_edges[tail] == null) {
-      _edges[tail] = new HashSet<N>();
-    }
-    //
-    // Then create the edge.
-    //
-    HashSet<N> tails = _edges[head];
-    if (tails == null) {
-      tails = new HashSet<N>();
-      _edges[head] = tails;
-    }
-    tails.add(tail);
-  }
-
-  /**
-   * Add the given node to the set of nodes in the graph.
-   *
-   * @param node the node to be added
-   */
-  void addNode(N node) {
-    HashSet<N> tails = _edges[node];
-    if (tails == null) {
-      _edges[node] = new HashSet<N>();
-    }
-  }
-
-  /**
-   * Run a topological sort of the graph. Since the graph may contain cycles, this results in a list
-   * of strongly connected components rather than a list of nodes. The nodes in each strongly
-   * connected components only have edges that point to nodes in the same component or earlier
-   * components.
-   */
-  List<List<N>> computeTopologicalSort() {
-    DirectedGraph_SccFinder<N> finder = new DirectedGraph_SccFinder<N>(this);
-    return finder.computeTopologicalSort();
-  }
-
-  /**
-   * Return true if the graph contains at least one path from `source` to `destination`.
-   */
-  bool containsPath(N source, N destination) {
-    HashSet<N> nodesVisited = new HashSet<N>();
-    return _containsPathInternal(source, destination, nodesVisited);
-  }
-
-  /**
-   * Return a list of nodes that form a cycle containing the given node. If the node is not part of
-   * this graph, then a list containing only the node itself will be returned.
-   *
-   * @return a list of nodes that form a cycle containing the given node
-   */
-  List<N> findCycleContaining(N node) {
-    if (node == null) {
-      throw new ArgumentError();
-    }
-    DirectedGraph_SccFinder<N> finder = new DirectedGraph_SccFinder<N>(this);
-    return finder.componentContaining(node);
-  }
-
-  /**
-   * Return a set containing the tails of edges that have the given node as their head. The set will
-   * be empty if there are no such edges or if the node is not part of the graph. Clients must not
-   * modify the returned set.
-   *
-   * @param head the node at the head of all of the edges whose tails are to be returned
-   * @return a set containing the tails of edges that have the given node as their head
-   */
-  Set<N> getTails(N head) {
-    HashSet<N> tails = _edges[head];
-    if (tails == null) {
-      return new HashSet<N>();
-    }
-    return tails;
-  }
-
-  /**
-   * Remove all of the given nodes from this graph. As a consequence, any edges for which those
-   * nodes were either a head or a tail will also be removed.
-   *
-   * @param nodes the nodes to be removed
-   */
-  void removeAllNodes(List<N> nodes) {
-    for (N node in nodes) {
-      removeNode(node);
-    }
-  }
-
-  /**
-   * Remove the edge from the given head node to the given tail node. If there was no such edge then
-   * the graph will be unmodified: the number of edges will be the same and the set of nodes will be
-   * the same (neither node will either be added or removed).
-   *
-   * @param head the node at the head of the edge
-   * @param tail the node at the tail of the edge
-   * @return `true` if the graph was modified as a result of this operation
-   */
-  void removeEdge(N head, N tail) {
-    HashSet<N> tails = _edges[head];
-    if (tails != null) {
-      tails.remove(tail);
-    }
-  }
-
-  /**
-   * Remove the given node from this graph. As a consequence, any edges for which that node was
-   * either a head or a tail will also be removed.
-   *
-   * @param node the node to be removed
-   */
-  void removeNode(N node) {
-    _edges.remove(node);
-    for (HashSet<N> tails in _edges.values) {
-      tails.remove(node);
-    }
-  }
-
-  /**
-   * Find one node (referred to as a sink node) that has no outgoing edges (that is, for which there
-   * are no edges that have that node as the head of the edge) and remove it from this graph. Return
-   * the node that was removed, or `null` if there are no such nodes either because the graph
-   * is empty or because every node in the graph has at least one outgoing edge. As a consequence of
-   * removing the node from the graph any edges for which that node was a tail will also be removed.
-   *
-   * @return the sink node that was removed
-   */
-  N removeSink() {
-    N sink = _findSink();
-    if (sink == null) {
-      return null;
-    }
-    removeNode(sink);
-    return sink;
-  }
-
-  bool _containsPathInternal(N source, N destination, HashSet<N> nodesVisited) {
-    if (identical(source, destination)) {
-      return true;
-    }
-    HashSet<N> tails = _edges[source];
-    if (tails != null) {
-      nodesVisited.add(source);
-      for (N tail in tails) {
-        if (!nodesVisited.contains(tail)) {
-          if (_containsPathInternal(tail, destination, nodesVisited)) {
-            return true;
-          }
-        }
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Return one node that has no outgoing edges (that is, for which there are no edges that have
-   * that node as the head of the edge), or `null` if there are no such nodes.
-   *
-   * @return a sink node
-   */
-  N _findSink() {
-    for (N key in _edges.keys) {
-      if (_edges[key].isEmpty) return key;
-    }
-    return null;
-  }
-}
-
-/**
- * Instances of the class `NodeInfo` are used by the [SccFinder] to maintain
- * information about the nodes that have been examined.
- *
- * @param N the type of the nodes corresponding to the entries
- */
-class DirectedGraph_NodeInfo<N> {
-  /**
-   * The depth of this node.
-   */
-  int index = 0;
-
-  /**
-   * The depth of the first node in a cycle.
-   */
-  int lowlink = 0;
-
-  /**
-   * A flag indicating whether the corresponding node is on the stack. Used to remove the need for
-   * searching a collection for the node each time the question needs to be asked.
-   */
-  bool onStack = false;
-
-  /**
-   * The component that contains the corresponding node.
-   */
-  List<N> component;
-
-  /**
-   * Initialize a newly created information holder to represent a node at the given depth.
-   *
-   * @param depth the depth of the node being represented
-   */
-  DirectedGraph_NodeInfo(int depth) {
-    index = depth;
-    lowlink = depth;
-    onStack = false;
-  }
-}
-
-/**
- * Instances of the class `SccFinder` implement Tarjan's Algorithm for finding the strongly
- * connected components in a graph.
- */
-class DirectedGraph_SccFinder<N> {
-  /**
-   * The graph to work with.
-   */
-  final DirectedGraph<N> _graph;
-
-  /**
-   * The index used to uniquely identify the depth of nodes.
-   */
-  int _index = 0;
-
-  /**
-   * The stack of nodes that are being visited in order to identify components.
-   */
-  List<N> _stack = new List<N>();
-
-  /**
-   * A table mapping nodes to information about the nodes that is used by this algorithm.
-   */
-  Map<N, DirectedGraph_NodeInfo<N>> _nodeMap =
-      new HashMap<N, DirectedGraph_NodeInfo<N>>();
-
-  /**
-   * A list of all strongly connected components found, in topological sort order (each node in a
-   * strongly connected component only has edges that point to nodes in the same component or
-   * earlier components).
-   */
-  List<List<N>> _allComponents = new List<List<N>>();
-
-  /**
-   * Initialize a newly created finder.
-   */
-  DirectedGraph_SccFinder(this._graph) : super();
-
-  /**
-   * Return a list containing the nodes that are part of the strongly connected component that
-   * contains the given node.
-   *
-   * @param node the node used to identify the strongly connected component to be returned
-   * @return the nodes that are part of the strongly connected component that contains the given
-   *         node
-   */
-  List<N> componentContaining(N node) => _strongConnect(node).component;
-
-  /**
-   * Run Tarjan's algorithm and return the resulting list of strongly connected components. The
-   * list is in topological sort order (each node in a strongly connected component only has edges
-   * that point to nodes in the same component or earlier components).
-   */
-  List<List<N>> computeTopologicalSort() {
-    for (N node in _graph._edges.keys.toSet()) {
-      DirectedGraph_NodeInfo<N> nodeInfo = _nodeMap[node];
-      if (nodeInfo == null) {
-        _strongConnect(node);
-      }
-    }
-    return _allComponents;
-  }
-
-  /**
-   * Remove and return the top-most element from the stack.
-   *
-   * @return the element that was removed
-   */
-  N _pop() {
-    N node = _stack.removeAt(_stack.length - 1);
-    _nodeMap[node].onStack = false;
-    return node;
-  }
-
-  /**
-   * Add the given node to the stack.
-   *
-   * @param node the node to be added to the stack
-   */
-  void _push(N node) {
-    _nodeMap[node].onStack = true;
-    _stack.add(node);
-  }
-
-  /**
-   * Compute the strongly connected component that contains the given node as well as any
-   * components containing nodes that are reachable from the given component.
-   *
-   * @param v the node from which the search will begin
-   * @return the information about the given node
-   */
-  DirectedGraph_NodeInfo<N> _strongConnect(N v) {
-    //
-    // Set the depth index for v to the smallest unused index
-    //
-    DirectedGraph_NodeInfo<N> vInfo = new DirectedGraph_NodeInfo<N>(_index++);
-    _nodeMap[v] = vInfo;
-    _push(v);
-    //
-    // Consider successors of v
-    //
-    HashSet<N> tails = _graph._edges[v];
-    if (tails != null) {
-      for (N w in tails) {
-        DirectedGraph_NodeInfo<N> wInfo = _nodeMap[w];
-        if (wInfo == null) {
-          // Successor w has not yet been visited; recurse on it
-          wInfo = _strongConnect(w);
-          vInfo.lowlink = math.min(vInfo.lowlink, wInfo.lowlink);
-        } else if (wInfo.onStack) {
-          // Successor w is in stack S and hence in the current SCC
-          vInfo.lowlink = math.min(vInfo.lowlink, wInfo.index);
-        }
-      }
-    }
-    //
-    // If v is a root node, pop the stack and generate an SCC
-    //
-    if (vInfo.lowlink == vInfo.index) {
-      List<N> component = new List<N>();
-      N w;
-      do {
-        w = _pop();
-        component.add(w);
-        _nodeMap[w].component = component;
-      } while (!identical(w, v));
-      _allComponents.add(component);
-    }
-    return vInfo;
-  }
-}
-
-/**
  * The interface `MapIterator` defines the behavior of objects that iterate over the entries
  * in a map.
  *
diff --git a/pkg/analyzer/lib/src/generated/utilities_general.dart b/pkg/analyzer/lib/src/generated/utilities_general.dart
index 5571721..9722bc8 100644
--- a/pkg/analyzer/lib/src/generated/utilities_general.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_general.dart
@@ -8,8 +8,6 @@
 
 import 'package:yaml/yaml.dart';
 
-export 'package:front_end/src/base/jenkins_smi_hash.dart' show JenkinsSmiHash;
-
 /**
  * Test if the given [value] is `false` or the string "false" (case-insensitive).
  */
@@ -55,6 +53,56 @@
  */
 String toUpperCase(Object value) => value?.toString()?.toUpperCase();
 
+/// Jenkins hash function, optimized for small integers.
+///
+/// Static methods borrowed from sdk/lib/math/jenkins_smi_hash.dart.  Non-static
+/// methods are an enhancement for the "front_end" package.
+///
+/// Where performance is critical, use [hash2], [hash3], or [hash4], or the
+/// pattern `finish(combine(combine(...combine(0, a), b)..., z))`, where a..z
+/// are hash codes to be combined.
+///
+/// For ease of use, you may also use this pattern:
+/// `(new JenkinsSmiHash()..add(a)..add(b)....add(z)).hashCode`, where a..z are
+/// the sub-objects whose hashes should be combined.  This pattern performs the
+/// same operations as the performance critical variant, but allocates an extra
+/// object.
+class JenkinsSmiHash {
+  /// Accumulates the hash code [value] into the running hash [hash].
+  static int combine(int hash, int value) {
+    hash = 0x1fffffff & (hash + value);
+    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+    return hash ^ (hash >> 6);
+  }
+
+  /// Finalizes a running hash produced by [combine].
+  static int finish(int hash) {
+    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
+    hash = hash ^ (hash >> 11);
+    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+  }
+
+  /// Combines together two hash codes.
+  static int hash2(a, b) => finish(combine(combine(0, a), b));
+
+  /// Combines together three hash codes.
+  static int hash3(a, b, c) => finish(combine(combine(combine(0, a), b), c));
+
+  /// Combines together four hash codes.
+  static int hash4(a, b, c, d) =>
+      finish(combine(combine(combine(combine(0, a), b), c), d));
+
+  int _hash = 0;
+
+  /// Accumulates the object [o] into the hash.
+  void add(Object o) {
+    _hash = combine(_hash, o.hashCode);
+  }
+
+  /// Finalizes the hash and return the resulting hashcode.
+  int get hashCode => finish(_hash);
+}
+
 /**
  * A simple limited queue.
  */
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index c669bd0..bc4e089 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -25,8 +25,8 @@
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/util/sdk.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:package_config/packages.dart' show Packages;
 import 'package:package_config/packages_file.dart' as pkgfile show parse;
 import 'package:package_config/src/packages_impl.dart' show MapPackages;
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index d9050f4..a94e348 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -121,7 +121,9 @@
 
   Iterable<AnalysisErrorInfo> _lintPubspecFile(File sourceFile) =>
       lintPubspecSource(
-          contents: sourceFile.readAsStringSync(), sourcePath: sourceFile.path);
+          contents: sourceFile.readAsStringSync(),
+          sourcePath: options.resourceProvider.pathContext
+              .normalize(sourceFile.absolute.path));
 }
 
 class FileGlobFilter extends LintFilter {
diff --git a/pkg/analyzer/lib/src/source/custom_resolver.dart b/pkg/analyzer/lib/src/source/custom_resolver.dart
index c50c77e..4e2c79a 100644
--- a/pkg/analyzer/lib/src/source/custom_resolver.dart
+++ b/pkg/analyzer/lib/src/source/custom_resolver.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/util/uri.dart';
 
 class CustomUriResolver extends UriResolver {
   final ResourceProvider resourceProvider;
@@ -21,8 +22,8 @@
     if (!fileUri.isAbsolute) {
       return null;
     }
-    return resourceProvider
-        .getFile(resourceProvider.pathContext.fromUri(fileUri))
-        .createSource(actualUri ?? uri);
+    var pathContext = resourceProvider.pathContext;
+    var path = fileUriToNormalizedPath(pathContext, fileUri);
+    return resourceProvider.getFile(path).createSource(actualUri ?? uri);
   }
 }
diff --git a/pkg/analyzer/lib/src/summary/api_signature.dart b/pkg/analyzer/lib/src/summary/api_signature.dart
index 5a2c438..80937d6 100644
--- a/pkg/analyzer/lib/src/summary/api_signature.dart
+++ b/pkg/analyzer/lib/src/summary/api_signature.dart
@@ -1,8 +1,151 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
-// This library re-exports front_end's api_signature.dart, since its API is
-// stable enough to be relied upon by clients.
+import 'dart:convert';
+import 'dart:typed_data';
 
-export 'package:front_end/src/base/api_signature.dart' show ApiSignature;
+import 'package:convert/convert.dart';
+import 'package:crypto/crypto.dart';
+
+/**
+ * An instance of [ApiSignature] collects data in the form of primitive types
+ * (strings, ints, bools, etc.) from a summary "builder" object, and uses them
+ * to generate an MD5 signature of a the non-informative parts of the summary
+ * (i.e. those parts representing the API of the code being summarized).
+ *
+ * Note that the data passed to the MD5 signature algorithm is untyped.  So, for
+ * instance, an API signature built from a sequence of `false` booleans is
+ * likely to match an API signature built from a sequence of zeros.  The caller
+ * should take this into account; e.g. if a data structure may be represented
+ * either by a boolean or an int, the caller should encode a tag distinguishing
+ * the two representations before encoding the data.
+ */
+class ApiSignature {
+  /**
+   * Version number of the code in this class.  Any time this class is changed
+   * in a way that affects the data collected in [_data], this version number
+   * should be incremented, so that a summary signed by a newer version of the
+   * signature algorithm won't accidentally have the same signature as a summary
+   * signed by an older version.
+   */
+  static const int _VERSION = 0;
+
+  /**
+   * Data accumulated so far.
+   */
+  ByteData _data = new ByteData(4096);
+
+  /**
+   * Offset into [_data] where the next byte should be written.
+   */
+  int _offset = 0;
+
+  /**
+   * Create an [ApiSignature] which is ready to accept data.
+   */
+  ApiSignature() {
+    addInt(_VERSION);
+  }
+
+  /**
+   * For testing only: create an [ApiSignature] which doesn't include any
+   * version information.  This makes it easier to unit tests, since the data
+   * is stable even if [_VERSION] is changed.
+   */
+  ApiSignature.unversioned();
+
+  /**
+   * Collect a boolean value.
+   */
+  void addBool(bool b) {
+    _makeRoom(1);
+    _data.setUint8(_offset, b ? 1 : 0);
+    _offset++;
+  }
+
+  /**
+   * Collect a sequence of arbitrary bytes.  Note that the length is not
+   * collected, so for example `addBytes([1, 2]);` will have the same effect as
+   * `addBytes([1]); addBytes([2]);`.
+   */
+  void addBytes(List<int> bytes) {
+    int length = bytes.length;
+    _makeRoom(length);
+    for (int i = 0; i < length; i++) {
+      _data.setUint8(_offset + i, bytes[i]);
+    }
+    _offset += length;
+  }
+
+  /**
+   * Collect a double-precision floating point value.
+   */
+  void addDouble(double d) {
+    _makeRoom(8);
+    _data.setFloat64(_offset, d, Endian.little);
+    _offset += 8;
+  }
+
+  /**
+   * Collect a 32-bit unsigned integer value.
+   */
+  void addInt(int i) {
+    _makeRoom(4);
+    _data.setUint32(_offset, i, Endian.little);
+    _offset += 4;
+  }
+
+  /**
+   * Collect a string.
+   */
+  void addString(String s) {
+    List<int> bytes = utf8.encode(s);
+    addInt(bytes.length);
+    addBytes(bytes);
+  }
+
+  /**
+   * Collect the given [Uint32List].
+   */
+  void addUint32List(Uint32List data) {
+    addBytes(data.buffer.asUint8List());
+  }
+
+  /**
+   * For testing only: retrieve the internal representation of the data that
+   * has been collected.
+   */
+  List<int> getBytes_forDebug() {
+    return new Uint8List.view(_data.buffer, 0, _offset).toList();
+  }
+
+  /**
+   * Return the bytes of the MD5 hash of the data collected so far.
+   */
+  List<int> toByteList() {
+    return md5.convert(new Uint8List.view(_data.buffer, 0, _offset)).bytes;
+  }
+
+  /**
+   * Return a hex-encoded MD5 signature of the data collected so far.
+   */
+  String toHex() {
+    return hex.encode(toByteList());
+  }
+
+  /**
+   * Ensure that [spaceNeeded] bytes can be added to [_data] at [_offset]
+   * (copying it to a larger object if necessary).
+   */
+  void _makeRoom(int spaceNeeded) {
+    int oldLength = _data.lengthInBytes;
+    if (_offset + spaceNeeded > oldLength) {
+      int newLength = 2 * (_offset + spaceNeeded);
+      ByteData newData = new ByteData(newLength);
+      new Uint8List.view(newData.buffer)
+          .setRange(0, oldLength, new Uint8List.view(_data.buffer));
+      _data = newData;
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary/expr_builder.dart b/pkg/analyzer/lib/src/summary/expr_builder.dart
index f67ae43..85053fe 100644
--- a/pkg/analyzer/lib/src/summary/expr_builder.dart
+++ b/pkg/analyzer/lib/src/summary/expr_builder.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/element.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';
@@ -302,6 +303,112 @@
     return arguments;
   }
 
+  /// Given the sequence of identifiers in [node], and the [classElement] or
+  /// [constructorElement] to which this sequence resolves, build the
+  /// [InstanceCreationExpression].
+  InstanceCreationExpression _buildCreation(
+    Expression node,
+    TypeArgumentList typeArguments,
+    ArgumentList argumentList, {
+    ClassElement classElement,
+    ConstructorElement constructorElement,
+  }) {
+    InstanceCreationExpression composeCreation(
+        DartType type,
+        ConstructorName constructorName,
+        ConstructorElement constructorElement,
+        ArgumentList argumentList) {
+      TypeName typeName = constructorName.type;
+      typeName.type = type;
+
+      constructorName.name?.staticElement = constructorElement;
+
+      var creation = astFactory.instanceCreationExpression(
+          uc.isValidConst
+              ? TokenFactory.tokenFromKeyword(Keyword.CONST)
+              : TokenFactory.tokenFromKeyword(Keyword.NEW),
+          constructorName,
+          argumentList);
+
+      creation.staticElement = constructorElement;
+      creation.staticType = type;
+      return creation;
+    }
+
+    classElement ??= constructorElement?.enclosingElement;
+    var type = AstRewriteVisitor.getType(
+        resynthesizer.typeSystem, classElement, typeArguments);
+
+    // C()
+    if (node is SimpleIdentifier && classElement != null) {
+      constructorElement = type.lookUpConstructor('', resynthesizer.library);
+      node.staticType = type;
+      return composeCreation(
+        type,
+        astFactory.constructorName(
+          astFactory.typeName(node, typeArguments),
+          null,
+          null,
+        ),
+        constructorElement,
+        argumentList,
+      );
+    }
+    if (node is PrefixedIdentifier) {
+      // C.n()
+      if (constructorElement != null) {
+        constructorElement =
+            type.lookUpConstructor(node.identifier.name, resynthesizer.library);
+        node.prefix.staticType = type;
+        return composeCreation(
+          type,
+          astFactory.constructorName(
+            astFactory.typeName(node.prefix, typeArguments),
+            TokenFactory.tokenFromType(TokenType.PERIOD),
+            node.identifier,
+          ),
+          constructorElement,
+          argumentList,
+        );
+      }
+      // p.C()
+      if (classElement != null) {
+        constructorElement = type.lookUpConstructor('', resynthesizer.library);
+        node.identifier.staticType = type;
+        return composeCreation(
+          type,
+          astFactory.constructorName(
+            astFactory.typeName(node.identifier, typeArguments),
+            null,
+            null,
+          ),
+          constructorElement,
+          argumentList,
+        );
+      }
+    }
+    // p.C.n()
+    if (node is PropertyAccess && constructorElement != null) {
+      constructorElement =
+          type.lookUpConstructor(node.propertyName.name, resynthesizer.library);
+      var typeIdentifier = (node.target as PrefixedIdentifier).identifier;
+      typeIdentifier.staticType = type;
+      return composeCreation(
+        type,
+        astFactory.constructorName(
+          astFactory.typeName(typeIdentifier, typeArguments),
+          TokenFactory.tokenFromType(TokenType.PERIOD),
+          node.propertyName,
+        ),
+        constructorElement,
+        argumentList,
+      );
+    }
+
+    throw new UnimplementedError('For ${node?.runtimeType}: $node; '
+        'class: $classElement;  constructor: $constructorElement');
+  }
+
   /**
    * Build the identifier sequence (a single or prefixed identifier, or a
    * property access) corresponding to the given reference [info].
@@ -571,6 +678,19 @@
     TypeArgumentList typeArguments = _buildTypeArguments();
     var period = TokenFactory.tokenFromType(TokenType.PERIOD);
     var argumentList = AstTestFactory.argumentList(arguments);
+
+    // Check for optional new/const.
+    if (info.element is ClassElement) {
+      _push(_buildCreation(node, typeArguments, argumentList,
+          classElement: info.element));
+      return;
+    }
+    if (info.element is ConstructorElement) {
+      _push(_buildCreation(node, typeArguments, argumentList,
+          constructorElement: info.element));
+      return;
+    }
+
     if (node is SimpleIdentifier) {
       _push(astFactory.methodInvocation(
           null, period, node, typeArguments, argumentList));
diff --git a/pkg/analyzer/lib/src/summary/flat_buffers.dart b/pkg/analyzer/lib/src/summary/flat_buffers.dart
index 8a33d95..3449a3b 100644
--- a/pkg/analyzer/lib/src/summary/flat_buffers.dart
+++ b/pkg/analyzer/lib/src/summary/flat_buffers.dart
@@ -1,8 +1,951 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
-// This library re-exports front_end's flat_buffers.dart, since its API is
-// stable enough to be relied upon by clients.
+import 'dart:collection';
+import 'dart:convert';
+import 'dart:math';
+import 'dart:typed_data';
 
-export 'package:front_end/src/base/flat_buffers.dart';
+/**
+ * Reader of lists of boolean values.
+ *
+ * The returned unmodifiable lists lazily read values on access.
+ */
+class BoolListReader extends Reader<List<bool>> {
+  const BoolListReader();
+
+  @override
+  int get size => 4;
+
+  @override
+  List<bool> read(BufferContext bc, int offset) =>
+      new _FbBoolList(bc, bc.derefObject(offset));
+}
+
+/**
+ * The reader of booleans.
+ */
+class BoolReader extends Reader<bool> {
+  const BoolReader() : super();
+
+  @override
+  int get size => 1;
+
+  @override
+  bool read(BufferContext bc, int offset) => bc._getInt8(offset) != 0;
+}
+
+/**
+ * Buffer with data and some context about it.
+ */
+class BufferContext {
+  final ByteData _buffer;
+
+  factory BufferContext.fromBytes(List<int> byteList) {
+    Uint8List uint8List = _asUint8List(byteList);
+    ByteData buf = new ByteData.view(uint8List.buffer, uint8List.offsetInBytes);
+    return new BufferContext._(buf);
+  }
+
+  BufferContext._(this._buffer);
+
+  int derefObject(int offset) {
+    return offset + _getUint32(offset);
+  }
+
+  Uint8List _asUint8LIst(int offset, int length) =>
+      _buffer.buffer.asUint8List(_buffer.offsetInBytes + offset, length);
+
+  double _getFloat64(int offset) => _buffer.getFloat64(offset, Endian.little);
+
+  int _getInt32(int offset) => _buffer.getInt32(offset, Endian.little);
+
+  int _getInt8(int offset) => _buffer.getInt8(offset);
+
+  int _getUint16(int offset) => _buffer.getUint16(offset, Endian.little);
+
+  int _getUint32(int offset) => _buffer.getUint32(offset, Endian.little);
+
+  int _getUint8(int offset) => _buffer.getUint8(offset);
+
+  /**
+   * If the [byteList] is already a [Uint8List] return it.
+   * Otherwise return a [Uint8List] copy of the [byteList].
+   */
+  static Uint8List _asUint8List(List<int> byteList) {
+    if (byteList is Uint8List) {
+      return byteList;
+    } else {
+      return new Uint8List.fromList(byteList);
+    }
+  }
+}
+
+/**
+ * Class that helps building flat buffers.
+ */
+class Builder {
+  final int initialSize;
+
+  /**
+   * The list of existing VTable(s).
+   */
+  final List<_VTable> _vTables = <_VTable>[];
+
+  ByteData _buf;
+
+  /**
+   * The maximum alignment that has been seen so far.  If [_buf] has to be
+   * reallocated in the future (to insert room at its start for more bytes) the
+   * reallocation will need to be a multiple of this many bytes.
+   */
+  int _maxAlign;
+
+  /**
+   * The number of bytes that have been written to the buffer so far.  The
+   * most recently written byte is this many bytes from the end of [_buf].
+   */
+  int _tail;
+
+  /**
+   * The location of the end of the current table, measured in bytes from the
+   * end of [_buf], or `null` if a table is not currently being built.
+   */
+  int _currentTableEndTail;
+
+  _VTable _currentVTable;
+
+  /**
+   * Map containing all strings that have been written so far.  This allows us
+   * to avoid duplicating strings.
+   */
+  Map<String, Offset<String>> _strings = <String, Offset<String>>{};
+
+  Builder({this.initialSize: 1024}) {
+    reset();
+  }
+
+  /**
+   * Add the [field] with the given boolean [value].  The field is not added if
+   * the [value] is equal to [def].  Booleans are stored as 8-bit fields with
+   * `0` for `false` and `1` for `true`.
+   */
+  void addBool(int field, bool value, [bool def]) {
+    _ensureCurrentVTable();
+    if (value != null && value != def) {
+      int size = 1;
+      _prepare(size, 1);
+      _trackField(field);
+      _buf.setInt8(_buf.lengthInBytes - _tail, value ? 1 : 0);
+    }
+  }
+
+  /**
+   * Add the [field] with the given 32-bit signed integer [value].  The field is
+   * not added if the [value] is equal to [def].
+   */
+  void addInt32(int field, int value, [int def]) {
+    _ensureCurrentVTable();
+    if (value != null && value != def) {
+      int size = 4;
+      _prepare(size, 1);
+      _trackField(field);
+      _setInt32AtTail(_buf, _tail, value);
+    }
+  }
+
+  /**
+   * Add the [field] with the given 8-bit signed integer [value].  The field is
+   * not added if the [value] is equal to [def].
+   */
+  void addInt8(int field, int value, [int def]) {
+    _ensureCurrentVTable();
+    if (value != null && value != def) {
+      int size = 1;
+      _prepare(size, 1);
+      _trackField(field);
+      _buf.setInt8(_buf.lengthInBytes - _tail, value);
+    }
+  }
+
+  /**
+   * Add the [field] referencing an object with the given [offset].
+   */
+  void addOffset(int field, Offset offset) {
+    _ensureCurrentVTable();
+    if (offset != null) {
+      _prepare(4, 1);
+      _trackField(field);
+      _setUint32AtTail(_buf, _tail, _tail - offset._tail);
+    }
+  }
+
+  /**
+   * Add the [field] with the given 32-bit unsigned integer [value].  The field
+   * is not added if the [value] is equal to [def].
+   */
+  void addUint32(int field, int value, [int def]) {
+    _ensureCurrentVTable();
+    if (value != null && value != def) {
+      int size = 4;
+      _prepare(size, 1);
+      _trackField(field);
+      _setUint32AtTail(_buf, _tail, value);
+    }
+  }
+
+  /**
+   * Add the [field] with the given 8-bit unsigned integer [value].  The field
+   * is not added if the [value] is equal to [def].
+   */
+  void addUint8(int field, int value, [int def]) {
+    _ensureCurrentVTable();
+    if (value != null && value != def) {
+      int size = 1;
+      _prepare(size, 1);
+      _trackField(field);
+      _setUint8AtTail(_buf, _tail, value);
+    }
+  }
+
+  /**
+   * End the current table and return its offset.
+   */
+  Offset endTable() {
+    if (_currentVTable == null) {
+      throw new StateError('Start a table before ending it.');
+    }
+    // Prepare for writing the VTable.
+    _prepare(4, 1);
+    int tableTail = _tail;
+    // Prepare the size of the current table.
+    _currentVTable.tableSize = tableTail - _currentTableEndTail;
+    // Prepare the VTable to use for the current table.
+    int vTableTail;
+    {
+      _currentVTable.computeFieldOffsets(tableTail);
+      // Try to find an existing compatible VTable.
+      for (int i = 0; i < _vTables.length; i++) {
+        _VTable vTable = _vTables[i];
+        if (_currentVTable.canUseExistingVTable(vTable)) {
+          vTableTail = vTable.tail;
+          break;
+        }
+      }
+      // Write a new VTable.
+      if (vTableTail == null) {
+        _prepare(2, _currentVTable.numOfUint16);
+        vTableTail = _tail;
+        _currentVTable.tail = vTableTail;
+        _currentVTable.output(_buf, _buf.lengthInBytes - _tail);
+        _vTables.add(_currentVTable);
+      }
+    }
+    // Set the VTable offset.
+    _setInt32AtTail(_buf, tableTail, vTableTail - tableTail);
+    // Done with this table.
+    _currentVTable = null;
+    return new Offset(tableTail);
+  }
+
+  /**
+   * Finish off the creation of the buffer.  The given [offset] is used as the
+   * root object offset, and usually references directly or indirectly every
+   * written object.  If [fileIdentifier] is specified (and not `null`), it is
+   * interpreted as a 4-byte Latin-1 encoded string that should be placed at
+   * bytes 4-7 of the file.
+   */
+  Uint8List finish(Offset offset, [String fileIdentifier]) {
+    _prepare(max(4, _maxAlign), fileIdentifier == null ? 1 : 2);
+    int alignedTail = _tail + ((-_tail) % _maxAlign);
+    _setUint32AtTail(_buf, alignedTail, alignedTail - offset._tail);
+    if (fileIdentifier != null) {
+      for (int i = 0; i < 4; i++) {
+        _setUint8AtTail(
+            _buf, alignedTail - 4 - i, fileIdentifier.codeUnitAt(i));
+      }
+    }
+    return _buf.buffer.asUint8List(_buf.lengthInBytes - alignedTail);
+  }
+
+  /**
+   * This is a low-level method, it should not be invoked by clients.
+   */
+  Uint8List lowFinish() {
+    int alignedTail = _tail + ((-_tail) % _maxAlign);
+    return _buf.buffer.asUint8List(_buf.lengthInBytes - alignedTail);
+  }
+
+  /**
+   * This is a low-level method, it should not be invoked by clients.
+   */
+  void lowReset() {
+    _buf = new ByteData(initialSize);
+    _maxAlign = 1;
+    _tail = 0;
+  }
+
+  /**
+   * This is a low-level method, it should not be invoked by clients.
+   */
+  void lowWriteUint32(int value) {
+    _prepare(4, 1);
+    _setUint32AtTail(_buf, _tail, value);
+  }
+
+  /**
+   * This is a low-level method, it should not be invoked by clients.
+   */
+  void lowWriteUint8(int value) {
+    _prepare(1, 1);
+    _buf.setUint8(_buf.lengthInBytes - _tail, value);
+  }
+
+  /**
+   * Reset the builder and make it ready for filling a new buffer.
+   */
+  void reset() {
+    _buf = new ByteData(initialSize);
+    _maxAlign = 1;
+    _tail = 0;
+    _currentVTable = null;
+  }
+
+  /**
+   * Start a new table.  Must be finished with [endTable] invocation.
+   */
+  void startTable() {
+    if (_currentVTable != null) {
+      throw new StateError('Inline tables are not supported.');
+    }
+    _currentVTable = new _VTable();
+    _currentTableEndTail = _tail;
+  }
+
+  /**
+   * Write the given list of [values].
+   */
+  Offset writeList(List<Offset> values) {
+    _ensureNoVTable();
+    _prepare(4, 1 + values.length);
+    Offset result = new Offset(_tail);
+    int tail = _tail;
+    _setUint32AtTail(_buf, tail, values.length);
+    tail -= 4;
+    for (Offset value in values) {
+      _setUint32AtTail(_buf, tail, tail - value._tail);
+      tail -= 4;
+    }
+    return result;
+  }
+
+  /**
+   * Write the given list of boolean [values].
+   */
+  Offset writeListBool(List<bool> values) {
+    int bitLength = values.length;
+    int padding = (-bitLength) % 8;
+    int byteLength = (bitLength + padding) ~/ 8;
+    // Prepare the backing Uint8List.
+    Uint8List bytes = new Uint8List(byteLength + 1);
+    // Record every bit.
+    int byteIndex = 0;
+    int byte = 0;
+    int mask = 1;
+    for (int bitIndex = 0; bitIndex < bitLength; bitIndex++) {
+      if (bitIndex != 0 && (bitIndex % 8 == 0)) {
+        bytes[byteIndex++] = byte;
+        byte = 0;
+        mask = 1;
+      }
+      if (values[bitIndex]) {
+        byte |= mask;
+      }
+      mask <<= 1;
+    }
+    // Write the last byte, even if it may be on the padding.
+    bytes[byteIndex] = byte;
+    // Write the padding length.
+    bytes[byteLength] = padding;
+    // Write as a Uint8 list.
+    return writeListUint8(bytes);
+  }
+
+  /**
+   * Write the given list of 64-bit float [values].
+   */
+  Offset writeListFloat64(List<double> values) {
+    _ensureNoVTable();
+    _prepare(8, 1 + values.length);
+    Offset result = new Offset(_tail);
+    int tail = _tail;
+    _setUint32AtTail(_buf, tail, values.length);
+    tail -= 8;
+    for (double value in values) {
+      _setFloat64AtTail(_buf, tail, value);
+      tail -= 8;
+    }
+    return result;
+  }
+
+  /**
+   * Write the given list of signed 32-bit integer [values].
+   */
+  Offset writeListInt32(List<int> values) {
+    _ensureNoVTable();
+    _prepare(4, 1 + values.length);
+    Offset result = new Offset(_tail);
+    int tail = _tail;
+    _setUint32AtTail(_buf, tail, values.length);
+    tail -= 4;
+    for (int value in values) {
+      _setInt32AtTail(_buf, tail, value);
+      tail -= 4;
+    }
+    return result;
+  }
+
+  /**
+   * Write the given list of unsigned 32-bit integer [values].
+   */
+  Offset writeListUint32(List<int> values) {
+    _ensureNoVTable();
+    _prepare(4, 1 + values.length);
+    Offset result = new Offset(_tail);
+    int tail = _tail;
+    _setUint32AtTail(_buf, tail, values.length);
+    tail -= 4;
+    for (int value in values) {
+      _setUint32AtTail(_buf, tail, value);
+      tail -= 4;
+    }
+    return result;
+  }
+
+  /**
+   * Write the given list of unsigned 8-bit integer [values].
+   */
+  Offset writeListUint8(List<int> values) {
+    _ensureNoVTable();
+    _prepare(4, 1, additionalBytes: values.length);
+    Offset result = new Offset(_tail);
+    int tail = _tail;
+    _setUint32AtTail(_buf, tail, values.length);
+    tail -= 4;
+    for (int value in values) {
+      _setUint8AtTail(_buf, tail, value);
+      tail -= 1;
+    }
+    return result;
+  }
+
+  /**
+   * Write the given string [value] and return its [Offset], or `null` if
+   * the [value] is equal to [def].
+   */
+  Offset<String> writeString(String value, [String def]) {
+    _ensureNoVTable();
+    if (value != def) {
+      return _strings.putIfAbsent(value, () {
+        // TODO(scheglov) optimize for ASCII strings
+        List<int> bytes = utf8.encode(value);
+        int length = bytes.length;
+        _prepare(4, 1, additionalBytes: length);
+        Offset<String> result = new Offset(_tail);
+        _setUint32AtTail(_buf, _tail, length);
+        int offset = _buf.lengthInBytes - _tail + 4;
+        for (int i = 0; i < length; i++) {
+          _buf.setUint8(offset++, bytes[i]);
+        }
+        return result;
+      });
+    }
+    return null;
+  }
+
+  /**
+   * Throw an exception if there is not currently a vtable.
+   */
+  void _ensureCurrentVTable() {
+    if (_currentVTable == null) {
+      throw new StateError('Start a table before adding values.');
+    }
+  }
+
+  /**
+   * Throw an exception if there is currently a vtable.
+   */
+  void _ensureNoVTable() {
+    if (_currentVTable != null) {
+      throw new StateError(
+          'Cannot write a non-scalar value while writing a table.');
+    }
+  }
+
+  /**
+   * Prepare for writing the given [count] of scalars of the given [size].
+   * Additionally allocate the specified [additionalBytes]. Update the current
+   * tail pointer to point at the allocated space.
+   */
+  void _prepare(int size, int count, {int additionalBytes: 0}) {
+    // Update the alignment.
+    if (_maxAlign < size) {
+      _maxAlign = size;
+    }
+    // Prepare amount of required space.
+    int dataSize = size * count + additionalBytes;
+    int alignDelta = (-(_tail + dataSize)) % size;
+    int bufSize = alignDelta + dataSize;
+    // Ensure that we have the required amount of space.
+    {
+      int oldCapacity = _buf.lengthInBytes;
+      if (_tail + bufSize > oldCapacity) {
+        int desiredNewCapacity = (oldCapacity + bufSize) * 2;
+        int deltaCapacity = desiredNewCapacity - oldCapacity;
+        deltaCapacity += (-deltaCapacity) % _maxAlign;
+        int newCapacity = oldCapacity + deltaCapacity;
+        ByteData newBuf = new ByteData(newCapacity);
+        newBuf.buffer
+            .asUint8List()
+            .setAll(deltaCapacity, _buf.buffer.asUint8List());
+        _buf = newBuf;
+      }
+    }
+    // Update the tail pointer.
+    _tail += bufSize;
+  }
+
+  /**
+   * Record the offset of the given [field].
+   */
+  void _trackField(int field) {
+    _currentVTable.addField(field, _tail);
+  }
+
+  static void _setFloat64AtTail(ByteData _buf, int tail, double x) {
+    _buf.setFloat64(_buf.lengthInBytes - tail, x, Endian.little);
+  }
+
+  static void _setInt32AtTail(ByteData _buf, int tail, int x) {
+    _buf.setInt32(_buf.lengthInBytes - tail, x, Endian.little);
+  }
+
+  static void _setUint32AtTail(ByteData _buf, int tail, int x) {
+    _buf.setUint32(_buf.lengthInBytes - tail, x, Endian.little);
+  }
+
+  static void _setUint8AtTail(ByteData _buf, int tail, int x) {
+    _buf.setUint8(_buf.lengthInBytes - tail, x);
+  }
+}
+
+/**
+ * The reader of lists of 64-bit float values.
+ *
+ * The returned unmodifiable lists lazily read values on access.
+ */
+class Float64ListReader extends Reader<List<double>> {
+  const Float64ListReader();
+
+  @override
+  int get size => 4;
+
+  @override
+  List<double> read(BufferContext bc, int offset) =>
+      new _FbFloat64List(bc, bc.derefObject(offset));
+}
+
+/**
+ * The reader of signed 32-bit integers.
+ */
+class Int32Reader extends Reader<int> {
+  const Int32Reader() : super();
+
+  @override
+  int get size => 4;
+
+  @override
+  int read(BufferContext bc, int offset) => bc._getInt32(offset);
+}
+
+/**
+ * The reader of 8-bit signed integers.
+ */
+class Int8Reader extends Reader<int> {
+  const Int8Reader() : super();
+
+  @override
+  int get size => 1;
+
+  @override
+  int read(BufferContext bc, int offset) => bc._getInt8(offset);
+}
+
+/**
+ * The reader of lists of objects.
+ *
+ * The returned unmodifiable lists lazily read objects on access.
+ */
+class ListReader<E> extends Reader<List<E>> {
+  final Reader<E> _elementReader;
+
+  const ListReader(this._elementReader);
+
+  @override
+  int get size => 4;
+
+  @override
+  List<E> read(BufferContext bc, int offset) =>
+      new _FbGenericList<E>(_elementReader, bc, bc.derefObject(offset));
+}
+
+/**
+ * The offset from the end of the buffer to a serialized object of the type [T].
+ */
+class Offset<T> {
+  final int _tail;
+
+  Offset(this._tail);
+}
+
+/**
+ * Object that can read a value at a [BufferContext].
+ */
+abstract class Reader<T> {
+  const Reader();
+
+  /**
+   * The size of the value in bytes.
+   */
+  int get size;
+
+  /**
+   * Read the value at the given [offset] in [bc].
+   */
+  T read(BufferContext bc, int offset);
+
+  /**
+   * Read the value of the given [field] in the given [object].
+   */
+  T vTableGet(BufferContext object, int offset, int field, [T defaultValue]) {
+    int vTableSOffset = object._getInt32(offset);
+    int vTableOffset = offset - vTableSOffset;
+    int vTableSize = object._getUint16(vTableOffset);
+    int vTableFieldOffset = (1 + 1 + field) * 2;
+    if (vTableFieldOffset < vTableSize) {
+      int fieldOffsetInObject =
+          object._getUint16(vTableOffset + vTableFieldOffset);
+      if (fieldOffsetInObject != 0) {
+        return read(object, offset + fieldOffsetInObject);
+      }
+    }
+    return defaultValue;
+  }
+}
+
+/**
+ * The reader of string values.
+ */
+class StringReader extends Reader<String> {
+  const StringReader() : super();
+
+  @override
+  int get size => 4;
+
+  @override
+  String read(BufferContext bc, int offset) {
+    int strOffset = bc.derefObject(offset);
+    int length = bc._getUint32(strOffset);
+    Uint8List bytes = bc._asUint8LIst(strOffset + 4, length);
+    if (_isLatin(bytes)) {
+      return new String.fromCharCodes(bytes);
+    }
+    return utf8.decode(bytes);
+  }
+
+  static bool _isLatin(Uint8List bytes) {
+    int length = bytes.length;
+    for (int i = 0; i < length; i++) {
+      if (bytes[i] > 127) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+
+/**
+ * An abstract reader for tables.
+ */
+abstract class TableReader<T> extends Reader<T> {
+  const TableReader();
+
+  @override
+  int get size => 4;
+
+  /**
+   * Return the object at [offset].
+   */
+  T createObject(BufferContext bc, int offset);
+
+  @override
+  T read(BufferContext bp, int offset) {
+    int objectOffset = bp.derefObject(offset);
+    return createObject(bp, objectOffset);
+  }
+}
+
+/**
+ * Reader of lists of unsigned 32-bit integer values.
+ *
+ * The returned unmodifiable lists lazily read values on access.
+ */
+class Uint32ListReader extends Reader<List<int>> {
+  const Uint32ListReader();
+
+  @override
+  int get size => 4;
+
+  @override
+  List<int> read(BufferContext bc, int offset) =>
+      new _FbUint32List(bc, bc.derefObject(offset));
+}
+
+/**
+ * The reader of unsigned 32-bit integers.
+ */
+class Uint32Reader extends Reader<int> {
+  const Uint32Reader() : super();
+
+  @override
+  int get size => 4;
+
+  @override
+  int read(BufferContext bc, int offset) => bc._getUint32(offset);
+}
+
+/**
+ * Reader of lists of unsigned 8-bit integer values.
+ *
+ * The returned unmodifiable lists lazily read values on access.
+ */
+class Uint8ListReader extends Reader<List<int>> {
+  const Uint8ListReader();
+
+  @override
+  int get size => 4;
+
+  @override
+  List<int> read(BufferContext bc, int offset) =>
+      new _FbUint8List(bc, bc.derefObject(offset));
+}
+
+/**
+ * The reader of unsigned 8-bit integers.
+ */
+class Uint8Reader extends Reader<int> {
+  const Uint8Reader() : super();
+
+  @override
+  int get size => 1;
+
+  @override
+  int read(BufferContext bc, int offset) => bc._getUint8(offset);
+}
+
+/**
+ * List of booleans backed by 8-bit unsigned integers.
+ */
+class _FbBoolList extends Object with ListMixin<bool> implements List<bool> {
+  final BufferContext bc;
+  final int offset;
+  int _length;
+
+  _FbBoolList(this.bc, this.offset);
+
+  @override
+  int get length {
+    if (_length == null) {
+      int byteLength = bc._getUint32(offset);
+      _length = (byteLength - 1) * 8 - _getByte(byteLength - 1);
+    }
+    return _length;
+  }
+
+  @override
+  void set length(int i) =>
+      throw new StateError('Attempt to modify immutable list');
+
+  @override
+  bool operator [](int i) {
+    int index = i ~/ 8;
+    int mask = 1 << i % 8;
+    return _getByte(index) & mask != 0;
+  }
+
+  @override
+  void operator []=(int i, bool e) =>
+      throw new StateError('Attempt to modify immutable list');
+
+  int _getByte(int index) => bc._getUint8(offset + 4 + index);
+}
+
+/**
+ * The list backed by 64-bit values - Uint64 length and Float64.
+ */
+class _FbFloat64List extends _FbList<double> {
+  _FbFloat64List(BufferContext bc, int offset) : super(bc, offset);
+
+  @override
+  double operator [](int i) {
+    return bc._getFloat64(offset + 8 + 8 * i);
+  }
+}
+
+/**
+ * List backed by a generic object which may have any size.
+ */
+class _FbGenericList<E> extends _FbList<E> {
+  final Reader<E> elementReader;
+
+  List<E> _items;
+
+  _FbGenericList(this.elementReader, BufferContext bp, int offset)
+      : super(bp, offset);
+
+  @override
+  E operator [](int i) {
+    _items ??= new List<E>(length);
+    E item = _items[i];
+    if (item == null) {
+      item = elementReader.read(bc, offset + 4 + elementReader.size * i);
+      _items[i] = item;
+    }
+    return item;
+  }
+}
+
+/**
+ * The base class for immutable lists read from flat buffers.
+ */
+abstract class _FbList<E> extends Object with ListMixin<E> implements List<E> {
+  final BufferContext bc;
+  final int offset;
+  int _length;
+
+  _FbList(this.bc, this.offset);
+
+  @override
+  int get length {
+    _length ??= bc._getUint32(offset);
+    return _length;
+  }
+
+  @override
+  void set length(int i) =>
+      throw new StateError('Attempt to modify immutable list');
+
+  @override
+  void operator []=(int i, E e) =>
+      throw new StateError('Attempt to modify immutable list');
+}
+
+/**
+ * List backed by 32-bit unsigned integers.
+ */
+class _FbUint32List extends _FbList<int> {
+  _FbUint32List(BufferContext bc, int offset) : super(bc, offset);
+
+  @override
+  int operator [](int i) {
+    return bc._getUint32(offset + 4 + 4 * i);
+  }
+}
+
+/**
+ * List backed by 8-bit unsigned integers.
+ */
+class _FbUint8List extends _FbList<int> {
+  _FbUint8List(BufferContext bc, int offset) : super(bc, offset);
+
+  @override
+  int operator [](int i) {
+    return bc._getUint8(offset + 4 + i);
+  }
+}
+
+/**
+ * Class that describes the structure of a table.
+ */
+class _VTable {
+  final List<int> fieldTails = <int>[];
+  final List<int> fieldOffsets = <int>[];
+
+  /**
+   * The size of the table that uses this VTable.
+   */
+  int tableSize;
+
+  /**
+   * The tail of this VTable.  It is used to share the same VTable between
+   * multiple tables of identical structure.
+   */
+  int tail;
+
+  int get numOfUint16 => 1 + 1 + fieldTails.length;
+
+  void addField(int field, int offset) {
+    while (fieldTails.length <= field) {
+      fieldTails.add(null);
+    }
+    fieldTails[field] = offset;
+  }
+
+  /**
+   * Return `true` if the [existing] VTable can be used instead of this.
+   */
+  bool canUseExistingVTable(_VTable existing) {
+    assert(tail == null);
+    assert(existing.tail != null);
+    if (tableSize == existing.tableSize &&
+        fieldOffsets.length == existing.fieldOffsets.length) {
+      for (int i = 0; i < fieldOffsets.length; i++) {
+        if (fieldOffsets[i] != existing.fieldOffsets[i]) {
+          return false;
+        }
+      }
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Fill the [fieldOffsets] field.
+   */
+  void computeFieldOffsets(int tableTail) {
+    assert(fieldOffsets.isEmpty);
+    for (int fieldTail in fieldTails) {
+      int fieldOffset = fieldTail == null ? 0 : tableTail - fieldTail;
+      fieldOffsets.add(fieldOffset);
+    }
+  }
+
+  /**
+   * Outputs this VTable to [buf], which is is expected to be aligned to 16-bit
+   * and have at least [numOfUint16] 16-bit words available.
+   */
+  void output(ByteData buf, int bufOffset) {
+    // VTable size.
+    buf.setUint16(bufOffset, numOfUint16 * 2, Endian.little);
+    bufOffset += 2;
+    // Table size.
+    buf.setUint16(bufOffset, tableSize, Endian.little);
+    bufOffset += 2;
+    // Field offsets.
+    for (int fieldOffset in fieldOffsets) {
+      buf.setUint16(bufOffset, fieldOffset, Endian.little);
+      bufOffset += 2;
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index cda912f..476923c 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -211,9 +211,7 @@
   @override
   String get exception => _exception ??= '';
 
-  /**
-   * The exception string.
-   */
+  /// The exception string.
   void set exception(String value) {
     this._exception = value;
   }
@@ -222,9 +220,7 @@
   List<AnalysisDriverExceptionFileBuilder> get files =>
       _files ??= <AnalysisDriverExceptionFileBuilder>[];
 
-  /**
-   * The state of files when the exception happened.
-   */
+  /// The state of files when the exception happened.
   void set files(List<AnalysisDriverExceptionFileBuilder> value) {
     this._files = value;
   }
@@ -232,9 +228,7 @@
   @override
   String get path => _path ??= '';
 
-  /**
-   * The path of the file being analyzed when the exception happened.
-   */
+  /// The path of the file being analyzed when the exception happened.
   void set path(String value) {
     this._path = value;
   }
@@ -242,9 +236,7 @@
   @override
   String get stackTrace => _stackTrace ??= '';
 
-  /**
-   * The exception stack trace string.
-   */
+  /// The exception stack trace string.
   void set stackTrace(String value) {
     this._stackTrace = value;
   }
@@ -414,9 +406,7 @@
   @override
   String get content => _content ??= '';
 
-  /**
-   * The content of the file.
-   */
+  /// The content of the file.
   void set content(String value) {
     this._content = value;
   }
@@ -424,9 +414,7 @@
   @override
   String get path => _path ??= '';
 
-  /**
-   * The path of the file.
-   */
+  /// The path of the file.
   void set path(String value) {
     this._path = value;
   }
@@ -532,9 +520,7 @@
   List<AnalysisDriverUnitErrorBuilder> get errors =>
       _errors ??= <AnalysisDriverUnitErrorBuilder>[];
 
-  /**
-   * The full list of analysis errors, both syntactic and semantic.
-   */
+  /// The full list of analysis errors, both syntactic and semantic.
   void set errors(List<AnalysisDriverUnitErrorBuilder> value) {
     this._errors = value;
   }
@@ -542,9 +528,7 @@
   @override
   AnalysisDriverUnitIndexBuilder get index => _index;
 
-  /**
-   * The index of the unit.
-   */
+  /// The index of the unit.
   void set index(AnalysisDriverUnitIndexBuilder value) {
     this._index = value;
   }
@@ -678,11 +662,9 @@
   @override
   List<int> get members => _members ??= <int>[];
 
-  /**
-   * The names of defined instance members.
-   * They are indexes into [AnalysisDriverUnitError.strings] list.
-   * The list is sorted in ascending order.
-   */
+  /// The names of defined instance members.
+  /// They are indexes into [AnalysisDriverUnitError.strings] list.
+  /// The list is sorted in ascending order.
   void set members(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._members = value;
@@ -691,10 +673,8 @@
   @override
   int get name => _name ??= 0;
 
-  /**
-   * The name of the class.
-   * It is an index into [AnalysisDriverUnitError.strings] list.
-   */
+  /// The name of the class.
+  /// It is an index into [AnalysisDriverUnitError.strings] list.
   void set name(int value) {
     assert(value == null || value >= 0);
     this._name = value;
@@ -806,9 +786,7 @@
   @override
   String get correction => _correction ??= '';
 
-  /**
-   * The optional correction hint for the error.
-   */
+  /// The optional correction hint for the error.
   void set correction(String value) {
     this._correction = value;
   }
@@ -816,9 +794,7 @@
   @override
   int get length => _length ??= 0;
 
-  /**
-   * The length of the error in the file.
-   */
+  /// The length of the error in the file.
   void set length(int value) {
     assert(value == null || value >= 0);
     this._length = value;
@@ -827,9 +803,7 @@
   @override
   String get message => _message ??= '';
 
-  /**
-   * The message of the error.
-   */
+  /// The message of the error.
   void set message(String value) {
     this._message = value;
   }
@@ -837,9 +811,7 @@
   @override
   int get offset => _offset ??= 0;
 
-  /**
-   * The offset from the beginning of the file.
-   */
+  /// The offset from the beginning of the file.
   void set offset(int value) {
     assert(value == null || value >= 0);
     this._offset = value;
@@ -848,9 +820,7 @@
   @override
   String get uniqueName => _uniqueName ??= '';
 
-  /**
-   * The unique name of the error code.
-   */
+  /// The unique name of the error code.
   void set uniqueName(String value) {
     this._uniqueName = value;
   }
@@ -1024,10 +994,8 @@
   List<idl.IndexSyntheticElementKind> get elementKinds =>
       _elementKinds ??= <idl.IndexSyntheticElementKind>[];
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the kind of the synthetic element.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the kind of the synthetic element.
   void set elementKinds(List<idl.IndexSyntheticElementKind> value) {
     this._elementKinds = value;
   }
@@ -1036,12 +1004,11 @@
   List<int> get elementNameClassMemberIds =>
       _elementNameClassMemberIds ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the class member element name, or `null` if the element
-   * is a top-level element.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this index.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the class member element name, or `null` if the element
+  /// is a top-level element.  The list is sorted in ascending order, so that
+  /// the client can quickly check whether an element is referenced in this
+  /// index.
   void set elementNameClassMemberIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameClassMemberIds = value;
@@ -1050,12 +1017,10 @@
   @override
   List<int> get elementNameParameterIds => _elementNameParameterIds ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the named parameter name, or `null` if the element is not
-   * a named parameter.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this index.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the named parameter name, or `null` if the element is
+  /// not a named parameter.  The list is sorted in ascending order, so that the
+  /// client can quickly check whether an element is referenced in this index.
   void set elementNameParameterIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameParameterIds = value;
@@ -1065,12 +1030,10 @@
   List<int> get elementNameUnitMemberIds =>
       _elementNameUnitMemberIds ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the top-level element name, or `null` if the element is
-   * the unit.  The list is sorted in ascending order, so that the client can
-   * quickly check whether an element is referenced in this index.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the top-level element name, or `null` if the element is
+  /// the unit.  The list is sorted in ascending order, so that the client can
+  /// quickly check whether an element is referenced in this index.
   void set elementNameUnitMemberIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameUnitMemberIds = value;
@@ -1079,11 +1042,9 @@
   @override
   List<int> get elementUnits => _elementUnits ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the index into [unitLibraryUris] and [unitUnitUris] for the library
-   * specific unit where the element is declared.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the index into [unitLibraryUris] and [unitUnitUris] for the library
+  /// specific unit where the element is declared.
   void set elementUnits(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementUnits = value;
@@ -1092,9 +1053,7 @@
   @override
   int get nullStringId => _nullStringId ??= 0;
 
-  /**
-   * Identifier of the null string in [strings].
-   */
+  /// Identifier of the null string in [strings].
   void set nullStringId(int value) {
     assert(value == null || value >= 0);
     this._nullStringId = value;
@@ -1103,11 +1062,9 @@
   @override
   List<String> get strings => _strings ??= <String>[];
 
-  /**
-   * List of unique element strings used in this index.  The list is sorted in
-   * ascending order, so that the client can quickly check the presence of a
-   * string in this index.
-   */
+  /// List of unique element strings used in this index.  The list is sorted in
+  /// ascending order, so that the client can quickly check the presence of a
+  /// string in this index.
   void set strings(List<String> value) {
     this._strings = value;
   }
@@ -1116,9 +1073,7 @@
   List<AnalysisDriverSubtypeBuilder> get subtypes =>
       _subtypes ??= <AnalysisDriverSubtypeBuilder>[];
 
-  /**
-   * The list of classes declared in the unit.
-   */
+  /// The list of classes declared in the unit.
   void set subtypes(List<AnalysisDriverSubtypeBuilder> value) {
     this._subtypes = value;
   }
@@ -1126,12 +1081,10 @@
   @override
   List<int> get supertypes => _supertypes ??= <int>[];
 
-  /**
-   * The identifiers of supertypes of elements at corresponding indexes
-   * in [subtypes].  They are indexes into [strings] list. The list is sorted
-   * in ascending order.  There might be more than one element with the same
-   * value if there is more than one subtype of this supertype.
-   */
+  /// The identifiers of supertypes of elements at corresponding indexes
+  /// in [subtypes].  They are indexes into [strings] list. The list is sorted
+  /// in ascending order.  There might be more than one element with the same
+  /// value if there is more than one subtype of this supertype.
   void set supertypes(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._supertypes = value;
@@ -1140,10 +1093,9 @@
   @override
   List<int> get unitLibraryUris => _unitLibraryUris ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to the library URI of a unique library
-   * specific unit referenced in the index.  It is an index into [strings] list.
-   */
+  /// Each item of this list corresponds to the library URI of a unique library
+  /// specific unit referenced in the index.  It is an index into [strings]
+  /// list.
   void set unitLibraryUris(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._unitLibraryUris = value;
@@ -1152,10 +1104,9 @@
   @override
   List<int> get unitUnitUris => _unitUnitUris ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to the unit URI of a unique library
-   * specific unit referenced in the index.  It is an index into [strings] list.
-   */
+  /// Each item of this list corresponds to the unit URI of a unique library
+  /// specific unit referenced in the index.  It is an index into [strings]
+  /// list.
   void set unitUnitUris(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._unitUnitUris = value;
@@ -1165,10 +1116,8 @@
   List<bool> get usedElementIsQualifiedFlags =>
       _usedElementIsQualifiedFlags ??= <bool>[];
 
-  /**
-   * Each item of this list is the `true` if the corresponding element usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding element usage
+  /// is qualified with some prefix.
   void set usedElementIsQualifiedFlags(List<bool> value) {
     this._usedElementIsQualifiedFlags = value;
   }
@@ -1177,9 +1126,7 @@
   List<idl.IndexRelationKind> get usedElementKinds =>
       _usedElementKinds ??= <idl.IndexRelationKind>[];
 
-  /**
-   * Each item of this list is the kind of the element usage.
-   */
+  /// Each item of this list is the kind of the element usage.
   void set usedElementKinds(List<idl.IndexRelationKind> value) {
     this._usedElementKinds = value;
   }
@@ -1187,9 +1134,7 @@
   @override
   List<int> get usedElementLengths => _usedElementLengths ??= <int>[];
 
-  /**
-   * Each item of this list is the length of the element usage.
-   */
+  /// Each item of this list is the length of the element usage.
   void set usedElementLengths(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElementLengths = value;
@@ -1198,10 +1143,8 @@
   @override
   List<int> get usedElementOffsets => _usedElementOffsets ??= <int>[];
 
-  /**
-   * Each item of this list is the offset of the element usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the element usage relative to the
+  /// beginning of the file.
   void set usedElementOffsets(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElementOffsets = value;
@@ -1210,12 +1153,10 @@
   @override
   List<int> get usedElements => _usedElements ??= <int>[];
 
-  /**
-   * Each item of this list is the index into [elementUnits],
-   * [elementNameUnitMemberIds], [elementNameClassMemberIds] and
-   * [elementNameParameterIds].  The list is sorted in ascending order, so
-   * that the client can quickly find element references in this index.
-   */
+  /// Each item of this list is the index into [elementUnits],
+  /// [elementNameUnitMemberIds], [elementNameClassMemberIds] and
+  /// [elementNameParameterIds].  The list is sorted in ascending order, so
+  /// that the client can quickly find element references in this index.
   void set usedElements(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElements = value;
@@ -1225,10 +1166,8 @@
   List<bool> get usedNameIsQualifiedFlags =>
       _usedNameIsQualifiedFlags ??= <bool>[];
 
-  /**
-   * Each item of this list is the `true` if the corresponding name usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding name usage
+  /// is qualified with some prefix.
   void set usedNameIsQualifiedFlags(List<bool> value) {
     this._usedNameIsQualifiedFlags = value;
   }
@@ -1237,9 +1176,7 @@
   List<idl.IndexRelationKind> get usedNameKinds =>
       _usedNameKinds ??= <idl.IndexRelationKind>[];
 
-  /**
-   * Each item of this list is the kind of the name usage.
-   */
+  /// Each item of this list is the kind of the name usage.
   void set usedNameKinds(List<idl.IndexRelationKind> value) {
     this._usedNameKinds = value;
   }
@@ -1247,10 +1184,8 @@
   @override
   List<int> get usedNameOffsets => _usedNameOffsets ??= <int>[];
 
-  /**
-   * Each item of this list is the offset of the name usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the name usage relative to the
+  /// beginning of the file.
   void set usedNameOffsets(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedNameOffsets = value;
@@ -1259,11 +1194,9 @@
   @override
   List<int> get usedNames => _usedNames ??= <int>[];
 
-  /**
-   * Each item of this list is the index into [strings] for a used name.  The
-   * list is sorted in ascending order, so that the client can quickly find
-   * whether a name is used in this index.
-   */
+  /// Each item of this list is the index into [strings] for a used name.  The
+  /// list is sorted in ascending order, so that the client can quickly find
+  /// whether a name is used in this index.
   void set usedNames(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedNames = value;
@@ -1916,9 +1849,7 @@
   List<String> get definedClassMemberNames =>
       _definedClassMemberNames ??= <String>[];
 
-  /**
-   * List of class member names defined by the unit.
-   */
+  /// List of class member names defined by the unit.
   void set definedClassMemberNames(List<String> value) {
     this._definedClassMemberNames = value;
   }
@@ -1926,9 +1857,7 @@
   @override
   List<String> get definedTopLevelNames => _definedTopLevelNames ??= <String>[];
 
-  /**
-   * List of top-level names defined by the unit.
-   */
+  /// List of top-level names defined by the unit.
   void set definedTopLevelNames(List<String> value) {
     this._definedTopLevelNames = value;
   }
@@ -1936,9 +1865,7 @@
   @override
   List<String> get referencedNames => _referencedNames ??= <String>[];
 
-  /**
-   * List of external names referenced by the unit.
-   */
+  /// List of external names referenced by the unit.
   void set referencedNames(List<String> value) {
     this._referencedNames = value;
   }
@@ -1946,10 +1873,8 @@
   @override
   List<String> get subtypedNames => _subtypedNames ??= <String>[];
 
-  /**
-   * List of names which are used in `extends`, `with` or `implements` clauses
-   * in the file. Import prefixes and type arguments are not included.
-   */
+  /// List of names which are used in `extends`, `with` or `implements` clauses
+  /// in the file. Import prefixes and type arguments are not included.
   void set subtypedNames(List<String> value) {
     this._subtypedNames = value;
   }
@@ -1957,9 +1882,7 @@
   @override
   UnlinkedUnitBuilder get unit => _unit;
 
-  /**
-   * Unlinked information for the unit.
-   */
+  /// Unlinked information for the unit.
   void set unit(UnlinkedUnitBuilder value) {
     this._unit = value;
   }
@@ -2181,9 +2104,7 @@
   @override
   int get length => _length ??= 0;
 
-  /**
-   * Length of the element code.
-   */
+  /// Length of the element code.
   void set length(int value) {
     assert(value == null || value >= 0);
     this._length = value;
@@ -2192,9 +2113,7 @@
   @override
   int get offset => _offset ??= 0;
 
-  /**
-   * Offset of the element code relative to the beginning of the file.
-   */
+  /// Offset of the element code relative to the beginning of the file.
   void set offset(int value) {
     assert(value == null || value >= 0);
     this._offset = value;
@@ -2297,9 +2216,7 @@
   @override
   idl.EntityRefKind get entityKind => _entityKind ??= idl.EntityRefKind.named;
 
-  /**
-   * The kind of entity being represented.
-   */
+  /// The kind of entity being represented.
   void set entityKind(idl.EntityRefKind value) {
     this._entityKind = value;
   }
@@ -2308,34 +2225,32 @@
   List<int> get implicitFunctionTypeIndices =>
       _implicitFunctionTypeIndices ??= <int>[];
 
-  /**
-   * Notice: This will be deprecated. However, its not deprecated yet, as we're
-   * keeping it for backwards compatibilty, and marking it deprecated makes it
-   * unreadable.
-   *
-   * TODO(mfairhurst) mark this deprecated, and remove its logic.
-   *
-   * If this is a reference to a function type implicitly defined by a
-   * function-typed parameter, a list of zero-based indices indicating the path
-   * from the entity referred to by [reference] to the appropriate type
-   * parameter.  Otherwise the empty list.
-   *
-   * If there are N indices in this list, then the entity being referred to is
-   * the function type implicitly defined by a function-typed parameter of a
-   * function-typed parameter, to N levels of nesting.  The first index in the
-   * list refers to the outermost level of nesting; for example if [reference]
-   * refers to the entity defined by:
-   *
-   *     void f(x, void g(y, z, int h(String w))) { ... }
-   *
-   * Then to refer to the function type implicitly defined by parameter `h`
-   * (which is parameter 2 of parameter 1 of `f`), then
-   * [implicitFunctionTypeIndices] should be [1, 2].
-   *
-   * Note that if the entity being referred to is a generic method inside a
-   * generic class, then the type arguments in [typeArguments] are applied
-   * first to the class and then to the method.
-   */
+  /// Notice: This will be deprecated. However, its not deprecated yet, as we're
+  /// keeping it for backwards compatibilty, and marking it deprecated makes it
+  /// unreadable.
+  ///
+  /// TODO(mfairhurst) mark this deprecated, and remove its logic.
+  ///
+  /// If this is a reference to a function type implicitly defined by a
+  /// function-typed parameter, a list of zero-based indices indicating the path
+  /// from the entity referred to by [reference] to the appropriate type
+  /// parameter.  Otherwise the empty list.
+  ///
+  /// If there are N indices in this list, then the entity being referred to is
+  /// the function type implicitly defined by a function-typed parameter of a
+  /// function-typed parameter, to N levels of nesting.  The first index in the
+  /// list refers to the outermost level of nesting; for example if [reference]
+  /// refers to the entity defined by:
+  ///
+  ///     void f(x, void g(y, z, int h(String w))) { ... }
+  ///
+  /// Then to refer to the function type implicitly defined by parameter `h`
+  /// (which is parameter 2 of parameter 1 of `f`), then
+  /// [implicitFunctionTypeIndices] should be [1, 2].
+  ///
+  /// Note that if the entity being referred to is a generic method inside a
+  /// generic class, then the type arguments in [typeArguments] are applied
+  /// first to the class and then to the method.
   void set implicitFunctionTypeIndices(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._implicitFunctionTypeIndices = value;
@@ -2344,25 +2259,23 @@
   @override
   int get paramReference => _paramReference ??= 0;
 
-  /**
-   * If this is a reference to a type parameter, one-based index into the list
-   * of [UnlinkedTypeParam]s currently in effect.  Indexing is done using De
-   * Bruijn index conventions; that is, innermost parameters come first, and
-   * if a class or method has multiple parameters, they are indexed from right
-   * to left.  So for instance, if the enclosing declaration is
-   *
-   *     class C<T,U> {
-   *       m<V,W> {
-   *         ...
-   *       }
-   *     }
-   *
-   * Then [paramReference] values of 1, 2, 3, and 4 represent W, V, U, and T,
-   * respectively.
-   *
-   * If the type being referred to is not a type parameter, [paramReference] is
-   * zero.
-   */
+  /// If this is a reference to a type parameter, one-based index into the list
+  /// of [UnlinkedTypeParam]s currently in effect.  Indexing is done using De
+  /// Bruijn index conventions; that is, innermost parameters come first, and
+  /// if a class or method has multiple parameters, they are indexed from right
+  /// to left.  So for instance, if the enclosing declaration is
+  ///
+  ///     class C<T,U> {
+  ///       m<V,W> {
+  ///         ...
+  ///       }
+  ///     }
+  ///
+  /// Then [paramReference] values of 1, 2, 3, and 4 represent W, V, U, and T,
+  /// respectively.
+  ///
+  /// If the type being referred to is not a type parameter, [paramReference] is
+  /// zero.
   void set paramReference(int value) {
     assert(value == null || value >= 0);
     this._paramReference = value;
@@ -2371,10 +2284,8 @@
   @override
   int get reference => _reference ??= 0;
 
-  /**
-   * Index into [UnlinkedUnit.references] for the entity being referred to, or
-   * zero if this is a reference to a type parameter.
-   */
+  /// Index into [UnlinkedUnit.references] for the entity being referred to, or
+  /// zero if this is a reference to a type parameter.
   void set reference(int value) {
     assert(value == null || value >= 0);
     this._reference = value;
@@ -2383,17 +2294,16 @@
   @override
   int get refinedSlot => _refinedSlot ??= 0;
 
-  /**
-   * If this [EntityRef] appears in a syntactic context where its type arguments
-   * might need to be inferred by a method other than instantiate-to-bounds,
-   * and [typeArguments] is empty, a slot id (which is unique within the
-   * compilation unit).  If an entry appears in [LinkedUnit.types] whose [slot]
-   * matches this value, that entry will contain the complete inferred type.
-   *
-   * This is called `refinedSlot` to clarify that if it points to an inferred
-   * type, it points to a type that is a "refinement" of this one (one in which
-   * some type arguments have been inferred).
-   */
+  /// If this [EntityRef] appears in a syntactic context where its type
+  /// arguments might need to be inferred by a method other than
+  /// instantiate-to-bounds, and [typeArguments] is empty, a slot id (which is
+  /// unique within the compilation unit).  If an entry appears in
+  /// [LinkedUnit.types] whose [slot] matches this value, that entry will
+  /// contain the complete inferred type.
+  ///
+  /// This is called `refinedSlot` to clarify that if it points to an inferred
+  /// type, it points to a type that is a "refinement" of this one (one in which
+  /// some type arguments have been inferred).
   void set refinedSlot(int value) {
     assert(value == null || value >= 0);
     this._refinedSlot = value;
@@ -2402,13 +2312,11 @@
   @override
   int get slot => _slot ??= 0;
 
-  /**
-   * If this [EntityRef] is contained within [LinkedUnit.types], slot id (which
-   * is unique within the compilation unit) identifying the target of type
-   * propagation or type inference with which this [EntityRef] is associated.
-   *
-   * Otherwise zero.
-   */
+  /// If this [EntityRef] is contained within [LinkedUnit.types], slot id (which
+  /// is unique within the compilation unit) identifying the target of type
+  /// propagation or type inference with which this [EntityRef] is associated.
+  ///
+  /// Otherwise zero.
   void set slot(int value) {
     assert(value == null || value >= 0);
     this._slot = value;
@@ -2418,12 +2326,10 @@
   List<UnlinkedParamBuilder> get syntheticParams =>
       _syntheticParams ??= <UnlinkedParamBuilder>[];
 
-  /**
-   * If this [EntityRef] is a reference to a function type whose
-   * [FunctionElement] is not in any library (e.g. a function type that was
-   * synthesized by a LUB computation), the function parameters.  Otherwise
-   * empty.
-   */
+  /// If this [EntityRef] is a reference to a function type whose
+  /// [FunctionElement] is not in any library (e.g. a function type that was
+  /// synthesized by a LUB computation), the function parameters.  Otherwise
+  /// empty.
   void set syntheticParams(List<UnlinkedParamBuilder> value) {
     this._syntheticParams = value;
   }
@@ -2431,12 +2337,10 @@
   @override
   EntityRefBuilder get syntheticReturnType => _syntheticReturnType;
 
-  /**
-   * If this [EntityRef] is a reference to a function type whose
-   * [FunctionElement] is not in any library (e.g. a function type that was
-   * synthesized by a LUB computation), the return type of the function.
-   * Otherwise `null`.
-   */
+  /// If this [EntityRef] is a reference to a function type whose
+  /// [FunctionElement] is not in any library (e.g. a function type that was
+  /// synthesized by a LUB computation), the return type of the function.
+  /// Otherwise `null`.
   void set syntheticReturnType(EntityRefBuilder value) {
     this._syntheticReturnType = value;
   }
@@ -2445,10 +2349,8 @@
   List<EntityRefBuilder> get typeArguments =>
       _typeArguments ??= <EntityRefBuilder>[];
 
-  /**
-   * If this is an instantiation of a generic type or generic executable, the
-   * type arguments used to instantiate it (if any).
-   */
+  /// If this is an instantiation of a generic type or generic executable, the
+  /// type arguments used to instantiate it (if any).
   void set typeArguments(List<EntityRefBuilder> value) {
     this._typeArguments = value;
   }
@@ -2457,10 +2359,8 @@
   List<UnlinkedTypeParamBuilder> get typeParameters =>
       _typeParameters ??= <UnlinkedTypeParamBuilder>[];
 
-  /**
-   * If this is a function type, the type parameters defined for the function
-   * type (if any).
-   */
+  /// If this is a function type, the type parameters defined for the function
+  /// type (if any).
   void set typeParameters(List<UnlinkedTypeParamBuilder> value) {
     this._typeParameters = value;
   }
@@ -2753,10 +2653,8 @@
   @override
   List<String> get parts => _parts ??= <String>[];
 
-  /**
-   * Absolute URI for the compilation units listed in the library's `part`
-   * declarations, empty string for invalid URI.
-   */
+  /// Absolute URI for the compilation units listed in the library's `part`
+  /// declarations, empty string for invalid URI.
   void set parts(List<String> value) {
     this._parts = value;
   }
@@ -2764,9 +2662,7 @@
   @override
   String get uri => _uri ??= '';
 
-  /**
-   * The absolute URI of the dependent library, e.g. `package:foo/bar.dart`.
-   */
+  /// The absolute URI of the dependent library, e.g. `package:foo/bar.dart`.
   void set uri(String value) {
     this._uri = value;
   }
@@ -2879,10 +2775,8 @@
   @override
   int get dependency => _dependency ??= 0;
 
-  /**
-   * Index into [LinkedLibrary.dependencies] for the library in which the
-   * entity is defined.
-   */
+  /// Index into [LinkedLibrary.dependencies] for the library in which the
+  /// entity is defined.
   void set dependency(int value) {
     assert(value == null || value >= 0);
     this._dependency = value;
@@ -2891,9 +2785,7 @@
   @override
   idl.ReferenceKind get kind => _kind ??= idl.ReferenceKind.classOrEnum;
 
-  /**
-   * The kind of the entity being referred to.
-   */
+  /// The kind of the entity being referred to.
   void set kind(idl.ReferenceKind value) {
     this._kind = value;
   }
@@ -2901,10 +2793,8 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * Name of the exported entity.  For an exported setter, this name includes
-   * the trailing '='.
-   */
+  /// Name of the exported entity.  For an exported setter, this name includes
+  /// the trailing '='.
   void set name(String value) {
     this._name = value;
   }
@@ -2912,12 +2802,10 @@
   @override
   int get unit => _unit ??= 0;
 
-  /**
-   * Integer index indicating which unit in the exported library contains the
-   * definition of the entity.  As with indices into [LinkedLibrary.units],
-   * zero represents the defining compilation unit, and nonzero values
-   * represent parts in the order of the corresponding `part` declarations.
-   */
+  /// Integer index indicating which unit in the exported library contains the
+  /// definition of the entity.  As with indices into [LinkedLibrary.units],
+  /// zero represents the defining compilation unit, and nonzero values
+  /// represent parts in the order of the corresponding `part` declarations.
   void set unit(int value) {
     assert(value == null || value >= 0);
     this._unit = value;
@@ -3052,22 +2940,20 @@
   List<LinkedDependencyBuilder> get dependencies =>
       _dependencies ??= <LinkedDependencyBuilder>[];
 
-  /**
-   * The libraries that this library depends on (either via an explicit import
-   * statement or via the implicit dependencies on `dart:core` and
-   * `dart:async`).  The first element of this array is a pseudo-dependency
-   * representing the library itself (it is also used for `dynamic` and
-   * `void`).  This is followed by elements representing "prelinked"
-   * dependencies (direct imports and the transitive closure of exports).
-   * After the prelinked dependencies are elements representing "linked"
-   * dependencies.
-   *
-   * A library is only included as a "linked" dependency if it is a true
-   * dependency (e.g. a propagated or inferred type or constant value
-   * implicitly refers to an element declared in the library) or
-   * anti-dependency (e.g. the result of type propagation or type inference
-   * depends on the lack of a certain declaration in the library).
-   */
+  /// The libraries that this library depends on (either via an explicit import
+  /// statement or via the implicit dependencies on `dart:core` and
+  /// `dart:async`).  The first element of this array is a pseudo-dependency
+  /// representing the library itself (it is also used for `dynamic` and
+  /// `void`).  This is followed by elements representing "prelinked"
+  /// dependencies (direct imports and the transitive closure of exports).
+  /// After the prelinked dependencies are elements representing "linked"
+  /// dependencies.
+  ///
+  /// A library is only included as a "linked" dependency if it is a true
+  /// dependency (e.g. a propagated or inferred type or constant value
+  /// implicitly refers to an element declared in the library) or
+  /// anti-dependency (e.g. the result of type propagation or type inference
+  /// depends on the lack of a certain declaration in the library).
   void set dependencies(List<LinkedDependencyBuilder> value) {
     this._dependencies = value;
   }
@@ -3075,10 +2961,8 @@
   @override
   List<int> get exportDependencies => _exportDependencies ??= <int>[];
 
-  /**
-   * For each export in [UnlinkedUnit.exports], an index into [dependencies]
-   * of the library being exported.
-   */
+  /// For each export in [UnlinkedUnit.exports], an index into [dependencies]
+  /// of the library being exported.
   void set exportDependencies(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._exportDependencies = value;
@@ -3088,13 +2972,11 @@
   List<LinkedExportNameBuilder> get exportNames =>
       _exportNames ??= <LinkedExportNameBuilder>[];
 
-  /**
-   * Information about entities in the export namespace of the library that are
-   * not in the public namespace of the library (that is, entities that are
-   * brought into the namespace via `export` directives).
-   *
-   * Sorted by name.
-   */
+  /// Information about entities in the export namespace of the library that are
+  /// not in the public namespace of the library (that is, entities that are
+  /// brought into the namespace via `export` directives).
+  ///
+  /// Sorted by name.
   void set exportNames(List<LinkedExportNameBuilder> value) {
     this._exportNames = value;
   }
@@ -3106,10 +2988,8 @@
   @override
   List<int> get importDependencies => _importDependencies ??= <int>[];
 
-  /**
-   * For each import in [UnlinkedUnit.imports], an index into [dependencies]
-   * of the library being imported.
-   */
+  /// For each import in [UnlinkedUnit.imports], an index into [dependencies]
+  /// of the library being imported.
   void set importDependencies(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._importDependencies = value;
@@ -3118,11 +2998,9 @@
   @override
   int get numPrelinkedDependencies => _numPrelinkedDependencies ??= 0;
 
-  /**
-   * The number of elements in [dependencies] which are not "linked"
-   * dependencies (that is, the number of libraries in the direct imports plus
-   * the transitive closure of exports, plus the library itself).
-   */
+  /// The number of elements in [dependencies] which are not "linked"
+  /// dependencies (that is, the number of libraries in the direct imports plus
+  /// the transitive closure of exports, plus the library itself).
   void set numPrelinkedDependencies(int value) {
     assert(value == null || value >= 0);
     this._numPrelinkedDependencies = value;
@@ -3131,12 +3009,10 @@
   @override
   List<LinkedUnitBuilder> get units => _units ??= <LinkedUnitBuilder>[];
 
-  /**
-   * The linked summary of all the compilation units constituting the
-   * library.  The summary of the defining compilation unit is listed first,
-   * followed by the summary of each part, in the order of the `part`
-   * declarations in the defining compilation unit.
-   */
+  /// The linked summary of all the compilation units constituting the
+  /// library.  The summary of the defining compilation unit is listed first,
+  /// followed by the summary of each part, in the order of the `part`
+  /// declarations in the defining compilation unit.
   void set units(List<LinkedUnitBuilder> value) {
     this._units = value;
   }
@@ -3390,17 +3266,15 @@
   @override
   int get containingReference => _containingReference ??= 0;
 
-  /**
-   * If this [LinkedReference] doesn't have an associated [UnlinkedReference],
-   * and the entity being referred to is contained within another entity, index
-   * of the containing entity.  This behaves similarly to
-   * [UnlinkedReference.prefixReference], however it is only used for class
-   * members, not for prefixed imports.
-   *
-   * Containing references must always point backward; that is, for all i, if
-   * LinkedUnit.references[i].containingReference != 0, then
-   * LinkedUnit.references[i].containingReference < i.
-   */
+  /// If this [LinkedReference] doesn't have an associated [UnlinkedReference],
+  /// and the entity being referred to is contained within another entity, index
+  /// of the containing entity.  This behaves similarly to
+  /// [UnlinkedReference.prefixReference], however it is only used for class
+  /// members, not for prefixed imports.
+  ///
+  /// Containing references must always point backward; that is, for all i, if
+  /// LinkedUnit.references[i].containingReference != 0, then
+  /// LinkedUnit.references[i].containingReference < i.
   void set containingReference(int value) {
     assert(value == null || value >= 0);
     this._containingReference = value;
@@ -3409,13 +3283,11 @@
   @override
   int get dependency => _dependency ??= 0;
 
-  /**
-   * Index into [LinkedLibrary.dependencies] indicating which imported library
-   * declares the entity being referred to.
-   *
-   * Zero if this entity is contained within another entity (e.g. a class
-   * member), or if [kind] is [ReferenceKind.prefix].
-   */
+  /// Index into [LinkedLibrary.dependencies] indicating which imported library
+  /// declares the entity being referred to.
+  ///
+  /// Zero if this entity is contained within another entity (e.g. a class
+  /// member), or if [kind] is [ReferenceKind.prefix].
   void set dependency(int value) {
     assert(value == null || value >= 0);
     this._dependency = value;
@@ -3424,10 +3296,8 @@
   @override
   idl.ReferenceKind get kind => _kind ??= idl.ReferenceKind.classOrEnum;
 
-  /**
-   * The kind of the entity being referred to.  For the pseudo-types `dynamic`
-   * and `void`, the kind is [ReferenceKind.classOrEnum].
-   */
+  /// The kind of the entity being referred to.  For the pseudo-types `dynamic`
+  /// and `void`, the kind is [ReferenceKind.classOrEnum].
   void set kind(idl.ReferenceKind value) {
     this._kind = value;
   }
@@ -3439,11 +3309,9 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * If this [LinkedReference] doesn't have an associated [UnlinkedReference],
-   * name of the entity being referred to.  For the pseudo-type `dynamic`, the
-   * string is "dynamic".  For the pseudo-type `void`, the string is "void".
-   */
+  /// If this [LinkedReference] doesn't have an associated [UnlinkedReference],
+  /// name of the entity being referred to.  For the pseudo-type `dynamic`, the
+  /// string is "dynamic".  For the pseudo-type `void`, the string is "void".
   void set name(String value) {
     this._name = value;
   }
@@ -3451,11 +3319,9 @@
   @override
   int get numTypeParameters => _numTypeParameters ??= 0;
 
-  /**
-   * If the entity being referred to is generic, the number of type parameters
-   * it declares (does not include type parameters of enclosing entities).
-   * Otherwise zero.
-   */
+  /// If the entity being referred to is generic, the number of type parameters
+  /// it declares (does not include type parameters of enclosing entities).
+  /// Otherwise zero.
   void set numTypeParameters(int value) {
     assert(value == null || value >= 0);
     this._numTypeParameters = value;
@@ -3464,15 +3330,13 @@
   @override
   int get unit => _unit ??= 0;
 
-  /**
-   * Integer index indicating which unit in the imported library contains the
-   * definition of the entity.  As with indices into [LinkedLibrary.units],
-   * zero represents the defining compilation unit, and nonzero values
-   * represent parts in the order of the corresponding `part` declarations.
-   *
-   * Zero if this entity is contained within another entity (e.g. a class
-   * member).
-   */
+  /// Integer index indicating which unit in the imported library contains the
+  /// definition of the entity.  As with indices into [LinkedLibrary.units],
+  /// zero represents the defining compilation unit, and nonzero values
+  /// represent parts in the order of the corresponding `part` declarations.
+  ///
+  /// Zero if this entity is contained within another entity (e.g. a class
+  /// member).
   void set unit(int value) {
     assert(value == null || value >= 0);
     this._unit = value;
@@ -3646,10 +3510,8 @@
   @override
   List<int> get constCycles => _constCycles ??= <int>[];
 
-  /**
-   * List of slot ids (referring to [UnlinkedExecutable.constCycleSlot])
-   * corresponding to const constructors that are part of cycles.
-   */
+  /// List of slot ids (referring to [UnlinkedExecutable.constCycleSlot])
+  /// corresponding to const constructors that are part of cycles.
   void set constCycles(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._constCycles = value;
@@ -3659,11 +3521,9 @@
   List<int> get parametersInheritingCovariant =>
       _parametersInheritingCovariant ??= <int>[];
 
-  /**
-   * List of slot ids (referring to [UnlinkedParam.inheritsCovariantSlot] or
-   * [UnlinkedVariable.inheritsCovariantSlot]) corresponding to parameters
-   * that inherit `@covariant` behavior from a base class.
-   */
+  /// List of slot ids (referring to [UnlinkedParam.inheritsCovariantSlot] or
+  /// [UnlinkedVariable.inheritsCovariantSlot]) corresponding to parameters
+  /// that inherit `@covariant` behavior from a base class.
   void set parametersInheritingCovariant(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._parametersInheritingCovariant = value;
@@ -3673,14 +3533,12 @@
   List<LinkedReferenceBuilder> get references =>
       _references ??= <LinkedReferenceBuilder>[];
 
-  /**
-   * Information about the resolution of references within the compilation
-   * unit.  Each element of [UnlinkedUnit.references] has a corresponding
-   * element in this list (at the same index).  If this list has additional
-   * elements beyond the number of elements in [UnlinkedUnit.references], those
-   * additional elements are references that are only referred to implicitly
-   * (e.g. elements involved in inferred or propagated types).
-   */
+  /// Information about the resolution of references within the compilation
+  /// unit.  Each element of [UnlinkedUnit.references] has a corresponding
+  /// element in this list (at the same index).  If this list has additional
+  /// elements beyond the number of elements in [UnlinkedUnit.references], those
+  /// additional elements are references that are only referred to implicitly
+  /// (e.g. elements involved in inferred or propagated types).
   void set references(List<LinkedReferenceBuilder> value) {
     this._references = value;
   }
@@ -3689,9 +3547,7 @@
   List<TopLevelInferenceErrorBuilder> get topLevelInferenceErrors =>
       _topLevelInferenceErrors ??= <TopLevelInferenceErrorBuilder>[];
 
-  /**
-   * The list of type inference errors.
-   */
+  /// The list of type inference errors.
   void set topLevelInferenceErrors(List<TopLevelInferenceErrorBuilder> value) {
     this._topLevelInferenceErrors = value;
   }
@@ -3699,10 +3555,8 @@
   @override
   List<EntityRefBuilder> get types => _types ??= <EntityRefBuilder>[];
 
-  /**
-   * List associating slot ids found inside the unlinked summary for the
-   * compilation unit with propagated and inferred types.
-   */
+  /// List associating slot ids found inside the unlinked summary for the
+  /// compilation unit with propagated and inferred types.
   void set types(List<EntityRefBuilder> value) {
     this._types = value;
   }
@@ -3935,9 +3789,7 @@
   List<LinkedLibraryBuilder> get linkedLibraries =>
       _linkedLibraries ??= <LinkedLibraryBuilder>[];
 
-  /**
-   * Linked libraries.
-   */
+  /// Linked libraries.
   void set linkedLibraries(List<LinkedLibraryBuilder> value) {
     this._linkedLibraries = value;
   }
@@ -3945,10 +3797,8 @@
   @override
   List<String> get linkedLibraryUris => _linkedLibraryUris ??= <String>[];
 
-  /**
-   * The list of URIs of items in [linkedLibraries], e.g. `dart:core` or
-   * `package:foo/bar.dart`.
-   */
+  /// The list of URIs of items in [linkedLibraries], e.g. `dart:core` or
+  /// `package:foo/bar.dart`.
   void set linkedLibraryUris(List<String> value) {
     this._linkedLibraryUris = value;
   }
@@ -3956,10 +3806,8 @@
   @override
   int get majorVersion => _majorVersion ??= 0;
 
-  /**
-   * Major version of the summary format.  See
-   * [PackageBundleAssembler.currentMajorVersion].
-   */
+  /// Major version of the summary format.  See
+  /// [PackageBundleAssembler.currentMajorVersion].
   void set majorVersion(int value) {
     assert(value == null || value >= 0);
     this._majorVersion = value;
@@ -3968,10 +3816,8 @@
   @override
   int get minorVersion => _minorVersion ??= 0;
 
-  /**
-   * Minor version of the summary format.  See
-   * [PackageBundleAssembler.currentMinorVersion].
-   */
+  /// Minor version of the summary format.  See
+  /// [PackageBundleAssembler.currentMinorVersion].
   void set minorVersion(int value) {
     assert(value == null || value >= 0);
     this._minorVersion = value;
@@ -3985,9 +3831,7 @@
   List<UnlinkedUnitBuilder> get unlinkedUnits =>
       _unlinkedUnits ??= <UnlinkedUnitBuilder>[];
 
-  /**
-   * Unlinked information for the compilation units constituting the package.
-   */
+  /// Unlinked information for the compilation units constituting the package.
   void set unlinkedUnits(List<UnlinkedUnitBuilder> value) {
     this._unlinkedUnits = value;
   }
@@ -3995,9 +3839,7 @@
   @override
   List<String> get unlinkedUnitUris => _unlinkedUnitUris ??= <String>[];
 
-  /**
-   * The list of URIs of items in [unlinkedUnits], e.g. `dart:core/bool.dart`.
-   */
+  /// The list of URIs of items in [unlinkedUnits], e.g. `dart:core/bool.dart`.
   void set unlinkedUnitUris(List<String> value) {
     this._unlinkedUnitUris = value;
   }
@@ -4246,10 +4088,8 @@
   List<idl.IndexSyntheticElementKind> get elementKinds =>
       _elementKinds ??= <idl.IndexSyntheticElementKind>[];
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the kind of the synthetic element.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the kind of the synthetic element.
   void set elementKinds(List<idl.IndexSyntheticElementKind> value) {
     this._elementKinds = value;
   }
@@ -4258,13 +4098,11 @@
   List<int> get elementNameClassMemberIds =>
       _elementNameClassMemberIds ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the class member element name, or `null` if the element
-   * is a top-level element.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this
-   * [PackageIndex].
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the class member element name, or `null` if the element
+  /// is a top-level element.  The list is sorted in ascending order, so that
+  /// the client can quickly check whether an element is referenced in this
+  /// [PackageIndex].
   void set elementNameClassMemberIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameClassMemberIds = value;
@@ -4273,13 +4111,11 @@
   @override
   List<int> get elementNameParameterIds => _elementNameParameterIds ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the named parameter name, or `null` if the element is not
-   * a named parameter.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this
-   * [PackageIndex].
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the named parameter name, or `null` if the element is
+  /// not a named parameter.  The list is sorted in ascending order, so that the
+  /// client can quickly check whether an element is referenced in this
+  /// [PackageIndex].
   void set elementNameParameterIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameParameterIds = value;
@@ -4289,12 +4125,10 @@
   List<int> get elementNameUnitMemberIds =>
       _elementNameUnitMemberIds ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the top-level element name, or `null` if the element is
-   * the unit.  The list is sorted in ascending order, so that the client can
-   * quickly check whether an element is referenced in this [PackageIndex].
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the top-level element name, or `null` if the element is
+  /// the unit.  The list is sorted in ascending order, so that the client can
+  /// quickly check whether an element is referenced in this [PackageIndex].
   void set elementNameUnitMemberIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameUnitMemberIds = value;
@@ -4303,11 +4137,9 @@
   @override
   List<int> get elementUnits => _elementUnits ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the index into [unitLibraryUris] and [unitUnitUris] for the library
-   * specific unit where the element is declared.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the index into [unitLibraryUris] and [unitUnitUris] for the library
+  /// specific unit where the element is declared.
   void set elementUnits(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementUnits = value;
@@ -4316,11 +4148,9 @@
   @override
   List<String> get strings => _strings ??= <String>[];
 
-  /**
-   * List of unique element strings used in this [PackageIndex].  The list is
-   * sorted in ascending order, so that the client can quickly check the
-   * presence of a string in this [PackageIndex].
-   */
+  /// List of unique element strings used in this [PackageIndex].  The list is
+  /// sorted in ascending order, so that the client can quickly check the
+  /// presence of a string in this [PackageIndex].
   void set strings(List<String> value) {
     this._strings = value;
   }
@@ -4328,11 +4158,9 @@
   @override
   List<int> get unitLibraryUris => _unitLibraryUris ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to the library URI of a unique library
-   * specific unit referenced in the [PackageIndex].  It is an index into
-   * [strings] list.
-   */
+  /// Each item of this list corresponds to the library URI of a unique library
+  /// specific unit referenced in the [PackageIndex].  It is an index into
+  /// [strings] list.
   void set unitLibraryUris(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._unitLibraryUris = value;
@@ -4341,9 +4169,7 @@
   @override
   List<UnitIndexBuilder> get units => _units ??= <UnitIndexBuilder>[];
 
-  /**
-   * List of indexes of each unit in this [PackageIndex].
-   */
+  /// List of indexes of each unit in this [PackageIndex].
   void set units(List<UnitIndexBuilder> value) {
     this._units = value;
   }
@@ -4351,11 +4177,9 @@
   @override
   List<int> get unitUnitUris => _unitUnitUris ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to the unit URI of a unique library
-   * specific unit referenced in the [PackageIndex].  It is an index into
-   * [strings] list.
-   */
+  /// Each item of this list corresponds to the unit URI of a unique library
+  /// specific unit referenced in the [PackageIndex].  It is an index into
+  /// [strings] list.
   void set unitUnitUris(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._unitUnitUris = value;
@@ -4696,9 +4520,7 @@
   @override
   List<String> get arguments => _arguments ??= <String>[];
 
-  /**
-   * The [kind] specific arguments.
-   */
+  /// The [kind] specific arguments.
   void set arguments(List<String> value) {
     this._arguments = value;
   }
@@ -4707,9 +4529,7 @@
   idl.TopLevelInferenceErrorKind get kind =>
       _kind ??= idl.TopLevelInferenceErrorKind.assignment;
 
-  /**
-   * The kind of the error.
-   */
+  /// The kind of the error.
   void set kind(idl.TopLevelInferenceErrorKind value) {
     this._kind = value;
   }
@@ -4717,11 +4537,9 @@
   @override
   int get slot => _slot ??= 0;
 
-  /**
-   * The slot id (which is unique within the compilation unit) identifying the
-   * target of type inference with which this [TopLevelInferenceError] is
-   * associated.
-   */
+  /// The slot id (which is unique within the compilation unit) identifying the
+  /// target of type inference with which this [TopLevelInferenceError] is
+  /// associated.
   void set slot(int value) {
     assert(value == null || value >= 0);
     this._slot = value;
@@ -4860,9 +4678,7 @@
   List<idl.IndexNameKind> get definedNameKinds =>
       _definedNameKinds ??= <idl.IndexNameKind>[];
 
-  /**
-   * Each item of this list is the kind of an element defined in this unit.
-   */
+  /// Each item of this list is the kind of an element defined in this unit.
   void set definedNameKinds(List<idl.IndexNameKind> value) {
     this._definedNameKinds = value;
   }
@@ -4870,10 +4686,8 @@
   @override
   List<int> get definedNameOffsets => _definedNameOffsets ??= <int>[];
 
-  /**
-   * Each item of this list is the name offset of an element defined in this
-   * unit relative to the beginning of the file.
-   */
+  /// Each item of this list is the name offset of an element defined in this
+  /// unit relative to the beginning of the file.
   void set definedNameOffsets(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._definedNameOffsets = value;
@@ -4882,12 +4696,10 @@
   @override
   List<int> get definedNames => _definedNames ??= <int>[];
 
-  /**
-   * Each item of this list corresponds to an element defined in this unit.  It
-   * is an index into [PackageIndex.strings] list.  The list is sorted in
-   * ascending order, so that the client can quickly find name definitions in
-   * this [UnitIndex].
-   */
+  /// Each item of this list corresponds to an element defined in this unit.  It
+  /// is an index into [PackageIndex.strings] list.  The list is sorted in
+  /// ascending order, so that the client can quickly find name definitions in
+  /// this [UnitIndex].
   void set definedNames(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._definedNames = value;
@@ -4896,10 +4708,8 @@
   @override
   int get unit => _unit ??= 0;
 
-  /**
-   * Index into [PackageIndex.unitLibraryUris] and [PackageIndex.unitUnitUris]
-   * for the library specific unit that corresponds to this [UnitIndex].
-   */
+  /// Index into [PackageIndex.unitLibraryUris] and [PackageIndex.unitUnitUris]
+  /// for the library specific unit that corresponds to this [UnitIndex].
   void set unit(int value) {
     assert(value == null || value >= 0);
     this._unit = value;
@@ -4909,10 +4719,8 @@
   List<bool> get usedElementIsQualifiedFlags =>
       _usedElementIsQualifiedFlags ??= <bool>[];
 
-  /**
-   * Each item of this list is the `true` if the corresponding element usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding element usage
+  /// is qualified with some prefix.
   void set usedElementIsQualifiedFlags(List<bool> value) {
     this._usedElementIsQualifiedFlags = value;
   }
@@ -4921,9 +4729,7 @@
   List<idl.IndexRelationKind> get usedElementKinds =>
       _usedElementKinds ??= <idl.IndexRelationKind>[];
 
-  /**
-   * Each item of this list is the kind of the element usage.
-   */
+  /// Each item of this list is the kind of the element usage.
   void set usedElementKinds(List<idl.IndexRelationKind> value) {
     this._usedElementKinds = value;
   }
@@ -4931,9 +4737,7 @@
   @override
   List<int> get usedElementLengths => _usedElementLengths ??= <int>[];
 
-  /**
-   * Each item of this list is the length of the element usage.
-   */
+  /// Each item of this list is the length of the element usage.
   void set usedElementLengths(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElementLengths = value;
@@ -4942,10 +4746,8 @@
   @override
   List<int> get usedElementOffsets => _usedElementOffsets ??= <int>[];
 
-  /**
-   * Each item of this list is the offset of the element usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the element usage relative to the
+  /// beginning of the file.
   void set usedElementOffsets(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElementOffsets = value;
@@ -4954,11 +4756,9 @@
   @override
   List<int> get usedElements => _usedElements ??= <int>[];
 
-  /**
-   * Each item of this list is the index into [PackageIndex.elementUnits] and
-   * [PackageIndex.elementOffsets].  The list is sorted in ascending order, so
-   * that the client can quickly find element references in this [UnitIndex].
-   */
+  /// Each item of this list is the index into [PackageIndex.elementUnits] and
+  /// [PackageIndex.elementOffsets].  The list is sorted in ascending order, so
+  /// that the client can quickly find element references in this [UnitIndex].
   void set usedElements(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElements = value;
@@ -4968,10 +4768,8 @@
   List<bool> get usedNameIsQualifiedFlags =>
       _usedNameIsQualifiedFlags ??= <bool>[];
 
-  /**
-   * Each item of this list is the `true` if the corresponding name usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding name usage
+  /// is qualified with some prefix.
   void set usedNameIsQualifiedFlags(List<bool> value) {
     this._usedNameIsQualifiedFlags = value;
   }
@@ -4980,9 +4778,7 @@
   List<idl.IndexRelationKind> get usedNameKinds =>
       _usedNameKinds ??= <idl.IndexRelationKind>[];
 
-  /**
-   * Each item of this list is the kind of the name usage.
-   */
+  /// Each item of this list is the kind of the name usage.
   void set usedNameKinds(List<idl.IndexRelationKind> value) {
     this._usedNameKinds = value;
   }
@@ -4990,10 +4786,8 @@
   @override
   List<int> get usedNameOffsets => _usedNameOffsets ??= <int>[];
 
-  /**
-   * Each item of this list is the offset of the name usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the name usage relative to the
+  /// beginning of the file.
   void set usedNameOffsets(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedNameOffsets = value;
@@ -5002,11 +4796,9 @@
   @override
   List<int> get usedNames => _usedNames ??= <int>[];
 
-  /**
-   * Each item of this list is the index into [PackageIndex.strings] for a
-   * used name.  The list is sorted in ascending order, so that the client can
-   * quickly find name uses in this [UnitIndex].
-   */
+  /// Each item of this list is the index into [PackageIndex.strings] for a
+  /// used name.  The list is sorted in ascending order, so that the client can
+  /// quickly find name uses in this [UnitIndex].
   void set usedNames(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedNames = value;
@@ -5455,9 +5247,7 @@
   List<UnlinkedExprBuilder> get annotations =>
       _annotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for this class.
-   */
+  /// Annotations for this class.
   void set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
@@ -5465,9 +5255,7 @@
   @override
   CodeRangeBuilder get codeRange => _codeRange;
 
-  /**
-   * Code range of the class.
-   */
+  /// Code range of the class.
   void set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
@@ -5476,10 +5264,8 @@
   UnlinkedDocumentationCommentBuilder get documentationComment =>
       _documentationComment;
 
-  /**
-   * Documentation comment for the class, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the class, or `null` if there is no
+  /// documentation comment.
   void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
@@ -5488,9 +5274,7 @@
   List<UnlinkedExecutableBuilder> get executables =>
       _executables ??= <UnlinkedExecutableBuilder>[];
 
-  /**
-   * Executable objects (methods, getters, and setters) contained in the class.
-   */
+  /// Executable objects (methods, getters, and setters) contained in the class.
   void set executables(List<UnlinkedExecutableBuilder> value) {
     this._executables = value;
   }
@@ -5499,9 +5283,7 @@
   List<UnlinkedVariableBuilder> get fields =>
       _fields ??= <UnlinkedVariableBuilder>[];
 
-  /**
-   * Field declarations contained in the class.
-   */
+  /// Field declarations contained in the class.
   void set fields(List<UnlinkedVariableBuilder> value) {
     this._fields = value;
   }
@@ -5509,10 +5291,8 @@
   @override
   bool get hasNoSupertype => _hasNoSupertype ??= false;
 
-  /**
-   * Indicates whether this class is the core "Object" class (and hence has no
-   * supertype)
-   */
+  /// Indicates whether this class is the core "Object" class (and hence has no
+  /// supertype)
   void set hasNoSupertype(bool value) {
     this._hasNoSupertype = value;
   }
@@ -5520,9 +5300,7 @@
   @override
   List<EntityRefBuilder> get interfaces => _interfaces ??= <EntityRefBuilder>[];
 
-  /**
-   * Interfaces appearing in an `implements` clause, if any.
-   */
+  /// Interfaces appearing in an `implements` clause, if any.
   void set interfaces(List<EntityRefBuilder> value) {
     this._interfaces = value;
   }
@@ -5530,9 +5308,7 @@
   @override
   bool get isAbstract => _isAbstract ??= false;
 
-  /**
-   * Indicates whether the class is declared with the `abstract` keyword.
-   */
+  /// Indicates whether the class is declared with the `abstract` keyword.
   void set isAbstract(bool value) {
     this._isAbstract = value;
   }
@@ -5540,9 +5316,7 @@
   @override
   bool get isMixinApplication => _isMixinApplication ??= false;
 
-  /**
-   * Indicates whether the class is declared using mixin application syntax.
-   */
+  /// Indicates whether the class is declared using mixin application syntax.
   void set isMixinApplication(bool value) {
     this._isMixinApplication = value;
   }
@@ -5550,9 +5324,7 @@
   @override
   List<EntityRefBuilder> get mixins => _mixins ??= <EntityRefBuilder>[];
 
-  /**
-   * Mixins appearing in a `with` clause, if any.
-   */
+  /// Mixins appearing in a `with` clause, if any.
   void set mixins(List<EntityRefBuilder> value) {
     this._mixins = value;
   }
@@ -5560,9 +5332,7 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * Name of the class.
-   */
+  /// Name of the class.
   void set name(String value) {
     this._name = value;
   }
@@ -5570,9 +5340,7 @@
   @override
   int get nameOffset => _nameOffset ??= 0;
 
-  /**
-   * Offset of the class name relative to the beginning of the file.
-   */
+  /// Offset of the class name relative to the beginning of the file.
   void set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
@@ -5582,11 +5350,9 @@
   List<EntityRefBuilder> get superclassConstraints =>
       _superclassConstraints ??= <EntityRefBuilder>[];
 
-  /**
-   * Superclass constraints for this mixin declaration. The list will be empty
-   * if this class is not a mixin declaration, or if the declaration does not
-   * have an `on` clause (in which case the type `Object` is implied).
-   */
+  /// Superclass constraints for this mixin declaration. The list will be empty
+  /// if this class is not a mixin declaration, or if the declaration does not
+  /// have an `on` clause (in which case the type `Object` is implied).
   void set superclassConstraints(List<EntityRefBuilder> value) {
     this._superclassConstraints = value;
   }
@@ -5594,11 +5360,9 @@
   @override
   List<String> get superInvokedNames => _superInvokedNames ??= <String>[];
 
-  /**
-   * Names of methods, getters, setters, and operators that this mixin
-   * declaration super-invokes.  For setters this includes the trailing "=".
-   * The list will be empty if this class is not a mixin declaration.
-   */
+  /// Names of methods, getters, setters, and operators that this mixin
+  /// declaration super-invokes.  For setters this includes the trailing "=".
+  /// The list will be empty if this class is not a mixin declaration.
   void set superInvokedNames(List<String> value) {
     this._superInvokedNames = value;
   }
@@ -5606,11 +5370,9 @@
   @override
   EntityRefBuilder get supertype => _supertype;
 
-  /**
-   * Supertype of the class, or `null` if either (a) the class doesn't
-   * explicitly declare a supertype (and hence has supertype `Object`), or (b)
-   * the class *is* `Object` (and hence has no supertype).
-   */
+  /// Supertype of the class, or `null` if either (a) the class doesn't
+  /// explicitly declare a supertype (and hence has supertype `Object`), or (b)
+  /// the class *is* `Object` (and hence has no supertype).
   void set supertype(EntityRefBuilder value) {
     this._supertype = value;
   }
@@ -5619,9 +5381,7 @@
   List<UnlinkedTypeParamBuilder> get typeParameters =>
       _typeParameters ??= <UnlinkedTypeParamBuilder>[];
 
-  /**
-   * Type parameters of the class, if any.
-   */
+  /// Type parameters of the class, if any.
   void set typeParameters(List<UnlinkedTypeParamBuilder> value) {
     this._typeParameters = value;
   }
@@ -6082,10 +5842,8 @@
   @override
   int get end => _end ??= 0;
 
-  /**
-   * If this is a `show` combinator, offset of the end of the list of shown
-   * names.  Otherwise zero.
-   */
+  /// If this is a `show` combinator, offset of the end of the list of shown
+  /// names.  Otherwise zero.
   void set end(int value) {
     assert(value == null || value >= 0);
     this._end = value;
@@ -6094,9 +5852,7 @@
   @override
   List<String> get hides => _hides ??= <String>[];
 
-  /**
-   * List of names which are hidden.  Empty if this is a `show` combinator.
-   */
+  /// List of names which are hidden.  Empty if this is a `show` combinator.
   void set hides(List<String> value) {
     this._hides = value;
   }
@@ -6104,10 +5860,8 @@
   @override
   int get offset => _offset ??= 0;
 
-  /**
-   * If this is a `show` combinator, offset of the `show` keyword.  Otherwise
-   * zero.
-   */
+  /// If this is a `show` combinator, offset of the `show` keyword.  Otherwise
+  /// zero.
   void set offset(int value) {
     assert(value == null || value >= 0);
     this._offset = value;
@@ -6116,9 +5870,7 @@
   @override
   List<String> get shows => _shows ??= <String>[];
 
-  /**
-   * List of names which are shown.  Empty if this is a `hide` combinator.
-   */
+  /// List of names which are shown.  Empty if this is a `hide` combinator.
   void set shows(List<String> value) {
     this._shows = value;
   }
@@ -6270,10 +6022,8 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * The name of the declared variable whose value is being used in the
-   * condition.
-   */
+  /// The name of the declared variable whose value is being used in the
+  /// condition.
   void set name(String value) {
     this._name = value;
   }
@@ -6281,9 +6031,7 @@
   @override
   String get uri => _uri ??= '';
 
-  /**
-   * The URI of the implementation library to be used if the condition is true.
-   */
+  /// The URI of the implementation library to be used if the condition is true.
   void set uri(String value) {
     this._uri = value;
   }
@@ -6291,10 +6039,8 @@
   @override
   String get value => _value ??= '';
 
-  /**
-   * The value to which the value of the declared variable will be compared,
-   * or `true` if the condition does not include an equality test.
-   */
+  /// The value to which the value of the declared variable will be compared,
+  /// or `true` if the condition does not include an equality test.
   void set value(String value) {
     this._value = value;
   }
@@ -6419,11 +6165,9 @@
   @override
   List<String> get argumentNames => _argumentNames ??= <String>[];
 
-  /**
-   * If there are `m` [arguments] and `n` [argumentNames], then each argument
-   * from [arguments] with index `i` such that `n + i - m >= 0`, should be used
-   * with the name at `n + i - m`.
-   */
+  /// If there are `m` [arguments] and `n` [argumentNames], then each argument
+  /// from [arguments] with index `i` such that `n + i - m >= 0`, should be used
+  /// with the name at `n + i - m`.
   void set argumentNames(List<String> value) {
     this._argumentNames = value;
   }
@@ -6432,10 +6176,8 @@
   List<UnlinkedExprBuilder> get arguments =>
       _arguments ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
-   * invocation.  Otherwise empty.
-   */
+  /// If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
+  /// invocation.  Otherwise empty.
   void set arguments(List<UnlinkedExprBuilder> value) {
     this._arguments = value;
   }
@@ -6443,10 +6185,8 @@
   @override
   UnlinkedExprBuilder get expression => _expression;
 
-  /**
-   * If [kind] is `field`, the expression of the field initializer.
-   * Otherwise `null`.
-   */
+  /// If [kind] is `field`, the expression of the field initializer.
+  /// Otherwise `null`.
   void set expression(UnlinkedExprBuilder value) {
     this._expression = value;
   }
@@ -6455,9 +6195,7 @@
   idl.UnlinkedConstructorInitializerKind get kind =>
       _kind ??= idl.UnlinkedConstructorInitializerKind.field;
 
-  /**
-   * The kind of the constructor initializer (field, redirect, super).
-   */
+  /// The kind of the constructor initializer (field, redirect, super).
   void set kind(idl.UnlinkedConstructorInitializerKind value) {
     this._kind = value;
   }
@@ -6465,12 +6203,10 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * If [kind] is `field`, the name of the field declared in the class.  If
-   * [kind] is `thisInvocation`, the name of the constructor, declared in this
-   * class, to redirect to.  If [kind] is `superInvocation`, the name of the
-   * constructor, declared in the superclass, to invoke.
-   */
+  /// If [kind] is `field`, the name of the field declared in the class.  If
+  /// [kind] is `thisInvocation`, the name of the constructor, declared in this
+  /// class, to redirect to.  If [kind] is `superInvocation`, the name of the
+  /// constructor, declared in the superclass, to invoke.
   void set name(String value) {
     this._name = value;
   }
@@ -6666,12 +6402,10 @@
   @override
   String get text => _text ??= '';
 
-  /**
-   * Text of the documentation comment, with '\r\n' replaced by '\n'.
-   *
-   * References appearing within the doc comment in square brackets are not
-   * specially encoded.
-   */
+  /// Text of the documentation comment, with '\r\n' replaced by '\n'.
+  ///
+  /// References appearing within the doc comment in square brackets are not
+  /// specially encoded.
   void set text(String value) {
     this._text = value;
   }
@@ -6770,9 +6504,7 @@
   List<UnlinkedExprBuilder> get annotations =>
       _annotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for this enum.
-   */
+  /// Annotations for this enum.
   void set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
@@ -6780,9 +6512,7 @@
   @override
   CodeRangeBuilder get codeRange => _codeRange;
 
-  /**
-   * Code range of the enum.
-   */
+  /// Code range of the enum.
   void set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
@@ -6791,10 +6521,8 @@
   UnlinkedDocumentationCommentBuilder get documentationComment =>
       _documentationComment;
 
-  /**
-   * Documentation comment for the enum, or `null` if there is no documentation
-   * comment.
-   */
+  /// Documentation comment for the enum, or `null` if there is no documentation
+  /// comment.
   void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
@@ -6802,9 +6530,7 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * Name of the enum type.
-   */
+  /// Name of the enum type.
   void set name(String value) {
     this._name = value;
   }
@@ -6812,9 +6538,7 @@
   @override
   int get nameOffset => _nameOffset ??= 0;
 
-  /**
-   * Offset of the enum name relative to the beginning of the file.
-   */
+  /// Offset of the enum name relative to the beginning of the file.
   void set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
@@ -6824,9 +6548,7 @@
   List<UnlinkedEnumValueBuilder> get values =>
       _values ??= <UnlinkedEnumValueBuilder>[];
 
-  /**
-   * Values listed in the enum declaration, in declaration order.
-   */
+  /// Values listed in the enum declaration, in declaration order.
   void set values(List<UnlinkedEnumValueBuilder> value) {
     this._values = value;
   }
@@ -7033,9 +6755,7 @@
   List<UnlinkedExprBuilder> get annotations =>
       _annotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for this value.
-   */
+  /// Annotations for this value.
   void set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
@@ -7044,10 +6764,8 @@
   UnlinkedDocumentationCommentBuilder get documentationComment =>
       _documentationComment;
 
-  /**
-   * Documentation comment for the enum value, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the enum value, or `null` if there is no
+  /// documentation comment.
   void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
@@ -7055,9 +6773,7 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * Name of the enumerated value.
-   */
+  /// Name of the enumerated value.
   void set name(String value) {
     this._name = value;
   }
@@ -7065,9 +6781,7 @@
   @override
   int get nameOffset => _nameOffset ??= 0;
 
-  /**
-   * Offset of the enum value name relative to the beginning of the file.
-   */
+  /// Offset of the enum value name relative to the beginning of the file.
   void set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
@@ -7249,9 +6963,7 @@
   List<UnlinkedExprBuilder> get annotations =>
       _annotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for this executable.
-   */
+  /// Annotations for this executable.
   void set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
@@ -7259,11 +6971,9 @@
   @override
   UnlinkedExprBuilder get bodyExpr => _bodyExpr;
 
-  /**
-   * If this executable's function body is declared using `=>`, the expression
-   * to the right of the `=>`.  May be omitted if neither type inference nor
-   * constant evaluation depends on the function body.
-   */
+  /// If this executable's function body is declared using `=>`, the expression
+  /// to the right of the `=>`.  May be omitted if neither type inference nor
+  /// constant evaluation depends on the function body.
   void set bodyExpr(UnlinkedExprBuilder value) {
     this._bodyExpr = value;
   }
@@ -7271,9 +6981,7 @@
   @override
   CodeRangeBuilder get codeRange => _codeRange;
 
-  /**
-   * Code range of the executable.
-   */
+  /// Code range of the executable.
   void set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
@@ -7282,10 +6990,8 @@
   List<UnlinkedConstructorInitializerBuilder> get constantInitializers =>
       _constantInitializers ??= <UnlinkedConstructorInitializerBuilder>[];
 
-  /**
-   * If a constant [UnlinkedExecutableKind.constructor], the constructor
-   * initializers.  Otherwise empty.
-   */
+  /// If a constant [UnlinkedExecutableKind.constructor], the constructor
+  /// initializers.  Otherwise empty.
   void set constantInitializers(
       List<UnlinkedConstructorInitializerBuilder> value) {
     this._constantInitializers = value;
@@ -7294,14 +7000,12 @@
   @override
   int get constCycleSlot => _constCycleSlot ??= 0;
 
-  /**
-   * If [kind] is [UnlinkedExecutableKind.constructor] and [isConst] is `true`,
-   * a nonzero slot id which is unique within this compilation unit.  If this id
-   * is found in [LinkedUnit.constCycles], then this constructor is part of a
-   * cycle.
-   *
-   * Otherwise, zero.
-   */
+  /// If [kind] is [UnlinkedExecutableKind.constructor] and [isConst] is `true`,
+  /// a nonzero slot id which is unique within this compilation unit.  If this
+  /// id is found in [LinkedUnit.constCycles], then this constructor is part of
+  /// a cycle.
+  ///
+  /// Otherwise, zero.
   void set constCycleSlot(int value) {
     assert(value == null || value >= 0);
     this._constCycleSlot = value;
@@ -7311,10 +7015,8 @@
   UnlinkedDocumentationCommentBuilder get documentationComment =>
       _documentationComment;
 
-  /**
-   * Documentation comment for the executable, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the executable, or `null` if there is no
+  /// documentation comment.
   void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
@@ -7322,13 +7024,11 @@
   @override
   int get inferredReturnTypeSlot => _inferredReturnTypeSlot ??= 0;
 
-  /**
-   * If this executable's return type is inferable, nonzero slot id
-   * identifying which entry in [LinkedUnit.types] contains the inferred
-   * return type.  If there is no matching entry in [LinkedUnit.types], then
-   * no return type was inferred for this variable, so its static type is
-   * `dynamic`.
-   */
+  /// If this executable's return type is inferable, nonzero slot id
+  /// identifying which entry in [LinkedUnit.types] contains the inferred
+  /// return type.  If there is no matching entry in [LinkedUnit.types], then
+  /// no return type was inferred for this variable, so its static type is
+  /// `dynamic`.
   void set inferredReturnTypeSlot(int value) {
     assert(value == null || value >= 0);
     this._inferredReturnTypeSlot = value;
@@ -7337,9 +7037,7 @@
   @override
   bool get isAbstract => _isAbstract ??= false;
 
-  /**
-   * Indicates whether the executable is declared using the `abstract` keyword.
-   */
+  /// Indicates whether the executable is declared using the `abstract` keyword.
   void set isAbstract(bool value) {
     this._isAbstract = value;
   }
@@ -7347,9 +7045,7 @@
   @override
   bool get isAsynchronous => _isAsynchronous ??= false;
 
-  /**
-   * Indicates whether the executable has body marked as being asynchronous.
-   */
+  /// Indicates whether the executable has body marked as being asynchronous.
   void set isAsynchronous(bool value) {
     this._isAsynchronous = value;
   }
@@ -7357,9 +7053,7 @@
   @override
   bool get isConst => _isConst ??= false;
 
-  /**
-   * Indicates whether the executable is declared using the `const` keyword.
-   */
+  /// Indicates whether the executable is declared using the `const` keyword.
   void set isConst(bool value) {
     this._isConst = value;
   }
@@ -7367,9 +7061,7 @@
   @override
   bool get isExternal => _isExternal ??= false;
 
-  /**
-   * Indicates whether the executable is declared using the `external` keyword.
-   */
+  /// Indicates whether the executable is declared using the `external` keyword.
   void set isExternal(bool value) {
     this._isExternal = value;
   }
@@ -7377,9 +7069,7 @@
   @override
   bool get isFactory => _isFactory ??= false;
 
-  /**
-   * Indicates whether the executable is declared using the `factory` keyword.
-   */
+  /// Indicates whether the executable is declared using the `factory` keyword.
   void set isFactory(bool value) {
     this._isFactory = value;
   }
@@ -7387,9 +7077,7 @@
   @override
   bool get isGenerator => _isGenerator ??= false;
 
-  /**
-   * Indicates whether the executable has body marked as being a generator.
-   */
+  /// Indicates whether the executable has body marked as being a generator.
   void set isGenerator(bool value) {
     this._isGenerator = value;
   }
@@ -7397,9 +7085,7 @@
   @override
   bool get isRedirectedConstructor => _isRedirectedConstructor ??= false;
 
-  /**
-   * Indicates whether the executable is a redirected constructor.
-   */
+  /// Indicates whether the executable is a redirected constructor.
   void set isRedirectedConstructor(bool value) {
     this._isRedirectedConstructor = value;
   }
@@ -7407,13 +7093,11 @@
   @override
   bool get isStatic => _isStatic ??= false;
 
-  /**
-   * Indicates whether the executable is declared using the `static` keyword.
-   *
-   * Note that for top level executables, this flag is false, since they are
-   * not declared using the `static` keyword (even though they are considered
-   * static for semantic purposes).
-   */
+  /// Indicates whether the executable is declared using the `static` keyword.
+  ///
+  /// Note that for top level executables, this flag is false, since they are
+  /// not declared using the `static` keyword (even though they are considered
+  /// static for semantic purposes).
   void set isStatic(bool value) {
     this._isStatic = value;
   }
@@ -7422,10 +7106,8 @@
   idl.UnlinkedExecutableKind get kind =>
       _kind ??= idl.UnlinkedExecutableKind.functionOrMethod;
 
-  /**
-   * The kind of the executable (function/method, getter, setter, or
-   * constructor).
-   */
+  /// The kind of the executable (function/method, getter, setter, or
+  /// constructor).
   void set kind(idl.UnlinkedExecutableKind value) {
     this._kind = value;
   }
@@ -7434,9 +7116,7 @@
   List<UnlinkedExecutableBuilder> get localFunctions =>
       _localFunctions ??= <UnlinkedExecutableBuilder>[];
 
-  /**
-   * The list of local functions.
-   */
+  /// The list of local functions.
   void set localFunctions(List<UnlinkedExecutableBuilder> value) {
     this._localFunctions = value;
   }
@@ -7452,11 +7132,9 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * Name of the executable.  For setters, this includes the trailing "=".  For
-   * named constructors, this excludes the class name and excludes the ".".
-   * For unnamed constructors, this is the empty string.
-   */
+  /// Name of the executable.  For setters, this includes the trailing "=".  For
+  /// named constructors, this excludes the class name and excludes the ".".
+  /// For unnamed constructors, this is the empty string.
   void set name(String value) {
     this._name = value;
   }
@@ -7464,10 +7142,8 @@
   @override
   int get nameEnd => _nameEnd ??= 0;
 
-  /**
-   * If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
-   * the offset of the end of the constructor name.  Otherwise zero.
-   */
+  /// If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
+  /// the offset of the end of the constructor name.  Otherwise zero.
   void set nameEnd(int value) {
     assert(value == null || value >= 0);
     this._nameEnd = value;
@@ -7476,12 +7152,10 @@
   @override
   int get nameOffset => _nameOffset ??= 0;
 
-  /**
-   * Offset of the executable name relative to the beginning of the file.  For
-   * named constructors, this excludes the class name and excludes the ".".
-   * For unnamed constructors, this is the offset of the class name (i.e. the
-   * offset of the second "C" in "class C { C(); }").
-   */
+  /// Offset of the executable name relative to the beginning of the file.  For
+  /// named constructors, this excludes the class name and excludes the ".".
+  /// For unnamed constructors, this is the offset of the class name (i.e. the
+  /// offset of the second "C" in "class C { C(); }").
   void set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
@@ -7491,11 +7165,9 @@
   List<UnlinkedParamBuilder> get parameters =>
       _parameters ??= <UnlinkedParamBuilder>[];
 
-  /**
-   * Parameters of the executable, if any.  Note that getters have no
-   * parameters (hence this will be the empty list), and setters have a single
-   * parameter.
-   */
+  /// Parameters of the executable, if any.  Note that getters have no
+  /// parameters (hence this will be the empty list), and setters have a single
+  /// parameter.
   void set parameters(List<UnlinkedParamBuilder> value) {
     this._parameters = value;
   }
@@ -7503,10 +7175,8 @@
   @override
   int get periodOffset => _periodOffset ??= 0;
 
-  /**
-   * If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
-   * the offset of the period before the constructor name.  Otherwise zero.
-   */
+  /// If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
+  /// the offset of the period before the constructor name.  Otherwise zero.
   void set periodOffset(int value) {
     assert(value == null || value >= 0);
     this._periodOffset = value;
@@ -7515,10 +7185,8 @@
   @override
   EntityRefBuilder get redirectedConstructor => _redirectedConstructor;
 
-  /**
-   * If [isRedirectedConstructor] and [isFactory] are both `true`, the
-   * constructor to which this constructor redirects; otherwise empty.
-   */
+  /// If [isRedirectedConstructor] and [isFactory] are both `true`, the
+  /// constructor to which this constructor redirects; otherwise empty.
   void set redirectedConstructor(EntityRefBuilder value) {
     this._redirectedConstructor = value;
   }
@@ -7526,11 +7194,9 @@
   @override
   String get redirectedConstructorName => _redirectedConstructorName ??= '';
 
-  /**
-   * If [isRedirectedConstructor] is `true` and [isFactory] is `false`, the
-   * name of the constructor that this constructor redirects to; otherwise
-   * empty.
-   */
+  /// If [isRedirectedConstructor] is `true` and [isFactory] is `false`, the
+  /// name of the constructor that this constructor redirects to; otherwise
+  /// empty.
   void set redirectedConstructorName(String value) {
     this._redirectedConstructorName = value;
   }
@@ -7538,13 +7204,11 @@
   @override
   EntityRefBuilder get returnType => _returnType;
 
-  /**
-   * Declared return type of the executable.  Absent if the executable is a
-   * constructor or the return type is implicit.  Absent for executables
-   * associated with variable initializers and closures, since these
-   * executables may have return types that are not accessible via direct
-   * imports.
-   */
+  /// Declared return type of the executable.  Absent if the executable is a
+  /// constructor or the return type is implicit.  Absent for executables
+  /// associated with variable initializers and closures, since these
+  /// executables may have return types that are not accessible via direct
+  /// imports.
   void set returnType(EntityRefBuilder value) {
     this._returnType = value;
   }
@@ -7553,10 +7217,8 @@
   List<UnlinkedTypeParamBuilder> get typeParameters =>
       _typeParameters ??= <UnlinkedTypeParamBuilder>[];
 
-  /**
-   * Type parameters of the executable, if any.  Empty if support for generic
-   * method syntax is disabled.
-   */
+  /// Type parameters of the executable, if any.  Empty if support for generic
+  /// method syntax is disabled.
   void set typeParameters(List<UnlinkedTypeParamBuilder> value) {
     this._typeParameters = value;
   }
@@ -7564,9 +7226,7 @@
   @override
   int get visibleLength => _visibleLength ??= 0;
 
-  /**
-   * If a local function, the length of the visible range; zero otherwise.
-   */
+  /// If a local function, the length of the visible range; zero otherwise.
   void set visibleLength(int value) {
     assert(value == null || value >= 0);
     this._visibleLength = value;
@@ -7575,9 +7235,7 @@
   @override
   int get visibleOffset => _visibleOffset ??= 0;
 
-  /**
-   * If a local function, the beginning of the visible range; zero otherwise.
-   */
+  /// If a local function, the beginning of the visible range; zero otherwise.
   void set visibleOffset(int value) {
     assert(value == null || value >= 0);
     this._visibleOffset = value;
@@ -8214,9 +7872,7 @@
   List<UnlinkedExprBuilder> get annotations =>
       _annotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for this export directive.
-   */
+  /// Annotations for this export directive.
   void set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
@@ -8224,9 +7880,7 @@
   @override
   int get offset => _offset ??= 0;
 
-  /**
-   * Offset of the "export" keyword.
-   */
+  /// Offset of the "export" keyword.
   void set offset(int value) {
     assert(value == null || value >= 0);
     this._offset = value;
@@ -8235,10 +7889,8 @@
   @override
   int get uriEnd => _uriEnd ??= 0;
 
-  /**
-   * End of the URI string (including quotes) relative to the beginning of the
-   * file.
-   */
+  /// End of the URI string (including quotes) relative to the beginning of the
+  /// file.
   void set uriEnd(int value) {
     assert(value == null || value >= 0);
     this._uriEnd = value;
@@ -8247,10 +7899,8 @@
   @override
   int get uriOffset => _uriOffset ??= 0;
 
-  /**
-   * Offset of the URI string (including quotes) relative to the beginning of
-   * the file.
-   */
+  /// Offset of the URI string (including quotes) relative to the beginning of
+  /// the file.
   void set uriOffset(int value) {
     assert(value == null || value >= 0);
     this._uriOffset = value;
@@ -8399,9 +8049,7 @@
   List<UnlinkedCombinatorBuilder> get combinators =>
       _combinators ??= <UnlinkedCombinatorBuilder>[];
 
-  /**
-   * Combinators contained in this export declaration.
-   */
+  /// Combinators contained in this export declaration.
   void set combinators(List<UnlinkedCombinatorBuilder> value) {
     this._combinators = value;
   }
@@ -8410,10 +8058,8 @@
   List<UnlinkedConfigurationBuilder> get configurations =>
       _configurations ??= <UnlinkedConfigurationBuilder>[];
 
-  /**
-   * Configurations used to control which library will actually be loaded at
-   * run-time.
-   */
+  /// Configurations used to control which library will actually be loaded at
+  /// run-time.
   void set configurations(List<UnlinkedConfigurationBuilder> value) {
     this._configurations = value;
   }
@@ -8421,9 +8067,7 @@
   @override
   String get uri => _uri ??= '';
 
-  /**
-   * URI used in the source code to reference the exported library.
-   */
+  /// URI used in the source code to reference the exported library.
   void set uri(String value) {
     this._uri = value;
   }
@@ -8580,9 +8224,7 @@
   List<idl.UnlinkedExprAssignOperator> get assignmentOperators =>
       _assignmentOperators ??= <idl.UnlinkedExprAssignOperator>[];
 
-  /**
-   * Sequence of operators used by assignment operations.
-   */
+  /// Sequence of operators used by assignment operations.
   void set assignmentOperators(List<idl.UnlinkedExprAssignOperator> value) {
     this._assignmentOperators = value;
   }
@@ -8590,9 +8232,7 @@
   @override
   List<double> get doubles => _doubles ??= <double>[];
 
-  /**
-   * Sequence of 64-bit doubles consumed by the operation `pushDouble`.
-   */
+  /// Sequence of 64-bit doubles consumed by the operation `pushDouble`.
   void set doubles(List<double> value) {
     this._doubles = value;
   }
@@ -8600,11 +8240,9 @@
   @override
   List<int> get ints => _ints ??= <int>[];
 
-  /**
-   * Sequence of unsigned 32-bit integers consumed by the operations
-   * `pushArgument`, `pushInt`, `shiftOr`, `concatenate`, `invokeConstructor`,
-   * `makeList`, and `makeMap`.
-   */
+  /// Sequence of unsigned 32-bit integers consumed by the operations
+  /// `pushArgument`, `pushInt`, `shiftOr`, `concatenate`, `invokeConstructor`,
+  /// `makeList`, and `makeMap`.
   void set ints(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._ints = value;
@@ -8613,10 +8251,8 @@
   @override
   bool get isValidConst => _isValidConst ??= false;
 
-  /**
-   * Indicates whether the expression is a valid potentially constant
-   * expression.
-   */
+  /// Indicates whether the expression is a valid potentially constant
+  /// expression.
   void set isValidConst(bool value) {
     this._isValidConst = value;
   }
@@ -8625,10 +8261,8 @@
   List<idl.UnlinkedExprOperation> get operations =>
       _operations ??= <idl.UnlinkedExprOperation>[];
 
-  /**
-   * Sequence of operations to execute (starting with an empty stack) to form
-   * the constant value.
-   */
+  /// Sequence of operations to execute (starting with an empty stack) to form
+  /// the constant value.
   void set operations(List<idl.UnlinkedExprOperation> value) {
     this._operations = value;
   }
@@ -8636,12 +8270,10 @@
   @override
   List<EntityRefBuilder> get references => _references ??= <EntityRefBuilder>[];
 
-  /**
-   * Sequence of language constructs consumed by the operations
-   * `pushReference`, `invokeConstructor`, `makeList`, and `makeMap`.  Note
-   * that in the case of `pushReference` (and sometimes `invokeConstructor` the
-   * actual entity being referred to may be something other than a type.
-   */
+  /// Sequence of language constructs consumed by the operations
+  /// `pushReference`, `invokeConstructor`, `makeList`, and `makeMap`.  Note
+  /// that in the case of `pushReference` (and sometimes `invokeConstructor` the
+  /// actual entity being referred to may be something other than a type.
   void set references(List<EntityRefBuilder> value) {
     this._references = value;
   }
@@ -8649,10 +8281,8 @@
   @override
   List<String> get strings => _strings ??= <String>[];
 
-  /**
-   * Sequence of strings consumed by the operations `pushString` and
-   * `invokeConstructor`.
-   */
+  /// Sequence of strings consumed by the operations `pushString` and
+  /// `invokeConstructor`.
   void set strings(List<String> value) {
     this._strings = value;
   }
@@ -8925,9 +8555,7 @@
   List<UnlinkedExprBuilder> get annotations =>
       _annotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for this import declaration.
-   */
+  /// Annotations for this import declaration.
   void set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
@@ -8936,9 +8564,7 @@
   List<UnlinkedCombinatorBuilder> get combinators =>
       _combinators ??= <UnlinkedCombinatorBuilder>[];
 
-  /**
-   * Combinators contained in this import declaration.
-   */
+  /// Combinators contained in this import declaration.
   void set combinators(List<UnlinkedCombinatorBuilder> value) {
     this._combinators = value;
   }
@@ -8947,10 +8573,8 @@
   List<UnlinkedConfigurationBuilder> get configurations =>
       _configurations ??= <UnlinkedConfigurationBuilder>[];
 
-  /**
-   * Configurations used to control which library will actually be loaded at
-   * run-time.
-   */
+  /// Configurations used to control which library will actually be loaded at
+  /// run-time.
   void set configurations(List<UnlinkedConfigurationBuilder> value) {
     this._configurations = value;
   }
@@ -8958,9 +8582,7 @@
   @override
   bool get isDeferred => _isDeferred ??= false;
 
-  /**
-   * Indicates whether the import declaration uses the `deferred` keyword.
-   */
+  /// Indicates whether the import declaration uses the `deferred` keyword.
   void set isDeferred(bool value) {
     this._isDeferred = value;
   }
@@ -8968,9 +8590,7 @@
   @override
   bool get isImplicit => _isImplicit ??= false;
 
-  /**
-   * Indicates whether the import declaration is implicit.
-   */
+  /// Indicates whether the import declaration is implicit.
   void set isImplicit(bool value) {
     this._isImplicit = value;
   }
@@ -8978,10 +8598,8 @@
   @override
   int get offset => _offset ??= 0;
 
-  /**
-   * If [isImplicit] is false, offset of the "import" keyword.  If [isImplicit]
-   * is true, zero.
-   */
+  /// If [isImplicit] is false, offset of the "import" keyword.  If [isImplicit]
+  /// is true, zero.
   void set offset(int value) {
     assert(value == null || value >= 0);
     this._offset = value;
@@ -8990,10 +8608,8 @@
   @override
   int get prefixOffset => _prefixOffset ??= 0;
 
-  /**
-   * Offset of the prefix name relative to the beginning of the file, or zero
-   * if there is no prefix.
-   */
+  /// Offset of the prefix name relative to the beginning of the file, or zero
+  /// if there is no prefix.
   void set prefixOffset(int value) {
     assert(value == null || value >= 0);
     this._prefixOffset = value;
@@ -9002,12 +8618,10 @@
   @override
   int get prefixReference => _prefixReference ??= 0;
 
-  /**
-   * Index into [UnlinkedUnit.references] of the prefix declared by this
-   * import declaration, or zero if this import declaration declares no prefix.
-   *
-   * Note that multiple imports can declare the same prefix.
-   */
+  /// Index into [UnlinkedUnit.references] of the prefix declared by this
+  /// import declaration, or zero if this import declaration declares no prefix.
+  ///
+  /// Note that multiple imports can declare the same prefix.
   void set prefixReference(int value) {
     assert(value == null || value >= 0);
     this._prefixReference = value;
@@ -9016,9 +8630,7 @@
   @override
   String get uri => _uri ??= '';
 
-  /**
-   * URI used in the source code to reference the imported library.
-   */
+  /// URI used in the source code to reference the imported library.
   void set uri(String value) {
     this._uri = value;
   }
@@ -9026,10 +8638,8 @@
   @override
   int get uriEnd => _uriEnd ??= 0;
 
-  /**
-   * End of the URI string (including quotes) relative to the beginning of the
-   * file.  If [isImplicit] is true, zero.
-   */
+  /// End of the URI string (including quotes) relative to the beginning of the
+  /// file.  If [isImplicit] is true, zero.
   void set uriEnd(int value) {
     assert(value == null || value >= 0);
     this._uriEnd = value;
@@ -9038,10 +8648,8 @@
   @override
   int get uriOffset => _uriOffset ??= 0;
 
-  /**
-   * Offset of the URI string (including quotes) relative to the beginning of
-   * the file.  If [isImplicit] is true, zero.
-   */
+  /// Offset of the URI string (including quotes) relative to the beginning of
+  /// the file.  If [isImplicit] is true, zero.
   void set uriOffset(int value) {
     assert(value == null || value >= 0);
     this._uriOffset = value;
@@ -9346,9 +8954,7 @@
   List<UnlinkedExprBuilder> get annotations =>
       _annotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for this parameter.
-   */
+  /// Annotations for this parameter.
   void set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
@@ -9356,9 +8962,7 @@
   @override
   CodeRangeBuilder get codeRange => _codeRange;
 
-  /**
-   * Code range of the parameter.
-   */
+  /// Code range of the parameter.
   void set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
@@ -9366,10 +8970,8 @@
   @override
   String get defaultValueCode => _defaultValueCode ??= '';
 
-  /**
-   * If the parameter has a default value, the source text of the constant
-   * expression in the default value.  Otherwise the empty string.
-   */
+  /// If the parameter has a default value, the source text of the constant
+  /// expression in the default value.  Otherwise the empty string.
   void set defaultValueCode(String value) {
     this._defaultValueCode = value;
   }
@@ -9377,17 +8979,15 @@
   @override
   int get inferredTypeSlot => _inferredTypeSlot ??= 0;
 
-  /**
-   * If this parameter's type is inferable, nonzero slot id identifying which
-   * entry in [LinkedLibrary.types] contains the inferred type.  If there is no
-   * matching entry in [LinkedLibrary.types], then no type was inferred for
-   * this variable, so its static type is `dynamic`.
-   *
-   * Note that although strong mode considers initializing formals to be
-   * inferable, they are not marked as such in the summary; if their type is
-   * not specified, they always inherit the static type of the corresponding
-   * field.
-   */
+  /// If this parameter's type is inferable, nonzero slot id identifying which
+  /// entry in [LinkedLibrary.types] contains the inferred type.  If there is no
+  /// matching entry in [LinkedLibrary.types], then no type was inferred for
+  /// this variable, so its static type is `dynamic`.
+  ///
+  /// Note that although strong mode considers initializing formals to be
+  /// inferable, they are not marked as such in the summary; if their type is
+  /// not specified, they always inherit the static type of the corresponding
+  /// field.
   void set inferredTypeSlot(int value) {
     assert(value == null || value >= 0);
     this._inferredTypeSlot = value;
@@ -9396,14 +8996,12 @@
   @override
   int get inheritsCovariantSlot => _inheritsCovariantSlot ??= 0;
 
-  /**
-   * If this is a parameter of an instance method, a nonzero slot id which is
-   * unique within this compilation unit.  If this id is found in
-   * [LinkedUnit.parametersInheritingCovariant], then this parameter inherits
-   * `@covariant` behavior from a base class.
-   *
-   * Otherwise, zero.
-   */
+  /// If this is a parameter of an instance method, a nonzero slot id which is
+  /// unique within this compilation unit.  If this id is found in
+  /// [LinkedUnit.parametersInheritingCovariant], then this parameter inherits
+  /// `@covariant` behavior from a base class.
+  ///
+  /// Otherwise, zero.
   void set inheritsCovariantSlot(int value) {
     assert(value == null || value >= 0);
     this._inheritsCovariantSlot = value;
@@ -9412,10 +9010,8 @@
   @override
   UnlinkedExecutableBuilder get initializer => _initializer;
 
-  /**
-   * The synthetic initializer function of the parameter.  Absent if the
-   * variable does not have an initializer.
-   */
+  /// The synthetic initializer function of the parameter.  Absent if the
+  /// variable does not have an initializer.
   void set initializer(UnlinkedExecutableBuilder value) {
     this._initializer = value;
   }
@@ -9423,9 +9019,7 @@
   @override
   bool get isExplicitlyCovariant => _isExplicitlyCovariant ??= false;
 
-  /**
-   * Indicates whether this parameter is explicitly marked as being covariant.
-   */
+  /// Indicates whether this parameter is explicitly marked as being covariant.
   void set isExplicitlyCovariant(bool value) {
     this._isExplicitlyCovariant = value;
   }
@@ -9433,9 +9027,7 @@
   @override
   bool get isFinal => _isFinal ??= false;
 
-  /**
-   * Indicates whether the parameter is declared using the `final` keyword.
-   */
+  /// Indicates whether the parameter is declared using the `final` keyword.
   void set isFinal(bool value) {
     this._isFinal = value;
   }
@@ -9443,16 +9035,14 @@
   @override
   bool get isFunctionTyped => _isFunctionTyped ??= false;
 
-  /**
-   * Indicates whether this is a function-typed parameter. A parameter is
-   * function-typed if the declaration of the parameter has explicit formal
-   * parameters
-   * ```
-   * int functionTyped(int p)
-   * ```
-   * but is not function-typed if it does not, even if the type of the parameter
-   * is a function type.
-   */
+  /// Indicates whether this is a function-typed parameter. A parameter is
+  /// function-typed if the declaration of the parameter has explicit formal
+  /// parameters
+  /// ```
+  /// int functionTyped(int p)
+  /// ```
+  /// but is not function-typed if it does not, even if the type of the
+  /// parameter is a function type.
   void set isFunctionTyped(bool value) {
     this._isFunctionTyped = value;
   }
@@ -9460,10 +9050,8 @@
   @override
   bool get isInitializingFormal => _isInitializingFormal ??= false;
 
-  /**
-   * Indicates whether this is an initializing formal parameter (i.e. it is
-   * declared using `this.` syntax).
-   */
+  /// Indicates whether this is an initializing formal parameter (i.e. it is
+  /// declared using `this.` syntax).
   void set isInitializingFormal(bool value) {
     this._isInitializingFormal = value;
   }
@@ -9471,9 +9059,7 @@
   @override
   idl.UnlinkedParamKind get kind => _kind ??= idl.UnlinkedParamKind.required;
 
-  /**
-   * Kind of the parameter.
-   */
+  /// Kind of the parameter.
   void set kind(idl.UnlinkedParamKind value) {
     this._kind = value;
   }
@@ -9481,9 +9067,7 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * Name of the parameter.
-   */
+  /// Name of the parameter.
   void set name(String value) {
     this._name = value;
   }
@@ -9491,9 +9075,7 @@
   @override
   int get nameOffset => _nameOffset ??= 0;
 
-  /**
-   * Offset of the parameter name relative to the beginning of the file.
-   */
+  /// Offset of the parameter name relative to the beginning of the file.
   void set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
@@ -9503,9 +9085,7 @@
   List<UnlinkedParamBuilder> get parameters =>
       _parameters ??= <UnlinkedParamBuilder>[];
 
-  /**
-   * If [isFunctionTyped] is `true`, the parameters of the function type.
-   */
+  /// If [isFunctionTyped] is `true`, the parameters of the function type.
   void set parameters(List<UnlinkedParamBuilder> value) {
     this._parameters = value;
   }
@@ -9513,11 +9093,9 @@
   @override
   EntityRefBuilder get type => _type;
 
-  /**
-   * If [isFunctionTyped] is `true`, the declared return type.  If
-   * [isFunctionTyped] is `false`, the declared type.  Absent if the type is
-   * implicit.
-   */
+  /// If [isFunctionTyped] is `true`, the declared return type.  If
+  /// [isFunctionTyped] is `false`, the declared type.  Absent if the type is
+  /// implicit.
   void set type(EntityRefBuilder value) {
     this._type = value;
   }
@@ -9525,9 +9103,7 @@
   @override
   int get visibleLength => _visibleLength ??= 0;
 
-  /**
-   * The length of the visible range.
-   */
+  /// The length of the visible range.
   void set visibleLength(int value) {
     assert(value == null || value >= 0);
     this._visibleLength = value;
@@ -9536,9 +9112,7 @@
   @override
   int get visibleOffset => _visibleOffset ??= 0;
 
-  /**
-   * The beginning of the visible range.
-   */
+  /// The beginning of the visible range.
   void set visibleOffset(int value) {
     assert(value == null || value >= 0);
     this._visibleOffset = value;
@@ -9933,9 +9507,7 @@
   List<UnlinkedExprBuilder> get annotations =>
       _annotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for this part declaration.
-   */
+  /// Annotations for this part declaration.
   void set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
@@ -9943,10 +9515,8 @@
   @override
   int get uriEnd => _uriEnd ??= 0;
 
-  /**
-   * End of the URI string (including quotes) relative to the beginning of the
-   * file.
-   */
+  /// End of the URI string (including quotes) relative to the beginning of the
+  /// file.
   void set uriEnd(int value) {
     assert(value == null || value >= 0);
     this._uriEnd = value;
@@ -9955,10 +9525,8 @@
   @override
   int get uriOffset => _uriOffset ??= 0;
 
-  /**
-   * Offset of the URI string (including quotes) relative to the beginning of
-   * the file.
-   */
+  /// Offset of the URI string (including quotes) relative to the beginning of
+  /// the file.
   void set uriOffset(int value) {
     assert(value == null || value >= 0);
     this._uriOffset = value;
@@ -10088,9 +9656,7 @@
   @override
   idl.ReferenceKind get kind => _kind ??= idl.ReferenceKind.classOrEnum;
 
-  /**
-   * The kind of object referred to by the name.
-   */
+  /// The kind of object referred to by the name.
   void set kind(idl.ReferenceKind value) {
     this._kind = value;
   }
@@ -10099,14 +9665,12 @@
   List<UnlinkedPublicNameBuilder> get members =>
       _members ??= <UnlinkedPublicNameBuilder>[];
 
-  /**
-   * If this [UnlinkedPublicName] is a class, the list of members which can be
-   * referenced statically - static fields, static methods, and constructors.
-   * Otherwise empty.
-   *
-   * Unnamed constructors are not included since they do not constitute a
-   * separate name added to any namespace.
-   */
+  /// If this [UnlinkedPublicName] is a class, the list of members which can be
+  /// referenced statically - static fields, static methods, and constructors.
+  /// Otherwise empty.
+  ///
+  /// Unnamed constructors are not included since they do not constitute a
+  /// separate name added to any namespace.
   void set members(List<UnlinkedPublicNameBuilder> value) {
     this._members = value;
   }
@@ -10114,9 +9678,7 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * The name itself.
-   */
+  /// The name itself.
   void set name(String value) {
     this._name = value;
   }
@@ -10124,10 +9686,8 @@
   @override
   int get numTypeParameters => _numTypeParameters ??= 0;
 
-  /**
-   * If the entity being referred to is generic, the number of type parameters
-   * it accepts.  Otherwise zero.
-   */
+  /// If the entity being referred to is generic, the number of type parameters
+  /// it accepts.  Otherwise zero.
   void set numTypeParameters(int value) {
     assert(value == null || value >= 0);
     this._numTypeParameters = value;
@@ -10282,9 +9842,7 @@
   List<UnlinkedExportPublicBuilder> get exports =>
       _exports ??= <UnlinkedExportPublicBuilder>[];
 
-  /**
-   * Export declarations in the compilation unit.
-   */
+  /// Export declarations in the compilation unit.
   void set exports(List<UnlinkedExportPublicBuilder> value) {
     this._exports = value;
   }
@@ -10293,12 +9851,10 @@
   List<UnlinkedPublicNameBuilder> get names =>
       _names ??= <UnlinkedPublicNameBuilder>[];
 
-  /**
-   * Public names defined in the compilation unit.
-   *
-   * TODO(paulberry): consider sorting these names to reduce unnecessary
-   * relinking.
-   */
+  /// Public names defined in the compilation unit.
+  ///
+  /// TODO(paulberry): consider sorting these names to reduce unnecessary
+  /// relinking.
   void set names(List<UnlinkedPublicNameBuilder> value) {
     this._names = value;
   }
@@ -10306,9 +9862,7 @@
   @override
   List<String> get parts => _parts ??= <String>[];
 
-  /**
-   * URIs referenced by part declarations in the compilation unit.
-   */
+  /// URIs referenced by part declarations in the compilation unit.
   void set parts(List<String> value) {
     this._parts = value;
   }
@@ -10477,11 +10031,9 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * Name of the entity being referred to.  For the pseudo-type `dynamic`, the
-   * string is "dynamic".  For the pseudo-type `void`, the string is "void".
-   * For the pseudo-type `bottom`, the string is "*bottom*".
-   */
+  /// Name of the entity being referred to.  For the pseudo-type `dynamic`, the
+  /// string is "dynamic".  For the pseudo-type `void`, the string is "void".
+  /// For the pseudo-type `bottom`, the string is "*bottom*".
   void set name(String value) {
     this._name = value;
   }
@@ -10489,14 +10041,12 @@
   @override
   int get prefixReference => _prefixReference ??= 0;
 
-  /**
-   * Prefix used to refer to the entity, or zero if no prefix is used.  This is
-   * an index into [UnlinkedUnit.references].
-   *
-   * Prefix references must always point backward; that is, for all i, if
-   * UnlinkedUnit.references[i].prefixReference != 0, then
-   * UnlinkedUnit.references[i].prefixReference < i.
-   */
+  /// Prefix used to refer to the entity, or zero if no prefix is used.  This is
+  /// an index into [UnlinkedUnit.references].
+  ///
+  /// Prefix references must always point backward; that is, for all i, if
+  /// UnlinkedUnit.references[i].prefixReference != 0, then
+  /// UnlinkedUnit.references[i].prefixReference < i.
   void set prefixReference(int value) {
     assert(value == null || value >= 0);
     this._prefixReference = value;
@@ -10604,9 +10154,7 @@
   List<UnlinkedExprBuilder> get annotations =>
       _annotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for this typedef.
-   */
+  /// Annotations for this typedef.
   void set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
@@ -10614,9 +10162,7 @@
   @override
   CodeRangeBuilder get codeRange => _codeRange;
 
-  /**
-   * Code range of the typedef.
-   */
+  /// Code range of the typedef.
   void set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
@@ -10625,10 +10171,8 @@
   UnlinkedDocumentationCommentBuilder get documentationComment =>
       _documentationComment;
 
-  /**
-   * Documentation comment for the typedef, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the typedef, or `null` if there is no
+  /// documentation comment.
   void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
@@ -10636,9 +10180,7 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * Name of the typedef.
-   */
+  /// Name of the typedef.
   void set name(String value) {
     this._name = value;
   }
@@ -10646,9 +10188,7 @@
   @override
   int get nameOffset => _nameOffset ??= 0;
 
-  /**
-   * Offset of the typedef name relative to the beginning of the file.
-   */
+  /// Offset of the typedef name relative to the beginning of the file.
   void set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
@@ -10658,9 +10198,7 @@
   List<UnlinkedParamBuilder> get parameters =>
       _parameters ??= <UnlinkedParamBuilder>[];
 
-  /**
-   * Parameters of the executable, if any.
-   */
+  /// Parameters of the executable, if any.
   void set parameters(List<UnlinkedParamBuilder> value) {
     this._parameters = value;
   }
@@ -10668,11 +10206,9 @@
   @override
   EntityRefBuilder get returnType => _returnType;
 
-  /**
-   * If [style] is [TypedefStyle.functionType], the return type of the typedef.
-   * If [style] is [TypedefStyle.genericFunctionType], the function type being
-   * defined.
-   */
+  /// If [style] is [TypedefStyle.functionType], the return type of the typedef.
+  /// If [style] is [TypedefStyle.genericFunctionType], the function type being
+  /// defined.
   void set returnType(EntityRefBuilder value) {
     this._returnType = value;
   }
@@ -10680,9 +10216,7 @@
   @override
   idl.TypedefStyle get style => _style ??= idl.TypedefStyle.functionType;
 
-  /**
-   * The style of the typedef.
-   */
+  /// The style of the typedef.
   void set style(idl.TypedefStyle value) {
     this._style = value;
   }
@@ -10691,9 +10225,7 @@
   List<UnlinkedTypeParamBuilder> get typeParameters =>
       _typeParameters ??= <UnlinkedTypeParamBuilder>[];
 
-  /**
-   * Type parameters of the typedef, if any.
-   */
+  /// Type parameters of the typedef, if any.
   void set typeParameters(List<UnlinkedTypeParamBuilder> value) {
     this._typeParameters = value;
   }
@@ -10972,9 +10504,7 @@
   List<UnlinkedExprBuilder> get annotations =>
       _annotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for this type parameter.
-   */
+  /// Annotations for this type parameter.
   void set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
@@ -10982,10 +10512,8 @@
   @override
   EntityRefBuilder get bound => _bound;
 
-  /**
-   * Bound of the type parameter, if a bound is explicitly declared.  Otherwise
-   * null.
-   */
+  /// Bound of the type parameter, if a bound is explicitly declared.  Otherwise
+  /// null.
   void set bound(EntityRefBuilder value) {
     this._bound = value;
   }
@@ -10993,9 +10521,7 @@
   @override
   CodeRangeBuilder get codeRange => _codeRange;
 
-  /**
-   * Code range of the type parameter.
-   */
+  /// Code range of the type parameter.
   void set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
@@ -11003,9 +10529,7 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * Name of the type parameter.
-   */
+  /// Name of the type parameter.
   void set name(String value) {
     this._name = value;
   }
@@ -11013,9 +10537,7 @@
   @override
   int get nameOffset => _nameOffset ??= 0;
 
-  /**
-   * Offset of the type parameter name relative to the beginning of the file.
-   */
+  /// Offset of the type parameter name relative to the beginning of the file.
   void set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
@@ -11207,11 +10729,9 @@
   @override
   List<int> get apiSignature => _apiSignature ??= <int>[];
 
-  /**
-   * MD5 hash of the non-informative fields of the [UnlinkedUnit] (not
-   * including this one) as 16 unsigned 8-bit integer values.  This can be used
-   * to identify when the API of a unit may have changed.
-   */
+  /// MD5 hash of the non-informative fields of the [UnlinkedUnit] (not
+  /// including this one) as 16 unsigned 8-bit integer values.  This can be used
+  /// to identify when the API of a unit may have changed.
   void set apiSignature(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._apiSignature = value;
@@ -11221,9 +10741,7 @@
   List<UnlinkedClassBuilder> get classes =>
       _classes ??= <UnlinkedClassBuilder>[];
 
-  /**
-   * Classes declared in the compilation unit.
-   */
+  /// Classes declared in the compilation unit.
   void set classes(List<UnlinkedClassBuilder> value) {
     this._classes = value;
   }
@@ -11231,9 +10749,7 @@
   @override
   CodeRangeBuilder get codeRange => _codeRange;
 
-  /**
-   * Code range of the unit.
-   */
+  /// Code range of the unit.
   void set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
@@ -11241,9 +10757,7 @@
   @override
   List<UnlinkedEnumBuilder> get enums => _enums ??= <UnlinkedEnumBuilder>[];
 
-  /**
-   * Enums declared in the compilation unit.
-   */
+  /// Enums declared in the compilation unit.
   void set enums(List<UnlinkedEnumBuilder> value) {
     this._enums = value;
   }
@@ -11252,10 +10766,8 @@
   List<UnlinkedExecutableBuilder> get executables =>
       _executables ??= <UnlinkedExecutableBuilder>[];
 
-  /**
-   * Top level executable objects (functions, getters, and setters) declared in
-   * the compilation unit.
-   */
+  /// Top level executable objects (functions, getters, and setters) declared in
+  /// the compilation unit.
   void set executables(List<UnlinkedExecutableBuilder> value) {
     this._executables = value;
   }
@@ -11264,9 +10776,7 @@
   List<UnlinkedExportNonPublicBuilder> get exports =>
       _exports ??= <UnlinkedExportNonPublicBuilder>[];
 
-  /**
-   * Export declarations in the compilation unit.
-   */
+  /// Export declarations in the compilation unit.
   void set exports(List<UnlinkedExportNonPublicBuilder> value) {
     this._exports = value;
   }
@@ -11279,9 +10789,7 @@
   List<UnlinkedImportBuilder> get imports =>
       _imports ??= <UnlinkedImportBuilder>[];
 
-  /**
-   * Import declarations in the compilation unit.
-   */
+  /// Import declarations in the compilation unit.
   void set imports(List<UnlinkedImportBuilder> value) {
     this._imports = value;
   }
@@ -11289,9 +10797,7 @@
   @override
   bool get isPartOf => _isPartOf ??= false;
 
-  /**
-   * Indicates whether the unit contains a "part of" declaration.
-   */
+  /// Indicates whether the unit contains a "part of" declaration.
   void set isPartOf(bool value) {
     this._isPartOf = value;
   }
@@ -11300,10 +10806,8 @@
   List<UnlinkedExprBuilder> get libraryAnnotations =>
       _libraryAnnotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for the library declaration, or the empty list if there is no
-   * library declaration.
-   */
+  /// Annotations for the library declaration, or the empty list if there is no
+  /// library declaration.
   void set libraryAnnotations(List<UnlinkedExprBuilder> value) {
     this._libraryAnnotations = value;
   }
@@ -11312,10 +10816,8 @@
   UnlinkedDocumentationCommentBuilder get libraryDocumentationComment =>
       _libraryDocumentationComment;
 
-  /**
-   * Documentation comment for the library, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the library, or `null` if there is no
+  /// documentation comment.
   void set libraryDocumentationComment(
       UnlinkedDocumentationCommentBuilder value) {
     this._libraryDocumentationComment = value;
@@ -11324,9 +10826,7 @@
   @override
   String get libraryName => _libraryName ??= '';
 
-  /**
-   * Name of the library (from a "library" declaration, if present).
-   */
+  /// Name of the library (from a "library" declaration, if present).
   void set libraryName(String value) {
     this._libraryName = value;
   }
@@ -11334,10 +10834,8 @@
   @override
   int get libraryNameLength => _libraryNameLength ??= 0;
 
-  /**
-   * Length of the library name as it appears in the source code (or 0 if the
-   * library has no name).
-   */
+  /// Length of the library name as it appears in the source code (or 0 if the
+  /// library has no name).
   void set libraryNameLength(int value) {
     assert(value == null || value >= 0);
     this._libraryNameLength = value;
@@ -11346,10 +10844,8 @@
   @override
   int get libraryNameOffset => _libraryNameOffset ??= 0;
 
-  /**
-   * Offset of the library name relative to the beginning of the file (or 0 if
-   * the library has no name).
-   */
+  /// Offset of the library name relative to the beginning of the file (or 0 if
+  /// the library has no name).
   void set libraryNameOffset(int value) {
     assert(value == null || value >= 0);
     this._libraryNameOffset = value;
@@ -11358,9 +10854,7 @@
   @override
   List<int> get lineStarts => _lineStarts ??= <int>[];
 
-  /**
-   * Offsets of the first character of each line in the source code.
-   */
+  /// Offsets of the first character of each line in the source code.
   void set lineStarts(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._lineStarts = value;
@@ -11369,9 +10863,7 @@
   @override
   List<UnlinkedClassBuilder> get mixins => _mixins ??= <UnlinkedClassBuilder>[];
 
-  /**
-   * Mixins declared in the compilation unit.
-   */
+  /// Mixins declared in the compilation unit.
   void set mixins(List<UnlinkedClassBuilder> value) {
     this._mixins = value;
   }
@@ -11379,9 +10871,7 @@
   @override
   List<UnlinkedPartBuilder> get parts => _parts ??= <UnlinkedPartBuilder>[];
 
-  /**
-   * Part declarations in the compilation unit.
-   */
+  /// Part declarations in the compilation unit.
   void set parts(List<UnlinkedPartBuilder> value) {
     this._parts = value;
   }
@@ -11389,9 +10879,7 @@
   @override
   UnlinkedPublicNamespaceBuilder get publicNamespace => _publicNamespace;
 
-  /**
-   * Unlinked public namespace of this compilation unit.
-   */
+  /// Unlinked public namespace of this compilation unit.
   void set publicNamespace(UnlinkedPublicNamespaceBuilder value) {
     this._publicNamespace = value;
   }
@@ -11400,13 +10888,11 @@
   List<UnlinkedReferenceBuilder> get references =>
       _references ??= <UnlinkedReferenceBuilder>[];
 
-  /**
-   * Top level and prefixed names referred to by this compilation unit.  The
-   * zeroth element of this array is always populated and is used to represent
-   * the absence of a reference in places where a reference is optional (for
-   * example [UnlinkedReference.prefixReference or
-   * UnlinkedImport.prefixReference]).
-   */
+  /// Top level and prefixed names referred to by this compilation unit.  The
+  /// zeroth element of this array is always populated and is used to represent
+  /// the absence of a reference in places where a reference is optional (for
+  /// example [UnlinkedReference.prefixReference or
+  /// UnlinkedImport.prefixReference]).
   void set references(List<UnlinkedReferenceBuilder> value) {
     this._references = value;
   }
@@ -11415,9 +10901,7 @@
   List<UnlinkedTypedefBuilder> get typedefs =>
       _typedefs ??= <UnlinkedTypedefBuilder>[];
 
-  /**
-   * Typedefs declared in the compilation unit.
-   */
+  /// Typedefs declared in the compilation unit.
   void set typedefs(List<UnlinkedTypedefBuilder> value) {
     this._typedefs = value;
   }
@@ -11426,9 +10910,7 @@
   List<UnlinkedVariableBuilder> get variables =>
       _variables ??= <UnlinkedVariableBuilder>[];
 
-  /**
-   * Top level variables declared in the compilation unit.
-   */
+  /// Top level variables declared in the compilation unit.
   void set variables(List<UnlinkedVariableBuilder> value) {
     this._variables = value;
   }
@@ -12047,9 +11529,7 @@
   List<UnlinkedExprBuilder> get annotations =>
       _annotations ??= <UnlinkedExprBuilder>[];
 
-  /**
-   * Annotations for this variable.
-   */
+  /// Annotations for this variable.
   void set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
@@ -12057,9 +11537,7 @@
   @override
   CodeRangeBuilder get codeRange => _codeRange;
 
-  /**
-   * Code range of the variable.
-   */
+  /// Code range of the variable.
   void set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
@@ -12068,10 +11546,8 @@
   UnlinkedDocumentationCommentBuilder get documentationComment =>
       _documentationComment;
 
-  /**
-   * Documentation comment for the variable, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the variable, or `null` if there is no
+  /// documentation comment.
   void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
@@ -12079,12 +11555,10 @@
   @override
   int get inferredTypeSlot => _inferredTypeSlot ??= 0;
 
-  /**
-   * If this variable is inferable, nonzero slot id identifying which entry in
-   * [LinkedLibrary.types] contains the inferred type for this variable.  If
-   * there is no matching entry in [LinkedLibrary.types], then no type was
-   * inferred for this variable, so its static type is `dynamic`.
-   */
+  /// If this variable is inferable, nonzero slot id identifying which entry in
+  /// [LinkedLibrary.types] contains the inferred type for this variable.  If
+  /// there is no matching entry in [LinkedLibrary.types], then no type was
+  /// inferred for this variable, so its static type is `dynamic`.
   void set inferredTypeSlot(int value) {
     assert(value == null || value >= 0);
     this._inferredTypeSlot = value;
@@ -12093,14 +11567,12 @@
   @override
   int get inheritsCovariantSlot => _inheritsCovariantSlot ??= 0;
 
-  /**
-   * If this is an instance non-final field, a nonzero slot id which is unique
-   * within this compilation unit.  If this id is found in
-   * [LinkedUnit.parametersInheritingCovariant], then the parameter of the
-   * synthetic setter inherits `@covariant` behavior from a base class.
-   *
-   * Otherwise, zero.
-   */
+  /// If this is an instance non-final field, a nonzero slot id which is unique
+  /// within this compilation unit.  If this id is found in
+  /// [LinkedUnit.parametersInheritingCovariant], then the parameter of the
+  /// synthetic setter inherits `@covariant` behavior from a base class.
+  ///
+  /// Otherwise, zero.
   void set inheritsCovariantSlot(int value) {
     assert(value == null || value >= 0);
     this._inheritsCovariantSlot = value;
@@ -12109,10 +11581,8 @@
   @override
   UnlinkedExecutableBuilder get initializer => _initializer;
 
-  /**
-   * The synthetic initializer function of the variable.  Absent if the variable
-   * does not have an initializer.
-   */
+  /// The synthetic initializer function of the variable.  Absent if the
+  /// variable does not have an initializer.
   void set initializer(UnlinkedExecutableBuilder value) {
     this._initializer = value;
   }
@@ -12120,9 +11590,7 @@
   @override
   bool get isConst => _isConst ??= false;
 
-  /**
-   * Indicates whether the variable is declared using the `const` keyword.
-   */
+  /// Indicates whether the variable is declared using the `const` keyword.
   void set isConst(bool value) {
     this._isConst = value;
   }
@@ -12130,10 +11598,8 @@
   @override
   bool get isCovariant => _isCovariant ??= false;
 
-  /**
-   * Indicates whether this variable is declared using the `covariant` keyword.
-   * This should be false for everything except instance fields.
-   */
+  /// Indicates whether this variable is declared using the `covariant` keyword.
+  /// This should be false for everything except instance fields.
   void set isCovariant(bool value) {
     this._isCovariant = value;
   }
@@ -12141,9 +11607,7 @@
   @override
   bool get isFinal => _isFinal ??= false;
 
-  /**
-   * Indicates whether the variable is declared using the `final` keyword.
-   */
+  /// Indicates whether the variable is declared using the `final` keyword.
   void set isFinal(bool value) {
     this._isFinal = value;
   }
@@ -12151,13 +11615,11 @@
   @override
   bool get isStatic => _isStatic ??= false;
 
-  /**
-   * Indicates whether the variable is declared using the `static` keyword.
-   *
-   * Note that for top level variables, this flag is false, since they are not
-   * declared using the `static` keyword (even though they are considered
-   * static for semantic purposes).
-   */
+  /// Indicates whether the variable is declared using the `static` keyword.
+  ///
+  /// Note that for top level variables, this flag is false, since they are not
+  /// declared using the `static` keyword (even though they are considered
+  /// static for semantic purposes).
   void set isStatic(bool value) {
     this._isStatic = value;
   }
@@ -12165,9 +11627,7 @@
   @override
   String get name => _name ??= '';
 
-  /**
-   * Name of the variable.
-   */
+  /// Name of the variable.
   void set name(String value) {
     this._name = value;
   }
@@ -12175,9 +11635,7 @@
   @override
   int get nameOffset => _nameOffset ??= 0;
 
-  /**
-   * Offset of the variable name relative to the beginning of the file.
-   */
+  /// Offset of the variable name relative to the beginning of the file.
   void set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
@@ -12186,14 +11644,12 @@
   @override
   int get propagatedTypeSlot => _propagatedTypeSlot ??= 0;
 
-  /**
-   * If this variable is propagable, nonzero slot id identifying which entry in
-   * [LinkedLibrary.types] contains the propagated type for this variable.  If
-   * there is no matching entry in [LinkedLibrary.types], then this variable's
-   * propagated type is the same as its declared type.
-   *
-   * Non-propagable variables have a [propagatedTypeSlot] of zero.
-   */
+  /// If this variable is propagable, nonzero slot id identifying which entry in
+  /// [LinkedLibrary.types] contains the propagated type for this variable.  If
+  /// there is no matching entry in [LinkedLibrary.types], then this variable's
+  /// propagated type is the same as its declared type.
+  ///
+  /// Non-propagable variables have a [propagatedTypeSlot] of zero.
   void set propagatedTypeSlot(int value) {
     assert(value == null || value >= 0);
     this._propagatedTypeSlot = value;
@@ -12202,9 +11658,7 @@
   @override
   EntityRefBuilder get type => _type;
 
-  /**
-   * Declared type of the variable.  Absent if the type is implicit.
-   */
+  /// Declared type of the variable.  Absent if the type is implicit.
   void set type(EntityRefBuilder value) {
     this._type = value;
   }
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 0f70322..6d76a1c 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -6,238 +6,154 @@
 // To regenerate the file, use the script "pkg/analyzer/tool/generate_files".
 
 
-/**
- * Enum used to indicate the kind of an entity reference.
- */
+/// Enum used to indicate the kind of an entity reference.
 enum EntityRefKind : byte {
-  /**
-   * The entity represents a named type.
-   */
+  /// The entity represents a named type.
   named,
 
-  /**
-   * The entity represents a generic function type.
-   */
+  /// The entity represents a generic function type.
   genericFunctionType,
 
-  /**
-   * The entity represents a function type that was synthesized by a LUB
-   * computation.
-   */
+  /// The entity represents a function type that was synthesized by a LUB
+  /// computation.
   syntheticFunction
 }
 
-/**
- * Enum used to indicate the kind of a name in index.
- */
+/// Enum used to indicate the kind of a name in index.
 enum IndexNameKind : byte {
-  /**
-   * A top-level element.
-   */
+  /// A top-level element.
   topLevel,
 
-  /**
-   * A class member.
-   */
+  /// A class member.
   classMember
 }
 
-/**
- * Enum used to indicate the kind of an index relation.
- */
+/// Enum used to indicate the kind of an index relation.
 enum IndexRelationKind : byte {
-  /**
-   * Left: class.
-   *   Is ancestor of (is extended or implemented, directly or indirectly).
-   * Right: other class declaration.
-   */
+  /// Left: class.
+  ///   Is ancestor of (is extended or implemented, directly or indirectly).
+  /// Right: other class declaration.
   IS_ANCESTOR_OF,
 
-  /**
-   * Left: class.
-   *   Is extended by.
-   * Right: other class declaration.
-   */
+  /// Left: class.
+  ///   Is extended by.
+  /// Right: other class declaration.
   IS_EXTENDED_BY,
 
-  /**
-   * Left: class.
-   *   Is implemented by.
-   * Right: other class declaration.
-   */
+  /// Left: class.
+  ///   Is implemented by.
+  /// Right: other class declaration.
   IS_IMPLEMENTED_BY,
 
-  /**
-   * Left: class.
-   *   Is mixed into.
-   * Right: other class declaration.
-   */
+  /// Left: class.
+  ///   Is mixed into.
+  /// Right: other class declaration.
   IS_MIXED_IN_BY,
 
-  /**
-   * Left: method, property accessor, function, variable.
-   *   Is invoked at.
-   * Right: location.
-   */
+  /// Left: method, property accessor, function, variable.
+  ///   Is invoked at.
+  /// Right: location.
   IS_INVOKED_BY,
 
-  /**
-   * Left: any element.
-   *   Is referenced (and not invoked, read/written) at.
-   * Right: location.
-   */
+  /// Left: any element.
+  ///   Is referenced (and not invoked, read/written) at.
+  /// Right: location.
   IS_REFERENCED_BY,
 
-  /**
-   * Left: unresolved member name.
-   *   Is read at.
-   * Right: location.
-   */
+  /// Left: unresolved member name.
+  ///   Is read at.
+  /// Right: location.
   IS_READ_BY,
 
-  /**
-   * Left: unresolved member name.
-   *   Is both read and written at.
-   * Right: location.
-   */
+  /// Left: unresolved member name.
+  ///   Is both read and written at.
+  /// Right: location.
   IS_READ_WRITTEN_BY,
 
-  /**
-   * Left: unresolved member name.
-   *   Is written at.
-   * Right: location.
-   */
+  /// Left: unresolved member name.
+  ///   Is written at.
+  /// Right: location.
   IS_WRITTEN_BY
 }
 
-/**
- * When we need to reference a synthetic element in [PackageIndex] we use a
- * value of this enum to specify which kind of the synthetic element we
- * actually reference.
- */
+/// When we need to reference a synthetic element in [PackageIndex] we use a
+/// value of this enum to specify which kind of the synthetic element we
+/// actually reference.
 enum IndexSyntheticElementKind : byte {
-  /**
-   * Not a synthetic element.
-   */
+  /// Not a synthetic element.
   notSynthetic,
 
-  /**
-   * The unnamed synthetic constructor a class element.
-   */
+  /// The unnamed synthetic constructor a class element.
   constructor,
 
-  /**
-   * The synthetic field element.
-   */
+  /// The synthetic field element.
   field,
 
-  /**
-   * The synthetic getter of a property introducing element.
-   */
+  /// The synthetic getter of a property introducing element.
   getter,
 
-  /**
-   * The synthetic setter of a property introducing element.
-   */
+  /// The synthetic setter of a property introducing element.
   setter,
 
-  /**
-   * The synthetic top-level variable element.
-   */
+  /// The synthetic top-level variable element.
   topLevelVariable,
 
-  /**
-   * The synthetic `loadLibrary` element.
-   */
+  /// The synthetic `loadLibrary` element.
   loadLibrary,
 
-  /**
-   * The synthetic `index` getter of an enum.
-   */
+  /// The synthetic `index` getter of an enum.
   enumIndex,
 
-  /**
-   * The synthetic `values` getter of an enum.
-   */
+  /// The synthetic `values` getter of an enum.
   enumValues,
 
-  /**
-   * The containing unit itself.
-   */
+  /// The containing unit itself.
   unit
 }
 
-/**
- * Enum used to indicate the kind of entity referred to by a
- * [LinkedReference].
- */
+/// Enum used to indicate the kind of entity referred to by a
+/// [LinkedReference].
 enum ReferenceKind : byte {
-  /**
-   * The entity is a class or enum.
-   */
+  /// The entity is a class or enum.
   classOrEnum,
 
-  /**
-   * The entity is a constructor.
-   */
+  /// The entity is a constructor.
   constructor,
 
-  /**
-   * The entity is a getter or setter inside a class.  Note: this is used in
-   * the case where a constant refers to a static const declared inside a
-   * class.
-   */
+  /// The entity is a getter or setter inside a class.  Note: this is used in
+  /// the case where a constant refers to a static const declared inside a
+  /// class.
   propertyAccessor,
 
-  /**
-   * The entity is a method.
-   */
+  /// The entity is a method.
   method,
 
-  /**
-   * The entity is a typedef.
-   */
+  /// The entity is a typedef.
   typedef,
 
-  /**
-   * The entity is a local function.
-   */
+  /// The entity is a local function.
   function,
 
-  /**
-   * The entity is a local variable.
-   */
+  /// The entity is a local variable.
   variable,
 
-  /**
-   * The entity is a top level function.
-   */
+  /// The entity is a top level function.
   topLevelFunction,
 
-  /**
-   * The entity is a top level getter or setter.
-   */
+  /// The entity is a top level getter or setter.
   topLevelPropertyAccessor,
 
-  /**
-   * The entity is a prefix.
-   */
+  /// The entity is a prefix.
   prefix,
 
-  /**
-   * The entity being referred to does not exist.
-   */
+  /// The entity being referred to does not exist.
   unresolved,
 
-  /**
-   * The entity is a typedef expressed using generic function type syntax.
-   */
+  /// The entity is a typedef expressed using generic function type syntax.
   genericFunctionTypedef
 }
 
-/**
- * Enum used to indicate the kind of the error during top-level inference.
- */
+/// Enum used to indicate the kind of the error during top-level inference.
 enum TopLevelInferenceErrorKind : byte {
   assignment,
 
@@ -252,2731 +168,1884 @@
   overrideConflictParameterType
 }
 
-/**
- * Enum used to indicate the style of a typedef.
- */
+/// Enum used to indicate the style of a typedef.
 enum TypedefStyle : byte {
-  /**
-   * A typedef that defines a non-generic function type. The syntax is
-   * ```
-   * 'typedef' returnType? identifier typeParameters? formalParameterList ';'
-   * ```
-   * The typedef can have type parameters associated with it, but the function
-   * type that results from applying type arguments does not.
-   */
+  /// A typedef that defines a non-generic function type. The syntax is
+  /// ```
+  /// 'typedef' returnType? identifier typeParameters? formalParameterList ';'
+  /// ```
+  /// The typedef can have type parameters associated with it, but the function
+  /// type that results from applying type arguments does not.
   functionType,
 
-  /**
-   * A typedef expressed using generic function type syntax. The syntax is
-   * ```
-   * typeAlias ::=
-   *     'typedef' identifier typeParameters? '=' genericFunctionType ';'
-   * genericFunctionType ::=
-   *     returnType? 'Function' typeParameters? parameterTypeList
-   * ```
-   * Both the typedef itself and the function type that results from applying
-   * type arguments can have type parameters.
-   */
+  /// A typedef expressed using generic function type syntax. The syntax is
+  /// ```
+  /// typeAlias ::=
+  ///     'typedef' identifier typeParameters? '=' genericFunctionType ';'
+  /// genericFunctionType ::=
+  ///     returnType? 'Function' typeParameters? parameterTypeList
+  /// ```
+  /// Both the typedef itself and the function type that results from applying
+  /// type arguments can have type parameters.
   genericFunctionType
 }
 
-/**
- * Enum used to indicate the kind of an constructor initializer.
- */
+/// Enum used to indicate the kind of an constructor initializer.
 enum UnlinkedConstructorInitializerKind : byte {
-  /**
-   * Initialization of a field.
-   */
+  /// Initialization of a field.
   field,
 
-  /**
-   * Invocation of a constructor in the same class.
-   */
+  /// Invocation of a constructor in the same class.
   thisInvocation,
 
-  /**
-   * Invocation of a superclass' constructor.
-   */
+  /// Invocation of a superclass' constructor.
   superInvocation,
 
-  /**
-   * Invocation of `assert`.
-   */
+  /// Invocation of `assert`.
   assertInvocation
 }
 
-/**
- * Enum used to indicate the kind of an executable.
- */
+/// Enum used to indicate the kind of an executable.
 enum UnlinkedExecutableKind : byte {
-  /**
-   * Executable is a function or method.
-   */
+  /// Executable is a function or method.
   functionOrMethod,
 
-  /**
-   * Executable is a getter.
-   */
+  /// Executable is a getter.
   getter,
 
-  /**
-   * Executable is a setter.
-   */
+  /// Executable is a setter.
   setter,
 
-  /**
-   * Executable is a constructor.
-   */
+  /// Executable is a constructor.
   constructor
 }
 
-/**
- * Enum representing the various kinds of assignment operations combined
- * with:
- *    [UnlinkedExprOperation.assignToRef],
- *    [UnlinkedExprOperation.assignToProperty],
- *    [UnlinkedExprOperation.assignToIndex].
- */
+/// Enum representing the various kinds of assignment operations combined
+/// with:
+///    [UnlinkedExprOperation.assignToRef],
+///    [UnlinkedExprOperation.assignToProperty],
+///    [UnlinkedExprOperation.assignToIndex].
 enum UnlinkedExprAssignOperator : byte {
-  /**
-   * Perform simple assignment `target = operand`.
-   */
+  /// Perform simple assignment `target = operand`.
   assign,
 
-  /**
-   * Perform `target ??= operand`.
-   */
+  /// Perform `target ??= operand`.
   ifNull,
 
-  /**
-   * Perform `target *= operand`.
-   */
+  /// Perform `target *= operand`.
   multiply,
 
-  /**
-   * Perform `target /= operand`.
-   */
+  /// Perform `target /= operand`.
   divide,
 
-  /**
-   * Perform `target ~/= operand`.
-   */
+  /// Perform `target ~/= operand`.
   floorDivide,
 
-  /**
-   * Perform `target %= operand`.
-   */
+  /// Perform `target %= operand`.
   modulo,
 
-  /**
-   * Perform `target += operand`.
-   */
+  /// Perform `target += operand`.
   plus,
 
-  /**
-   * Perform `target -= operand`.
-   */
+  /// Perform `target -= operand`.
   minus,
 
-  /**
-   * Perform `target <<= operand`.
-   */
+  /// Perform `target <<= operand`.
   shiftLeft,
 
-  /**
-   * Perform `target >>= operand`.
-   */
+  /// Perform `target >>= operand`.
   shiftRight,
 
-  /**
-   * Perform `target &= operand`.
-   */
+  /// Perform `target &= operand`.
   bitAnd,
 
-  /**
-   * Perform `target ^= operand`.
-   */
+  /// Perform `target ^= operand`.
   bitXor,
 
-  /**
-   * Perform `target |= operand`.
-   */
+  /// Perform `target |= operand`.
   bitOr,
 
-  /**
-   * Perform `++target`.
-   */
+  /// Perform `++target`.
   prefixIncrement,
 
-  /**
-   * Perform `--target`.
-   */
+  /// Perform `--target`.
   prefixDecrement,
 
-  /**
-   * Perform `target++`.
-   */
+  /// Perform `target++`.
   postfixIncrement,
 
-  /**
-   * Perform `target++`.
-   */
+  /// Perform `target++`.
   postfixDecrement
 }
 
-/**
- * Enum representing the various kinds of operations which may be performed to
- * in an expression.  These options are assumed to execute in the
- * context of a stack which is initially empty.
- */
+/// Enum representing the various kinds of operations which may be performed to
+/// in an expression.  These options are assumed to execute in the
+/// context of a stack which is initially empty.
 enum UnlinkedExprOperation : byte {
-  /**
-   * Push the next value from [UnlinkedExpr.ints] (a 32-bit unsigned integer)
-   * onto the stack.
-   *
-   * Note that Dart supports integers larger than 32 bits; these are
-   * represented by composing 32-bit values using the [pushLongInt] operation.
-   */
+  /// Push the next value from [UnlinkedExpr.ints] (a 32-bit unsigned integer)
+  /// onto the stack.
+  ///
+  /// Note that Dart supports integers larger than 32 bits; these are
+  /// represented by composing 32-bit values using the [pushLongInt] operation.
   pushInt,
 
-  /**
-   * Get the number of components from [UnlinkedExpr.ints], then do this number
-   * of times the following operations: multiple the current value by 2^32, "or"
-   * it with the next value in [UnlinkedExpr.ints]. The initial value is zero.
-   * Push the result into the stack.
-   */
+  /// Get the number of components from [UnlinkedExpr.ints], then do this number
+  /// of times the following operations: multiple the current value by 2^32,
+  /// "or" it with the next value in [UnlinkedExpr.ints]. The initial value is
+  /// zero. Push the result into the stack.
   pushLongInt,
 
-  /**
-   * Push the next value from [UnlinkedExpr.doubles] (a double precision
-   * floating point value) onto the stack.
-   */
+  /// Push the next value from [UnlinkedExpr.doubles] (a double precision
+  /// floating point value) onto the stack.
   pushDouble,
 
-  /**
-   * Push the constant `true` onto the stack.
-   */
+  /// Push the constant `true` onto the stack.
   pushTrue,
 
-  /**
-   * Push the constant `false` onto the stack.
-   */
+  /// Push the constant `false` onto the stack.
   pushFalse,
 
-  /**
-   * Push the next value from [UnlinkedExpr.strings] onto the stack.
-   */
+  /// Push the next value from [UnlinkedExpr.strings] onto the stack.
   pushString,
 
-  /**
-   * Pop the top n values from the stack (where n is obtained from
-   * [UnlinkedExpr.ints]), convert them to strings (if they aren't already),
-   * concatenate them into a single string, and push it back onto the stack.
-   *
-   * This operation is used to represent constants whose value is a literal
-   * string containing string interpolations.
-   */
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), convert them to strings (if they aren't already),
+  /// concatenate them into a single string, and push it back onto the stack.
+  ///
+  /// This operation is used to represent constants whose value is a literal
+  /// string containing string interpolations.
   concatenate,
 
-  /**
-   * Get the next value from [UnlinkedExpr.strings], convert it to a symbol,
-   * and push it onto the stack.
-   */
+  /// Get the next value from [UnlinkedExpr.strings], convert it to a symbol,
+  /// and push it onto the stack.
   makeSymbol,
 
-  /**
-   * Push the constant `null` onto the stack.
-   */
+  /// Push the constant `null` onto the stack.
   pushNull,
 
-  /**
-   * Push the value of the function parameter with the name obtained from
-   * [UnlinkedExpr.strings].
-   */
+  /// Push the value of the function parameter with the name obtained from
+  /// [UnlinkedExpr.strings].
   pushParameter,
 
-  /**
-   * Evaluate a (potentially qualified) identifier expression and push the
-   * resulting value onto the stack.  The identifier to be evaluated is
-   * obtained from [UnlinkedExpr.references].
-   *
-   * This operation is used to represent the following kinds of constants
-   * (which are indistinguishable from an unresolved AST alone):
-   *
-   * - A qualified reference to a static constant variable (e.g. `C.v`, where
-   *   C is a class and `v` is a constant static variable in `C`).
-   * - An identifier expression referring to a constant variable.
-   * - A simple or qualified identifier denoting a class or type alias.
-   * - A simple or qualified identifier denoting a top-level function or a
-   *   static method.
-   */
+  /// Evaluate a (potentially qualified) identifier expression and push the
+  /// resulting value onto the stack.  The identifier to be evaluated is
+  /// obtained from [UnlinkedExpr.references].
+  ///
+  /// This operation is used to represent the following kinds of constants
+  /// (which are indistinguishable from an unresolved AST alone):
+  ///
+  /// - A qualified reference to a static constant variable (e.g. `C.v`, where
+  ///   C is a class and `v` is a constant static variable in `C`).
+  /// - An identifier expression referring to a constant variable.
+  /// - A simple or qualified identifier denoting a class or type alias.
+  /// - A simple or qualified identifier denoting a top-level function or a
+  ///   static method.
   pushReference,
 
-  /**
-   * Pop the top value from the stack, extract the value of the property with
-   * the name obtained from [UnlinkedExpr.strings], and push the result back
-   * onto the stack.
-   */
+  /// Pop the top value from the stack, extract the value of the property with
+  /// the name obtained from [UnlinkedExpr.strings], and push the result back
+  /// onto the stack.
   extractProperty,
 
-  /**
-   * Pop the top `n` values from the stack (where `n` is obtained from
-   * [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
-   * `n` values from [UnlinkedExpr.strings] and use the lists of names and
-   * values to create named arguments.  Then pop the top `m` values from the
-   * stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
-   * from the end) and use them as positional arguments.  Use the lists of
-   * positional and names arguments to invoke a constant constructor obtained
-   * from [UnlinkedExpr.references], and push the resulting value back onto the
-   * stack.
-   *
-   * Arguments are skipped, and `0` are specified as the numbers of arguments
-   * on the stack, if the expression is not a constant. We store expression of
-   * variable initializers to perform top-level inference, and arguments are
-   * never used to infer types.
-   *
-   * Note that for an invocation of the form `const a.b(...)` (where no type
-   * arguments are specified), it is impossible to tell from the unresolved AST
-   * alone whether `a` is a class name and `b` is a constructor name, or `a` is
-   * a prefix name and `b` is a class name.  For consistency between AST based
-   * and elements based summaries, references to default constructors are always
-   * recorded as references to corresponding classes.
-   */
+  /// Pop the top `n` values from the stack (where `n` is obtained from
+  /// [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
+  /// `n` values from [UnlinkedExpr.strings] and use the lists of names and
+  /// values to create named arguments.  Then pop the top `m` values from the
+  /// stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
+  /// from the end) and use them as positional arguments.  Use the lists of
+  /// positional and names arguments to invoke a constant constructor obtained
+  /// from [UnlinkedExpr.references], and push the resulting value back onto the
+  /// stack.
+  ///
+  /// Arguments are skipped, and `0` are specified as the numbers of arguments
+  /// on the stack, if the expression is not a constant. We store expression of
+  /// variable initializers to perform top-level inference, and arguments are
+  /// never used to infer types.
+  ///
+  /// Note that for an invocation of the form `const a.b(...)` (where no type
+  /// arguments are specified), it is impossible to tell from the unresolved AST
+  /// alone whether `a` is a class name and `b` is a constructor name, or `a` is
+  /// a prefix name and `b` is a class name.  For consistency between AST based
+  /// and elements based summaries, references to default constructors are
+  /// always recorded as references to corresponding classes.
   invokeConstructor,
 
-  /**
-   * Pop the top n values from the stack (where n is obtained from
-   * [UnlinkedExpr.ints]), place them in a [List], and push the result back
-   * onto the stack.  The type parameter for the [List] is implicitly `dynamic`.
-   */
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), place them in a [List], and push the result back
+  /// onto the stack.  The type parameter for the [List] is implicitly
+  /// `dynamic`.
   makeUntypedList,
 
-  /**
-   * Pop the top 2*n values from the stack (where n is obtained from
-   * [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
-   * [Map], and push the result back onto the stack.  The two type parameters
-   * for the [Map] are implicitly `dynamic`.
-   */
+  /// Pop the top 2*n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
+  /// [Map], and push the result back onto the stack.  The two type parameters
+  /// for the [Map] are implicitly `dynamic`.
   makeUntypedMap,
 
-  /**
-   * Pop the top n values from the stack (where n is obtained from
-   * [UnlinkedExpr.ints]), place them in a [List], and push the result back
-   * onto the stack.  The type parameter for the [List] is obtained from
-   * [UnlinkedExpr.references].
-   */
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), place them in a [List], and push the result back
+  /// onto the stack.  The type parameter for the [List] is obtained from
+  /// [UnlinkedExpr.references].
   makeTypedList,
 
-  /**
-   * Pop the top 2*n values from the stack (where n is obtained from
-   * [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
-   * [Map], and push the result back onto the stack.  The two type parameters
-   * for the [Map] are obtained from [UnlinkedExpr.references].
-   */
+  /// Pop the top 2*n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
+  /// [Map], and push the result back onto the stack.  The two type parameters
+  /// for the [Map] are obtained from [UnlinkedExpr.references].
   makeTypedMap,
 
-  /**
-   * Pop the top 2 values from the stack, evaluate `v1 == v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, evaluate `v1 == v2`, and push the
+  /// result back onto the stack.
   equal,
 
-  /**
-   * Pop the top 2 values from the stack, evaluate `v1 != v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, evaluate `v1 != v2`, and push the
+  /// result back onto the stack.
   notEqual,
 
-  /**
-   * Pop the top value from the stack, compute its boolean negation, and push
-   * the result back onto the stack.
-   */
+  /// Pop the top value from the stack, compute its boolean negation, and push
+  /// the result back onto the stack.
   not,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 && v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 && v2`, and push the
+  /// result back onto the stack.
   and,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 || v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 || v2`, and push the
+  /// result back onto the stack.
   or,
 
-  /**
-   * Pop the top value from the stack, compute its integer complement, and push
-   * the result back onto the stack.
-   */
+  /// Pop the top value from the stack, compute its integer complement, and push
+  /// the result back onto the stack.
   complement,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 ^ v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 ^ v2`, and push the
+  /// result back onto the stack.
   bitXor,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 & v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 & v2`, and push the
+  /// result back onto the stack.
   bitAnd,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 | v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 | v2`, and push the
+  /// result back onto the stack.
   bitOr,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 >> v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 >> v2`, and push the
+  /// result back onto the stack.
   bitShiftRight,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 << v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 << v2`, and push the
+  /// result back onto the stack.
   bitShiftLeft,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 + v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 + v2`, and push the
+  /// result back onto the stack.
   add,
 
-  /**
-   * Pop the top value from the stack, compute its integer negation, and push
-   * the result back onto the stack.
-   */
+  /// Pop the top value from the stack, compute its integer negation, and push
+  /// the result back onto the stack.
   negate,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 - v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 - v2`, and push the
+  /// result back onto the stack.
   subtract,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 * v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 * v2`, and push the
+  /// result back onto the stack.
   multiply,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 / v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 / v2`, and push the
+  /// result back onto the stack.
   divide,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 ~/ v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 ~/ v2`, and push the
+  /// result back onto the stack.
   floorDivide,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 > v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 > v2`, and push the
+  /// result back onto the stack.
   greater,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 < v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 < v2`, and push the
+  /// result back onto the stack.
   less,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 >= v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 >= v2`, and push the
+  /// result back onto the stack.
   greaterEqual,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 <= v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 <= v2`, and push the
+  /// result back onto the stack.
   lessEqual,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 % v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 % v2`, and push the
+  /// result back onto the stack.
   modulo,
 
-  /**
-   * Pop the top 3 values from the stack, compute `v1 ? v2 : v3`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 3 values from the stack, compute `v1 ? v2 : v3`, and push the
+  /// result back onto the stack.
   conditional,
 
-  /**
-   * Pop from the stack `value` and get the next `target` reference from
-   * [UnlinkedExpr.references] - a top-level variable (prefixed or not), an
-   * assignable field of a class (prefixed or not), or a sequence of getters
-   * ending with an assignable property `a.b.b.c.d.e`.  In general `a.b` cannot
-   * not be distinguished between: `a` is a prefix and `b` is a top-level
-   * variable; or `a` is an object and `b` is the name of a property.  Perform
-   * `reference op= value` where `op` is the next assignment operator from
-   * [UnlinkedExpr.assignmentOperators].  Push `value` back into the stack.
-   *
-   * If the assignment operator is a prefix/postfix increment/decrement, then
-   * `value` is not present in the stack, so it should not be popped and the
-   * corresponding value of the `target` after/before update is pushed into the
-   * stack instead.
-   */
+  /// Pop from the stack `value` and get the next `target` reference from
+  /// [UnlinkedExpr.references] - a top-level variable (prefixed or not), an
+  /// assignable field of a class (prefixed or not), or a sequence of getters
+  /// ending with an assignable property `a.b.b.c.d.e`.  In general `a.b` cannot
+  /// not be distinguished between: `a` is a prefix and `b` is a top-level
+  /// variable; or `a` is an object and `b` is the name of a property.  Perform
+  /// `reference op= value` where `op` is the next assignment operator from
+  /// [UnlinkedExpr.assignmentOperators].  Push `value` back into the stack.
+  ///
+  /// If the assignment operator is a prefix/postfix increment/decrement, then
+  /// `value` is not present in the stack, so it should not be popped and the
+  /// corresponding value of the `target` after/before update is pushed into the
+  /// stack instead.
   assignToRef,
 
-  /**
-   * Pop from the stack `target` and `value`.  Get the name of the property from
-   * `UnlinkedConst.strings` and assign the `value` to the named property of the
-   * `target`.  This operation is used when we know that the `target` is an
-   * object reference expression, e.g. `new Foo().a.b.c` or `a.b[0].c.d`.
-   * Perform `target.property op= value` where `op` is the next assignment
-   * operator from [UnlinkedExpr.assignmentOperators].  Push `value` back into
-   * the stack.
-   *
-   * If the assignment operator is a prefix/postfix increment/decrement, then
-   * `value` is not present in the stack, so it should not be popped and the
-   * corresponding value of the `target` after/before update is pushed into the
-   * stack instead.
-   */
+  /// Pop from the stack `target` and `value`.  Get the name of the property
+  /// from `UnlinkedConst.strings` and assign the `value` to the named property
+  /// of the `target`.  This operation is used when we know that the `target`
+  /// is an object reference expression, e.g. `new Foo().a.b.c` or `a.b[0].c.d`.
+  /// Perform `target.property op= value` where `op` is the next assignment
+  /// operator from [UnlinkedExpr.assignmentOperators].  Push `value` back into
+  /// the stack.
+  ///
+  /// If the assignment operator is a prefix/postfix increment/decrement, then
+  /// `value` is not present in the stack, so it should not be popped and the
+  /// corresponding value of the `target` after/before update is pushed into the
+  /// stack instead.
   assignToProperty,
 
-  /**
-   * Pop from the stack `index`, `target` and `value`.  Perform
-   * `target[index] op= value`  where `op` is the next assignment operator from
-   * [UnlinkedExpr.assignmentOperators].  Push `value` back into the stack.
-   *
-   * If the assignment operator is a prefix/postfix increment/decrement, then
-   * `value` is not present in the stack, so it should not be popped and the
-   * corresponding value of the `target` after/before update is pushed into the
-   * stack instead.
-   */
+  /// Pop from the stack `index`, `target` and `value`.  Perform
+  /// `target[index] op= value`  where `op` is the next assignment operator from
+  /// [UnlinkedExpr.assignmentOperators].  Push `value` back into the stack.
+  ///
+  /// If the assignment operator is a prefix/postfix increment/decrement, then
+  /// `value` is not present in the stack, so it should not be popped and the
+  /// corresponding value of the `target` after/before update is pushed into the
+  /// stack instead.
   assignToIndex,
 
-  /**
-   * Pop from the stack `index` and `target`.  Push into the stack the result
-   * of evaluation of `target[index]`.
-   */
+  /// Pop from the stack `index` and `target`.  Push into the stack the result
+  /// of evaluation of `target[index]`.
   extractIndex,
 
-  /**
-   * Pop the top `n` values from the stack (where `n` is obtained from
-   * [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
-   * `n` values from [UnlinkedExpr.strings] and use the lists of names and
-   * values to create named arguments.  Then pop the top `m` values from the
-   * stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
-   * from the end) and use them as positional arguments.  Use the lists of
-   * positional and names arguments to invoke a method (or a function) with
-   * the reference from [UnlinkedExpr.references].  If `k` is nonzero (where
-   * `k` is obtained from [UnlinkedExpr.ints]), obtain `k` type arguments from
-   * [UnlinkedExpr.references] and use them as generic type arguments for the
-   * aforementioned method or function.  Push the result of the invocation onto
-   * the stack.
-   *
-   * Arguments are skipped, and `0` are specified as the numbers of arguments
-   * on the stack, if the expression is not a constant. We store expression of
-   * variable initializers to perform top-level inference, and arguments are
-   * never used to infer types.
-   *
-   * In general `a.b` cannot not be distinguished between: `a` is a prefix and
-   * `b` is a top-level function; or `a` is an object and `b` is the name of a
-   * method.  This operation should be used for a sequence of identifiers
-   * `a.b.b.c.d.e` ending with an invokable result.
-   */
+  /// Pop the top `n` values from the stack (where `n` is obtained from
+  /// [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
+  /// `n` values from [UnlinkedExpr.strings] and use the lists of names and
+  /// values to create named arguments.  Then pop the top `m` values from the
+  /// stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
+  /// from the end) and use them as positional arguments.  Use the lists of
+  /// positional and names arguments to invoke a method (or a function) with
+  /// the reference from [UnlinkedExpr.references].  If `k` is nonzero (where
+  /// `k` is obtained from [UnlinkedExpr.ints]), obtain `k` type arguments from
+  /// [UnlinkedExpr.references] and use them as generic type arguments for the
+  /// aforementioned method or function.  Push the result of the invocation onto
+  /// the stack.
+  ///
+  /// Arguments are skipped, and `0` are specified as the numbers of arguments
+  /// on the stack, if the expression is not a constant. We store expression of
+  /// variable initializers to perform top-level inference, and arguments are
+  /// never used to infer types.
+  ///
+  /// In general `a.b` cannot not be distinguished between: `a` is a prefix and
+  /// `b` is a top-level function; or `a` is an object and `b` is the name of a
+  /// method.  This operation should be used for a sequence of identifiers
+  /// `a.b.b.c.d.e` ending with an invokable result.
   invokeMethodRef,
 
-  /**
-   * Pop the top `n` values from the stack (where `n` is obtained from
-   * [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
-   * `n` values from [UnlinkedExpr.strings] and use the lists of names and
-   * values to create named arguments.  Then pop the top `m` values from the
-   * stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
-   * from the end) and use them as positional arguments.  Use the lists of
-   * positional and names arguments to invoke the method with the name from
-   * [UnlinkedExpr.strings] of the target popped from the stack.  If `k` is
-   * nonzero (where `k` is obtained from [UnlinkedExpr.ints]), obtain `k` type
-   * arguments from [UnlinkedExpr.references] and use them as generic type
-   * arguments for the aforementioned method.  Push the result of the
-   * invocation onto the stack.
-   *
-   * Arguments are skipped, and `0` are specified as the numbers of arguments
-   * on the stack, if the expression is not a constant. We store expression of
-   * variable initializers to perform top-level inference, and arguments are
-   * never used to infer types.
-   *
-   * This operation should be used for invocation of a method invocation
-   * where `target` is known to be an object instance.
-   */
+  /// Pop the top `n` values from the stack (where `n` is obtained from
+  /// [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
+  /// `n` values from [UnlinkedExpr.strings] and use the lists of names and
+  /// values to create named arguments.  Then pop the top `m` values from the
+  /// stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
+  /// from the end) and use them as positional arguments.  Use the lists of
+  /// positional and names arguments to invoke the method with the name from
+  /// [UnlinkedExpr.strings] of the target popped from the stack.  If `k` is
+  /// nonzero (where `k` is obtained from [UnlinkedExpr.ints]), obtain `k` type
+  /// arguments from [UnlinkedExpr.references] and use them as generic type
+  /// arguments for the aforementioned method.  Push the result of the
+  /// invocation onto the stack.
+  ///
+  /// Arguments are skipped, and `0` are specified as the numbers of arguments
+  /// on the stack, if the expression is not a constant. We store expression of
+  /// variable initializers to perform top-level inference, and arguments are
+  /// never used to infer types.
+  ///
+  /// This operation should be used for invocation of a method invocation
+  /// where `target` is known to be an object instance.
   invokeMethod,
 
-  /**
-   * Begin a new cascade section.  Duplicate the top value of the stack.
-   */
+  /// Begin a new cascade section.  Duplicate the top value of the stack.
   cascadeSectionBegin,
 
-  /**
-   * End a new cascade section.  Pop the top value from the stack and throw it
-   * away.
-   */
+  /// End a new cascade section.  Pop the top value from the stack and throw it
+  /// away.
   cascadeSectionEnd,
 
-  /**
-   * Pop the top value from the stack and cast it to the type with reference
-   * from [UnlinkedExpr.references], push the result into the stack.
-   */
+  /// Pop the top value from the stack and cast it to the type with reference
+  /// from [UnlinkedExpr.references], push the result into the stack.
   typeCast,
 
-  /**
-   * Pop the top value from the stack and check whether it is a subclass of the
-   * type with reference from [UnlinkedExpr.references], push the result into
-   * the stack.
-   */
+  /// Pop the top value from the stack and check whether it is a subclass of the
+  /// type with reference from [UnlinkedExpr.references], push the result into
+  /// the stack.
   typeCheck,
 
-  /**
-   * Pop the top value from the stack and raise an exception with this value.
-   */
+  /// Pop the top value from the stack and raise an exception with this value.
   throwException,
 
-  /**
-   * Obtain two values `n` and `m` from [UnlinkedExpr.ints].  Then, starting at
-   * the executable element for the expression being evaluated, if n > 0, pop to
-   * the nth enclosing function element.  Then, push the mth local function of
-   * that element onto the stack.
-   */
+  /// Obtain two values `n` and `m` from [UnlinkedExpr.ints].  Then, starting at
+  /// the executable element for the expression being evaluated, if n > 0, pop
+  /// to the nth enclosing function element.  Then, push the mth local function
+  /// of that element onto the stack.
   pushLocalFunctionReference,
 
-  /**
-   * Pop the top two values from the stack.  If the first value is non-null,
-   * keep it and discard the second.  Otherwise, keep the second and discard the
-   * first.
-   */
+  /// Pop the top two values from the stack.  If the first value is non-null,
+  /// keep it and discard the second.  Otherwise, keep the second and discard
+  /// the first.
   ifNull,
 
-  /**
-   * Pop the top value from the stack.  Treat it as a Future and await its
-   * completion.  Then push the awaited value onto the stack.
-   */
+  /// Pop the top value from the stack.  Treat it as a Future and await its
+  /// completion.  Then push the awaited value onto the stack.
   await,
 
-  /**
-   * Push an abstract value onto the stack. Abstract values mark the presence of
-   * a value, but whose details are not included.
-   *
-   * This is not used by the summary generators today, but it will be used to
-   * experiment with prunning the initializer expression tree, so only
-   * information that is necessary gets included in the output summary file.
-   */
+  /// Push an abstract value onto the stack. Abstract values mark the presence
+  /// of a value, but whose details are not included.
+  ///
+  /// This is not used by the summary generators today, but it will be used to
+  /// experiment with prunning the initializer expression tree, so only
+  /// information that is necessary gets included in the output summary file.
   pushUntypedAbstract,
 
-  /**
-   * Get the next type reference from [UnlinkedExpr.references] and push an
-   * abstract value onto the stack that has that type.
-   *
-   * Like [pushUntypedAbstract], this is also not used by the summary generators
-   * today. The plan is to experiment with prunning the initializer expression
-   * tree, and include just enough type information to perform strong-mode type
-   * inference, but not all the details of how this type was obtained.
-   */
+  /// Get the next type reference from [UnlinkedExpr.references] and push an
+  /// abstract value onto the stack that has that type.
+  ///
+  /// Like [pushUntypedAbstract], this is also not used by the summary
+  /// generators today. The plan is to experiment with prunning the initializer
+  /// expression tree, and include just enough type information to perform
+  /// strong-mode type inference, but not all the details of how this type was
+  /// obtained.
   pushTypedAbstract,
 
-  /**
-   * Push an error onto the stack.
-   *
-   * Like [pushUntypedAbstract], this is not used by summary generators today.
-   * This will be used to experiment with prunning the const expression tree. If
-   * a constant has an error, we can omit the subexpression containing the error
-   * and only include a marker that an error was detected.
-   */
+  /// Push an error onto the stack.
+  ///
+  /// Like [pushUntypedAbstract], this is not used by summary generators today.
+  /// This will be used to experiment with prunning the const expression tree.
+  /// If a constant has an error, we can omit the subexpression containing the
+  /// error and only include a marker that an error was detected.
   pushError,
 
-  /**
-   * Push `this` expression onto the stack.
-   */
+  /// Push `this` expression onto the stack.
   pushThis,
 
-  /**
-   * Push `super` expression onto the stack.
-   */
+  /// Push `super` expression onto the stack.
   pushSuper
 }
 
-/**
- * Enum used to indicate the kind of a parameter.
- */
+/// Enum used to indicate the kind of a parameter.
 enum UnlinkedParamKind : byte {
-  /**
-   * Parameter is required.
-   */
+  /// Parameter is required.
   required,
 
-  /**
-   * Parameter is positional optional (enclosed in `[]`)
-   */
+  /// Parameter is positional optional (enclosed in `[]`)
   positional,
 
-  /**
-   * Parameter is named optional (enclosed in `{}`)
-   */
+  /// Parameter is named optional (enclosed in `{}`)
   named
 }
 
-/**
- * Information about the context of an exception in analysis driver.
- */
+/// Information about the context of an exception in analysis driver.
 table AnalysisDriverExceptionContext {
-  /**
-   * The exception string.
-   */
+  /// The exception string.
   exception:string (id: 1);
 
-  /**
-   * The state of files when the exception happened.
-   */
+  /// The state of files when the exception happened.
   files:[AnalysisDriverExceptionFile] (id: 3);
 
-  /**
-   * The path of the file being analyzed when the exception happened.
-   */
+  /// The path of the file being analyzed when the exception happened.
   path:string (id: 0);
 
-  /**
-   * The exception stack trace string.
-   */
+  /// The exception stack trace string.
   stackTrace:string (id: 2);
 }
 
-/**
- * Information about a single file in [AnalysisDriverExceptionContext].
- */
+/// Information about a single file in [AnalysisDriverExceptionContext].
 table AnalysisDriverExceptionFile {
-  /**
-   * The content of the file.
-   */
+  /// The content of the file.
   content:string (id: 1);
 
-  /**
-   * The path of the file.
-   */
+  /// The path of the file.
   path:string (id: 0);
 }
 
-/**
- * Information about a resolved unit.
- */
+/// Information about a resolved unit.
 table AnalysisDriverResolvedUnit {
-  /**
-   * The full list of analysis errors, both syntactic and semantic.
-   */
+  /// The full list of analysis errors, both syntactic and semantic.
   errors:[AnalysisDriverUnitError] (id: 0);
 
-  /**
-   * The index of the unit.
-   */
+  /// The index of the unit.
   index:AnalysisDriverUnitIndex (id: 1);
 }
 
-/**
- * Information about a subtype of one or more classes.
- */
+/// Information about a subtype of one or more classes.
 table AnalysisDriverSubtype {
-  /**
-   * The names of defined instance members.
-   * They are indexes into [AnalysisDriverUnitError.strings] list.
-   * The list is sorted in ascending order.
-   */
+  /// The names of defined instance members.
+  /// They are indexes into [AnalysisDriverUnitError.strings] list.
+  /// The list is sorted in ascending order.
   members:[uint] (id: 1);
 
-  /**
-   * The name of the class.
-   * It is an index into [AnalysisDriverUnitError.strings] list.
-   */
+  /// The name of the class.
+  /// It is an index into [AnalysisDriverUnitError.strings] list.
   name:uint (id: 0);
 }
 
-/**
- * Information about an error in a resolved unit.
- */
+/// Information about an error in a resolved unit.
 table AnalysisDriverUnitError {
-  /**
-   * The optional correction hint for the error.
-   */
+  /// The optional correction hint for the error.
   correction:string (id: 4);
 
-  /**
-   * The length of the error in the file.
-   */
+  /// The length of the error in the file.
   length:uint (id: 1);
 
-  /**
-   * The message of the error.
-   */
+  /// The message of the error.
   message:string (id: 3);
 
-  /**
-   * The offset from the beginning of the file.
-   */
+  /// The offset from the beginning of the file.
   offset:uint (id: 0);
 
-  /**
-   * The unique name of the error code.
-   */
+  /// The unique name of the error code.
   uniqueName:string (id: 2);
 }
 
-/**
- * Information about a resolved unit.
- */
+/// Information about a resolved unit.
 table AnalysisDriverUnitIndex {
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the kind of the synthetic element.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the kind of the synthetic element.
   elementKinds:[IndexSyntheticElementKind] (id: 4);
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the class member element name, or `null` if the element
-   * is a top-level element.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this index.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the class member element name, or `null` if the element
+  /// is a top-level element.  The list is sorted in ascending order, so that
+  /// the client can quickly check whether an element is referenced in this
+  /// index.
   elementNameClassMemberIds:[uint] (id: 7);
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the named parameter name, or `null` if the element is not
-   * a named parameter.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this index.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the named parameter name, or `null` if the element is
+  /// not a named parameter.  The list is sorted in ascending order, so that the
+  /// client can quickly check whether an element is referenced in this index.
   elementNameParameterIds:[uint] (id: 8);
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the top-level element name, or `null` if the element is
-   * the unit.  The list is sorted in ascending order, so that the client can
-   * quickly check whether an element is referenced in this index.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the top-level element name, or `null` if the element is
+  /// the unit.  The list is sorted in ascending order, so that the client can
+  /// quickly check whether an element is referenced in this index.
   elementNameUnitMemberIds:[uint] (id: 6);
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the index into [unitLibraryUris] and [unitUnitUris] for the library
-   * specific unit where the element is declared.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the index into [unitLibraryUris] and [unitUnitUris] for the library
+  /// specific unit where the element is declared.
   elementUnits:[uint] (id: 5);
 
-  /**
-   * Identifier of the null string in [strings].
-   */
+  /// Identifier of the null string in [strings].
   nullStringId:uint (id: 1);
 
-  /**
-   * List of unique element strings used in this index.  The list is sorted in
-   * ascending order, so that the client can quickly check the presence of a
-   * string in this index.
-   */
+  /// List of unique element strings used in this index.  The list is sorted in
+  /// ascending order, so that the client can quickly check the presence of a
+  /// string in this index.
   strings:[string] (id: 0);
 
-  /**
-   * The list of classes declared in the unit.
-   */
+  /// The list of classes declared in the unit.
   subtypes:[AnalysisDriverSubtype] (id: 19);
 
-  /**
-   * The identifiers of supertypes of elements at corresponding indexes
-   * in [subtypes].  They are indexes into [strings] list. The list is sorted
-   * in ascending order.  There might be more than one element with the same
-   * value if there is more than one subtype of this supertype.
-   */
+  /// The identifiers of supertypes of elements at corresponding indexes
+  /// in [subtypes].  They are indexes into [strings] list. The list is sorted
+  /// in ascending order.  There might be more than one element with the same
+  /// value if there is more than one subtype of this supertype.
   supertypes:[uint] (id: 18);
 
-  /**
-   * Each item of this list corresponds to the library URI of a unique library
-   * specific unit referenced in the index.  It is an index into [strings] list.
-   */
+  /// Each item of this list corresponds to the library URI of a unique library
+  /// specific unit referenced in the index.  It is an index into [strings]
+  /// list.
   unitLibraryUris:[uint] (id: 2);
 
-  /**
-   * Each item of this list corresponds to the unit URI of a unique library
-   * specific unit referenced in the index.  It is an index into [strings] list.
-   */
+  /// Each item of this list corresponds to the unit URI of a unique library
+  /// specific unit referenced in the index.  It is an index into [strings]
+  /// list.
   unitUnitUris:[uint] (id: 3);
 
-  /**
-   * Each item of this list is the `true` if the corresponding element usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding element usage
+  /// is qualified with some prefix.
   usedElementIsQualifiedFlags:[ubyte] (id: 13);
 
-  /**
-   * Each item of this list is the kind of the element usage.
-   */
+  /// Each item of this list is the kind of the element usage.
   usedElementKinds:[IndexRelationKind] (id: 10);
 
-  /**
-   * Each item of this list is the length of the element usage.
-   */
+  /// Each item of this list is the length of the element usage.
   usedElementLengths:[uint] (id: 12);
 
-  /**
-   * Each item of this list is the offset of the element usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the element usage relative to the
+  /// beginning of the file.
   usedElementOffsets:[uint] (id: 11);
 
-  /**
-   * Each item of this list is the index into [elementUnits],
-   * [elementNameUnitMemberIds], [elementNameClassMemberIds] and
-   * [elementNameParameterIds].  The list is sorted in ascending order, so
-   * that the client can quickly find element references in this index.
-   */
+  /// Each item of this list is the index into [elementUnits],
+  /// [elementNameUnitMemberIds], [elementNameClassMemberIds] and
+  /// [elementNameParameterIds].  The list is sorted in ascending order, so
+  /// that the client can quickly find element references in this index.
   usedElements:[uint] (id: 9);
 
-  /**
-   * Each item of this list is the `true` if the corresponding name usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding name usage
+  /// is qualified with some prefix.
   usedNameIsQualifiedFlags:[ubyte] (id: 17);
 
-  /**
-   * Each item of this list is the kind of the name usage.
-   */
+  /// Each item of this list is the kind of the name usage.
   usedNameKinds:[IndexRelationKind] (id: 15);
 
-  /**
-   * Each item of this list is the offset of the name usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the name usage relative to the
+  /// beginning of the file.
   usedNameOffsets:[uint] (id: 16);
 
-  /**
-   * Each item of this list is the index into [strings] for a used name.  The
-   * list is sorted in ascending order, so that the client can quickly find
-   * whether a name is used in this index.
-   */
+  /// Each item of this list is the index into [strings] for a used name.  The
+  /// list is sorted in ascending order, so that the client can quickly find
+  /// whether a name is used in this index.
   usedNames:[uint] (id: 14);
 }
 
-/**
- * Information about an unlinked unit.
- */
+/// Information about an unlinked unit.
 table AnalysisDriverUnlinkedUnit {
-  /**
-   * List of class member names defined by the unit.
-   */
+  /// List of class member names defined by the unit.
   definedClassMemberNames:[string] (id: 3);
 
-  /**
-   * List of top-level names defined by the unit.
-   */
+  /// List of top-level names defined by the unit.
   definedTopLevelNames:[string] (id: 2);
 
-  /**
-   * List of external names referenced by the unit.
-   */
+  /// List of external names referenced by the unit.
   referencedNames:[string] (id: 0);
 
-  /**
-   * List of names which are used in `extends`, `with` or `implements` clauses
-   * in the file. Import prefixes and type arguments are not included.
-   */
+  /// List of names which are used in `extends`, `with` or `implements` clauses
+  /// in the file. Import prefixes and type arguments are not included.
   subtypedNames:[string] (id: 4);
 
-  /**
-   * Unlinked information for the unit.
-   */
+  /// Unlinked information for the unit.
   unit:UnlinkedUnit (id: 1);
 }
 
-/**
- * Information about an element code range.
- */
+/// Information about an element code range.
 table CodeRange {
-  /**
-   * Length of the element code.
-   */
+  /// Length of the element code.
   length:uint (id: 1);
 
-  /**
-   * Offset of the element code relative to the beginning of the file.
-   */
+  /// Offset of the element code relative to the beginning of the file.
   offset:uint (id: 0);
 }
 
-/**
- * Summary information about a reference to an entity such as a type, top level
- * executable, or executable within a class.
- */
+/// Summary information about a reference to an entity such as a type, top level
+/// executable, or executable within a class.
 table EntityRef {
-  /**
-   * The kind of entity being represented.
-   */
+  /// The kind of entity being represented.
   entityKind:EntityRefKind (id: 8);
 
-  /**
-   * Notice: This will be deprecated. However, its not deprecated yet, as we're
-   * keeping it for backwards compatibilty, and marking it deprecated makes it
-   * unreadable.
-   *
-   * TODO(mfairhurst) mark this deprecated, and remove its logic.
-   *
-   * If this is a reference to a function type implicitly defined by a
-   * function-typed parameter, a list of zero-based indices indicating the path
-   * from the entity referred to by [reference] to the appropriate type
-   * parameter.  Otherwise the empty list.
-   *
-   * If there are N indices in this list, then the entity being referred to is
-   * the function type implicitly defined by a function-typed parameter of a
-   * function-typed parameter, to N levels of nesting.  The first index in the
-   * list refers to the outermost level of nesting; for example if [reference]
-   * refers to the entity defined by:
-   *
-   *     void f(x, void g(y, z, int h(String w))) { ... }
-   *
-   * Then to refer to the function type implicitly defined by parameter `h`
-   * (which is parameter 2 of parameter 1 of `f`), then
-   * [implicitFunctionTypeIndices] should be [1, 2].
-   *
-   * Note that if the entity being referred to is a generic method inside a
-   * generic class, then the type arguments in [typeArguments] are applied
-   * first to the class and then to the method.
-   */
+  /// Notice: This will be deprecated. However, its not deprecated yet, as we're
+  /// keeping it for backwards compatibilty, and marking it deprecated makes it
+  /// unreadable.
+  ///
+  /// TODO(mfairhurst) mark this deprecated, and remove its logic.
+  ///
+  /// If this is a reference to a function type implicitly defined by a
+  /// function-typed parameter, a list of zero-based indices indicating the path
+  /// from the entity referred to by [reference] to the appropriate type
+  /// parameter.  Otherwise the empty list.
+  ///
+  /// If there are N indices in this list, then the entity being referred to is
+  /// the function type implicitly defined by a function-typed parameter of a
+  /// function-typed parameter, to N levels of nesting.  The first index in the
+  /// list refers to the outermost level of nesting; for example if [reference]
+  /// refers to the entity defined by:
+  ///
+  ///     void f(x, void g(y, z, int h(String w))) { ... }
+  ///
+  /// Then to refer to the function type implicitly defined by parameter `h`
+  /// (which is parameter 2 of parameter 1 of `f`), then
+  /// [implicitFunctionTypeIndices] should be [1, 2].
+  ///
+  /// Note that if the entity being referred to is a generic method inside a
+  /// generic class, then the type arguments in [typeArguments] are applied
+  /// first to the class and then to the method.
   implicitFunctionTypeIndices:[uint] (id: 4);
 
-  /**
-   * If this is a reference to a type parameter, one-based index into the list
-   * of [UnlinkedTypeParam]s currently in effect.  Indexing is done using De
-   * Bruijn index conventions; that is, innermost parameters come first, and
-   * if a class or method has multiple parameters, they are indexed from right
-   * to left.  So for instance, if the enclosing declaration is
-   *
-   *     class C<T,U> {
-   *       m<V,W> {
-   *         ...
-   *       }
-   *     }
-   *
-   * Then [paramReference] values of 1, 2, 3, and 4 represent W, V, U, and T,
-   * respectively.
-   *
-   * If the type being referred to is not a type parameter, [paramReference] is
-   * zero.
-   */
+  /// If this is a reference to a type parameter, one-based index into the list
+  /// of [UnlinkedTypeParam]s currently in effect.  Indexing is done using De
+  /// Bruijn index conventions; that is, innermost parameters come first, and
+  /// if a class or method has multiple parameters, they are indexed from right
+  /// to left.  So for instance, if the enclosing declaration is
+  ///
+  ///     class C<T,U> {
+  ///       m<V,W> {
+  ///         ...
+  ///       }
+  ///     }
+  ///
+  /// Then [paramReference] values of 1, 2, 3, and 4 represent W, V, U, and T,
+  /// respectively.
+  ///
+  /// If the type being referred to is not a type parameter, [paramReference] is
+  /// zero.
   paramReference:uint (id: 3);
 
-  /**
-   * Index into [UnlinkedUnit.references] for the entity being referred to, or
-   * zero if this is a reference to a type parameter.
-   */
+  /// Index into [UnlinkedUnit.references] for the entity being referred to, or
+  /// zero if this is a reference to a type parameter.
   reference:uint (id: 0);
 
-  /**
-   * If this [EntityRef] appears in a syntactic context where its type arguments
-   * might need to be inferred by a method other than instantiate-to-bounds,
-   * and [typeArguments] is empty, a slot id (which is unique within the
-   * compilation unit).  If an entry appears in [LinkedUnit.types] whose [slot]
-   * matches this value, that entry will contain the complete inferred type.
-   *
-   * This is called `refinedSlot` to clarify that if it points to an inferred
-   * type, it points to a type that is a "refinement" of this one (one in which
-   * some type arguments have been inferred).
-   */
+  /// If this [EntityRef] appears in a syntactic context where its type
+  /// arguments might need to be inferred by a method other than
+  /// instantiate-to-bounds, and [typeArguments] is empty, a slot id (which is
+  /// unique within the compilation unit).  If an entry appears in
+  /// [LinkedUnit.types] whose [slot] matches this value, that entry will
+  /// contain the complete inferred type.
+  ///
+  /// This is called `refinedSlot` to clarify that if it points to an inferred
+  /// type, it points to a type that is a "refinement" of this one (one in which
+  /// some type arguments have been inferred).
   refinedSlot:uint (id: 9);
 
-  /**
-   * If this [EntityRef] is contained within [LinkedUnit.types], slot id (which
-   * is unique within the compilation unit) identifying the target of type
-   * propagation or type inference with which this [EntityRef] is associated.
-   *
-   * Otherwise zero.
-   */
+  /// If this [EntityRef] is contained within [LinkedUnit.types], slot id (which
+  /// is unique within the compilation unit) identifying the target of type
+  /// propagation or type inference with which this [EntityRef] is associated.
+  ///
+  /// Otherwise zero.
   slot:uint (id: 2);
 
-  /**
-   * If this [EntityRef] is a reference to a function type whose
-   * [FunctionElement] is not in any library (e.g. a function type that was
-   * synthesized by a LUB computation), the function parameters.  Otherwise
-   * empty.
-   */
+  /// If this [EntityRef] is a reference to a function type whose
+  /// [FunctionElement] is not in any library (e.g. a function type that was
+  /// synthesized by a LUB computation), the function parameters.  Otherwise
+  /// empty.
   syntheticParams:[UnlinkedParam] (id: 6);
 
-  /**
-   * If this [EntityRef] is a reference to a function type whose
-   * [FunctionElement] is not in any library (e.g. a function type that was
-   * synthesized by a LUB computation), the return type of the function.
-   * Otherwise `null`.
-   */
+  /// If this [EntityRef] is a reference to a function type whose
+  /// [FunctionElement] is not in any library (e.g. a function type that was
+  /// synthesized by a LUB computation), the return type of the function.
+  /// Otherwise `null`.
   syntheticReturnType:EntityRef (id: 5);
 
-  /**
-   * If this is an instantiation of a generic type or generic executable, the
-   * type arguments used to instantiate it (if any).
-   */
+  /// If this is an instantiation of a generic type or generic executable, the
+  /// type arguments used to instantiate it (if any).
   typeArguments:[EntityRef] (id: 1);
 
-  /**
-   * If this is a function type, the type parameters defined for the function
-   * type (if any).
-   */
+  /// If this is a function type, the type parameters defined for the function
+  /// type (if any).
   typeParameters:[UnlinkedTypeParam] (id: 7);
 }
 
-/**
- * Information about a dependency that exists between one library and another
- * due to an "import" declaration.
- */
+/// Information about a dependency that exists between one library and another
+/// due to an "import" declaration.
 table LinkedDependency {
-  /**
-   * Absolute URI for the compilation units listed in the library's `part`
-   * declarations, empty string for invalid URI.
-   */
+  /// Absolute URI for the compilation units listed in the library's `part`
+  /// declarations, empty string for invalid URI.
   parts:[string] (id: 1);
 
-  /**
-   * The absolute URI of the dependent library, e.g. `package:foo/bar.dart`.
-   */
+  /// The absolute URI of the dependent library, e.g. `package:foo/bar.dart`.
   uri:string (id: 0);
 }
 
-/**
- * Information about a single name in the export namespace of the library that
- * is not in the public namespace.
- */
+/// Information about a single name in the export namespace of the library that
+/// is not in the public namespace.
 table LinkedExportName {
-  /**
-   * Index into [LinkedLibrary.dependencies] for the library in which the
-   * entity is defined.
-   */
+  /// Index into [LinkedLibrary.dependencies] for the library in which the
+  /// entity is defined.
   dependency:uint (id: 0);
 
-  /**
-   * The kind of the entity being referred to.
-   */
+  /// The kind of the entity being referred to.
   kind:ReferenceKind (id: 3);
 
-  /**
-   * Name of the exported entity.  For an exported setter, this name includes
-   * the trailing '='.
-   */
+  /// Name of the exported entity.  For an exported setter, this name includes
+  /// the trailing '='.
   name:string (id: 1);
 
-  /**
-   * Integer index indicating which unit in the exported library contains the
-   * definition of the entity.  As with indices into [LinkedLibrary.units],
-   * zero represents the defining compilation unit, and nonzero values
-   * represent parts in the order of the corresponding `part` declarations.
-   */
+  /// Integer index indicating which unit in the exported library contains the
+  /// definition of the entity.  As with indices into [LinkedLibrary.units],
+  /// zero represents the defining compilation unit, and nonzero values
+  /// represent parts in the order of the corresponding `part` declarations.
   unit:uint (id: 2);
 }
 
-/**
- * Linked summary of a library.
- */
+/// Linked summary of a library.
 table LinkedLibrary {
-  /**
-   * The libraries that this library depends on (either via an explicit import
-   * statement or via the implicit dependencies on `dart:core` and
-   * `dart:async`).  The first element of this array is a pseudo-dependency
-   * representing the library itself (it is also used for `dynamic` and
-   * `void`).  This is followed by elements representing "prelinked"
-   * dependencies (direct imports and the transitive closure of exports).
-   * After the prelinked dependencies are elements representing "linked"
-   * dependencies.
-   *
-   * A library is only included as a "linked" dependency if it is a true
-   * dependency (e.g. a propagated or inferred type or constant value
-   * implicitly refers to an element declared in the library) or
-   * anti-dependency (e.g. the result of type propagation or type inference
-   * depends on the lack of a certain declaration in the library).
-   */
+  /// The libraries that this library depends on (either via an explicit import
+  /// statement or via the implicit dependencies on `dart:core` and
+  /// `dart:async`).  The first element of this array is a pseudo-dependency
+  /// representing the library itself (it is also used for `dynamic` and
+  /// `void`).  This is followed by elements representing "prelinked"
+  /// dependencies (direct imports and the transitive closure of exports).
+  /// After the prelinked dependencies are elements representing "linked"
+  /// dependencies.
+  ///
+  /// A library is only included as a "linked" dependency if it is a true
+  /// dependency (e.g. a propagated or inferred type or constant value
+  /// implicitly refers to an element declared in the library) or
+  /// anti-dependency (e.g. the result of type propagation or type inference
+  /// depends on the lack of a certain declaration in the library).
   dependencies:[LinkedDependency] (id: 0);
 
-  /**
-   * For each export in [UnlinkedUnit.exports], an index into [dependencies]
-   * of the library being exported.
-   */
+  /// For each export in [UnlinkedUnit.exports], an index into [dependencies]
+  /// of the library being exported.
   exportDependencies:[uint] (id: 6);
 
-  /**
-   * Information about entities in the export namespace of the library that are
-   * not in the public namespace of the library (that is, entities that are
-   * brought into the namespace via `export` directives).
-   *
-   * Sorted by name.
-   */
+  /// Information about entities in the export namespace of the library that are
+  /// not in the public namespace of the library (that is, entities that are
+  /// brought into the namespace via `export` directives).
+  ///
+  /// Sorted by name.
   exportNames:[LinkedExportName] (id: 4);
 
-  /**
-   * Indicates whether this library was summarized in "fallback mode".  If
-   * true, all other fields in the data structure have their default values.
-   */
+  /// Indicates whether this library was summarized in "fallback mode".  If
+  /// true, all other fields in the data structure have their default values.
   fallbackMode:bool (id: 5, deprecated);
 
-  /**
-   * For each import in [UnlinkedUnit.imports], an index into [dependencies]
-   * of the library being imported.
-   */
+  /// For each import in [UnlinkedUnit.imports], an index into [dependencies]
+  /// of the library being imported.
   importDependencies:[uint] (id: 1);
 
-  /**
-   * The number of elements in [dependencies] which are not "linked"
-   * dependencies (that is, the number of libraries in the direct imports plus
-   * the transitive closure of exports, plus the library itself).
-   */
+  /// The number of elements in [dependencies] which are not "linked"
+  /// dependencies (that is, the number of libraries in the direct imports plus
+  /// the transitive closure of exports, plus the library itself).
   numPrelinkedDependencies:uint (id: 2);
 
-  /**
-   * The linked summary of all the compilation units constituting the
-   * library.  The summary of the defining compilation unit is listed first,
-   * followed by the summary of each part, in the order of the `part`
-   * declarations in the defining compilation unit.
-   */
+  /// The linked summary of all the compilation units constituting the
+  /// library.  The summary of the defining compilation unit is listed first,
+  /// followed by the summary of each part, in the order of the `part`
+  /// declarations in the defining compilation unit.
   units:[LinkedUnit] (id: 3);
 }
 
-/**
- * Information about the resolution of an [UnlinkedReference].
- */
+/// Information about the resolution of an [UnlinkedReference].
 table LinkedReference {
-  /**
-   * If this [LinkedReference] doesn't have an associated [UnlinkedReference],
-   * and the entity being referred to is contained within another entity, index
-   * of the containing entity.  This behaves similarly to
-   * [UnlinkedReference.prefixReference], however it is only used for class
-   * members, not for prefixed imports.
-   *
-   * Containing references must always point backward; that is, for all i, if
-   * LinkedUnit.references[i].containingReference != 0, then
-   * LinkedUnit.references[i].containingReference < i.
-   */
+  /// If this [LinkedReference] doesn't have an associated [UnlinkedReference],
+  /// and the entity being referred to is contained within another entity, index
+  /// of the containing entity.  This behaves similarly to
+  /// [UnlinkedReference.prefixReference], however it is only used for class
+  /// members, not for prefixed imports.
+  ///
+  /// Containing references must always point backward; that is, for all i, if
+  /// LinkedUnit.references[i].containingReference != 0, then
+  /// LinkedUnit.references[i].containingReference < i.
   containingReference:uint (id: 5);
 
-  /**
-   * Index into [LinkedLibrary.dependencies] indicating which imported library
-   * declares the entity being referred to.
-   *
-   * Zero if this entity is contained within another entity (e.g. a class
-   * member), or if [kind] is [ReferenceKind.prefix].
-   */
+  /// Index into [LinkedLibrary.dependencies] indicating which imported library
+  /// declares the entity being referred to.
+  ///
+  /// Zero if this entity is contained within another entity (e.g. a class
+  /// member), or if [kind] is [ReferenceKind.prefix].
   dependency:uint (id: 1);
 
-  /**
-   * The kind of the entity being referred to.  For the pseudo-types `dynamic`
-   * and `void`, the kind is [ReferenceKind.classOrEnum].
-   */
+  /// The kind of the entity being referred to.  For the pseudo-types `dynamic`
+  /// and `void`, the kind is [ReferenceKind.classOrEnum].
   kind:ReferenceKind (id: 2);
 
-  /**
-   * If [kind] is [ReferenceKind.function] (that is, the entity being referred
-   * to is a local function), the index of the function within
-   * [UnlinkedExecutable.localFunctions].  Otherwise zero.
-   */
+  /// If [kind] is [ReferenceKind.function] (that is, the entity being referred
+  /// to is a local function), the index of the function within
+  /// [UnlinkedExecutable.localFunctions].  Otherwise zero.
   localIndex:uint (id: 6, deprecated);
 
-  /**
-   * If this [LinkedReference] doesn't have an associated [UnlinkedReference],
-   * name of the entity being referred to.  For the pseudo-type `dynamic`, the
-   * string is "dynamic".  For the pseudo-type `void`, the string is "void".
-   */
+  /// If this [LinkedReference] doesn't have an associated [UnlinkedReference],
+  /// name of the entity being referred to.  For the pseudo-type `dynamic`, the
+  /// string is "dynamic".  For the pseudo-type `void`, the string is "void".
   name:string (id: 3);
 
-  /**
-   * If the entity being referred to is generic, the number of type parameters
-   * it declares (does not include type parameters of enclosing entities).
-   * Otherwise zero.
-   */
+  /// If the entity being referred to is generic, the number of type parameters
+  /// it declares (does not include type parameters of enclosing entities).
+  /// Otherwise zero.
   numTypeParameters:uint (id: 4);
 
-  /**
-   * Integer index indicating which unit in the imported library contains the
-   * definition of the entity.  As with indices into [LinkedLibrary.units],
-   * zero represents the defining compilation unit, and nonzero values
-   * represent parts in the order of the corresponding `part` declarations.
-   *
-   * Zero if this entity is contained within another entity (e.g. a class
-   * member).
-   */
+  /// Integer index indicating which unit in the imported library contains the
+  /// definition of the entity.  As with indices into [LinkedLibrary.units],
+  /// zero represents the defining compilation unit, and nonzero values
+  /// represent parts in the order of the corresponding `part` declarations.
+  ///
+  /// Zero if this entity is contained within another entity (e.g. a class
+  /// member).
   unit:uint (id: 0);
 }
 
-/**
- * Linked summary of a compilation unit.
- */
+/// Linked summary of a compilation unit.
 table LinkedUnit {
-  /**
-   * List of slot ids (referring to [UnlinkedExecutable.constCycleSlot])
-   * corresponding to const constructors that are part of cycles.
-   */
+  /// List of slot ids (referring to [UnlinkedExecutable.constCycleSlot])
+  /// corresponding to const constructors that are part of cycles.
   constCycles:[uint] (id: 2);
 
-  /**
-   * List of slot ids (referring to [UnlinkedParam.inheritsCovariantSlot] or
-   * [UnlinkedVariable.inheritsCovariantSlot]) corresponding to parameters
-   * that inherit `@covariant` behavior from a base class.
-   */
+  /// List of slot ids (referring to [UnlinkedParam.inheritsCovariantSlot] or
+  /// [UnlinkedVariable.inheritsCovariantSlot]) corresponding to parameters
+  /// that inherit `@covariant` behavior from a base class.
   parametersInheritingCovariant:[uint] (id: 3);
 
-  /**
-   * Information about the resolution of references within the compilation
-   * unit.  Each element of [UnlinkedUnit.references] has a corresponding
-   * element in this list (at the same index).  If this list has additional
-   * elements beyond the number of elements in [UnlinkedUnit.references], those
-   * additional elements are references that are only referred to implicitly
-   * (e.g. elements involved in inferred or propagated types).
-   */
+  /// Information about the resolution of references within the compilation
+  /// unit.  Each element of [UnlinkedUnit.references] has a corresponding
+  /// element in this list (at the same index).  If this list has additional
+  /// elements beyond the number of elements in [UnlinkedUnit.references], those
+  /// additional elements are references that are only referred to implicitly
+  /// (e.g. elements involved in inferred or propagated types).
   references:[LinkedReference] (id: 0);
 
-  /**
-   * The list of type inference errors.
-   */
+  /// The list of type inference errors.
   topLevelInferenceErrors:[TopLevelInferenceError] (id: 4);
 
-  /**
-   * List associating slot ids found inside the unlinked summary for the
-   * compilation unit with propagated and inferred types.
-   */
+  /// List associating slot ids found inside the unlinked summary for the
+  /// compilation unit with propagated and inferred types.
   types:[EntityRef] (id: 1);
 }
 
-/**
- * Summary information about a package.
- */
+/// Summary information about a package.
 table PackageBundle {
-  /**
-   * MD5 hash of the non-informative fields of the [PackageBundle] (not
-   * including this one).  This can be used to identify when the API of a
-   * package may have changed.
-   */
+  /// MD5 hash of the non-informative fields of the [PackageBundle] (not
+  /// including this one).  This can be used to identify when the API of a
+  /// package may have changed.
   apiSignature:string (id: 7, deprecated);
 
-  /**
-   * Information about the packages this package depends on, if known.
-   */
+  /// Information about the packages this package depends on, if known.
   dependencies:[PackageDependencyInfo] (id: 8, deprecated);
 
-  /**
-   * Linked libraries.
-   */
+  /// Linked libraries.
   linkedLibraries:[LinkedLibrary] (id: 0);
 
-  /**
-   * The list of URIs of items in [linkedLibraries], e.g. `dart:core` or
-   * `package:foo/bar.dart`.
-   */
+  /// The list of URIs of items in [linkedLibraries], e.g. `dart:core` or
+  /// `package:foo/bar.dart`.
   linkedLibraryUris:[string] (id: 1);
 
-  /**
-   * Major version of the summary format.  See
-   * [PackageBundleAssembler.currentMajorVersion].
-   */
+  /// Major version of the summary format.  See
+  /// [PackageBundleAssembler.currentMajorVersion].
   majorVersion:uint (id: 5);
 
-  /**
-   * Minor version of the summary format.  See
-   * [PackageBundleAssembler.currentMinorVersion].
-   */
+  /// Minor version of the summary format.  See
+  /// [PackageBundleAssembler.currentMinorVersion].
   minorVersion:uint (id: 6);
 
-  /**
-   * List of MD5 hashes of the files listed in [unlinkedUnitUris].  Each hash
-   * is encoded as a hexadecimal string using lower case letters.
-   */
+  /// List of MD5 hashes of the files listed in [unlinkedUnitUris].  Each hash
+  /// is encoded as a hexadecimal string using lower case letters.
   unlinkedUnitHashes:[string] (id: 4, deprecated);
 
-  /**
-   * Unlinked information for the compilation units constituting the package.
-   */
+  /// Unlinked information for the compilation units constituting the package.
   unlinkedUnits:[UnlinkedUnit] (id: 2);
 
-  /**
-   * The list of URIs of items in [unlinkedUnits], e.g. `dart:core/bool.dart`.
-   */
+  /// The list of URIs of items in [unlinkedUnits], e.g. `dart:core/bool.dart`.
   unlinkedUnitUris:[string] (id: 3);
 }
 
-/**
- * Information about a single dependency of a summary package.
- */
+/// Information about a single dependency of a summary package.
 table PackageDependencyInfo {
-  /**
-   * API signature of this dependency.
-   */
+  /// API signature of this dependency.
   apiSignature:string (id: 0);
 
-  /**
-   * If this dependency summarizes any files whose URI takes the form
-   * "package:<package_name>/...", a list of all such package names, sorted
-   * lexicographically.  Otherwise empty.
-   */
+  /// If this dependency summarizes any files whose URI takes the form
+  /// "package:<package_name>/...", a list of all such package names, sorted
+  /// lexicographically.  Otherwise empty.
   includedPackageNames:[string] (id: 2);
 
-  /**
-   * Indicates whether this dependency summarizes any files whose URI takes the
-   * form "dart:...".
-   */
+  /// Indicates whether this dependency summarizes any files whose URI takes the
+  /// form "dart:...".
   includesDartUris:bool (id: 4);
 
-  /**
-   * Indicates whether this dependency summarizes any files whose URI takes the
-   * form "file:...".
-   */
+  /// Indicates whether this dependency summarizes any files whose URI takes the
+  /// form "file:...".
   includesFileUris:bool (id: 3);
 
-  /**
-   * Relative path to the summary file for this dependency.  This is intended as
-   * a hint to help the analysis server locate summaries of dependencies.  We
-   * don't specify precisely what this path is relative to, but we expect it to
-   * be relative to a directory the analysis server can find (e.g. for projects
-   * built using Bazel, it would be relative to the "bazel-bin" directory).
-   *
-   * Absent if the path is not known.
-   */
+  /// Relative path to the summary file for this dependency.  This is intended
+  /// as a hint to help the analysis server locate summaries of dependencies.
+  /// We don't specify precisely what this path is relative to, but we expect
+  /// it to be relative to a directory the analysis server can find (e.g. for
+  /// projects built using Bazel, it would be relative to the "bazel-bin"
+  /// directory).
+  ///
+  /// Absent if the path is not known.
   summaryPath:string (id: 1);
 }
 
-/**
- * Index information about a package.
- */
+/// Index information about a package.
 table PackageIndex {
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the kind of the synthetic element.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the kind of the synthetic element.
   elementKinds:[IndexSyntheticElementKind] (id: 5);
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the class member element name, or `null` if the element
-   * is a top-level element.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this
-   * [PackageIndex].
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the class member element name, or `null` if the element
+  /// is a top-level element.  The list is sorted in ascending order, so that
+  /// the client can quickly check whether an element is referenced in this
+  /// [PackageIndex].
   elementNameClassMemberIds:[uint] (id: 7);
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the named parameter name, or `null` if the element is not
-   * a named parameter.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this
-   * [PackageIndex].
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the named parameter name, or `null` if the element is
+  /// not a named parameter.  The list is sorted in ascending order, so that the
+  /// client can quickly check whether an element is referenced in this
+  /// [PackageIndex].
   elementNameParameterIds:[uint] (id: 8);
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the top-level element name, or `null` if the element is
-   * the unit.  The list is sorted in ascending order, so that the client can
-   * quickly check whether an element is referenced in this [PackageIndex].
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the top-level element name, or `null` if the element is
+  /// the unit.  The list is sorted in ascending order, so that the client can
+  /// quickly check whether an element is referenced in this [PackageIndex].
   elementNameUnitMemberIds:[uint] (id: 1);
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the index into [unitLibraryUris] and [unitUnitUris] for the library
-   * specific unit where the element is declared.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the index into [unitLibraryUris] and [unitUnitUris] for the library
+  /// specific unit where the element is declared.
   elementUnits:[uint] (id: 0);
 
-  /**
-   * List of unique element strings used in this [PackageIndex].  The list is
-   * sorted in ascending order, so that the client can quickly check the
-   * presence of a string in this [PackageIndex].
-   */
+  /// List of unique element strings used in this [PackageIndex].  The list is
+  /// sorted in ascending order, so that the client can quickly check the
+  /// presence of a string in this [PackageIndex].
   strings:[string] (id: 6);
 
-  /**
-   * Each item of this list corresponds to the library URI of a unique library
-   * specific unit referenced in the [PackageIndex].  It is an index into
-   * [strings] list.
-   */
+  /// Each item of this list corresponds to the library URI of a unique library
+  /// specific unit referenced in the [PackageIndex].  It is an index into
+  /// [strings] list.
   unitLibraryUris:[uint] (id: 2);
 
-  /**
-   * List of indexes of each unit in this [PackageIndex].
-   */
+  /// List of indexes of each unit in this [PackageIndex].
   units:[UnitIndex] (id: 4);
 
-  /**
-   * Each item of this list corresponds to the unit URI of a unique library
-   * specific unit referenced in the [PackageIndex].  It is an index into
-   * [strings] list.
-   */
+  /// Each item of this list corresponds to the unit URI of a unique library
+  /// specific unit referenced in the [PackageIndex].  It is an index into
+  /// [strings] list.
   unitUnitUris:[uint] (id: 3);
 }
 
-/**
- * Summary information about a top-level type inference error.
- */
+/// Summary information about a top-level type inference error.
 table TopLevelInferenceError {
-  /**
-   * The [kind] specific arguments.
-   */
+  /// The [kind] specific arguments.
   arguments:[string] (id: 2);
 
-  /**
-   * The kind of the error.
-   */
+  /// The kind of the error.
   kind:TopLevelInferenceErrorKind (id: 1);
 
-  /**
-   * The slot id (which is unique within the compilation unit) identifying the
-   * target of type inference with which this [TopLevelInferenceError] is
-   * associated.
-   */
+  /// The slot id (which is unique within the compilation unit) identifying the
+  /// target of type inference with which this [TopLevelInferenceError] is
+  /// associated.
   slot:uint (id: 0);
 }
 
-/**
- * Index information about a unit in a [PackageIndex].
- */
+/// Index information about a unit in a [PackageIndex].
 table UnitIndex {
-  /**
-   * Each item of this list is the kind of an element defined in this unit.
-   */
+  /// Each item of this list is the kind of an element defined in this unit.
   definedNameKinds:[IndexNameKind] (id: 6);
 
-  /**
-   * Each item of this list is the name offset of an element defined in this
-   * unit relative to the beginning of the file.
-   */
+  /// Each item of this list is the name offset of an element defined in this
+  /// unit relative to the beginning of the file.
   definedNameOffsets:[uint] (id: 7);
 
-  /**
-   * Each item of this list corresponds to an element defined in this unit.  It
-   * is an index into [PackageIndex.strings] list.  The list is sorted in
-   * ascending order, so that the client can quickly find name definitions in
-   * this [UnitIndex].
-   */
+  /// Each item of this list corresponds to an element defined in this unit.  It
+  /// is an index into [PackageIndex.strings] list.  The list is sorted in
+  /// ascending order, so that the client can quickly find name definitions in
+  /// this [UnitIndex].
   definedNames:[uint] (id: 5);
 
-  /**
-   * Index into [PackageIndex.unitLibraryUris] and [PackageIndex.unitUnitUris]
-   * for the library specific unit that corresponds to this [UnitIndex].
-   */
+  /// Index into [PackageIndex.unitLibraryUris] and [PackageIndex.unitUnitUris]
+  /// for the library specific unit that corresponds to this [UnitIndex].
   unit:uint (id: 0);
 
-  /**
-   * Each item of this list is the `true` if the corresponding element usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding element usage
+  /// is qualified with some prefix.
   usedElementIsQualifiedFlags:[ubyte] (id: 11);
 
-  /**
-   * Each item of this list is the kind of the element usage.
-   */
+  /// Each item of this list is the kind of the element usage.
   usedElementKinds:[IndexRelationKind] (id: 4);
 
-  /**
-   * Each item of this list is the length of the element usage.
-   */
+  /// Each item of this list is the length of the element usage.
   usedElementLengths:[uint] (id: 1);
 
-  /**
-   * Each item of this list is the offset of the element usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the element usage relative to the
+  /// beginning of the file.
   usedElementOffsets:[uint] (id: 2);
 
-  /**
-   * Each item of this list is the index into [PackageIndex.elementUnits] and
-   * [PackageIndex.elementOffsets].  The list is sorted in ascending order, so
-   * that the client can quickly find element references in this [UnitIndex].
-   */
+  /// Each item of this list is the index into [PackageIndex.elementUnits] and
+  /// [PackageIndex.elementOffsets].  The list is sorted in ascending order, so
+  /// that the client can quickly find element references in this [UnitIndex].
   usedElements:[uint] (id: 3);
 
-  /**
-   * Each item of this list is the `true` if the corresponding name usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding name usage
+  /// is qualified with some prefix.
   usedNameIsQualifiedFlags:[ubyte] (id: 12);
 
-  /**
-   * Each item of this list is the kind of the name usage.
-   */
+  /// Each item of this list is the kind of the name usage.
   usedNameKinds:[IndexRelationKind] (id: 10);
 
-  /**
-   * Each item of this list is the offset of the name usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the name usage relative to the
+  /// beginning of the file.
   usedNameOffsets:[uint] (id: 9);
 
-  /**
-   * Each item of this list is the index into [PackageIndex.strings] for a
-   * used name.  The list is sorted in ascending order, so that the client can
-   * quickly find name uses in this [UnitIndex].
-   */
+  /// Each item of this list is the index into [PackageIndex.strings] for a
+  /// used name.  The list is sorted in ascending order, so that the client can
+  /// quickly find name uses in this [UnitIndex].
   usedNames:[uint] (id: 8);
 }
 
-/**
- * Unlinked summary information about a class declaration.
- */
+/// Unlinked summary information about a class declaration.
 table UnlinkedClass {
-  /**
-   * Annotations for this class.
-   */
+  /// Annotations for this class.
   annotations:[UnlinkedExpr] (id: 5);
 
-  /**
-   * Code range of the class.
-   */
+  /// Code range of the class.
   codeRange:CodeRange (id: 13);
 
-  /**
-   * Documentation comment for the class, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the class, or `null` if there is no
+  /// documentation comment.
   documentationComment:UnlinkedDocumentationComment (id: 6);
 
-  /**
-   * Executable objects (methods, getters, and setters) contained in the class.
-   */
+  /// Executable objects (methods, getters, and setters) contained in the class.
   executables:[UnlinkedExecutable] (id: 2);
 
-  /**
-   * Field declarations contained in the class.
-   */
+  /// Field declarations contained in the class.
   fields:[UnlinkedVariable] (id: 4);
 
-  /**
-   * Indicates whether this class is the core "Object" class (and hence has no
-   * supertype)
-   */
+  /// Indicates whether this class is the core "Object" class (and hence has no
+  /// supertype)
   hasNoSupertype:bool (id: 12);
 
-  /**
-   * Interfaces appearing in an `implements` clause, if any.
-   */
+  /// Interfaces appearing in an `implements` clause, if any.
   interfaces:[EntityRef] (id: 7);
 
-  /**
-   * Indicates whether the class is declared with the `abstract` keyword.
-   */
+  /// Indicates whether the class is declared with the `abstract` keyword.
   isAbstract:bool (id: 8);
 
-  /**
-   * Indicates whether the class is declared using mixin application syntax.
-   */
+  /// Indicates whether the class is declared using mixin application syntax.
   isMixinApplication:bool (id: 11);
 
-  /**
-   * Mixins appearing in a `with` clause, if any.
-   */
+  /// Mixins appearing in a `with` clause, if any.
   mixins:[EntityRef] (id: 10);
 
-  /**
-   * Name of the class.
-   */
+  /// Name of the class.
   name:string (id: 0);
 
-  /**
-   * Offset of the class name relative to the beginning of the file.
-   */
+  /// Offset of the class name relative to the beginning of the file.
   nameOffset:uint (id: 1);
 
-  /**
-   * Superclass constraints for this mixin declaration. The list will be empty
-   * if this class is not a mixin declaration, or if the declaration does not
-   * have an `on` clause (in which case the type `Object` is implied).
-   */
+  /// Superclass constraints for this mixin declaration. The list will be empty
+  /// if this class is not a mixin declaration, or if the declaration does not
+  /// have an `on` clause (in which case the type `Object` is implied).
   superclassConstraints:[EntityRef] (id: 14);
 
-  /**
-   * Names of methods, getters, setters, and operators that this mixin
-   * declaration super-invokes.  For setters this includes the trailing "=".
-   * The list will be empty if this class is not a mixin declaration.
-   */
+  /// Names of methods, getters, setters, and operators that this mixin
+  /// declaration super-invokes.  For setters this includes the trailing "=".
+  /// The list will be empty if this class is not a mixin declaration.
   superInvokedNames:[string] (id: 15);
 
-  /**
-   * Supertype of the class, or `null` if either (a) the class doesn't
-   * explicitly declare a supertype (and hence has supertype `Object`), or (b)
-   * the class *is* `Object` (and hence has no supertype).
-   */
+  /// Supertype of the class, or `null` if either (a) the class doesn't
+  /// explicitly declare a supertype (and hence has supertype `Object`), or (b)
+  /// the class *is* `Object` (and hence has no supertype).
   supertype:EntityRef (id: 3);
 
-  /**
-   * Type parameters of the class, if any.
-   */
+  /// Type parameters of the class, if any.
   typeParameters:[UnlinkedTypeParam] (id: 9);
 }
 
-/**
- * Unlinked summary information about a `show` or `hide` combinator in an
- * import or export declaration.
- */
+/// Unlinked summary information about a `show` or `hide` combinator in an
+/// import or export declaration.
 table UnlinkedCombinator {
-  /**
-   * If this is a `show` combinator, offset of the end of the list of shown
-   * names.  Otherwise zero.
-   */
+  /// If this is a `show` combinator, offset of the end of the list of shown
+  /// names.  Otherwise zero.
   end:uint (id: 3);
 
-  /**
-   * List of names which are hidden.  Empty if this is a `show` combinator.
-   */
+  /// List of names which are hidden.  Empty if this is a `show` combinator.
   hides:[string] (id: 1);
 
-  /**
-   * If this is a `show` combinator, offset of the `show` keyword.  Otherwise
-   * zero.
-   */
+  /// If this is a `show` combinator, offset of the `show` keyword.  Otherwise
+  /// zero.
   offset:uint (id: 2);
 
-  /**
-   * List of names which are shown.  Empty if this is a `hide` combinator.
-   */
+  /// List of names which are shown.  Empty if this is a `hide` combinator.
   shows:[string] (id: 0);
 }
 
-/**
- * Unlinked summary information about a single import or export configuration.
- */
+/// Unlinked summary information about a single import or export configuration.
 table UnlinkedConfiguration {
-  /**
-   * The name of the declared variable whose value is being used in the
-   * condition.
-   */
+  /// The name of the declared variable whose value is being used in the
+  /// condition.
   name:string (id: 0);
 
-  /**
-   * The URI of the implementation library to be used if the condition is true.
-   */
+  /// The URI of the implementation library to be used if the condition is true.
   uri:string (id: 2);
 
-  /**
-   * The value to which the value of the declared variable will be compared,
-   * or `true` if the condition does not include an equality test.
-   */
+  /// The value to which the value of the declared variable will be compared,
+  /// or `true` if the condition does not include an equality test.
   value:string (id: 1);
 }
 
-/**
- * Unlinked summary information about a constructor initializer.
- */
+/// Unlinked summary information about a constructor initializer.
 table UnlinkedConstructorInitializer {
-  /**
-   * If there are `m` [arguments] and `n` [argumentNames], then each argument
-   * from [arguments] with index `i` such that `n + i - m >= 0`, should be used
-   * with the name at `n + i - m`.
-   */
+  /// If there are `m` [arguments] and `n` [argumentNames], then each argument
+  /// from [arguments] with index `i` such that `n + i - m >= 0`, should be used
+  /// with the name at `n + i - m`.
   argumentNames:[string] (id: 4);
 
-  /**
-   * If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
-   * invocation.  Otherwise empty.
-   */
+  /// If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
+  /// invocation.  Otherwise empty.
   arguments:[UnlinkedExpr] (id: 3);
 
-  /**
-   * If [kind] is `field`, the expression of the field initializer.
-   * Otherwise `null`.
-   */
+  /// If [kind] is `field`, the expression of the field initializer.
+  /// Otherwise `null`.
   expression:UnlinkedExpr (id: 1);
 
-  /**
-   * The kind of the constructor initializer (field, redirect, super).
-   */
+  /// The kind of the constructor initializer (field, redirect, super).
   kind:UnlinkedConstructorInitializerKind (id: 2);
 
-  /**
-   * If [kind] is `field`, the name of the field declared in the class.  If
-   * [kind] is `thisInvocation`, the name of the constructor, declared in this
-   * class, to redirect to.  If [kind] is `superInvocation`, the name of the
-   * constructor, declared in the superclass, to invoke.
-   */
+  /// If [kind] is `field`, the name of the field declared in the class.  If
+  /// [kind] is `thisInvocation`, the name of the constructor, declared in this
+  /// class, to redirect to.  If [kind] is `superInvocation`, the name of the
+  /// constructor, declared in the superclass, to invoke.
   name:string (id: 0);
 }
 
-/**
- * Unlinked summary information about a documentation comment.
- */
+/// Unlinked summary information about a documentation comment.
 table UnlinkedDocumentationComment {
-  /**
-   * Length of the documentation comment (prior to replacing '\r\n' with '\n').
-   */
+  /// Length of the documentation comment (prior to replacing '\r\n' with '\n').
   length:uint (id: 0, deprecated);
 
-  /**
-   * Offset of the beginning of the documentation comment relative to the
-   * beginning of the file.
-   */
+  /// Offset of the beginning of the documentation comment relative to the
+  /// beginning of the file.
   offset:uint (id: 2, deprecated);
 
-  /**
-   * Text of the documentation comment, with '\r\n' replaced by '\n'.
-   *
-   * References appearing within the doc comment in square brackets are not
-   * specially encoded.
-   */
+  /// Text of the documentation comment, with '\r\n' replaced by '\n'.
+  ///
+  /// References appearing within the doc comment in square brackets are not
+  /// specially encoded.
   text:string (id: 1);
 }
 
-/**
- * Unlinked summary information about an enum declaration.
- */
+/// Unlinked summary information about an enum declaration.
 table UnlinkedEnum {
-  /**
-   * Annotations for this enum.
-   */
+  /// Annotations for this enum.
   annotations:[UnlinkedExpr] (id: 4);
 
-  /**
-   * Code range of the enum.
-   */
+  /// Code range of the enum.
   codeRange:CodeRange (id: 5);
 
-  /**
-   * Documentation comment for the enum, or `null` if there is no documentation
-   * comment.
-   */
+  /// Documentation comment for the enum, or `null` if there is no documentation
+  /// comment.
   documentationComment:UnlinkedDocumentationComment (id: 3);
 
-  /**
-   * Name of the enum type.
-   */
+  /// Name of the enum type.
   name:string (id: 0);
 
-  /**
-   * Offset of the enum name relative to the beginning of the file.
-   */
+  /// Offset of the enum name relative to the beginning of the file.
   nameOffset:uint (id: 1);
 
-  /**
-   * Values listed in the enum declaration, in declaration order.
-   */
+  /// Values listed in the enum declaration, in declaration order.
   values:[UnlinkedEnumValue] (id: 2);
 }
 
-/**
- * Unlinked summary information about a single enumerated value in an enum
- * declaration.
- */
+/// Unlinked summary information about a single enumerated value in an enum
+/// declaration.
 table UnlinkedEnumValue {
-  /**
-   * Annotations for this value.
-   */
+  /// Annotations for this value.
   annotations:[UnlinkedExpr] (id: 3);
 
-  /**
-   * Documentation comment for the enum value, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the enum value, or `null` if there is no
+  /// documentation comment.
   documentationComment:UnlinkedDocumentationComment (id: 2);
 
-  /**
-   * Name of the enumerated value.
-   */
+  /// Name of the enumerated value.
   name:string (id: 0);
 
-  /**
-   * Offset of the enum value name relative to the beginning of the file.
-   */
+  /// Offset of the enum value name relative to the beginning of the file.
   nameOffset:uint (id: 1);
 }
 
-/**
- * Unlinked summary information about a function, method, getter, or setter
- * declaration.
- */
+/// Unlinked summary information about a function, method, getter, or setter
+/// declaration.
 table UnlinkedExecutable {
-  /**
-   * Annotations for this executable.
-   */
+  /// Annotations for this executable.
   annotations:[UnlinkedExpr] (id: 6);
 
-  /**
-   * If this executable's function body is declared using `=>`, the expression
-   * to the right of the `=>`.  May be omitted if neither type inference nor
-   * constant evaluation depends on the function body.
-   */
+  /// If this executable's function body is declared using `=>`, the expression
+  /// to the right of the `=>`.  May be omitted if neither type inference nor
+  /// constant evaluation depends on the function body.
   bodyExpr:UnlinkedExpr (id: 29);
 
-  /**
-   * Code range of the executable.
-   */
+  /// Code range of the executable.
   codeRange:CodeRange (id: 26);
 
-  /**
-   * If a constant [UnlinkedExecutableKind.constructor], the constructor
-   * initializers.  Otherwise empty.
-   */
+  /// If a constant [UnlinkedExecutableKind.constructor], the constructor
+  /// initializers.  Otherwise empty.
   constantInitializers:[UnlinkedConstructorInitializer] (id: 14);
 
-  /**
-   * If [kind] is [UnlinkedExecutableKind.constructor] and [isConst] is `true`,
-   * a nonzero slot id which is unique within this compilation unit.  If this id
-   * is found in [LinkedUnit.constCycles], then this constructor is part of a
-   * cycle.
-   *
-   * Otherwise, zero.
-   */
+  /// If [kind] is [UnlinkedExecutableKind.constructor] and [isConst] is `true`,
+  /// a nonzero slot id which is unique within this compilation unit.  If this
+  /// id is found in [LinkedUnit.constCycles], then this constructor is part of
+  /// a cycle.
+  ///
+  /// Otherwise, zero.
   constCycleSlot:uint (id: 25);
 
-  /**
-   * Documentation comment for the executable, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the executable, or `null` if there is no
+  /// documentation comment.
   documentationComment:UnlinkedDocumentationComment (id: 7);
 
-  /**
-   * If this executable's return type is inferable, nonzero slot id
-   * identifying which entry in [LinkedUnit.types] contains the inferred
-   * return type.  If there is no matching entry in [LinkedUnit.types], then
-   * no return type was inferred for this variable, so its static type is
-   * `dynamic`.
-   */
+  /// If this executable's return type is inferable, nonzero slot id
+  /// identifying which entry in [LinkedUnit.types] contains the inferred
+  /// return type.  If there is no matching entry in [LinkedUnit.types], then
+  /// no return type was inferred for this variable, so its static type is
+  /// `dynamic`.
   inferredReturnTypeSlot:uint (id: 5);
 
-  /**
-   * Indicates whether the executable is declared using the `abstract` keyword.
-   */
+  /// Indicates whether the executable is declared using the `abstract` keyword.
   isAbstract:bool (id: 10);
 
-  /**
-   * Indicates whether the executable has body marked as being asynchronous.
-   */
+  /// Indicates whether the executable has body marked as being asynchronous.
   isAsynchronous:bool (id: 27);
 
-  /**
-   * Indicates whether the executable is declared using the `const` keyword.
-   */
+  /// Indicates whether the executable is declared using the `const` keyword.
   isConst:bool (id: 12);
 
-  /**
-   * Indicates whether the executable is declared using the `external` keyword.
-   */
+  /// Indicates whether the executable is declared using the `external` keyword.
   isExternal:bool (id: 11);
 
-  /**
-   * Indicates whether the executable is declared using the `factory` keyword.
-   */
+  /// Indicates whether the executable is declared using the `factory` keyword.
   isFactory:bool (id: 8);
 
-  /**
-   * Indicates whether the executable has body marked as being a generator.
-   */
+  /// Indicates whether the executable has body marked as being a generator.
   isGenerator:bool (id: 28);
 
-  /**
-   * Indicates whether the executable is a redirected constructor.
-   */
+  /// Indicates whether the executable is a redirected constructor.
   isRedirectedConstructor:bool (id: 13);
 
-  /**
-   * Indicates whether the executable is declared using the `static` keyword.
-   *
-   * Note that for top level executables, this flag is false, since they are
-   * not declared using the `static` keyword (even though they are considered
-   * static for semantic purposes).
-   */
+  /// Indicates whether the executable is declared using the `static` keyword.
+  ///
+  /// Note that for top level executables, this flag is false, since they are
+  /// not declared using the `static` keyword (even though they are considered
+  /// static for semantic purposes).
   isStatic:bool (id: 9);
 
-  /**
-   * The kind of the executable (function/method, getter, setter, or
-   * constructor).
-   */
+  /// The kind of the executable (function/method, getter, setter, or
+  /// constructor).
   kind:UnlinkedExecutableKind (id: 4);
 
-  /**
-   * The list of local functions.
-   */
+  /// The list of local functions.
   localFunctions:[UnlinkedExecutable] (id: 18);
 
-  /**
-   * The list of local labels.
-   */
+  /// The list of local labels.
   localLabels:[string] (id: 22, deprecated);
 
-  /**
-   * The list of local variables.
-   */
+  /// The list of local variables.
   localVariables:[UnlinkedVariable] (id: 19, deprecated);
 
-  /**
-   * Name of the executable.  For setters, this includes the trailing "=".  For
-   * named constructors, this excludes the class name and excludes the ".".
-   * For unnamed constructors, this is the empty string.
-   */
+  /// Name of the executable.  For setters, this includes the trailing "=".  For
+  /// named constructors, this excludes the class name and excludes the ".".
+  /// For unnamed constructors, this is the empty string.
   name:string (id: 1);
 
-  /**
-   * If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
-   * the offset of the end of the constructor name.  Otherwise zero.
-   */
+  /// If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
+  /// the offset of the end of the constructor name.  Otherwise zero.
   nameEnd:uint (id: 23);
 
-  /**
-   * Offset of the executable name relative to the beginning of the file.  For
-   * named constructors, this excludes the class name and excludes the ".".
-   * For unnamed constructors, this is the offset of the class name (i.e. the
-   * offset of the second "C" in "class C { C(); }").
-   */
+  /// Offset of the executable name relative to the beginning of the file.  For
+  /// named constructors, this excludes the class name and excludes the ".".
+  /// For unnamed constructors, this is the offset of the class name (i.e. the
+  /// offset of the second "C" in "class C { C(); }").
   nameOffset:uint (id: 0);
 
-  /**
-   * Parameters of the executable, if any.  Note that getters have no
-   * parameters (hence this will be the empty list), and setters have a single
-   * parameter.
-   */
+  /// Parameters of the executable, if any.  Note that getters have no
+  /// parameters (hence this will be the empty list), and setters have a single
+  /// parameter.
   parameters:[UnlinkedParam] (id: 2);
 
-  /**
-   * If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
-   * the offset of the period before the constructor name.  Otherwise zero.
-   */
+  /// If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
+  /// the offset of the period before the constructor name.  Otherwise zero.
   periodOffset:uint (id: 24);
 
-  /**
-   * If [isRedirectedConstructor] and [isFactory] are both `true`, the
-   * constructor to which this constructor redirects; otherwise empty.
-   */
+  /// If [isRedirectedConstructor] and [isFactory] are both `true`, the
+  /// constructor to which this constructor redirects; otherwise empty.
   redirectedConstructor:EntityRef (id: 15);
 
-  /**
-   * If [isRedirectedConstructor] is `true` and [isFactory] is `false`, the
-   * name of the constructor that this constructor redirects to; otherwise
-   * empty.
-   */
+  /// If [isRedirectedConstructor] is `true` and [isFactory] is `false`, the
+  /// name of the constructor that this constructor redirects to; otherwise
+  /// empty.
   redirectedConstructorName:string (id: 17);
 
-  /**
-   * Declared return type of the executable.  Absent if the executable is a
-   * constructor or the return type is implicit.  Absent for executables
-   * associated with variable initializers and closures, since these
-   * executables may have return types that are not accessible via direct
-   * imports.
-   */
+  /// Declared return type of the executable.  Absent if the executable is a
+  /// constructor or the return type is implicit.  Absent for executables
+  /// associated with variable initializers and closures, since these
+  /// executables may have return types that are not accessible via direct
+  /// imports.
   returnType:EntityRef (id: 3);
 
-  /**
-   * Type parameters of the executable, if any.  Empty if support for generic
-   * method syntax is disabled.
-   */
+  /// Type parameters of the executable, if any.  Empty if support for generic
+  /// method syntax is disabled.
   typeParameters:[UnlinkedTypeParam] (id: 16);
 
-  /**
-   * If a local function, the length of the visible range; zero otherwise.
-   */
+  /// If a local function, the length of the visible range; zero otherwise.
   visibleLength:uint (id: 20);
 
-  /**
-   * If a local function, the beginning of the visible range; zero otherwise.
-   */
+  /// If a local function, the beginning of the visible range; zero otherwise.
   visibleOffset:uint (id: 21);
 }
 
-/**
- * Unlinked summary information about an export declaration (stored outside
- * [UnlinkedPublicNamespace]).
- */
+/// Unlinked summary information about an export declaration (stored outside
+/// [UnlinkedPublicNamespace]).
 table UnlinkedExportNonPublic {
-  /**
-   * Annotations for this export directive.
-   */
+  /// Annotations for this export directive.
   annotations:[UnlinkedExpr] (id: 3);
 
-  /**
-   * Offset of the "export" keyword.
-   */
+  /// Offset of the "export" keyword.
   offset:uint (id: 0);
 
-  /**
-   * End of the URI string (including quotes) relative to the beginning of the
-   * file.
-   */
+  /// End of the URI string (including quotes) relative to the beginning of the
+  /// file.
   uriEnd:uint (id: 1);
 
-  /**
-   * Offset of the URI string (including quotes) relative to the beginning of
-   * the file.
-   */
+  /// Offset of the URI string (including quotes) relative to the beginning of
+  /// the file.
   uriOffset:uint (id: 2);
 }
 
-/**
- * Unlinked summary information about an export declaration (stored inside
- * [UnlinkedPublicNamespace]).
- */
+/// Unlinked summary information about an export declaration (stored inside
+/// [UnlinkedPublicNamespace]).
 table UnlinkedExportPublic {
-  /**
-   * Combinators contained in this export declaration.
-   */
+  /// Combinators contained in this export declaration.
   combinators:[UnlinkedCombinator] (id: 1);
 
-  /**
-   * Configurations used to control which library will actually be loaded at
-   * run-time.
-   */
+  /// Configurations used to control which library will actually be loaded at
+  /// run-time.
   configurations:[UnlinkedConfiguration] (id: 2);
 
-  /**
-   * URI used in the source code to reference the exported library.
-   */
+  /// URI used in the source code to reference the exported library.
   uri:string (id: 0);
 }
 
-/**
- * Unlinked summary information about an expression.
- *
- * Expressions are represented using a simple stack-based language
- * where [operations] is a sequence of operations to execute starting with an
- * empty stack.  Once all operations have been executed, the stack should
- * contain a single value which is the value of the constant.  Note that some
- * operations consume additional data from the other fields of this class.
- */
+/// Unlinked summary information about an expression.
+///
+/// Expressions are represented using a simple stack-based language
+/// where [operations] is a sequence of operations to execute starting with an
+/// empty stack.  Once all operations have been executed, the stack should
+/// contain a single value which is the value of the constant.  Note that some
+/// operations consume additional data from the other fields of this class.
 table UnlinkedExpr {
-  /**
-   * Sequence of operators used by assignment operations.
-   */
+  /// Sequence of operators used by assignment operations.
   assignmentOperators:[UnlinkedExprAssignOperator] (id: 6);
 
-  /**
-   * Sequence of 64-bit doubles consumed by the operation `pushDouble`.
-   */
+  /// Sequence of 64-bit doubles consumed by the operation `pushDouble`.
   doubles:[double] (id: 4);
 
-  /**
-   * Sequence of unsigned 32-bit integers consumed by the operations
-   * `pushArgument`, `pushInt`, `shiftOr`, `concatenate`, `invokeConstructor`,
-   * `makeList`, and `makeMap`.
-   */
+  /// Sequence of unsigned 32-bit integers consumed by the operations
+  /// `pushArgument`, `pushInt`, `shiftOr`, `concatenate`, `invokeConstructor`,
+  /// `makeList`, and `makeMap`.
   ints:[uint] (id: 1);
 
-  /**
-   * Indicates whether the expression is a valid potentially constant
-   * expression.
-   */
+  /// Indicates whether the expression is a valid potentially constant
+  /// expression.
   isValidConst:bool (id: 5);
 
-  /**
-   * Sequence of operations to execute (starting with an empty stack) to form
-   * the constant value.
-   */
+  /// Sequence of operations to execute (starting with an empty stack) to form
+  /// the constant value.
   operations:[UnlinkedExprOperation] (id: 0);
 
-  /**
-   * Sequence of language constructs consumed by the operations
-   * `pushReference`, `invokeConstructor`, `makeList`, and `makeMap`.  Note
-   * that in the case of `pushReference` (and sometimes `invokeConstructor` the
-   * actual entity being referred to may be something other than a type.
-   */
+  /// Sequence of language constructs consumed by the operations
+  /// `pushReference`, `invokeConstructor`, `makeList`, and `makeMap`.  Note
+  /// that in the case of `pushReference` (and sometimes `invokeConstructor` the
+  /// actual entity being referred to may be something other than a type.
   references:[EntityRef] (id: 2);
 
-  /**
-   * Sequence of strings consumed by the operations `pushString` and
-   * `invokeConstructor`.
-   */
+  /// Sequence of strings consumed by the operations `pushString` and
+  /// `invokeConstructor`.
   strings:[string] (id: 3);
 }
 
-/**
- * Unlinked summary information about an import declaration.
- */
+/// Unlinked summary information about an import declaration.
 table UnlinkedImport {
-  /**
-   * Annotations for this import declaration.
-   */
+  /// Annotations for this import declaration.
   annotations:[UnlinkedExpr] (id: 8);
 
-  /**
-   * Combinators contained in this import declaration.
-   */
+  /// Combinators contained in this import declaration.
   combinators:[UnlinkedCombinator] (id: 4);
 
-  /**
-   * Configurations used to control which library will actually be loaded at
-   * run-time.
-   */
+  /// Configurations used to control which library will actually be loaded at
+  /// run-time.
   configurations:[UnlinkedConfiguration] (id: 10);
 
-  /**
-   * Indicates whether the import declaration uses the `deferred` keyword.
-   */
+  /// Indicates whether the import declaration uses the `deferred` keyword.
   isDeferred:bool (id: 9);
 
-  /**
-   * Indicates whether the import declaration is implicit.
-   */
+  /// Indicates whether the import declaration is implicit.
   isImplicit:bool (id: 5);
 
-  /**
-   * If [isImplicit] is false, offset of the "import" keyword.  If [isImplicit]
-   * is true, zero.
-   */
+  /// If [isImplicit] is false, offset of the "import" keyword.  If [isImplicit]
+  /// is true, zero.
   offset:uint (id: 0);
 
-  /**
-   * Offset of the prefix name relative to the beginning of the file, or zero
-   * if there is no prefix.
-   */
+  /// Offset of the prefix name relative to the beginning of the file, or zero
+  /// if there is no prefix.
   prefixOffset:uint (id: 6);
 
-  /**
-   * Index into [UnlinkedUnit.references] of the prefix declared by this
-   * import declaration, or zero if this import declaration declares no prefix.
-   *
-   * Note that multiple imports can declare the same prefix.
-   */
+  /// Index into [UnlinkedUnit.references] of the prefix declared by this
+  /// import declaration, or zero if this import declaration declares no prefix.
+  ///
+  /// Note that multiple imports can declare the same prefix.
   prefixReference:uint (id: 7);
 
-  /**
-   * URI used in the source code to reference the imported library.
-   */
+  /// URI used in the source code to reference the imported library.
   uri:string (id: 1);
 
-  /**
-   * End of the URI string (including quotes) relative to the beginning of the
-   * file.  If [isImplicit] is true, zero.
-   */
+  /// End of the URI string (including quotes) relative to the beginning of the
+  /// file.  If [isImplicit] is true, zero.
   uriEnd:uint (id: 2);
 
-  /**
-   * Offset of the URI string (including quotes) relative to the beginning of
-   * the file.  If [isImplicit] is true, zero.
-   */
+  /// Offset of the URI string (including quotes) relative to the beginning of
+  /// the file.  If [isImplicit] is true, zero.
   uriOffset:uint (id: 3);
 }
 
-/**
- * Unlinked summary information about a function parameter.
- */
+/// Unlinked summary information about a function parameter.
 table UnlinkedParam {
-  /**
-   * Annotations for this parameter.
-   */
+  /// Annotations for this parameter.
   annotations:[UnlinkedExpr] (id: 9);
 
-  /**
-   * Code range of the parameter.
-   */
+  /// Code range of the parameter.
   codeRange:CodeRange (id: 7);
 
-  /**
-   * If the parameter has a default value, the source text of the constant
-   * expression in the default value.  Otherwise the empty string.
-   */
+  /// If the parameter has a default value, the source text of the constant
+  /// expression in the default value.  Otherwise the empty string.
   defaultValueCode:string (id: 13);
 
-  /**
-   * If this parameter's type is inferable, nonzero slot id identifying which
-   * entry in [LinkedLibrary.types] contains the inferred type.  If there is no
-   * matching entry in [LinkedLibrary.types], then no type was inferred for
-   * this variable, so its static type is `dynamic`.
-   *
-   * Note that although strong mode considers initializing formals to be
-   * inferable, they are not marked as such in the summary; if their type is
-   * not specified, they always inherit the static type of the corresponding
-   * field.
-   */
+  /// If this parameter's type is inferable, nonzero slot id identifying which
+  /// entry in [LinkedLibrary.types] contains the inferred type.  If there is no
+  /// matching entry in [LinkedLibrary.types], then no type was inferred for
+  /// this variable, so its static type is `dynamic`.
+  ///
+  /// Note that although strong mode considers initializing formals to be
+  /// inferable, they are not marked as such in the summary; if their type is
+  /// not specified, they always inherit the static type of the corresponding
+  /// field.
   inferredTypeSlot:uint (id: 2);
 
-  /**
-   * If this is a parameter of an instance method, a nonzero slot id which is
-   * unique within this compilation unit.  If this id is found in
-   * [LinkedUnit.parametersInheritingCovariant], then this parameter inherits
-   * `@covariant` behavior from a base class.
-   *
-   * Otherwise, zero.
-   */
+  /// If this is a parameter of an instance method, a nonzero slot id which is
+  /// unique within this compilation unit.  If this id is found in
+  /// [LinkedUnit.parametersInheritingCovariant], then this parameter inherits
+  /// `@covariant` behavior from a base class.
+  ///
+  /// Otherwise, zero.
   inheritsCovariantSlot:uint (id: 14);
 
-  /**
-   * The synthetic initializer function of the parameter.  Absent if the
-   * variable does not have an initializer.
-   */
+  /// The synthetic initializer function of the parameter.  Absent if the
+  /// variable does not have an initializer.
   initializer:UnlinkedExecutable (id: 12);
 
-  /**
-   * Indicates whether this parameter is explicitly marked as being covariant.
-   */
+  /// Indicates whether this parameter is explicitly marked as being covariant.
   isExplicitlyCovariant:bool (id: 15);
 
-  /**
-   * Indicates whether the parameter is declared using the `final` keyword.
-   */
+  /// Indicates whether the parameter is declared using the `final` keyword.
   isFinal:bool (id: 16);
 
-  /**
-   * Indicates whether this is a function-typed parameter. A parameter is
-   * function-typed if the declaration of the parameter has explicit formal
-   * parameters
-   * ```
-   * int functionTyped(int p)
-   * ```
-   * but is not function-typed if it does not, even if the type of the parameter
-   * is a function type.
-   */
+  /// Indicates whether this is a function-typed parameter. A parameter is
+  /// function-typed if the declaration of the parameter has explicit formal
+  /// parameters
+  /// ```
+  /// int functionTyped(int p)
+  /// ```
+  /// but is not function-typed if it does not, even if the type of the
+  /// parameter is a function type.
   isFunctionTyped:bool (id: 5);
 
-  /**
-   * Indicates whether this is an initializing formal parameter (i.e. it is
-   * declared using `this.` syntax).
-   */
+  /// Indicates whether this is an initializing formal parameter (i.e. it is
+  /// declared using `this.` syntax).
   isInitializingFormal:bool (id: 6);
 
-  /**
-   * Kind of the parameter.
-   */
+  /// Kind of the parameter.
   kind:UnlinkedParamKind (id: 4);
 
-  /**
-   * Name of the parameter.
-   */
+  /// Name of the parameter.
   name:string (id: 0);
 
-  /**
-   * Offset of the parameter name relative to the beginning of the file.
-   */
+  /// Offset of the parameter name relative to the beginning of the file.
   nameOffset:uint (id: 1);
 
-  /**
-   * If [isFunctionTyped] is `true`, the parameters of the function type.
-   */
+  /// If [isFunctionTyped] is `true`, the parameters of the function type.
   parameters:[UnlinkedParam] (id: 8);
 
-  /**
-   * If [isFunctionTyped] is `true`, the declared return type.  If
-   * [isFunctionTyped] is `false`, the declared type.  Absent if the type is
-   * implicit.
-   */
+  /// If [isFunctionTyped] is `true`, the declared return type.  If
+  /// [isFunctionTyped] is `false`, the declared type.  Absent if the type is
+  /// implicit.
   type:EntityRef (id: 3);
 
-  /**
-   * The length of the visible range.
-   */
+  /// The length of the visible range.
   visibleLength:uint (id: 10);
 
-  /**
-   * The beginning of the visible range.
-   */
+  /// The beginning of the visible range.
   visibleOffset:uint (id: 11);
 }
 
-/**
- * Unlinked summary information about a part declaration.
- */
+/// Unlinked summary information about a part declaration.
 table UnlinkedPart {
-  /**
-   * Annotations for this part declaration.
-   */
+  /// Annotations for this part declaration.
   annotations:[UnlinkedExpr] (id: 2);
 
-  /**
-   * End of the URI string (including quotes) relative to the beginning of the
-   * file.
-   */
+  /// End of the URI string (including quotes) relative to the beginning of the
+  /// file.
   uriEnd:uint (id: 0);
 
-  /**
-   * Offset of the URI string (including quotes) relative to the beginning of
-   * the file.
-   */
+  /// Offset of the URI string (including quotes) relative to the beginning of
+  /// the file.
   uriOffset:uint (id: 1);
 }
 
-/**
- * Unlinked summary information about a specific name contributed by a
- * compilation unit to a library's public namespace.
- *
- * TODO(paulberry): some of this information is redundant with information
- * elsewhere in the summary.  Consider reducing the redundancy to reduce
- * summary size.
- */
+/// Unlinked summary information about a specific name contributed by a
+/// compilation unit to a library's public namespace.
+///
+/// TODO(paulberry): some of this information is redundant with information
+/// elsewhere in the summary.  Consider reducing the redundancy to reduce
+/// summary size.
 table UnlinkedPublicName {
-  /**
-   * The kind of object referred to by the name.
-   */
+  /// The kind of object referred to by the name.
   kind:ReferenceKind (id: 1);
 
-  /**
-   * If this [UnlinkedPublicName] is a class, the list of members which can be
-   * referenced statically - static fields, static methods, and constructors.
-   * Otherwise empty.
-   *
-   * Unnamed constructors are not included since they do not constitute a
-   * separate name added to any namespace.
-   */
+  /// If this [UnlinkedPublicName] is a class, the list of members which can be
+  /// referenced statically - static fields, static methods, and constructors.
+  /// Otherwise empty.
+  ///
+  /// Unnamed constructors are not included since they do not constitute a
+  /// separate name added to any namespace.
   members:[UnlinkedPublicName] (id: 2);
 
-  /**
-   * The name itself.
-   */
+  /// The name itself.
   name:string (id: 0);
 
-  /**
-   * If the entity being referred to is generic, the number of type parameters
-   * it accepts.  Otherwise zero.
-   */
+  /// If the entity being referred to is generic, the number of type parameters
+  /// it accepts.  Otherwise zero.
   numTypeParameters:uint (id: 3);
 }
 
-/**
- * Unlinked summary information about what a compilation unit contributes to a
- * library's public namespace.  This is the subset of [UnlinkedUnit] that is
- * required from dependent libraries in order to perform prelinking.
- */
+/// Unlinked summary information about what a compilation unit contributes to a
+/// library's public namespace.  This is the subset of [UnlinkedUnit] that is
+/// required from dependent libraries in order to perform prelinking.
 table UnlinkedPublicNamespace {
-  /**
-   * Export declarations in the compilation unit.
-   */
+  /// Export declarations in the compilation unit.
   exports:[UnlinkedExportPublic] (id: 2);
 
-  /**
-   * Public names defined in the compilation unit.
-   *
-   * TODO(paulberry): consider sorting these names to reduce unnecessary
-   * relinking.
-   */
+  /// Public names defined in the compilation unit.
+  ///
+  /// TODO(paulberry): consider sorting these names to reduce unnecessary
+  /// relinking.
   names:[UnlinkedPublicName] (id: 0);
 
-  /**
-   * URIs referenced by part declarations in the compilation unit.
-   */
+  /// URIs referenced by part declarations in the compilation unit.
   parts:[string] (id: 1);
 }
 
-/**
- * Unlinked summary information about a name referred to in one library that
- * might be defined in another.
- */
+/// Unlinked summary information about a name referred to in one library that
+/// might be defined in another.
 table UnlinkedReference {
-  /**
-   * Name of the entity being referred to.  For the pseudo-type `dynamic`, the
-   * string is "dynamic".  For the pseudo-type `void`, the string is "void".
-   * For the pseudo-type `bottom`, the string is "*bottom*".
-   */
+  /// Name of the entity being referred to.  For the pseudo-type `dynamic`, the
+  /// string is "dynamic".  For the pseudo-type `void`, the string is "void".
+  /// For the pseudo-type `bottom`, the string is "*bottom*".
   name:string (id: 0);
 
-  /**
-   * Prefix used to refer to the entity, or zero if no prefix is used.  This is
-   * an index into [UnlinkedUnit.references].
-   *
-   * Prefix references must always point backward; that is, for all i, if
-   * UnlinkedUnit.references[i].prefixReference != 0, then
-   * UnlinkedUnit.references[i].prefixReference < i.
-   */
+  /// Prefix used to refer to the entity, or zero if no prefix is used.  This is
+  /// an index into [UnlinkedUnit.references].
+  ///
+  /// Prefix references must always point backward; that is, for all i, if
+  /// UnlinkedUnit.references[i].prefixReference != 0, then
+  /// UnlinkedUnit.references[i].prefixReference < i.
   prefixReference:uint (id: 1);
 }
 
-/**
- * Unlinked summary information about a typedef declaration.
- */
+/// Unlinked summary information about a typedef declaration.
 table UnlinkedTypedef {
-  /**
-   * Annotations for this typedef.
-   */
+  /// Annotations for this typedef.
   annotations:[UnlinkedExpr] (id: 4);
 
-  /**
-   * Code range of the typedef.
-   */
+  /// Code range of the typedef.
   codeRange:CodeRange (id: 7);
 
-  /**
-   * Documentation comment for the typedef, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the typedef, or `null` if there is no
+  /// documentation comment.
   documentationComment:UnlinkedDocumentationComment (id: 6);
 
-  /**
-   * Name of the typedef.
-   */
+  /// Name of the typedef.
   name:string (id: 0);
 
-  /**
-   * Offset of the typedef name relative to the beginning of the file.
-   */
+  /// Offset of the typedef name relative to the beginning of the file.
   nameOffset:uint (id: 1);
 
-  /**
-   * Parameters of the executable, if any.
-   */
+  /// Parameters of the executable, if any.
   parameters:[UnlinkedParam] (id: 3);
 
-  /**
-   * If [style] is [TypedefStyle.functionType], the return type of the typedef.
-   * If [style] is [TypedefStyle.genericFunctionType], the function type being
-   * defined.
-   */
+  /// If [style] is [TypedefStyle.functionType], the return type of the typedef.
+  /// If [style] is [TypedefStyle.genericFunctionType], the function type being
+  /// defined.
   returnType:EntityRef (id: 2);
 
-  /**
-   * The style of the typedef.
-   */
+  /// The style of the typedef.
   style:TypedefStyle (id: 8);
 
-  /**
-   * Type parameters of the typedef, if any.
-   */
+  /// Type parameters of the typedef, if any.
   typeParameters:[UnlinkedTypeParam] (id: 5);
 }
 
-/**
- * Unlinked summary information about a type parameter declaration.
- */
+/// Unlinked summary information about a type parameter declaration.
 table UnlinkedTypeParam {
-  /**
-   * Annotations for this type parameter.
-   */
+  /// Annotations for this type parameter.
   annotations:[UnlinkedExpr] (id: 3);
 
-  /**
-   * Bound of the type parameter, if a bound is explicitly declared.  Otherwise
-   * null.
-   */
+  /// Bound of the type parameter, if a bound is explicitly declared.  Otherwise
+  /// null.
   bound:EntityRef (id: 2);
 
-  /**
-   * Code range of the type parameter.
-   */
+  /// Code range of the type parameter.
   codeRange:CodeRange (id: 4);
 
-  /**
-   * Name of the type parameter.
-   */
+  /// Name of the type parameter.
   name:string (id: 0);
 
-  /**
-   * Offset of the type parameter name relative to the beginning of the file.
-   */
+  /// Offset of the type parameter name relative to the beginning of the file.
   nameOffset:uint (id: 1);
 }
 
-/**
- * Unlinked summary information about a compilation unit ("part file").
- */
+/// Unlinked summary information about a compilation unit ("part file").
 table UnlinkedUnit {
-  /**
-   * MD5 hash of the non-informative fields of the [UnlinkedUnit] (not
-   * including this one) as 16 unsigned 8-bit integer values.  This can be used
-   * to identify when the API of a unit may have changed.
-   */
+  /// MD5 hash of the non-informative fields of the [UnlinkedUnit] (not
+  /// including this one) as 16 unsigned 8-bit integer values.  This can be used
+  /// to identify when the API of a unit may have changed.
   apiSignature:[uint] (id: 19);
 
-  /**
-   * Classes declared in the compilation unit.
-   */
+  /// Classes declared in the compilation unit.
   classes:[UnlinkedClass] (id: 2);
 
-  /**
-   * Code range of the unit.
-   */
+  /// Code range of the unit.
   codeRange:CodeRange (id: 15);
 
-  /**
-   * Enums declared in the compilation unit.
-   */
+  /// Enums declared in the compilation unit.
   enums:[UnlinkedEnum] (id: 12);
 
-  /**
-   * Top level executable objects (functions, getters, and setters) declared in
-   * the compilation unit.
-   */
+  /// Top level executable objects (functions, getters, and setters) declared in
+  /// the compilation unit.
   executables:[UnlinkedExecutable] (id: 4);
 
-  /**
-   * Export declarations in the compilation unit.
-   */
+  /// Export declarations in the compilation unit.
   exports:[UnlinkedExportNonPublic] (id: 13);
 
-  /**
-   * If this compilation unit was summarized in fallback mode, the path where
-   * the compilation unit may be found on disk.  Otherwise empty.
-   *
-   * When this field is non-empty, all other fields in the data structure have
-   * their default values.
-   */
+  /// If this compilation unit was summarized in fallback mode, the path where
+  /// the compilation unit may be found on disk.  Otherwise empty.
+  ///
+  /// When this field is non-empty, all other fields in the data structure have
+  /// their default values.
   fallbackModePath:string (id: 16, deprecated);
 
-  /**
-   * Import declarations in the compilation unit.
-   */
+  /// Import declarations in the compilation unit.
   imports:[UnlinkedImport] (id: 5);
 
-  /**
-   * Indicates whether the unit contains a "part of" declaration.
-   */
+  /// Indicates whether the unit contains a "part of" declaration.
   isPartOf:bool (id: 18);
 
-  /**
-   * Annotations for the library declaration, or the empty list if there is no
-   * library declaration.
-   */
+  /// Annotations for the library declaration, or the empty list if there is no
+  /// library declaration.
   libraryAnnotations:[UnlinkedExpr] (id: 14);
 
-  /**
-   * Documentation comment for the library, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the library, or `null` if there is no
+  /// documentation comment.
   libraryDocumentationComment:UnlinkedDocumentationComment (id: 9);
 
-  /**
-   * Name of the library (from a "library" declaration, if present).
-   */
+  /// Name of the library (from a "library" declaration, if present).
   libraryName:string (id: 6);
 
-  /**
-   * Length of the library name as it appears in the source code (or 0 if the
-   * library has no name).
-   */
+  /// Length of the library name as it appears in the source code (or 0 if the
+  /// library has no name).
   libraryNameLength:uint (id: 7);
 
-  /**
-   * Offset of the library name relative to the beginning of the file (or 0 if
-   * the library has no name).
-   */
+  /// Offset of the library name relative to the beginning of the file (or 0 if
+  /// the library has no name).
   libraryNameOffset:uint (id: 8);
 
-  /**
-   * Offsets of the first character of each line in the source code.
-   */
+  /// Offsets of the first character of each line in the source code.
   lineStarts:[uint] (id: 17);
 
-  /**
-   * Mixins declared in the compilation unit.
-   */
+  /// Mixins declared in the compilation unit.
   mixins:[UnlinkedClass] (id: 20);
 
-  /**
-   * Part declarations in the compilation unit.
-   */
+  /// Part declarations in the compilation unit.
   parts:[UnlinkedPart] (id: 11);
 
-  /**
-   * Unlinked public namespace of this compilation unit.
-   */
+  /// Unlinked public namespace of this compilation unit.
   publicNamespace:UnlinkedPublicNamespace (id: 0);
 
-  /**
-   * Top level and prefixed names referred to by this compilation unit.  The
-   * zeroth element of this array is always populated and is used to represent
-   * the absence of a reference in places where a reference is optional (for
-   * example [UnlinkedReference.prefixReference or
-   * UnlinkedImport.prefixReference]).
-   */
+  /// Top level and prefixed names referred to by this compilation unit.  The
+  /// zeroth element of this array is always populated and is used to represent
+  /// the absence of a reference in places where a reference is optional (for
+  /// example [UnlinkedReference.prefixReference or
+  /// UnlinkedImport.prefixReference]).
   references:[UnlinkedReference] (id: 1);
 
-  /**
-   * Typedefs declared in the compilation unit.
-   */
+  /// Typedefs declared in the compilation unit.
   typedefs:[UnlinkedTypedef] (id: 10);
 
-  /**
-   * Top level variables declared in the compilation unit.
-   */
+  /// Top level variables declared in the compilation unit.
   variables:[UnlinkedVariable] (id: 3);
 }
 
-/**
- * Unlinked summary information about a top level variable, local variable, or
- * a field.
- */
+/// Unlinked summary information about a top level variable, local variable, or
+/// a field.
 table UnlinkedVariable {
-  /**
-   * Annotations for this variable.
-   */
+  /// Annotations for this variable.
   annotations:[UnlinkedExpr] (id: 8);
 
-  /**
-   * Code range of the variable.
-   */
+  /// Code range of the variable.
   codeRange:CodeRange (id: 5);
 
-  /**
-   * Documentation comment for the variable, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the variable, or `null` if there is no
+  /// documentation comment.
   documentationComment:UnlinkedDocumentationComment (id: 10);
 
-  /**
-   * If this variable is inferable, nonzero slot id identifying which entry in
-   * [LinkedLibrary.types] contains the inferred type for this variable.  If
-   * there is no matching entry in [LinkedLibrary.types], then no type was
-   * inferred for this variable, so its static type is `dynamic`.
-   */
+  /// If this variable is inferable, nonzero slot id identifying which entry in
+  /// [LinkedLibrary.types] contains the inferred type for this variable.  If
+  /// there is no matching entry in [LinkedLibrary.types], then no type was
+  /// inferred for this variable, so its static type is `dynamic`.
   inferredTypeSlot:uint (id: 9);
 
-  /**
-   * If this is an instance non-final field, a nonzero slot id which is unique
-   * within this compilation unit.  If this id is found in
-   * [LinkedUnit.parametersInheritingCovariant], then the parameter of the
-   * synthetic setter inherits `@covariant` behavior from a base class.
-   *
-   * Otherwise, zero.
-   */
+  /// If this is an instance non-final field, a nonzero slot id which is unique
+  /// within this compilation unit.  If this id is found in
+  /// [LinkedUnit.parametersInheritingCovariant], then the parameter of the
+  /// synthetic setter inherits `@covariant` behavior from a base class.
+  ///
+  /// Otherwise, zero.
   inheritsCovariantSlot:uint (id: 15);
 
-  /**
-   * The synthetic initializer function of the variable.  Absent if the variable
-   * does not have an initializer.
-   */
+  /// The synthetic initializer function of the variable.  Absent if the
+  /// variable does not have an initializer.
   initializer:UnlinkedExecutable (id: 13);
 
-  /**
-   * Indicates whether the variable is declared using the `const` keyword.
-   */
+  /// Indicates whether the variable is declared using the `const` keyword.
   isConst:bool (id: 6);
 
-  /**
-   * Indicates whether this variable is declared using the `covariant` keyword.
-   * This should be false for everything except instance fields.
-   */
+  /// Indicates whether this variable is declared using the `covariant` keyword.
+  /// This should be false for everything except instance fields.
   isCovariant:bool (id: 14);
 
-  /**
-   * Indicates whether the variable is declared using the `final` keyword.
-   */
+  /// Indicates whether the variable is declared using the `final` keyword.
   isFinal:bool (id: 7);
 
-  /**
-   * Indicates whether the variable is declared using the `static` keyword.
-   *
-   * Note that for top level variables, this flag is false, since they are not
-   * declared using the `static` keyword (even though they are considered
-   * static for semantic purposes).
-   */
+  /// Indicates whether the variable is declared using the `static` keyword.
+  ///
+  /// Note that for top level variables, this flag is false, since they are not
+  /// declared using the `static` keyword (even though they are considered
+  /// static for semantic purposes).
   isStatic:bool (id: 4);
 
-  /**
-   * Name of the variable.
-   */
+  /// Name of the variable.
   name:string (id: 0);
 
-  /**
-   * Offset of the variable name relative to the beginning of the file.
-   */
+  /// Offset of the variable name relative to the beginning of the file.
   nameOffset:uint (id: 1);
 
-  /**
-   * If this variable is propagable, nonzero slot id identifying which entry in
-   * [LinkedLibrary.types] contains the propagated type for this variable.  If
-   * there is no matching entry in [LinkedLibrary.types], then this variable's
-   * propagated type is the same as its declared type.
-   *
-   * Non-propagable variables have a [propagatedTypeSlot] of zero.
-   */
+  /// If this variable is propagable, nonzero slot id identifying which entry in
+  /// [LinkedLibrary.types] contains the propagated type for this variable.  If
+  /// there is no matching entry in [LinkedLibrary.types], then this variable's
+  /// propagated type is the same as its declared type.
+  ///
+  /// Non-propagable variables have a [propagatedTypeSlot] of zero.
   propagatedTypeSlot:uint (id: 2);
 
-  /**
-   * Declared type of the variable.  Absent if the type is implicit.
-   */
+  /// Declared type of the variable.  Absent if the type is implicit.
   type:EntityRef (id: 3);
 
-  /**
-   * If a local variable, the length of the visible range; zero otherwise.
-   */
+  /// If a local variable, the length of the visible range; zero otherwise.
   visibleLength:uint (id: 11, deprecated);
 
-  /**
-   * If a local variable, the beginning of the visible range; zero otherwise.
-   */
+  /// If a local variable, the beginning of the visible range; zero otherwise.
   visibleOffset:uint (id: 12, deprecated);
 }
 
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 4a9640c..01c2a7c 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -2,43 +2,41 @@
 // for 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 is an "idl" style description of the summary format.  It
- * contains abstract classes which declare the interface for reading data from
- * summaries.  It is parsed and transformed into code that implements the
- * summary format.
- *
- * The code generation process introduces the following semantics:
- * - Getters of type List never return null, and have a default value of the
- *   empty list.
- * - Getters of type int return unsigned 32-bit integers, never null, and have
- *   a default value of zero.
- * - Getters of type String never return null, and have a default value of ''.
- * - Getters of type bool never return null, and have a default value of false.
- * - Getters whose type is an enum never return null, and have a default value
- *   of the first value declared in the enum.
- *
- * Terminology used in this document:
- * - "Unlinked" refers to information that can be determined from reading a
- *   single .dart file in isolation.
- * - "Prelinked" refers to information that can be determined from the defining
- *   compilation unit of a library, plus direct imports, plus the transitive
- *   closure of exports reachable from those libraries, plus all part files
- *   constituting those libraries.
- * - "Linked" refers to all other information; in theory, this information may
- *   depend on all files in the transitive import/export closure.  However, in
- *   practice we expect that the number of additional dependencies will usually
- *   be small, since the additional dependencies only need to be consulted for
- *   type propagation, type inference, and constant evaluation, which typically
- *   have short dependency chains.
- *
- * Since we expect "linked" and "prelinked" dependencies to be similar, we only
- * rarely distinguish between them; most information is that is not "unlinked"
- * is typically considered "linked" for simplicity.
- *
- * Except as otherwise noted, synthetic elements are not stored in the summary;
- * they are re-synthesized at the time the summary is read.
- */
+/// This file is an "idl" style description of the summary format.  It
+/// contains abstract classes which declare the interface for reading data from
+/// summaries.  It is parsed and transformed into code that implements the
+/// summary format.
+///
+/// The code generation process introduces the following semantics:
+/// - Getters of type List never return null, and have a default value of the
+///   empty list.
+/// - Getters of type int return unsigned 32-bit integers, never null, and have
+///   a default value of zero.
+/// - Getters of type String never return null, and have a default value of ''.
+/// - Getters of type bool never return null, and have a default value of false.
+/// - Getters whose type is an enum never return null, and have a default value
+///   of the first value declared in the enum.
+///
+/// Terminology used in this document:
+/// - "Unlinked" refers to information that can be determined from reading a
+///   single .dart file in isolation.
+/// - "Prelinked" refers to information that can be determined from the defining
+///   compilation unit of a library, plus direct imports, plus the transitive
+///   closure of exports reachable from those libraries, plus all part files
+///   constituting those libraries.
+/// - "Linked" refers to all other information; in theory, this information may
+///   depend on all files in the transitive import/export closure.  However, in
+///   practice we expect that the number of additional dependencies will usually
+///   be small, since the additional dependencies only need to be consulted for
+///   type propagation, type inference, and constant evaluation, which typically
+///   have short dependency chains.
+///
+/// Since we expect "linked" and "prelinked" dependencies to be similar, we only
+/// rarely distinguish between them; most information is that is not "unlinked"
+/// is typically considered "linked" for simplicity.
+///
+/// Except as otherwise noted, synthetic elements are not stored in the summary;
+/// they are re-synthesized at the time the summary is read.
 library analyzer.tool.summary.idl;
 
 import 'package:analyzer/dart/element/element.dart';
@@ -47,1192 +45,869 @@
 import 'base.dart' show Id, TopLevel;
 import 'format.dart' as generated;
 
-/**
- * Annotation describing information which is not part of Dart semantics; in
- * other words, if this information (or any information it refers to) changes,
- * static analysis and runtime behavior of the library are unaffected.
- *
- * Information that has purely local effect (in other words, it does not affect
- * the API of the code being analyzed) is also marked as `informative`.
- */
+/// Annotation describing information which is not part of Dart semantics; in
+/// other words, if this information (or any information it refers to) changes,
+/// static analysis and runtime behavior of the library are unaffected.
+///
+/// Information that has purely local effect (in other words, it does not affect
+/// the API of the code being analyzed) is also marked as `informative`.
 const informative = null;
 
-/**
- * Information about the context of an exception in analysis driver.
- */
+/// Information about the context of an exception in analysis driver.
 @TopLevel('ADEC')
 abstract class AnalysisDriverExceptionContext extends base.SummaryClass {
   factory AnalysisDriverExceptionContext.fromBuffer(List<int> buffer) =>
       generated.readAnalysisDriverExceptionContext(buffer);
 
-  /**
-   * The exception string.
-   */
+  /// The exception string.
   @Id(1)
   String get exception;
 
-  /**
-   * The state of files when the exception happened.
-   */
+  /// The state of files when the exception happened.
   @Id(3)
   List<AnalysisDriverExceptionFile> get files;
 
-  /**
-   * The path of the file being analyzed when the exception happened.
-   */
+  /// The path of the file being analyzed when the exception happened.
   @Id(0)
   String get path;
 
-  /**
-   * The exception stack trace string.
-   */
+  /// The exception stack trace string.
   @Id(2)
   String get stackTrace;
 }
 
-/**
- * Information about a single file in [AnalysisDriverExceptionContext].
- */
+/// Information about a single file in [AnalysisDriverExceptionContext].
 abstract class AnalysisDriverExceptionFile extends base.SummaryClass {
-  /**
-   * The content of the file.
-   */
+  /// The content of the file.
   @Id(1)
   String get content;
 
-  /**
-   * The path of the file.
-   */
+  /// The path of the file.
   @Id(0)
   String get path;
 }
 
-/**
- * Information about a resolved unit.
- */
+/// Information about a resolved unit.
 @TopLevel('ADRU')
 abstract class AnalysisDriverResolvedUnit extends base.SummaryClass {
   factory AnalysisDriverResolvedUnit.fromBuffer(List<int> buffer) =>
       generated.readAnalysisDriverResolvedUnit(buffer);
 
-  /**
-   * The full list of analysis errors, both syntactic and semantic.
-   */
+  /// The full list of analysis errors, both syntactic and semantic.
   @Id(0)
   List<AnalysisDriverUnitError> get errors;
 
-  /**
-   * The index of the unit.
-   */
+  /// The index of the unit.
   @Id(1)
   AnalysisDriverUnitIndex get index;
 }
 
-/**
- * Information about a subtype of one or more classes.
- */
+/// Information about a subtype of one or more classes.
 abstract class AnalysisDriverSubtype extends base.SummaryClass {
-  /**
-   * The names of defined instance members.
-   * They are indexes into [AnalysisDriverUnitError.strings] list.
-   * The list is sorted in ascending order.
-   */
+  /// The names of defined instance members.
+  /// They are indexes into [AnalysisDriverUnitError.strings] list.
+  /// The list is sorted in ascending order.
   @Id(1)
   List<int> get members;
 
-  /**
-   * The name of the class.
-   * It is an index into [AnalysisDriverUnitError.strings] list.
-   */
+  /// The name of the class.
+  /// It is an index into [AnalysisDriverUnitError.strings] list.
   @Id(0)
   int get name;
 }
 
-/**
- * Information about an error in a resolved unit.
- */
+/// Information about an error in a resolved unit.
 abstract class AnalysisDriverUnitError extends base.SummaryClass {
-  /**
-   * The optional correction hint for the error.
-   */
+  /// The optional correction hint for the error.
   @Id(4)
   String get correction;
 
-  /**
-   * The length of the error in the file.
-   */
+  /// The length of the error in the file.
   @Id(1)
   int get length;
 
-  /**
-   * The message of the error.
-   */
+  /// The message of the error.
   @Id(3)
   String get message;
 
-  /**
-   * The offset from the beginning of the file.
-   */
+  /// The offset from the beginning of the file.
   @Id(0)
   int get offset;
 
-  /**
-   * The unique name of the error code.
-   */
+  /// The unique name of the error code.
   @Id(2)
   String get uniqueName;
 }
 
-/**
- * Information about a resolved unit.
- */
+/// Information about a resolved unit.
 @TopLevel('ADUI')
 abstract class AnalysisDriverUnitIndex extends base.SummaryClass {
   factory AnalysisDriverUnitIndex.fromBuffer(List<int> buffer) =>
       generated.readAnalysisDriverUnitIndex(buffer);
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the kind of the synthetic element.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the kind of the synthetic element.
   @Id(4)
   List<IndexSyntheticElementKind> get elementKinds;
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the class member element name, or `null` if the element
-   * is a top-level element.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this index.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the class member element name, or `null` if the element
+  /// is a top-level element.  The list is sorted in ascending order, so that
+  /// the client can quickly check whether an element is referenced in this
+  /// index.
   @Id(7)
   List<int> get elementNameClassMemberIds;
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the named parameter name, or `null` if the element is not
-   * a named parameter.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this index.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the named parameter name, or `null` if the element is
+  /// not a named parameter.  The list is sorted in ascending order, so that the
+  /// client can quickly check whether an element is referenced in this index.
   @Id(8)
   List<int> get elementNameParameterIds;
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the top-level element name, or `null` if the element is
-   * the unit.  The list is sorted in ascending order, so that the client can
-   * quickly check whether an element is referenced in this index.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the top-level element name, or `null` if the element is
+  /// the unit.  The list is sorted in ascending order, so that the client can
+  /// quickly check whether an element is referenced in this index.
   @Id(6)
   List<int> get elementNameUnitMemberIds;
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the index into [unitLibraryUris] and [unitUnitUris] for the library
-   * specific unit where the element is declared.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the index into [unitLibraryUris] and [unitUnitUris] for the library
+  /// specific unit where the element is declared.
   @Id(5)
   List<int> get elementUnits;
 
-  /**
-   * Identifier of the null string in [strings].
-   */
+  /// Identifier of the null string in [strings].
   @Id(1)
   int get nullStringId;
 
-  /**
-   * List of unique element strings used in this index.  The list is sorted in
-   * ascending order, so that the client can quickly check the presence of a
-   * string in this index.
-   */
+  /// List of unique element strings used in this index.  The list is sorted in
+  /// ascending order, so that the client can quickly check the presence of a
+  /// string in this index.
   @Id(0)
   List<String> get strings;
 
-  /**
-   * The list of classes declared in the unit.
-   */
+  /// The list of classes declared in the unit.
   @Id(19)
   List<AnalysisDriverSubtype> get subtypes;
 
-  /**
-   * The identifiers of supertypes of elements at corresponding indexes
-   * in [subtypes].  They are indexes into [strings] list. The list is sorted
-   * in ascending order.  There might be more than one element with the same
-   * value if there is more than one subtype of this supertype.
-   */
+  /// The identifiers of supertypes of elements at corresponding indexes
+  /// in [subtypes].  They are indexes into [strings] list. The list is sorted
+  /// in ascending order.  There might be more than one element with the same
+  /// value if there is more than one subtype of this supertype.
   @Id(18)
   List<int> get supertypes;
 
-  /**
-   * Each item of this list corresponds to the library URI of a unique library
-   * specific unit referenced in the index.  It is an index into [strings] list.
-   */
+  /// Each item of this list corresponds to the library URI of a unique library
+  /// specific unit referenced in the index.  It is an index into [strings]
+  /// list.
   @Id(2)
   List<int> get unitLibraryUris;
 
-  /**
-   * Each item of this list corresponds to the unit URI of a unique library
-   * specific unit referenced in the index.  It is an index into [strings] list.
-   */
+  /// Each item of this list corresponds to the unit URI of a unique library
+  /// specific unit referenced in the index.  It is an index into [strings]
+  /// list.
   @Id(3)
   List<int> get unitUnitUris;
 
-  /**
-   * Each item of this list is the `true` if the corresponding element usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding element usage
+  /// is qualified with some prefix.
   @Id(13)
   List<bool> get usedElementIsQualifiedFlags;
 
-  /**
-   * Each item of this list is the kind of the element usage.
-   */
+  /// Each item of this list is the kind of the element usage.
   @Id(10)
   List<IndexRelationKind> get usedElementKinds;
 
-  /**
-   * Each item of this list is the length of the element usage.
-   */
+  /// Each item of this list is the length of the element usage.
   @Id(12)
   List<int> get usedElementLengths;
 
-  /**
-   * Each item of this list is the offset of the element usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the element usage relative to the
+  /// beginning of the file.
   @Id(11)
   List<int> get usedElementOffsets;
 
-  /**
-   * Each item of this list is the index into [elementUnits],
-   * [elementNameUnitMemberIds], [elementNameClassMemberIds] and
-   * [elementNameParameterIds].  The list is sorted in ascending order, so
-   * that the client can quickly find element references in this index.
-   */
+  /// Each item of this list is the index into [elementUnits],
+  /// [elementNameUnitMemberIds], [elementNameClassMemberIds] and
+  /// [elementNameParameterIds].  The list is sorted in ascending order, so
+  /// that the client can quickly find element references in this index.
   @Id(9)
   List<int> get usedElements;
 
-  /**
-   * Each item of this list is the `true` if the corresponding name usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding name usage
+  /// is qualified with some prefix.
   @Id(17)
   List<bool> get usedNameIsQualifiedFlags;
 
-  /**
-   * Each item of this list is the kind of the name usage.
-   */
+  /// Each item of this list is the kind of the name usage.
   @Id(15)
   List<IndexRelationKind> get usedNameKinds;
 
-  /**
-   * Each item of this list is the offset of the name usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the name usage relative to the
+  /// beginning of the file.
   @Id(16)
   List<int> get usedNameOffsets;
 
-  /**
-   * Each item of this list is the index into [strings] for a used name.  The
-   * list is sorted in ascending order, so that the client can quickly find
-   * whether a name is used in this index.
-   */
+  /// Each item of this list is the index into [strings] for a used name.  The
+  /// list is sorted in ascending order, so that the client can quickly find
+  /// whether a name is used in this index.
   @Id(14)
   List<int> get usedNames;
 }
 
-/**
- * Information about an unlinked unit.
- */
+/// Information about an unlinked unit.
 @TopLevel('ADUU')
 abstract class AnalysisDriverUnlinkedUnit extends base.SummaryClass {
   factory AnalysisDriverUnlinkedUnit.fromBuffer(List<int> buffer) =>
       generated.readAnalysisDriverUnlinkedUnit(buffer);
 
-  /**
-   * List of class member names defined by the unit.
-   */
+  /// List of class member names defined by the unit.
   @Id(3)
   List<String> get definedClassMemberNames;
 
-  /**
-   * List of top-level names defined by the unit.
-   */
+  /// List of top-level names defined by the unit.
   @Id(2)
   List<String> get definedTopLevelNames;
 
-  /**
-   * List of external names referenced by the unit.
-   */
+  /// List of external names referenced by the unit.
   @Id(0)
   List<String> get referencedNames;
 
-  /**
-   * List of names which are used in `extends`, `with` or `implements` clauses
-   * in the file. Import prefixes and type arguments are not included.
-   */
+  /// List of names which are used in `extends`, `with` or `implements` clauses
+  /// in the file. Import prefixes and type arguments are not included.
   @Id(4)
   List<String> get subtypedNames;
 
-  /**
-   * Unlinked information for the unit.
-   */
+  /// Unlinked information for the unit.
   @Id(1)
   UnlinkedUnit get unit;
 }
 
-/**
- * Information about an element code range.
- */
+/// Information about an element code range.
 abstract class CodeRange extends base.SummaryClass {
-  /**
-   * Length of the element code.
-   */
+  /// Length of the element code.
   @Id(1)
   int get length;
 
-  /**
-   * Offset of the element code relative to the beginning of the file.
-   */
+  /// Offset of the element code relative to the beginning of the file.
   @Id(0)
   int get offset;
 }
 
-/**
- * Summary information about a reference to an entity such as a type, top level
- * executable, or executable within a class.
- */
+/// Summary information about a reference to an entity such as a type, top level
+/// executable, or executable within a class.
 abstract class EntityRef extends base.SummaryClass {
-  /**
-   * The kind of entity being represented.
-   */
+  /// The kind of entity being represented.
   @Id(8)
   EntityRefKind get entityKind;
 
-  /**
-   * Notice: This will be deprecated. However, its not deprecated yet, as we're
-   * keeping it for backwards compatibilty, and marking it deprecated makes it
-   * unreadable.
-   *
-   * TODO(mfairhurst) mark this deprecated, and remove its logic.
-   *
-   * If this is a reference to a function type implicitly defined by a
-   * function-typed parameter, a list of zero-based indices indicating the path
-   * from the entity referred to by [reference] to the appropriate type
-   * parameter.  Otherwise the empty list.
-   *
-   * If there are N indices in this list, then the entity being referred to is
-   * the function type implicitly defined by a function-typed parameter of a
-   * function-typed parameter, to N levels of nesting.  The first index in the
-   * list refers to the outermost level of nesting; for example if [reference]
-   * refers to the entity defined by:
-   *
-   *     void f(x, void g(y, z, int h(String w))) { ... }
-   *
-   * Then to refer to the function type implicitly defined by parameter `h`
-   * (which is parameter 2 of parameter 1 of `f`), then
-   * [implicitFunctionTypeIndices] should be [1, 2].
-   *
-   * Note that if the entity being referred to is a generic method inside a
-   * generic class, then the type arguments in [typeArguments] are applied
-   * first to the class and then to the method.
-   */
+  /// Notice: This will be deprecated. However, its not deprecated yet, as we're
+  /// keeping it for backwards compatibilty, and marking it deprecated makes it
+  /// unreadable.
+  ///
+  /// TODO(mfairhurst) mark this deprecated, and remove its logic.
+  ///
+  /// If this is a reference to a function type implicitly defined by a
+  /// function-typed parameter, a list of zero-based indices indicating the path
+  /// from the entity referred to by [reference] to the appropriate type
+  /// parameter.  Otherwise the empty list.
+  ///
+  /// If there are N indices in this list, then the entity being referred to is
+  /// the function type implicitly defined by a function-typed parameter of a
+  /// function-typed parameter, to N levels of nesting.  The first index in the
+  /// list refers to the outermost level of nesting; for example if [reference]
+  /// refers to the entity defined by:
+  ///
+  ///     void f(x, void g(y, z, int h(String w))) { ... }
+  ///
+  /// Then to refer to the function type implicitly defined by parameter `h`
+  /// (which is parameter 2 of parameter 1 of `f`), then
+  /// [implicitFunctionTypeIndices] should be [1, 2].
+  ///
+  /// Note that if the entity being referred to is a generic method inside a
+  /// generic class, then the type arguments in [typeArguments] are applied
+  /// first to the class and then to the method.
   @Id(4)
   List<int> get implicitFunctionTypeIndices;
 
-  /**
-   * If this is a reference to a type parameter, one-based index into the list
-   * of [UnlinkedTypeParam]s currently in effect.  Indexing is done using De
-   * Bruijn index conventions; that is, innermost parameters come first, and
-   * if a class or method has multiple parameters, they are indexed from right
-   * to left.  So for instance, if the enclosing declaration is
-   *
-   *     class C<T,U> {
-   *       m<V,W> {
-   *         ...
-   *       }
-   *     }
-   *
-   * Then [paramReference] values of 1, 2, 3, and 4 represent W, V, U, and T,
-   * respectively.
-   *
-   * If the type being referred to is not a type parameter, [paramReference] is
-   * zero.
-   */
+  /// If this is a reference to a type parameter, one-based index into the list
+  /// of [UnlinkedTypeParam]s currently in effect.  Indexing is done using De
+  /// Bruijn index conventions; that is, innermost parameters come first, and
+  /// if a class or method has multiple parameters, they are indexed from right
+  /// to left.  So for instance, if the enclosing declaration is
+  ///
+  ///     class C<T,U> {
+  ///       m<V,W> {
+  ///         ...
+  ///       }
+  ///     }
+  ///
+  /// Then [paramReference] values of 1, 2, 3, and 4 represent W, V, U, and T,
+  /// respectively.
+  ///
+  /// If the type being referred to is not a type parameter, [paramReference] is
+  /// zero.
   @Id(3)
   int get paramReference;
 
-  /**
-   * Index into [UnlinkedUnit.references] for the entity being referred to, or
-   * zero if this is a reference to a type parameter.
-   */
+  /// Index into [UnlinkedUnit.references] for the entity being referred to, or
+  /// zero if this is a reference to a type parameter.
   @Id(0)
   int get reference;
 
-  /**
-   * If this [EntityRef] appears in a syntactic context where its type arguments
-   * might need to be inferred by a method other than instantiate-to-bounds,
-   * and [typeArguments] is empty, a slot id (which is unique within the
-   * compilation unit).  If an entry appears in [LinkedUnit.types] whose [slot]
-   * matches this value, that entry will contain the complete inferred type.
-   *
-   * This is called `refinedSlot` to clarify that if it points to an inferred
-   * type, it points to a type that is a "refinement" of this one (one in which
-   * some type arguments have been inferred).
-   */
+  /// If this [EntityRef] appears in a syntactic context where its type
+  /// arguments might need to be inferred by a method other than
+  /// instantiate-to-bounds, and [typeArguments] is empty, a slot id (which is
+  /// unique within the compilation unit).  If an entry appears in
+  /// [LinkedUnit.types] whose [slot] matches this value, that entry will
+  /// contain the complete inferred type.
+  ///
+  /// This is called `refinedSlot` to clarify that if it points to an inferred
+  /// type, it points to a type that is a "refinement" of this one (one in which
+  /// some type arguments have been inferred).
   @Id(9)
   int get refinedSlot;
 
-  /**
-   * If this [EntityRef] is contained within [LinkedUnit.types], slot id (which
-   * is unique within the compilation unit) identifying the target of type
-   * propagation or type inference with which this [EntityRef] is associated.
-   *
-   * Otherwise zero.
-   */
+  /// If this [EntityRef] is contained within [LinkedUnit.types], slot id (which
+  /// is unique within the compilation unit) identifying the target of type
+  /// propagation or type inference with which this [EntityRef] is associated.
+  ///
+  /// Otherwise zero.
   @Id(2)
   int get slot;
 
-  /**
-   * If this [EntityRef] is a reference to a function type whose
-   * [FunctionElement] is not in any library (e.g. a function type that was
-   * synthesized by a LUB computation), the function parameters.  Otherwise
-   * empty.
-   */
+  /// If this [EntityRef] is a reference to a function type whose
+  /// [FunctionElement] is not in any library (e.g. a function type that was
+  /// synthesized by a LUB computation), the function parameters.  Otherwise
+  /// empty.
   @Id(6)
   List<UnlinkedParam> get syntheticParams;
 
-  /**
-   * If this [EntityRef] is a reference to a function type whose
-   * [FunctionElement] is not in any library (e.g. a function type that was
-   * synthesized by a LUB computation), the return type of the function.
-   * Otherwise `null`.
-   */
+  /// If this [EntityRef] is a reference to a function type whose
+  /// [FunctionElement] is not in any library (e.g. a function type that was
+  /// synthesized by a LUB computation), the return type of the function.
+  /// Otherwise `null`.
   @Id(5)
   EntityRef get syntheticReturnType;
 
-  /**
-   * If this is an instantiation of a generic type or generic executable, the
-   * type arguments used to instantiate it (if any).
-   */
+  /// If this is an instantiation of a generic type or generic executable, the
+  /// type arguments used to instantiate it (if any).
   @Id(1)
   List<EntityRef> get typeArguments;
 
-  /**
-   * If this is a function type, the type parameters defined for the function
-   * type (if any).
-   */
+  /// If this is a function type, the type parameters defined for the function
+  /// type (if any).
   @Id(7)
   List<UnlinkedTypeParam> get typeParameters;
 }
 
-/**
- * Enum used to indicate the kind of an entity reference.
- */
+/// Enum used to indicate the kind of an entity reference.
 enum EntityRefKind {
-  /**
-   * The entity represents a named type.
-   */
+  /// The entity represents a named type.
   named,
 
-  /**
-   * The entity represents a generic function type.
-   */
+  /// The entity represents a generic function type.
   genericFunctionType,
 
-  /**
-   * The entity represents a function type that was synthesized by a LUB
-   * computation.
-   */
+  /// The entity represents a function type that was synthesized by a LUB
+  /// computation.
   syntheticFunction
 }
 
-/**
- * Enum used to indicate the kind of a name in index.
- */
+/// Enum used to indicate the kind of a name in index.
 enum IndexNameKind {
-  /**
-   * A top-level element.
-   */
+  /// A top-level element.
   topLevel,
 
-  /**
-   * A class member.
-   */
+  /// A class member.
   classMember
 }
 
-/**
- * Enum used to indicate the kind of an index relation.
- */
+/// Enum used to indicate the kind of an index relation.
 enum IndexRelationKind {
-  /**
-   * Left: class.
-   *   Is ancestor of (is extended or implemented, directly or indirectly).
-   * Right: other class declaration.
-   */
+  /// Left: class.
+  ///   Is ancestor of (is extended or implemented, directly or indirectly).
+  /// Right: other class declaration.
   IS_ANCESTOR_OF,
 
-  /**
-   * Left: class.
-   *   Is extended by.
-   * Right: other class declaration.
-   */
+  /// Left: class.
+  ///   Is extended by.
+  /// Right: other class declaration.
   IS_EXTENDED_BY,
 
-  /**
-   * Left: class.
-   *   Is implemented by.
-   * Right: other class declaration.
-   */
+  /// Left: class.
+  ///   Is implemented by.
+  /// Right: other class declaration.
   IS_IMPLEMENTED_BY,
 
-  /**
-   * Left: class.
-   *   Is mixed into.
-   * Right: other class declaration.
-   */
+  /// Left: class.
+  ///   Is mixed into.
+  /// Right: other class declaration.
   IS_MIXED_IN_BY,
 
-  /**
-   * Left: method, property accessor, function, variable.
-   *   Is invoked at.
-   * Right: location.
-   */
+  /// Left: method, property accessor, function, variable.
+  ///   Is invoked at.
+  /// Right: location.
   IS_INVOKED_BY,
 
-  /**
-   * Left: any element.
-   *   Is referenced (and not invoked, read/written) at.
-   * Right: location.
-   */
+  /// Left: any element.
+  ///   Is referenced (and not invoked, read/written) at.
+  /// Right: location.
   IS_REFERENCED_BY,
 
-  /**
-   * Left: unresolved member name.
-   *   Is read at.
-   * Right: location.
-   */
+  /// Left: unresolved member name.
+  ///   Is read at.
+  /// Right: location.
   IS_READ_BY,
 
-  /**
-   * Left: unresolved member name.
-   *   Is both read and written at.
-   * Right: location.
-   */
+  /// Left: unresolved member name.
+  ///   Is both read and written at.
+  /// Right: location.
   IS_READ_WRITTEN_BY,
 
-  /**
-   * Left: unresolved member name.
-   *   Is written at.
-   * Right: location.
-   */
+  /// Left: unresolved member name.
+  ///   Is written at.
+  /// Right: location.
   IS_WRITTEN_BY
 }
 
-/**
- * When we need to reference a synthetic element in [PackageIndex] we use a
- * value of this enum to specify which kind of the synthetic element we
- * actually reference.
- */
+/// When we need to reference a synthetic element in [PackageIndex] we use a
+/// value of this enum to specify which kind of the synthetic element we
+/// actually reference.
 enum IndexSyntheticElementKind {
-  /**
-   * Not a synthetic element.
-   */
+  /// Not a synthetic element.
   notSynthetic,
 
-  /**
-   * The unnamed synthetic constructor a class element.
-   */
+  /// The unnamed synthetic constructor a class element.
   constructor,
 
-  /**
-   * The synthetic field element.
-   */
+  /// The synthetic field element.
   field,
 
-  /**
-   * The synthetic getter of a property introducing element.
-   */
+  /// The synthetic getter of a property introducing element.
   getter,
 
-  /**
-   * The synthetic setter of a property introducing element.
-   */
+  /// The synthetic setter of a property introducing element.
   setter,
 
-  /**
-   * The synthetic top-level variable element.
-   */
+  /// The synthetic top-level variable element.
   topLevelVariable,
 
-  /**
-   * The synthetic `loadLibrary` element.
-   */
+  /// The synthetic `loadLibrary` element.
   loadLibrary,
 
-  /**
-   * The synthetic `index` getter of an enum.
-   */
+  /// The synthetic `index` getter of an enum.
   enumIndex,
 
-  /**
-   * The synthetic `values` getter of an enum.
-   */
+  /// The synthetic `values` getter of an enum.
   enumValues,
 
-  /**
-   * The containing unit itself.
-   */
+  /// The containing unit itself.
   unit
 }
 
-/**
- * Information about a dependency that exists between one library and another
- * due to an "import" declaration.
- */
+/// Information about a dependency that exists between one library and another
+/// due to an "import" declaration.
 abstract class LinkedDependency extends base.SummaryClass {
-  /**
-   * Absolute URI for the compilation units listed in the library's `part`
-   * declarations, empty string for invalid URI.
-   */
+  /// Absolute URI for the compilation units listed in the library's `part`
+  /// declarations, empty string for invalid URI.
   @Id(1)
   List<String> get parts;
 
-  /**
-   * The absolute URI of the dependent library, e.g. `package:foo/bar.dart`.
-   */
+  /// The absolute URI of the dependent library, e.g. `package:foo/bar.dart`.
   @Id(0)
   String get uri;
 }
 
-/**
- * Information about a single name in the export namespace of the library that
- * is not in the public namespace.
- */
+/// Information about a single name in the export namespace of the library that
+/// is not in the public namespace.
 abstract class LinkedExportName extends base.SummaryClass {
-  /**
-   * Index into [LinkedLibrary.dependencies] for the library in which the
-   * entity is defined.
-   */
+  /// Index into [LinkedLibrary.dependencies] for the library in which the
+  /// entity is defined.
   @Id(0)
   int get dependency;
 
-  /**
-   * The kind of the entity being referred to.
-   */
+  /// The kind of the entity being referred to.
   @Id(3)
   ReferenceKind get kind;
 
-  /**
-   * Name of the exported entity.  For an exported setter, this name includes
-   * the trailing '='.
-   */
+  /// Name of the exported entity.  For an exported setter, this name includes
+  /// the trailing '='.
   @Id(1)
   String get name;
 
-  /**
-   * Integer index indicating which unit in the exported library contains the
-   * definition of the entity.  As with indices into [LinkedLibrary.units],
-   * zero represents the defining compilation unit, and nonzero values
-   * represent parts in the order of the corresponding `part` declarations.
-   */
+  /// Integer index indicating which unit in the exported library contains the
+  /// definition of the entity.  As with indices into [LinkedLibrary.units],
+  /// zero represents the defining compilation unit, and nonzero values
+  /// represent parts in the order of the corresponding `part` declarations.
   @Id(2)
   int get unit;
 }
 
-/**
- * Linked summary of a library.
- */
+/// Linked summary of a library.
 @TopLevel('LLib')
 abstract class LinkedLibrary extends base.SummaryClass {
   factory LinkedLibrary.fromBuffer(List<int> buffer) =>
       generated.readLinkedLibrary(buffer);
 
-  /**
-   * The libraries that this library depends on (either via an explicit import
-   * statement or via the implicit dependencies on `dart:core` and
-   * `dart:async`).  The first element of this array is a pseudo-dependency
-   * representing the library itself (it is also used for `dynamic` and
-   * `void`).  This is followed by elements representing "prelinked"
-   * dependencies (direct imports and the transitive closure of exports).
-   * After the prelinked dependencies are elements representing "linked"
-   * dependencies.
-   *
-   * A library is only included as a "linked" dependency if it is a true
-   * dependency (e.g. a propagated or inferred type or constant value
-   * implicitly refers to an element declared in the library) or
-   * anti-dependency (e.g. the result of type propagation or type inference
-   * depends on the lack of a certain declaration in the library).
-   */
+  /// The libraries that this library depends on (either via an explicit import
+  /// statement or via the implicit dependencies on `dart:core` and
+  /// `dart:async`).  The first element of this array is a pseudo-dependency
+  /// representing the library itself (it is also used for `dynamic` and
+  /// `void`).  This is followed by elements representing "prelinked"
+  /// dependencies (direct imports and the transitive closure of exports).
+  /// After the prelinked dependencies are elements representing "linked"
+  /// dependencies.
+  ///
+  /// A library is only included as a "linked" dependency if it is a true
+  /// dependency (e.g. a propagated or inferred type or constant value
+  /// implicitly refers to an element declared in the library) or
+  /// anti-dependency (e.g. the result of type propagation or type inference
+  /// depends on the lack of a certain declaration in the library).
   @Id(0)
   List<LinkedDependency> get dependencies;
 
-  /**
-   * For each export in [UnlinkedUnit.exports], an index into [dependencies]
-   * of the library being exported.
-   */
+  /// For each export in [UnlinkedUnit.exports], an index into [dependencies]
+  /// of the library being exported.
   @Id(6)
   List<int> get exportDependencies;
 
-  /**
-   * Information about entities in the export namespace of the library that are
-   * not in the public namespace of the library (that is, entities that are
-   * brought into the namespace via `export` directives).
-   *
-   * Sorted by name.
-   */
+  /// Information about entities in the export namespace of the library that are
+  /// not in the public namespace of the library (that is, entities that are
+  /// brought into the namespace via `export` directives).
+  ///
+  /// Sorted by name.
   @Id(4)
   List<LinkedExportName> get exportNames;
 
-  /**
-   * Indicates whether this library was summarized in "fallback mode".  If
-   * true, all other fields in the data structure have their default values.
-   */
+  /// Indicates whether this library was summarized in "fallback mode".  If
+  /// true, all other fields in the data structure have their default values.
   @deprecated
   @Id(5)
   bool get fallbackMode;
 
-  /**
-   * For each import in [UnlinkedUnit.imports], an index into [dependencies]
-   * of the library being imported.
-   */
+  /// For each import in [UnlinkedUnit.imports], an index into [dependencies]
+  /// of the library being imported.
   @Id(1)
   List<int> get importDependencies;
 
-  /**
-   * The number of elements in [dependencies] which are not "linked"
-   * dependencies (that is, the number of libraries in the direct imports plus
-   * the transitive closure of exports, plus the library itself).
-   */
+  /// The number of elements in [dependencies] which are not "linked"
+  /// dependencies (that is, the number of libraries in the direct imports plus
+  /// the transitive closure of exports, plus the library itself).
   @Id(2)
   int get numPrelinkedDependencies;
 
-  /**
-   * The linked summary of all the compilation units constituting the
-   * library.  The summary of the defining compilation unit is listed first,
-   * followed by the summary of each part, in the order of the `part`
-   * declarations in the defining compilation unit.
-   */
+  /// The linked summary of all the compilation units constituting the
+  /// library.  The summary of the defining compilation unit is listed first,
+  /// followed by the summary of each part, in the order of the `part`
+  /// declarations in the defining compilation unit.
   @Id(3)
   List<LinkedUnit> get units;
 }
 
-/**
- * Information about the resolution of an [UnlinkedReference].
- */
+/// Information about the resolution of an [UnlinkedReference].
 abstract class LinkedReference extends base.SummaryClass {
-  /**
-   * If this [LinkedReference] doesn't have an associated [UnlinkedReference],
-   * and the entity being referred to is contained within another entity, index
-   * of the containing entity.  This behaves similarly to
-   * [UnlinkedReference.prefixReference], however it is only used for class
-   * members, not for prefixed imports.
-   *
-   * Containing references must always point backward; that is, for all i, if
-   * LinkedUnit.references[i].containingReference != 0, then
-   * LinkedUnit.references[i].containingReference < i.
-   */
+  /// If this [LinkedReference] doesn't have an associated [UnlinkedReference],
+  /// and the entity being referred to is contained within another entity, index
+  /// of the containing entity.  This behaves similarly to
+  /// [UnlinkedReference.prefixReference], however it is only used for class
+  /// members, not for prefixed imports.
+  ///
+  /// Containing references must always point backward; that is, for all i, if
+  /// LinkedUnit.references[i].containingReference != 0, then
+  /// LinkedUnit.references[i].containingReference < i.
   @Id(5)
   int get containingReference;
 
-  /**
-   * Index into [LinkedLibrary.dependencies] indicating which imported library
-   * declares the entity being referred to.
-   *
-   * Zero if this entity is contained within another entity (e.g. a class
-   * member), or if [kind] is [ReferenceKind.prefix].
-   */
+  /// Index into [LinkedLibrary.dependencies] indicating which imported library
+  /// declares the entity being referred to.
+  ///
+  /// Zero if this entity is contained within another entity (e.g. a class
+  /// member), or if [kind] is [ReferenceKind.prefix].
   @Id(1)
   int get dependency;
 
-  /**
-   * The kind of the entity being referred to.  For the pseudo-types `dynamic`
-   * and `void`, the kind is [ReferenceKind.classOrEnum].
-   */
+  /// The kind of the entity being referred to.  For the pseudo-types `dynamic`
+  /// and `void`, the kind is [ReferenceKind.classOrEnum].
   @Id(2)
   ReferenceKind get kind;
 
-  /**
-   * If [kind] is [ReferenceKind.function] (that is, the entity being referred
-   * to is a local function), the index of the function within
-   * [UnlinkedExecutable.localFunctions].  Otherwise zero.
-   */
+  /// If [kind] is [ReferenceKind.function] (that is, the entity being referred
+  /// to is a local function), the index of the function within
+  /// [UnlinkedExecutable.localFunctions].  Otherwise zero.
   @deprecated
   @Id(6)
   int get localIndex;
 
-  /**
-   * If this [LinkedReference] doesn't have an associated [UnlinkedReference],
-   * name of the entity being referred to.  For the pseudo-type `dynamic`, the
-   * string is "dynamic".  For the pseudo-type `void`, the string is "void".
-   */
+  /// If this [LinkedReference] doesn't have an associated [UnlinkedReference],
+  /// name of the entity being referred to.  For the pseudo-type `dynamic`, the
+  /// string is "dynamic".  For the pseudo-type `void`, the string is "void".
   @Id(3)
   String get name;
 
-  /**
-   * If the entity being referred to is generic, the number of type parameters
-   * it declares (does not include type parameters of enclosing entities).
-   * Otherwise zero.
-   */
+  /// If the entity being referred to is generic, the number of type parameters
+  /// it declares (does not include type parameters of enclosing entities).
+  /// Otherwise zero.
   @Id(4)
   int get numTypeParameters;
 
-  /**
-   * Integer index indicating which unit in the imported library contains the
-   * definition of the entity.  As with indices into [LinkedLibrary.units],
-   * zero represents the defining compilation unit, and nonzero values
-   * represent parts in the order of the corresponding `part` declarations.
-   *
-   * Zero if this entity is contained within another entity (e.g. a class
-   * member).
-   */
+  /// Integer index indicating which unit in the imported library contains the
+  /// definition of the entity.  As with indices into [LinkedLibrary.units],
+  /// zero represents the defining compilation unit, and nonzero values
+  /// represent parts in the order of the corresponding `part` declarations.
+  ///
+  /// Zero if this entity is contained within another entity (e.g. a class
+  /// member).
   @Id(0)
   int get unit;
 }
 
-/**
- * Linked summary of a compilation unit.
- */
+/// Linked summary of a compilation unit.
 abstract class LinkedUnit extends base.SummaryClass {
-  /**
-   * List of slot ids (referring to [UnlinkedExecutable.constCycleSlot])
-   * corresponding to const constructors that are part of cycles.
-   */
+  /// List of slot ids (referring to [UnlinkedExecutable.constCycleSlot])
+  /// corresponding to const constructors that are part of cycles.
   @Id(2)
   List<int> get constCycles;
 
-  /**
-   * List of slot ids (referring to [UnlinkedParam.inheritsCovariantSlot] or
-   * [UnlinkedVariable.inheritsCovariantSlot]) corresponding to parameters
-   * that inherit `@covariant` behavior from a base class.
-   */
+  /// List of slot ids (referring to [UnlinkedParam.inheritsCovariantSlot] or
+  /// [UnlinkedVariable.inheritsCovariantSlot]) corresponding to parameters
+  /// that inherit `@covariant` behavior from a base class.
   @Id(3)
   List<int> get parametersInheritingCovariant;
 
-  /**
-   * Information about the resolution of references within the compilation
-   * unit.  Each element of [UnlinkedUnit.references] has a corresponding
-   * element in this list (at the same index).  If this list has additional
-   * elements beyond the number of elements in [UnlinkedUnit.references], those
-   * additional elements are references that are only referred to implicitly
-   * (e.g. elements involved in inferred or propagated types).
-   */
+  /// Information about the resolution of references within the compilation
+  /// unit.  Each element of [UnlinkedUnit.references] has a corresponding
+  /// element in this list (at the same index).  If this list has additional
+  /// elements beyond the number of elements in [UnlinkedUnit.references], those
+  /// additional elements are references that are only referred to implicitly
+  /// (e.g. elements involved in inferred or propagated types).
   @Id(0)
   List<LinkedReference> get references;
 
-  /**
-   * The list of type inference errors.
-   */
+  /// The list of type inference errors.
   @Id(4)
   List<TopLevelInferenceError> get topLevelInferenceErrors;
 
-  /**
-   * List associating slot ids found inside the unlinked summary for the
-   * compilation unit with propagated and inferred types.
-   */
+  /// List associating slot ids found inside the unlinked summary for the
+  /// compilation unit with propagated and inferred types.
   @Id(1)
   List<EntityRef> get types;
 }
 
-/**
- * Summary information about a package.
- */
+/// Summary information about a package.
 @TopLevel('PBdl')
 abstract class PackageBundle extends base.SummaryClass {
   factory PackageBundle.fromBuffer(List<int> buffer) =>
       generated.readPackageBundle(buffer);
 
-  /**
-   * MD5 hash of the non-informative fields of the [PackageBundle] (not
-   * including this one).  This can be used to identify when the API of a
-   * package may have changed.
-   */
+  /// MD5 hash of the non-informative fields of the [PackageBundle] (not
+  /// including this one).  This can be used to identify when the API of a
+  /// package may have changed.
   @Id(7)
   @deprecated
   String get apiSignature;
 
-  /**
-   * Information about the packages this package depends on, if known.
-   */
+  /// Information about the packages this package depends on, if known.
   @Id(8)
   @informative
   @deprecated
   List<PackageDependencyInfo> get dependencies;
 
-  /**
-   * Linked libraries.
-   */
+  /// Linked libraries.
   @Id(0)
   List<LinkedLibrary> get linkedLibraries;
 
-  /**
-   * The list of URIs of items in [linkedLibraries], e.g. `dart:core` or
-   * `package:foo/bar.dart`.
-   */
+  /// The list of URIs of items in [linkedLibraries], e.g. `dart:core` or
+  /// `package:foo/bar.dart`.
   @Id(1)
   List<String> get linkedLibraryUris;
 
-  /**
-   * Major version of the summary format.  See
-   * [PackageBundleAssembler.currentMajorVersion].
-   */
+  /// Major version of the summary format.  See
+  /// [PackageBundleAssembler.currentMajorVersion].
   @Id(5)
   int get majorVersion;
 
-  /**
-   * Minor version of the summary format.  See
-   * [PackageBundleAssembler.currentMinorVersion].
-   */
+  /// Minor version of the summary format.  See
+  /// [PackageBundleAssembler.currentMinorVersion].
   @Id(6)
   int get minorVersion;
 
-  /**
-   * List of MD5 hashes of the files listed in [unlinkedUnitUris].  Each hash
-   * is encoded as a hexadecimal string using lower case letters.
-   */
+  /// List of MD5 hashes of the files listed in [unlinkedUnitUris].  Each hash
+  /// is encoded as a hexadecimal string using lower case letters.
   @Id(4)
   @deprecated
   @informative
   List<String> get unlinkedUnitHashes;
 
-  /**
-   * Unlinked information for the compilation units constituting the package.
-   */
+  /// Unlinked information for the compilation units constituting the package.
   @Id(2)
   List<UnlinkedUnit> get unlinkedUnits;
 
-  /**
-   * The list of URIs of items in [unlinkedUnits], e.g. `dart:core/bool.dart`.
-   */
+  /// The list of URIs of items in [unlinkedUnits], e.g. `dart:core/bool.dart`.
   @Id(3)
   List<String> get unlinkedUnitUris;
 }
 
-/**
- * Information about a single dependency of a summary package.
- */
+/// Information about a single dependency of a summary package.
 @deprecated
 abstract class PackageDependencyInfo extends base.SummaryClass {
-  /**
-   * API signature of this dependency.
-   */
+  /// API signature of this dependency.
   @Id(0)
   String get apiSignature;
 
-  /**
-   * If this dependency summarizes any files whose URI takes the form
-   * "package:<package_name>/...", a list of all such package names, sorted
-   * lexicographically.  Otherwise empty.
-   */
+  /// If this dependency summarizes any files whose URI takes the form
+  /// "package:<package_name>/...", a list of all such package names, sorted
+  /// lexicographically.  Otherwise empty.
   @Id(2)
   List<String> get includedPackageNames;
 
-  /**
-   * Indicates whether this dependency summarizes any files whose URI takes the
-   * form "dart:...".
-   */
+  /// Indicates whether this dependency summarizes any files whose URI takes the
+  /// form "dart:...".
   @Id(4)
   bool get includesDartUris;
 
-  /**
-   * Indicates whether this dependency summarizes any files whose URI takes the
-   * form "file:...".
-   */
+  /// Indicates whether this dependency summarizes any files whose URI takes the
+  /// form "file:...".
   @Id(3)
   bool get includesFileUris;
 
-  /**
-   * Relative path to the summary file for this dependency.  This is intended as
-   * a hint to help the analysis server locate summaries of dependencies.  We
-   * don't specify precisely what this path is relative to, but we expect it to
-   * be relative to a directory the analysis server can find (e.g. for projects
-   * built using Bazel, it would be relative to the "bazel-bin" directory).
-   *
-   * Absent if the path is not known.
-   */
+  /// Relative path to the summary file for this dependency.  This is intended
+  /// as a hint to help the analysis server locate summaries of dependencies.
+  /// We don't specify precisely what this path is relative to, but we expect
+  /// it to be relative to a directory the analysis server can find (e.g. for
+  /// projects built using Bazel, it would be relative to the "bazel-bin"
+  /// directory).
+  ///
+  /// Absent if the path is not known.
   @Id(1)
   String get summaryPath;
 }
 
-/**
- * Index information about a package.
- */
+/// Index information about a package.
 @TopLevel('Indx')
 abstract class PackageIndex extends base.SummaryClass {
   factory PackageIndex.fromBuffer(List<int> buffer) =>
       generated.readPackageIndex(buffer);
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the kind of the synthetic element.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the kind of the synthetic element.
   @Id(5)
   List<IndexSyntheticElementKind> get elementKinds;
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the class member element name, or `null` if the element
-   * is a top-level element.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this
-   * [PackageIndex].
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the class member element name, or `null` if the element
+  /// is a top-level element.  The list is sorted in ascending order, so that
+  /// the client can quickly check whether an element is referenced in this
+  /// [PackageIndex].
   @Id(7)
   List<int> get elementNameClassMemberIds;
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the named parameter name, or `null` if the element is not
-   * a named parameter.  The list is sorted in ascending order, so that the
-   * client can quickly check whether an element is referenced in this
-   * [PackageIndex].
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the named parameter name, or `null` if the element is
+  /// not a named parameter.  The list is sorted in ascending order, so that the
+  /// client can quickly check whether an element is referenced in this
+  /// [PackageIndex].
   @Id(8)
   List<int> get elementNameParameterIds;
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the identifier of the top-level element name, or `null` if the element is
-   * the unit.  The list is sorted in ascending order, so that the client can
-   * quickly check whether an element is referenced in this [PackageIndex].
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the identifier of the top-level element name, or `null` if the element is
+  /// the unit.  The list is sorted in ascending order, so that the client can
+  /// quickly check whether an element is referenced in this [PackageIndex].
   @Id(1)
   List<int> get elementNameUnitMemberIds;
 
-  /**
-   * Each item of this list corresponds to a unique referenced element.  It is
-   * the index into [unitLibraryUris] and [unitUnitUris] for the library
-   * specific unit where the element is declared.
-   */
+  /// Each item of this list corresponds to a unique referenced element.  It is
+  /// the index into [unitLibraryUris] and [unitUnitUris] for the library
+  /// specific unit where the element is declared.
   @Id(0)
   List<int> get elementUnits;
 
-  /**
-   * List of unique element strings used in this [PackageIndex].  The list is
-   * sorted in ascending order, so that the client can quickly check the
-   * presence of a string in this [PackageIndex].
-   */
+  /// List of unique element strings used in this [PackageIndex].  The list is
+  /// sorted in ascending order, so that the client can quickly check the
+  /// presence of a string in this [PackageIndex].
   @Id(6)
   List<String> get strings;
 
-  /**
-   * Each item of this list corresponds to the library URI of a unique library
-   * specific unit referenced in the [PackageIndex].  It is an index into
-   * [strings] list.
-   */
+  /// Each item of this list corresponds to the library URI of a unique library
+  /// specific unit referenced in the [PackageIndex].  It is an index into
+  /// [strings] list.
   @Id(2)
   List<int> get unitLibraryUris;
 
-  /**
-   * List of indexes of each unit in this [PackageIndex].
-   */
+  /// List of indexes of each unit in this [PackageIndex].
   @Id(4)
   List<UnitIndex> get units;
 
-  /**
-   * Each item of this list corresponds to the unit URI of a unique library
-   * specific unit referenced in the [PackageIndex].  It is an index into
-   * [strings] list.
-   */
+  /// Each item of this list corresponds to the unit URI of a unique library
+  /// specific unit referenced in the [PackageIndex].  It is an index into
+  /// [strings] list.
   @Id(3)
   List<int> get unitUnitUris;
 }
 
-/**
- * Enum used to indicate the kind of entity referred to by a
- * [LinkedReference].
- */
+/// Enum used to indicate the kind of entity referred to by a
+/// [LinkedReference].
 enum ReferenceKind {
-  /**
-   * The entity is a class or enum.
-   */
+  /// The entity is a class or enum.
   classOrEnum,
 
-  /**
-   * The entity is a constructor.
-   */
+  /// The entity is a constructor.
   constructor,
 
-  /**
-   * The entity is a getter or setter inside a class.  Note: this is used in
-   * the case where a constant refers to a static const declared inside a
-   * class.
-   */
+  /// The entity is a getter or setter inside a class.  Note: this is used in
+  /// the case where a constant refers to a static const declared inside a
+  /// class.
   propertyAccessor,
 
-  /**
-   * The entity is a method.
-   */
+  /// The entity is a method.
   method,
 
-  /**
-   * The entity is a typedef.
-   */
+  /// The entity is a typedef.
   typedef,
 
-  /**
-   * The entity is a local function.
-   */
+  /// The entity is a local function.
   function,
 
-  /**
-   * The entity is a local variable.
-   */
+  /// The entity is a local variable.
   variable,
 
-  /**
-   * The entity is a top level function.
-   */
+  /// The entity is a top level function.
   topLevelFunction,
 
-  /**
-   * The entity is a top level getter or setter.
-   */
+  /// The entity is a top level getter or setter.
   topLevelPropertyAccessor,
 
-  /**
-   * The entity is a prefix.
-   */
+  /// The entity is a prefix.
   prefix,
 
-  /**
-   * The entity being referred to does not exist.
-   */
+  /// The entity being referred to does not exist.
   unresolved,
 
-  /**
-   * The entity is a typedef expressed using generic function type syntax.
-   */
+  /// The entity is a typedef expressed using generic function type syntax.
   genericFunctionTypedef
 }
 
-/**
- * Summary information about a top-level type inference error.
- */
+/// Summary information about a top-level type inference error.
 abstract class TopLevelInferenceError extends base.SummaryClass {
-  /**
-   * The [kind] specific arguments.
-   */
+  /// The [kind] specific arguments.
   @Id(2)
   List<String> get arguments;
 
-  /**
-   * The kind of the error.
-   */
+  /// The kind of the error.
   @Id(1)
   TopLevelInferenceErrorKind get kind;
 
-  /**
-   * The slot id (which is unique within the compilation unit) identifying the
-   * target of type inference with which this [TopLevelInferenceError] is
-   * associated.
-   */
+  /// The slot id (which is unique within the compilation unit) identifying the
+  /// target of type inference with which this [TopLevelInferenceError] is
+  /// associated.
   @Id(0)
   int get slot;
 }
 
-/**
- * Enum used to indicate the kind of the error during top-level inference.
- */
+/// Enum used to indicate the kind of the error during top-level inference.
 enum TopLevelInferenceErrorKind {
   assignment,
   instanceGetter,
@@ -1242,2177 +917,1567 @@
   overrideConflictParameterType
 }
 
-/**
- * Enum used to indicate the style of a typedef.
- */
+/// Enum used to indicate the style of a typedef.
 enum TypedefStyle {
-  /**
-   * A typedef that defines a non-generic function type. The syntax is
-   * ```
-   * 'typedef' returnType? identifier typeParameters? formalParameterList ';'
-   * ```
-   * The typedef can have type parameters associated with it, but the function
-   * type that results from applying type arguments does not.
-   */
+  /// A typedef that defines a non-generic function type. The syntax is
+  /// ```
+  /// 'typedef' returnType? identifier typeParameters? formalParameterList ';'
+  /// ```
+  /// The typedef can have type parameters associated with it, but the function
+  /// type that results from applying type arguments does not.
   functionType,
 
-  /**
-   * A typedef expressed using generic function type syntax. The syntax is
-   * ```
-   * typeAlias ::=
-   *     'typedef' identifier typeParameters? '=' genericFunctionType ';'
-   * genericFunctionType ::=
-   *     returnType? 'Function' typeParameters? parameterTypeList
-   * ```
-   * Both the typedef itself and the function type that results from applying
-   * type arguments can have type parameters.
-   */
+  /// A typedef expressed using generic function type syntax. The syntax is
+  /// ```
+  /// typeAlias ::=
+  ///     'typedef' identifier typeParameters? '=' genericFunctionType ';'
+  /// genericFunctionType ::=
+  ///     returnType? 'Function' typeParameters? parameterTypeList
+  /// ```
+  /// Both the typedef itself and the function type that results from applying
+  /// type arguments can have type parameters.
   genericFunctionType
 }
 
-/**
- * Index information about a unit in a [PackageIndex].
- */
+/// Index information about a unit in a [PackageIndex].
 abstract class UnitIndex extends base.SummaryClass {
-  /**
-   * Each item of this list is the kind of an element defined in this unit.
-   */
+  /// Each item of this list is the kind of an element defined in this unit.
   @Id(6)
   List<IndexNameKind> get definedNameKinds;
 
-  /**
-   * Each item of this list is the name offset of an element defined in this
-   * unit relative to the beginning of the file.
-   */
+  /// Each item of this list is the name offset of an element defined in this
+  /// unit relative to the beginning of the file.
   @Id(7)
   List<int> get definedNameOffsets;
 
-  /**
-   * Each item of this list corresponds to an element defined in this unit.  It
-   * is an index into [PackageIndex.strings] list.  The list is sorted in
-   * ascending order, so that the client can quickly find name definitions in
-   * this [UnitIndex].
-   */
+  /// Each item of this list corresponds to an element defined in this unit.  It
+  /// is an index into [PackageIndex.strings] list.  The list is sorted in
+  /// ascending order, so that the client can quickly find name definitions in
+  /// this [UnitIndex].
   @Id(5)
   List<int> get definedNames;
 
-  /**
-   * Index into [PackageIndex.unitLibraryUris] and [PackageIndex.unitUnitUris]
-   * for the library specific unit that corresponds to this [UnitIndex].
-   */
+  /// Index into [PackageIndex.unitLibraryUris] and [PackageIndex.unitUnitUris]
+  /// for the library specific unit that corresponds to this [UnitIndex].
   @Id(0)
   int get unit;
 
-  /**
-   * Each item of this list is the `true` if the corresponding element usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding element usage
+  /// is qualified with some prefix.
   @Id(11)
   List<bool> get usedElementIsQualifiedFlags;
 
-  /**
-   * Each item of this list is the kind of the element usage.
-   */
+  /// Each item of this list is the kind of the element usage.
   @Id(4)
   List<IndexRelationKind> get usedElementKinds;
 
-  /**
-   * Each item of this list is the length of the element usage.
-   */
+  /// Each item of this list is the length of the element usage.
   @Id(1)
   List<int> get usedElementLengths;
 
-  /**
-   * Each item of this list is the offset of the element usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the element usage relative to the
+  /// beginning of the file.
   @Id(2)
   List<int> get usedElementOffsets;
 
-  /**
-   * Each item of this list is the index into [PackageIndex.elementUnits] and
-   * [PackageIndex.elementOffsets].  The list is sorted in ascending order, so
-   * that the client can quickly find element references in this [UnitIndex].
-   */
+  /// Each item of this list is the index into [PackageIndex.elementUnits] and
+  /// [PackageIndex.elementOffsets].  The list is sorted in ascending order, so
+  /// that the client can quickly find element references in this [UnitIndex].
   @Id(3)
   List<int> get usedElements;
 
-  /**
-   * Each item of this list is the `true` if the corresponding name usage
-   * is qualified with some prefix.
-   */
+  /// Each item of this list is the `true` if the corresponding name usage
+  /// is qualified with some prefix.
   @Id(12)
   List<bool> get usedNameIsQualifiedFlags;
 
-  /**
-   * Each item of this list is the kind of the name usage.
-   */
+  /// Each item of this list is the kind of the name usage.
   @Id(10)
   List<IndexRelationKind> get usedNameKinds;
 
-  /**
-   * Each item of this list is the offset of the name usage relative to the
-   * beginning of the file.
-   */
+  /// Each item of this list is the offset of the name usage relative to the
+  /// beginning of the file.
   @Id(9)
   List<int> get usedNameOffsets;
 
-  /**
-   * Each item of this list is the index into [PackageIndex.strings] for a
-   * used name.  The list is sorted in ascending order, so that the client can
-   * quickly find name uses in this [UnitIndex].
-   */
+  /// Each item of this list is the index into [PackageIndex.strings] for a
+  /// used name.  The list is sorted in ascending order, so that the client can
+  /// quickly find name uses in this [UnitIndex].
   @Id(8)
   List<int> get usedNames;
 }
 
-/**
- * Unlinked summary information about a class declaration.
- */
+/// Unlinked summary information about a class declaration.
 abstract class UnlinkedClass extends base.SummaryClass {
-  /**
-   * Annotations for this class.
-   */
+  /// Annotations for this class.
   @Id(5)
   List<UnlinkedExpr> get annotations;
 
-  /**
-   * Code range of the class.
-   */
+  /// Code range of the class.
   @informative
   @Id(13)
   CodeRange get codeRange;
 
-  /**
-   * Documentation comment for the class, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the class, or `null` if there is no
+  /// documentation comment.
   @informative
   @Id(6)
   UnlinkedDocumentationComment get documentationComment;
 
-  /**
-   * Executable objects (methods, getters, and setters) contained in the class.
-   */
+  /// Executable objects (methods, getters, and setters) contained in the class.
   @Id(2)
   List<UnlinkedExecutable> get executables;
 
-  /**
-   * Field declarations contained in the class.
-   */
+  /// Field declarations contained in the class.
   @Id(4)
   List<UnlinkedVariable> get fields;
 
-  /**
-   * Indicates whether this class is the core "Object" class (and hence has no
-   * supertype)
-   */
+  /// Indicates whether this class is the core "Object" class (and hence has no
+  /// supertype)
   @Id(12)
   bool get hasNoSupertype;
 
-  /**
-   * Interfaces appearing in an `implements` clause, if any.
-   */
+  /// Interfaces appearing in an `implements` clause, if any.
   @Id(7)
   List<EntityRef> get interfaces;
 
-  /**
-   * Indicates whether the class is declared with the `abstract` keyword.
-   */
+  /// Indicates whether the class is declared with the `abstract` keyword.
   @Id(8)
   bool get isAbstract;
 
-  /**
-   * Indicates whether the class is declared using mixin application syntax.
-   */
+  /// Indicates whether the class is declared using mixin application syntax.
   @Id(11)
   bool get isMixinApplication;
 
-  /**
-   * Mixins appearing in a `with` clause, if any.
-   */
+  /// Mixins appearing in a `with` clause, if any.
   @Id(10)
   List<EntityRef> get mixins;
 
-  /**
-   * Name of the class.
-   */
+  /// Name of the class.
   @Id(0)
   String get name;
 
-  /**
-   * Offset of the class name relative to the beginning of the file.
-   */
+  /// Offset of the class name relative to the beginning of the file.
   @informative
   @Id(1)
   int get nameOffset;
 
-  /**
-   * Superclass constraints for this mixin declaration. The list will be empty
-   * if this class is not a mixin declaration, or if the declaration does not
-   * have an `on` clause (in which case the type `Object` is implied).
-   */
+  /// Superclass constraints for this mixin declaration. The list will be empty
+  /// if this class is not a mixin declaration, or if the declaration does not
+  /// have an `on` clause (in which case the type `Object` is implied).
   @Id(14)
   List<EntityRef> get superclassConstraints;
 
-  /**
-   * Names of methods, getters, setters, and operators that this mixin
-   * declaration super-invokes.  For setters this includes the trailing "=".
-   * The list will be empty if this class is not a mixin declaration.
-   */
+  /// Names of methods, getters, setters, and operators that this mixin
+  /// declaration super-invokes.  For setters this includes the trailing "=".
+  /// The list will be empty if this class is not a mixin declaration.
   @Id(15)
   List<String> get superInvokedNames;
 
-  /**
-   * Supertype of the class, or `null` if either (a) the class doesn't
-   * explicitly declare a supertype (and hence has supertype `Object`), or (b)
-   * the class *is* `Object` (and hence has no supertype).
-   */
+  /// Supertype of the class, or `null` if either (a) the class doesn't
+  /// explicitly declare a supertype (and hence has supertype `Object`), or (b)
+  /// the class *is* `Object` (and hence has no supertype).
   @Id(3)
   EntityRef get supertype;
 
-  /**
-   * Type parameters of the class, if any.
-   */
+  /// Type parameters of the class, if any.
   @Id(9)
   List<UnlinkedTypeParam> get typeParameters;
 }
 
-/**
- * Unlinked summary information about a `show` or `hide` combinator in an
- * import or export declaration.
- */
+/// Unlinked summary information about a `show` or `hide` combinator in an
+/// import or export declaration.
 abstract class UnlinkedCombinator extends base.SummaryClass {
-  /**
-   * If this is a `show` combinator, offset of the end of the list of shown
-   * names.  Otherwise zero.
-   */
+  /// If this is a `show` combinator, offset of the end of the list of shown
+  /// names.  Otherwise zero.
   @informative
   @Id(3)
   int get end;
 
-  /**
-   * List of names which are hidden.  Empty if this is a `show` combinator.
-   */
+  /// List of names which are hidden.  Empty if this is a `show` combinator.
   @Id(1)
   List<String> get hides;
 
-  /**
-   * If this is a `show` combinator, offset of the `show` keyword.  Otherwise
-   * zero.
-   */
+  /// If this is a `show` combinator, offset of the `show` keyword.  Otherwise
+  /// zero.
   @informative
   @Id(2)
   int get offset;
 
-  /**
-   * List of names which are shown.  Empty if this is a `hide` combinator.
-   */
+  /// List of names which are shown.  Empty if this is a `hide` combinator.
   @Id(0)
   List<String> get shows;
 }
 
-/**
- * Unlinked summary information about a single import or export configuration.
- */
+/// Unlinked summary information about a single import or export configuration.
 abstract class UnlinkedConfiguration extends base.SummaryClass {
-  /**
-   * The name of the declared variable whose value is being used in the
-   * condition.
-   */
+  /// The name of the declared variable whose value is being used in the
+  /// condition.
   @Id(0)
   String get name;
 
-  /**
-   * The URI of the implementation library to be used if the condition is true.
-   */
+  /// The URI of the implementation library to be used if the condition is true.
   @Id(2)
   String get uri;
 
-  /**
-   * The value to which the value of the declared variable will be compared,
-   * or `true` if the condition does not include an equality test.
-   */
+  /// The value to which the value of the declared variable will be compared,
+  /// or `true` if the condition does not include an equality test.
   @Id(1)
   String get value;
 }
 
-/**
- * Unlinked summary information about a constructor initializer.
- */
+/// Unlinked summary information about a constructor initializer.
 abstract class UnlinkedConstructorInitializer extends base.SummaryClass {
-  /**
-   * If there are `m` [arguments] and `n` [argumentNames], then each argument
-   * from [arguments] with index `i` such that `n + i - m >= 0`, should be used
-   * with the name at `n + i - m`.
-   */
+  /// If there are `m` [arguments] and `n` [argumentNames], then each argument
+  /// from [arguments] with index `i` such that `n + i - m >= 0`, should be used
+  /// with the name at `n + i - m`.
   @Id(4)
   List<String> get argumentNames;
 
-  /**
-   * If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
-   * invocation.  Otherwise empty.
-   */
+  /// If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
+  /// invocation.  Otherwise empty.
   @Id(3)
   List<UnlinkedExpr> get arguments;
 
-  /**
-   * If [kind] is `field`, the expression of the field initializer.
-   * Otherwise `null`.
-   */
+  /// If [kind] is `field`, the expression of the field initializer.
+  /// Otherwise `null`.
   @Id(1)
   UnlinkedExpr get expression;
 
-  /**
-   * The kind of the constructor initializer (field, redirect, super).
-   */
+  /// The kind of the constructor initializer (field, redirect, super).
   @Id(2)
   UnlinkedConstructorInitializerKind get kind;
 
-  /**
-   * If [kind] is `field`, the name of the field declared in the class.  If
-   * [kind] is `thisInvocation`, the name of the constructor, declared in this
-   * class, to redirect to.  If [kind] is `superInvocation`, the name of the
-   * constructor, declared in the superclass, to invoke.
-   */
+  /// If [kind] is `field`, the name of the field declared in the class.  If
+  /// [kind] is `thisInvocation`, the name of the constructor, declared in this
+  /// class, to redirect to.  If [kind] is `superInvocation`, the name of the
+  /// constructor, declared in the superclass, to invoke.
   @Id(0)
   String get name;
 }
 
-/**
- * Enum used to indicate the kind of an constructor initializer.
- */
+/// Enum used to indicate the kind of an constructor initializer.
 enum UnlinkedConstructorInitializerKind {
-  /**
-   * Initialization of a field.
-   */
+  /// Initialization of a field.
   field,
 
-  /**
-   * Invocation of a constructor in the same class.
-   */
+  /// Invocation of a constructor in the same class.
   thisInvocation,
 
-  /**
-   * Invocation of a superclass' constructor.
-   */
+  /// Invocation of a superclass' constructor.
   superInvocation,
 
-  /**
-   * Invocation of `assert`.
-   */
+  /// Invocation of `assert`.
   assertInvocation
 }
 
-/**
- * Unlinked summary information about a documentation comment.
- */
+/// Unlinked summary information about a documentation comment.
 abstract class UnlinkedDocumentationComment extends base.SummaryClass {
-  /**
-   * Length of the documentation comment (prior to replacing '\r\n' with '\n').
-   */
+  /// Length of the documentation comment (prior to replacing '\r\n' with '\n').
   @Id(0)
   @deprecated
   int get length;
 
-  /**
-   * Offset of the beginning of the documentation comment relative to the
-   * beginning of the file.
-   */
+  /// Offset of the beginning of the documentation comment relative to the
+  /// beginning of the file.
   @Id(2)
   @deprecated
   int get offset;
 
-  /**
-   * Text of the documentation comment, with '\r\n' replaced by '\n'.
-   *
-   * References appearing within the doc comment in square brackets are not
-   * specially encoded.
-   */
+  /// Text of the documentation comment, with '\r\n' replaced by '\n'.
+  ///
+  /// References appearing within the doc comment in square brackets are not
+  /// specially encoded.
   @Id(1)
   String get text;
 }
 
-/**
- * Unlinked summary information about an enum declaration.
- */
+/// Unlinked summary information about an enum declaration.
 abstract class UnlinkedEnum extends base.SummaryClass {
-  /**
-   * Annotations for this enum.
-   */
+  /// Annotations for this enum.
   @Id(4)
   List<UnlinkedExpr> get annotations;
 
-  /**
-   * Code range of the enum.
-   */
+  /// Code range of the enum.
   @informative
   @Id(5)
   CodeRange get codeRange;
 
-  /**
-   * Documentation comment for the enum, or `null` if there is no documentation
-   * comment.
-   */
+  /// Documentation comment for the enum, or `null` if there is no documentation
+  /// comment.
   @informative
   @Id(3)
   UnlinkedDocumentationComment get documentationComment;
 
-  /**
-   * Name of the enum type.
-   */
+  /// Name of the enum type.
   @Id(0)
   String get name;
 
-  /**
-   * Offset of the enum name relative to the beginning of the file.
-   */
+  /// Offset of the enum name relative to the beginning of the file.
   @informative
   @Id(1)
   int get nameOffset;
 
-  /**
-   * Values listed in the enum declaration, in declaration order.
-   */
+  /// Values listed in the enum declaration, in declaration order.
   @Id(2)
   List<UnlinkedEnumValue> get values;
 }
 
-/**
- * Unlinked summary information about a single enumerated value in an enum
- * declaration.
- */
+/// Unlinked summary information about a single enumerated value in an enum
+/// declaration.
 abstract class UnlinkedEnumValue extends base.SummaryClass {
-  /**
-   * Annotations for this value.
-   */
+  /// Annotations for this value.
   @Id(3)
   List<UnlinkedExpr> get annotations;
 
-  /**
-   * Documentation comment for the enum value, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the enum value, or `null` if there is no
+  /// documentation comment.
   @informative
   @Id(2)
   UnlinkedDocumentationComment get documentationComment;
 
-  /**
-   * Name of the enumerated value.
-   */
+  /// Name of the enumerated value.
   @Id(0)
   String get name;
 
-  /**
-   * Offset of the enum value name relative to the beginning of the file.
-   */
+  /// Offset of the enum value name relative to the beginning of the file.
   @informative
   @Id(1)
   int get nameOffset;
 }
 
-/**
- * Unlinked summary information about a function, method, getter, or setter
- * declaration.
- */
+/// Unlinked summary information about a function, method, getter, or setter
+/// declaration.
 abstract class UnlinkedExecutable extends base.SummaryClass {
-  /**
-   * Annotations for this executable.
-   */
+  /// Annotations for this executable.
   @Id(6)
   List<UnlinkedExpr> get annotations;
 
-  /**
-   * If this executable's function body is declared using `=>`, the expression
-   * to the right of the `=>`.  May be omitted if neither type inference nor
-   * constant evaluation depends on the function body.
-   */
+  /// If this executable's function body is declared using `=>`, the expression
+  /// to the right of the `=>`.  May be omitted if neither type inference nor
+  /// constant evaluation depends on the function body.
   @Id(29)
   UnlinkedExpr get bodyExpr;
 
-  /**
-   * Code range of the executable.
-   */
+  /// Code range of the executable.
   @informative
   @Id(26)
   CodeRange get codeRange;
 
-  /**
-   * If a constant [UnlinkedExecutableKind.constructor], the constructor
-   * initializers.  Otherwise empty.
-   */
+  /// If a constant [UnlinkedExecutableKind.constructor], the constructor
+  /// initializers.  Otherwise empty.
   @Id(14)
   List<UnlinkedConstructorInitializer> get constantInitializers;
 
-  /**
-   * If [kind] is [UnlinkedExecutableKind.constructor] and [isConst] is `true`,
-   * a nonzero slot id which is unique within this compilation unit.  If this id
-   * is found in [LinkedUnit.constCycles], then this constructor is part of a
-   * cycle.
-   *
-   * Otherwise, zero.
-   */
+  /// If [kind] is [UnlinkedExecutableKind.constructor] and [isConst] is `true`,
+  /// a nonzero slot id which is unique within this compilation unit.  If this
+  /// id is found in [LinkedUnit.constCycles], then this constructor is part of
+  /// a cycle.
+  ///
+  /// Otherwise, zero.
   @Id(25)
   int get constCycleSlot;
 
-  /**
-   * Documentation comment for the executable, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the executable, or `null` if there is no
+  /// documentation comment.
   @informative
   @Id(7)
   UnlinkedDocumentationComment get documentationComment;
 
-  /**
-   * If this executable's return type is inferable, nonzero slot id
-   * identifying which entry in [LinkedUnit.types] contains the inferred
-   * return type.  If there is no matching entry in [LinkedUnit.types], then
-   * no return type was inferred for this variable, so its static type is
-   * `dynamic`.
-   */
+  /// If this executable's return type is inferable, nonzero slot id
+  /// identifying which entry in [LinkedUnit.types] contains the inferred
+  /// return type.  If there is no matching entry in [LinkedUnit.types], then
+  /// no return type was inferred for this variable, so its static type is
+  /// `dynamic`.
   @Id(5)
   int get inferredReturnTypeSlot;
 
-  /**
-   * Indicates whether the executable is declared using the `abstract` keyword.
-   */
+  /// Indicates whether the executable is declared using the `abstract` keyword.
   @Id(10)
   bool get isAbstract;
 
-  /**
-   * Indicates whether the executable has body marked as being asynchronous.
-   */
+  /// Indicates whether the executable has body marked as being asynchronous.
   @informative
   @Id(27)
   bool get isAsynchronous;
 
-  /**
-   * Indicates whether the executable is declared using the `const` keyword.
-   */
+  /// Indicates whether the executable is declared using the `const` keyword.
   @Id(12)
   bool get isConst;
 
-  /**
-   * Indicates whether the executable is declared using the `external` keyword.
-   */
+  /// Indicates whether the executable is declared using the `external` keyword.
   @Id(11)
   bool get isExternal;
 
-  /**
-   * Indicates whether the executable is declared using the `factory` keyword.
-   */
+  /// Indicates whether the executable is declared using the `factory` keyword.
   @Id(8)
   bool get isFactory;
 
-  /**
-   * Indicates whether the executable has body marked as being a generator.
-   */
+  /// Indicates whether the executable has body marked as being a generator.
   @informative
   @Id(28)
   bool get isGenerator;
 
-  /**
-   * Indicates whether the executable is a redirected constructor.
-   */
+  /// Indicates whether the executable is a redirected constructor.
   @Id(13)
   bool get isRedirectedConstructor;
 
-  /**
-   * Indicates whether the executable is declared using the `static` keyword.
-   *
-   * Note that for top level executables, this flag is false, since they are
-   * not declared using the `static` keyword (even though they are considered
-   * static for semantic purposes).
-   */
+  /// Indicates whether the executable is declared using the `static` keyword.
+  ///
+  /// Note that for top level executables, this flag is false, since they are
+  /// not declared using the `static` keyword (even though they are considered
+  /// static for semantic purposes).
   @Id(9)
   bool get isStatic;
 
-  /**
-   * The kind of the executable (function/method, getter, setter, or
-   * constructor).
-   */
+  /// The kind of the executable (function/method, getter, setter, or
+  /// constructor).
   @Id(4)
   UnlinkedExecutableKind get kind;
 
-  /**
-   * The list of local functions.
-   */
+  /// The list of local functions.
   @Id(18)
   List<UnlinkedExecutable> get localFunctions;
 
-  /**
-   * The list of local labels.
-   */
+  /// The list of local labels.
   @informative
   @deprecated
   @Id(22)
   List<String> get localLabels;
 
-  /**
-   * The list of local variables.
-   */
+  /// The list of local variables.
   @informative
   @deprecated
   @Id(19)
   List<UnlinkedVariable> get localVariables;
 
-  /**
-   * Name of the executable.  For setters, this includes the trailing "=".  For
-   * named constructors, this excludes the class name and excludes the ".".
-   * For unnamed constructors, this is the empty string.
-   */
+  /// Name of the executable.  For setters, this includes the trailing "=".  For
+  /// named constructors, this excludes the class name and excludes the ".".
+  /// For unnamed constructors, this is the empty string.
   @Id(1)
   String get name;
 
-  /**
-   * If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
-   * the offset of the end of the constructor name.  Otherwise zero.
-   */
+  /// If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
+  /// the offset of the end of the constructor name.  Otherwise zero.
   @informative
   @Id(23)
   int get nameEnd;
 
-  /**
-   * Offset of the executable name relative to the beginning of the file.  For
-   * named constructors, this excludes the class name and excludes the ".".
-   * For unnamed constructors, this is the offset of the class name (i.e. the
-   * offset of the second "C" in "class C { C(); }").
-   */
+  /// Offset of the executable name relative to the beginning of the file.  For
+  /// named constructors, this excludes the class name and excludes the ".".
+  /// For unnamed constructors, this is the offset of the class name (i.e. the
+  /// offset of the second "C" in "class C { C(); }").
   @informative
   @Id(0)
   int get nameOffset;
 
-  /**
-   * Parameters of the executable, if any.  Note that getters have no
-   * parameters (hence this will be the empty list), and setters have a single
-   * parameter.
-   */
+  /// Parameters of the executable, if any.  Note that getters have no
+  /// parameters (hence this will be the empty list), and setters have a single
+  /// parameter.
   @Id(2)
   List<UnlinkedParam> get parameters;
 
-  /**
-   * If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
-   * the offset of the period before the constructor name.  Otherwise zero.
-   */
+  /// If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
+  /// the offset of the period before the constructor name.  Otherwise zero.
   @informative
   @Id(24)
   int get periodOffset;
 
-  /**
-   * If [isRedirectedConstructor] and [isFactory] are both `true`, the
-   * constructor to which this constructor redirects; otherwise empty.
-   */
+  /// If [isRedirectedConstructor] and [isFactory] are both `true`, the
+  /// constructor to which this constructor redirects; otherwise empty.
   @Id(15)
   EntityRef get redirectedConstructor;
 
-  /**
-   * If [isRedirectedConstructor] is `true` and [isFactory] is `false`, the
-   * name of the constructor that this constructor redirects to; otherwise
-   * empty.
-   */
+  /// If [isRedirectedConstructor] is `true` and [isFactory] is `false`, the
+  /// name of the constructor that this constructor redirects to; otherwise
+  /// empty.
   @Id(17)
   String get redirectedConstructorName;
 
-  /**
-   * Declared return type of the executable.  Absent if the executable is a
-   * constructor or the return type is implicit.  Absent for executables
-   * associated with variable initializers and closures, since these
-   * executables may have return types that are not accessible via direct
-   * imports.
-   */
+  /// Declared return type of the executable.  Absent if the executable is a
+  /// constructor or the return type is implicit.  Absent for executables
+  /// associated with variable initializers and closures, since these
+  /// executables may have return types that are not accessible via direct
+  /// imports.
   @Id(3)
   EntityRef get returnType;
 
-  /**
-   * Type parameters of the executable, if any.  Empty if support for generic
-   * method syntax is disabled.
-   */
+  /// Type parameters of the executable, if any.  Empty if support for generic
+  /// method syntax is disabled.
   @Id(16)
   List<UnlinkedTypeParam> get typeParameters;
 
-  /**
-   * If a local function, the length of the visible range; zero otherwise.
-   */
+  /// If a local function, the length of the visible range; zero otherwise.
   @informative
   @Id(20)
   int get visibleLength;
 
-  /**
-   * If a local function, the beginning of the visible range; zero otherwise.
-   */
+  /// If a local function, the beginning of the visible range; zero otherwise.
   @informative
   @Id(21)
   int get visibleOffset;
 }
 
-/**
- * Enum used to indicate the kind of an executable.
- */
+/// Enum used to indicate the kind of an executable.
 enum UnlinkedExecutableKind {
-  /**
-   * Executable is a function or method.
-   */
+  /// Executable is a function or method.
   functionOrMethod,
 
-  /**
-   * Executable is a getter.
-   */
+  /// Executable is a getter.
   getter,
 
-  /**
-   * Executable is a setter.
-   */
+  /// Executable is a setter.
   setter,
 
-  /**
-   * Executable is a constructor.
-   */
+  /// Executable is a constructor.
   constructor
 }
 
-/**
- * Unlinked summary information about an export declaration (stored outside
- * [UnlinkedPublicNamespace]).
- */
+/// Unlinked summary information about an export declaration (stored outside
+/// [UnlinkedPublicNamespace]).
 abstract class UnlinkedExportNonPublic extends base.SummaryClass {
-  /**
-   * Annotations for this export directive.
-   */
+  /// Annotations for this export directive.
   @Id(3)
   List<UnlinkedExpr> get annotations;
 
-  /**
-   * Offset of the "export" keyword.
-   */
+  /// Offset of the "export" keyword.
   @informative
   @Id(0)
   int get offset;
 
-  /**
-   * End of the URI string (including quotes) relative to the beginning of the
-   * file.
-   */
+  /// End of the URI string (including quotes) relative to the beginning of the
+  /// file.
   @informative
   @Id(1)
   int get uriEnd;
 
-  /**
-   * Offset of the URI string (including quotes) relative to the beginning of
-   * the file.
-   */
+  /// Offset of the URI string (including quotes) relative to the beginning of
+  /// the file.
   @informative
   @Id(2)
   int get uriOffset;
 }
 
-/**
- * Unlinked summary information about an export declaration (stored inside
- * [UnlinkedPublicNamespace]).
- */
+/// Unlinked summary information about an export declaration (stored inside
+/// [UnlinkedPublicNamespace]).
 abstract class UnlinkedExportPublic extends base.SummaryClass {
-  /**
-   * Combinators contained in this export declaration.
-   */
+  /// Combinators contained in this export declaration.
   @Id(1)
   List<UnlinkedCombinator> get combinators;
 
-  /**
-   * Configurations used to control which library will actually be loaded at
-   * run-time.
-   */
+  /// Configurations used to control which library will actually be loaded at
+  /// run-time.
   @Id(2)
   List<UnlinkedConfiguration> get configurations;
 
-  /**
-   * URI used in the source code to reference the exported library.
-   */
+  /// URI used in the source code to reference the exported library.
   @Id(0)
   String get uri;
 }
 
-/**
- * Unlinked summary information about an expression.
- *
- * Expressions are represented using a simple stack-based language
- * where [operations] is a sequence of operations to execute starting with an
- * empty stack.  Once all operations have been executed, the stack should
- * contain a single value which is the value of the constant.  Note that some
- * operations consume additional data from the other fields of this class.
- */
+/// Unlinked summary information about an expression.
+///
+/// Expressions are represented using a simple stack-based language
+/// where [operations] is a sequence of operations to execute starting with an
+/// empty stack.  Once all operations have been executed, the stack should
+/// contain a single value which is the value of the constant.  Note that some
+/// operations consume additional data from the other fields of this class.
 abstract class UnlinkedExpr extends base.SummaryClass {
-  /**
-   * Sequence of operators used by assignment operations.
-   */
+  /// Sequence of operators used by assignment operations.
   @Id(6)
   List<UnlinkedExprAssignOperator> get assignmentOperators;
 
-  /**
-   * Sequence of 64-bit doubles consumed by the operation `pushDouble`.
-   */
+  /// Sequence of 64-bit doubles consumed by the operation `pushDouble`.
   @Id(4)
   List<double> get doubles;
 
-  /**
-   * Sequence of unsigned 32-bit integers consumed by the operations
-   * `pushArgument`, `pushInt`, `shiftOr`, `concatenate`, `invokeConstructor`,
-   * `makeList`, and `makeMap`.
-   */
+  /// Sequence of unsigned 32-bit integers consumed by the operations
+  /// `pushArgument`, `pushInt`, `shiftOr`, `concatenate`, `invokeConstructor`,
+  /// `makeList`, and `makeMap`.
   @Id(1)
   List<int> get ints;
 
-  /**
-   * Indicates whether the expression is a valid potentially constant
-   * expression.
-   */
+  /// Indicates whether the expression is a valid potentially constant
+  /// expression.
   @Id(5)
   bool get isValidConst;
 
-  /**
-   * Sequence of operations to execute (starting with an empty stack) to form
-   * the constant value.
-   */
+  /// Sequence of operations to execute (starting with an empty stack) to form
+  /// the constant value.
   @Id(0)
   List<UnlinkedExprOperation> get operations;
 
-  /**
-   * Sequence of language constructs consumed by the operations
-   * `pushReference`, `invokeConstructor`, `makeList`, and `makeMap`.  Note
-   * that in the case of `pushReference` (and sometimes `invokeConstructor` the
-   * actual entity being referred to may be something other than a type.
-   */
+  /// Sequence of language constructs consumed by the operations
+  /// `pushReference`, `invokeConstructor`, `makeList`, and `makeMap`.  Note
+  /// that in the case of `pushReference` (and sometimes `invokeConstructor` the
+  /// actual entity being referred to may be something other than a type.
   @Id(2)
   List<EntityRef> get references;
 
-  /**
-   * Sequence of strings consumed by the operations `pushString` and
-   * `invokeConstructor`.
-   */
+  /// Sequence of strings consumed by the operations `pushString` and
+  /// `invokeConstructor`.
   @Id(3)
   List<String> get strings;
 }
 
-/**
- * Enum representing the various kinds of assignment operations combined
- * with:
- *    [UnlinkedExprOperation.assignToRef],
- *    [UnlinkedExprOperation.assignToProperty],
- *    [UnlinkedExprOperation.assignToIndex].
- */
+/// Enum representing the various kinds of assignment operations combined
+/// with:
+///    [UnlinkedExprOperation.assignToRef],
+///    [UnlinkedExprOperation.assignToProperty],
+///    [UnlinkedExprOperation.assignToIndex].
 enum UnlinkedExprAssignOperator {
-  /**
-   * Perform simple assignment `target = operand`.
-   */
+  /// Perform simple assignment `target = operand`.
   assign,
 
-  /**
-   * Perform `target ??= operand`.
-   */
+  /// Perform `target ??= operand`.
   ifNull,
 
-  /**
-   * Perform `target *= operand`.
-   */
+  /// Perform `target *= operand`.
   multiply,
 
-  /**
-   * Perform `target /= operand`.
-   */
+  /// Perform `target /= operand`.
   divide,
 
-  /**
-   * Perform `target ~/= operand`.
-   */
+  /// Perform `target ~/= operand`.
   floorDivide,
 
-  /**
-   * Perform `target %= operand`.
-   */
+  /// Perform `target %= operand`.
   modulo,
 
-  /**
-   * Perform `target += operand`.
-   */
+  /// Perform `target += operand`.
   plus,
 
-  /**
-   * Perform `target -= operand`.
-   */
+  /// Perform `target -= operand`.
   minus,
 
-  /**
-   * Perform `target <<= operand`.
-   */
+  /// Perform `target <<= operand`.
   shiftLeft,
 
-  /**
-   * Perform `target >>= operand`.
-   */
+  /// Perform `target >>= operand`.
   shiftRight,
 
-  /**
-   * Perform `target &= operand`.
-   */
+  /// Perform `target &= operand`.
   bitAnd,
 
-  /**
-   * Perform `target ^= operand`.
-   */
+  /// Perform `target ^= operand`.
   bitXor,
 
-  /**
-   * Perform `target |= operand`.
-   */
+  /// Perform `target |= operand`.
   bitOr,
 
-  /**
-   * Perform `++target`.
-   */
+  /// Perform `++target`.
   prefixIncrement,
 
-  /**
-   * Perform `--target`.
-   */
+  /// Perform `--target`.
   prefixDecrement,
 
-  /**
-   * Perform `target++`.
-   */
+  /// Perform `target++`.
   postfixIncrement,
 
-  /**
-   * Perform `target++`.
-   */
+  /// Perform `target++`.
   postfixDecrement,
 }
 
-/**
- * Enum representing the various kinds of operations which may be performed to
- * in an expression.  These options are assumed to execute in the
- * context of a stack which is initially empty.
- */
+/// Enum representing the various kinds of operations which may be performed to
+/// in an expression.  These options are assumed to execute in the
+/// context of a stack which is initially empty.
 enum UnlinkedExprOperation {
-  /**
-   * Push the next value from [UnlinkedExpr.ints] (a 32-bit unsigned integer)
-   * onto the stack.
-   *
-   * Note that Dart supports integers larger than 32 bits; these are
-   * represented by composing 32-bit values using the [pushLongInt] operation.
-   */
+  /// Push the next value from [UnlinkedExpr.ints] (a 32-bit unsigned integer)
+  /// onto the stack.
+  ///
+  /// Note that Dart supports integers larger than 32 bits; these are
+  /// represented by composing 32-bit values using the [pushLongInt] operation.
   pushInt,
 
-  /**
-   * Get the number of components from [UnlinkedExpr.ints], then do this number
-   * of times the following operations: multiple the current value by 2^32, "or"
-   * it with the next value in [UnlinkedExpr.ints]. The initial value is zero.
-   * Push the result into the stack.
-   */
+  /// Get the number of components from [UnlinkedExpr.ints], then do this number
+  /// of times the following operations: multiple the current value by 2^32,
+  /// "or" it with the next value in [UnlinkedExpr.ints]. The initial value is
+  /// zero. Push the result into the stack.
   pushLongInt,
 
-  /**
-   * Push the next value from [UnlinkedExpr.doubles] (a double precision
-   * floating point value) onto the stack.
-   */
+  /// Push the next value from [UnlinkedExpr.doubles] (a double precision
+  /// floating point value) onto the stack.
   pushDouble,
 
-  /**
-   * Push the constant `true` onto the stack.
-   */
+  /// Push the constant `true` onto the stack.
   pushTrue,
 
-  /**
-   * Push the constant `false` onto the stack.
-   */
+  /// Push the constant `false` onto the stack.
   pushFalse,
 
-  /**
-   * Push the next value from [UnlinkedExpr.strings] onto the stack.
-   */
+  /// Push the next value from [UnlinkedExpr.strings] onto the stack.
   pushString,
 
-  /**
-   * Pop the top n values from the stack (where n is obtained from
-   * [UnlinkedExpr.ints]), convert them to strings (if they aren't already),
-   * concatenate them into a single string, and push it back onto the stack.
-   *
-   * This operation is used to represent constants whose value is a literal
-   * string containing string interpolations.
-   */
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), convert them to strings (if they aren't already),
+  /// concatenate them into a single string, and push it back onto the stack.
+  ///
+  /// This operation is used to represent constants whose value is a literal
+  /// string containing string interpolations.
   concatenate,
 
-  /**
-   * Get the next value from [UnlinkedExpr.strings], convert it to a symbol,
-   * and push it onto the stack.
-   */
+  /// Get the next value from [UnlinkedExpr.strings], convert it to a symbol,
+  /// and push it onto the stack.
   makeSymbol,
 
-  /**
-   * Push the constant `null` onto the stack.
-   */
+  /// Push the constant `null` onto the stack.
   pushNull,
 
-  /**
-   * Push the value of the function parameter with the name obtained from
-   * [UnlinkedExpr.strings].
-   */
+  /// Push the value of the function parameter with the name obtained from
+  /// [UnlinkedExpr.strings].
   pushParameter,
 
-  /**
-   * Evaluate a (potentially qualified) identifier expression and push the
-   * resulting value onto the stack.  The identifier to be evaluated is
-   * obtained from [UnlinkedExpr.references].
-   *
-   * This operation is used to represent the following kinds of constants
-   * (which are indistinguishable from an unresolved AST alone):
-   *
-   * - A qualified reference to a static constant variable (e.g. `C.v`, where
-   *   C is a class and `v` is a constant static variable in `C`).
-   * - An identifier expression referring to a constant variable.
-   * - A simple or qualified identifier denoting a class or type alias.
-   * - A simple or qualified identifier denoting a top-level function or a
-   *   static method.
-   */
+  /// Evaluate a (potentially qualified) identifier expression and push the
+  /// resulting value onto the stack.  The identifier to be evaluated is
+  /// obtained from [UnlinkedExpr.references].
+  ///
+  /// This operation is used to represent the following kinds of constants
+  /// (which are indistinguishable from an unresolved AST alone):
+  ///
+  /// - A qualified reference to a static constant variable (e.g. `C.v`, where
+  ///   C is a class and `v` is a constant static variable in `C`).
+  /// - An identifier expression referring to a constant variable.
+  /// - A simple or qualified identifier denoting a class or type alias.
+  /// - A simple or qualified identifier denoting a top-level function or a
+  ///   static method.
   pushReference,
 
-  /**
-   * Pop the top value from the stack, extract the value of the property with
-   * the name obtained from [UnlinkedExpr.strings], and push the result back
-   * onto the stack.
-   */
+  /// Pop the top value from the stack, extract the value of the property with
+  /// the name obtained from [UnlinkedExpr.strings], and push the result back
+  /// onto the stack.
   extractProperty,
 
-  /**
-   * Pop the top `n` values from the stack (where `n` is obtained from
-   * [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
-   * `n` values from [UnlinkedExpr.strings] and use the lists of names and
-   * values to create named arguments.  Then pop the top `m` values from the
-   * stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
-   * from the end) and use them as positional arguments.  Use the lists of
-   * positional and names arguments to invoke a constant constructor obtained
-   * from [UnlinkedExpr.references], and push the resulting value back onto the
-   * stack.
-   *
-   * Arguments are skipped, and `0` are specified as the numbers of arguments
-   * on the stack, if the expression is not a constant. We store expression of
-   * variable initializers to perform top-level inference, and arguments are
-   * never used to infer types.
-   *
-   * Note that for an invocation of the form `const a.b(...)` (where no type
-   * arguments are specified), it is impossible to tell from the unresolved AST
-   * alone whether `a` is a class name and `b` is a constructor name, or `a` is
-   * a prefix name and `b` is a class name.  For consistency between AST based
-   * and elements based summaries, references to default constructors are always
-   * recorded as references to corresponding classes.
-   */
+  /// Pop the top `n` values from the stack (where `n` is obtained from
+  /// [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
+  /// `n` values from [UnlinkedExpr.strings] and use the lists of names and
+  /// values to create named arguments.  Then pop the top `m` values from the
+  /// stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
+  /// from the end) and use them as positional arguments.  Use the lists of
+  /// positional and names arguments to invoke a constant constructor obtained
+  /// from [UnlinkedExpr.references], and push the resulting value back onto the
+  /// stack.
+  ///
+  /// Arguments are skipped, and `0` are specified as the numbers of arguments
+  /// on the stack, if the expression is not a constant. We store expression of
+  /// variable initializers to perform top-level inference, and arguments are
+  /// never used to infer types.
+  ///
+  /// Note that for an invocation of the form `const a.b(...)` (where no type
+  /// arguments are specified), it is impossible to tell from the unresolved AST
+  /// alone whether `a` is a class name and `b` is a constructor name, or `a` is
+  /// a prefix name and `b` is a class name.  For consistency between AST based
+  /// and elements based summaries, references to default constructors are
+  /// always recorded as references to corresponding classes.
   invokeConstructor,
 
-  /**
-   * Pop the top n values from the stack (where n is obtained from
-   * [UnlinkedExpr.ints]), place them in a [List], and push the result back
-   * onto the stack.  The type parameter for the [List] is implicitly `dynamic`.
-   */
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), place them in a [List], and push the result back
+  /// onto the stack.  The type parameter for the [List] is implicitly
+  /// `dynamic`.
   makeUntypedList,
 
-  /**
-   * Pop the top 2*n values from the stack (where n is obtained from
-   * [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
-   * [Map], and push the result back onto the stack.  The two type parameters
-   * for the [Map] are implicitly `dynamic`.
-   */
+  /// Pop the top 2*n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
+  /// [Map], and push the result back onto the stack.  The two type parameters
+  /// for the [Map] are implicitly `dynamic`.
   makeUntypedMap,
 
-  /**
-   * Pop the top n values from the stack (where n is obtained from
-   * [UnlinkedExpr.ints]), place them in a [List], and push the result back
-   * onto the stack.  The type parameter for the [List] is obtained from
-   * [UnlinkedExpr.references].
-   */
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), place them in a [List], and push the result back
+  /// onto the stack.  The type parameter for the [List] is obtained from
+  /// [UnlinkedExpr.references].
   makeTypedList,
 
-  /**
-   * Pop the top 2*n values from the stack (where n is obtained from
-   * [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
-   * [Map], and push the result back onto the stack.  The two type parameters
-   * for the [Map] are obtained from [UnlinkedExpr.references].
-   */
+  /// Pop the top 2*n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), interpret them as key/value pairs, place them in a
+  /// [Map], and push the result back onto the stack.  The two type parameters
+  /// for the [Map] are obtained from [UnlinkedExpr.references].
   makeTypedMap,
 
-  /**
-   * Pop the top 2 values from the stack, evaluate `v1 == v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, evaluate `v1 == v2`, and push the
+  /// result back onto the stack.
   equal,
 
-  /**
-   * Pop the top 2 values from the stack, evaluate `v1 != v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, evaluate `v1 != v2`, and push the
+  /// result back onto the stack.
   notEqual,
 
-  /**
-   * Pop the top value from the stack, compute its boolean negation, and push
-   * the result back onto the stack.
-   */
+  /// Pop the top value from the stack, compute its boolean negation, and push
+  /// the result back onto the stack.
   not,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 && v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 && v2`, and push the
+  /// result back onto the stack.
   and,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 || v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 || v2`, and push the
+  /// result back onto the stack.
   or,
 
-  /**
-   * Pop the top value from the stack, compute its integer complement, and push
-   * the result back onto the stack.
-   */
+  /// Pop the top value from the stack, compute its integer complement, and push
+  /// the result back onto the stack.
   complement,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 ^ v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 ^ v2`, and push the
+  /// result back onto the stack.
   bitXor,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 & v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 & v2`, and push the
+  /// result back onto the stack.
   bitAnd,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 | v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 | v2`, and push the
+  /// result back onto the stack.
   bitOr,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 >> v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 >> v2`, and push the
+  /// result back onto the stack.
   bitShiftRight,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 << v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 << v2`, and push the
+  /// result back onto the stack.
   bitShiftLeft,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 + v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 + v2`, and push the
+  /// result back onto the stack.
   add,
 
-  /**
-   * Pop the top value from the stack, compute its integer negation, and push
-   * the result back onto the stack.
-   */
+  /// Pop the top value from the stack, compute its integer negation, and push
+  /// the result back onto the stack.
   negate,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 - v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 - v2`, and push the
+  /// result back onto the stack.
   subtract,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 * v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 * v2`, and push the
+  /// result back onto the stack.
   multiply,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 / v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 / v2`, and push the
+  /// result back onto the stack.
   divide,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 ~/ v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 ~/ v2`, and push the
+  /// result back onto the stack.
   floorDivide,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 > v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 > v2`, and push the
+  /// result back onto the stack.
   greater,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 < v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 < v2`, and push the
+  /// result back onto the stack.
   less,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 >= v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 >= v2`, and push the
+  /// result back onto the stack.
   greaterEqual,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 <= v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 <= v2`, and push the
+  /// result back onto the stack.
   lessEqual,
 
-  /**
-   * Pop the top 2 values from the stack, compute `v1 % v2`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 2 values from the stack, compute `v1 % v2`, and push the
+  /// result back onto the stack.
   modulo,
 
-  /**
-   * Pop the top 3 values from the stack, compute `v1 ? v2 : v3`, and push the
-   * result back onto the stack.
-   */
+  /// Pop the top 3 values from the stack, compute `v1 ? v2 : v3`, and push the
+  /// result back onto the stack.
   conditional,
 
-  /**
-   * Pop from the stack `value` and get the next `target` reference from
-   * [UnlinkedExpr.references] - a top-level variable (prefixed or not), an
-   * assignable field of a class (prefixed or not), or a sequence of getters
-   * ending with an assignable property `a.b.b.c.d.e`.  In general `a.b` cannot
-   * not be distinguished between: `a` is a prefix and `b` is a top-level
-   * variable; or `a` is an object and `b` is the name of a property.  Perform
-   * `reference op= value` where `op` is the next assignment operator from
-   * [UnlinkedExpr.assignmentOperators].  Push `value` back into the stack.
-   *
-   * If the assignment operator is a prefix/postfix increment/decrement, then
-   * `value` is not present in the stack, so it should not be popped and the
-   * corresponding value of the `target` after/before update is pushed into the
-   * stack instead.
-   */
+  /// Pop from the stack `value` and get the next `target` reference from
+  /// [UnlinkedExpr.references] - a top-level variable (prefixed or not), an
+  /// assignable field of a class (prefixed or not), or a sequence of getters
+  /// ending with an assignable property `a.b.b.c.d.e`.  In general `a.b` cannot
+  /// not be distinguished between: `a` is a prefix and `b` is a top-level
+  /// variable; or `a` is an object and `b` is the name of a property.  Perform
+  /// `reference op= value` where `op` is the next assignment operator from
+  /// [UnlinkedExpr.assignmentOperators].  Push `value` back into the stack.
+  ///
+  /// If the assignment operator is a prefix/postfix increment/decrement, then
+  /// `value` is not present in the stack, so it should not be popped and the
+  /// corresponding value of the `target` after/before update is pushed into the
+  /// stack instead.
   assignToRef,
 
-  /**
-   * Pop from the stack `target` and `value`.  Get the name of the property from
-   * `UnlinkedConst.strings` and assign the `value` to the named property of the
-   * `target`.  This operation is used when we know that the `target` is an
-   * object reference expression, e.g. `new Foo().a.b.c` or `a.b[0].c.d`.
-   * Perform `target.property op= value` where `op` is the next assignment
-   * operator from [UnlinkedExpr.assignmentOperators].  Push `value` back into
-   * the stack.
-   *
-   * If the assignment operator is a prefix/postfix increment/decrement, then
-   * `value` is not present in the stack, so it should not be popped and the
-   * corresponding value of the `target` after/before update is pushed into the
-   * stack instead.
-   */
+  /// Pop from the stack `target` and `value`.  Get the name of the property
+  /// from `UnlinkedConst.strings` and assign the `value` to the named property
+  /// of the `target`.  This operation is used when we know that the `target`
+  /// is an object reference expression, e.g. `new Foo().a.b.c` or `a.b[0].c.d`.
+  /// Perform `target.property op= value` where `op` is the next assignment
+  /// operator from [UnlinkedExpr.assignmentOperators].  Push `value` back into
+  /// the stack.
+  ///
+  /// If the assignment operator is a prefix/postfix increment/decrement, then
+  /// `value` is not present in the stack, so it should not be popped and the
+  /// corresponding value of the `target` after/before update is pushed into the
+  /// stack instead.
   assignToProperty,
 
-  /**
-   * Pop from the stack `index`, `target` and `value`.  Perform
-   * `target[index] op= value`  where `op` is the next assignment operator from
-   * [UnlinkedExpr.assignmentOperators].  Push `value` back into the stack.
-   *
-   * If the assignment operator is a prefix/postfix increment/decrement, then
-   * `value` is not present in the stack, so it should not be popped and the
-   * corresponding value of the `target` after/before update is pushed into the
-   * stack instead.
-   */
+  /// Pop from the stack `index`, `target` and `value`.  Perform
+  /// `target[index] op= value`  where `op` is the next assignment operator from
+  /// [UnlinkedExpr.assignmentOperators].  Push `value` back into the stack.
+  ///
+  /// If the assignment operator is a prefix/postfix increment/decrement, then
+  /// `value` is not present in the stack, so it should not be popped and the
+  /// corresponding value of the `target` after/before update is pushed into the
+  /// stack instead.
   assignToIndex,
 
-  /**
-   * Pop from the stack `index` and `target`.  Push into the stack the result
-   * of evaluation of `target[index]`.
-   */
+  /// Pop from the stack `index` and `target`.  Push into the stack the result
+  /// of evaluation of `target[index]`.
   extractIndex,
 
-  /**
-   * Pop the top `n` values from the stack (where `n` is obtained from
-   * [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
-   * `n` values from [UnlinkedExpr.strings] and use the lists of names and
-   * values to create named arguments.  Then pop the top `m` values from the
-   * stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
-   * from the end) and use them as positional arguments.  Use the lists of
-   * positional and names arguments to invoke a method (or a function) with
-   * the reference from [UnlinkedExpr.references].  If `k` is nonzero (where
-   * `k` is obtained from [UnlinkedExpr.ints]), obtain `k` type arguments from
-   * [UnlinkedExpr.references] and use them as generic type arguments for the
-   * aforementioned method or function.  Push the result of the invocation onto
-   * the stack.
-   *
-   * Arguments are skipped, and `0` are specified as the numbers of arguments
-   * on the stack, if the expression is not a constant. We store expression of
-   * variable initializers to perform top-level inference, and arguments are
-   * never used to infer types.
-   *
-   * In general `a.b` cannot not be distinguished between: `a` is a prefix and
-   * `b` is a top-level function; or `a` is an object and `b` is the name of a
-   * method.  This operation should be used for a sequence of identifiers
-   * `a.b.b.c.d.e` ending with an invokable result.
-   */
+  /// Pop the top `n` values from the stack (where `n` is obtained from
+  /// [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
+  /// `n` values from [UnlinkedExpr.strings] and use the lists of names and
+  /// values to create named arguments.  Then pop the top `m` values from the
+  /// stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
+  /// from the end) and use them as positional arguments.  Use the lists of
+  /// positional and names arguments to invoke a method (or a function) with
+  /// the reference from [UnlinkedExpr.references].  If `k` is nonzero (where
+  /// `k` is obtained from [UnlinkedExpr.ints]), obtain `k` type arguments from
+  /// [UnlinkedExpr.references] and use them as generic type arguments for the
+  /// aforementioned method or function.  Push the result of the invocation onto
+  /// the stack.
+  ///
+  /// Arguments are skipped, and `0` are specified as the numbers of arguments
+  /// on the stack, if the expression is not a constant. We store expression of
+  /// variable initializers to perform top-level inference, and arguments are
+  /// never used to infer types.
+  ///
+  /// In general `a.b` cannot not be distinguished between: `a` is a prefix and
+  /// `b` is a top-level function; or `a` is an object and `b` is the name of a
+  /// method.  This operation should be used for a sequence of identifiers
+  /// `a.b.b.c.d.e` ending with an invokable result.
   invokeMethodRef,
 
-  /**
-   * Pop the top `n` values from the stack (where `n` is obtained from
-   * [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
-   * `n` values from [UnlinkedExpr.strings] and use the lists of names and
-   * values to create named arguments.  Then pop the top `m` values from the
-   * stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
-   * from the end) and use them as positional arguments.  Use the lists of
-   * positional and names arguments to invoke the method with the name from
-   * [UnlinkedExpr.strings] of the target popped from the stack.  If `k` is
-   * nonzero (where `k` is obtained from [UnlinkedExpr.ints]), obtain `k` type
-   * arguments from [UnlinkedExpr.references] and use them as generic type
-   * arguments for the aforementioned method.  Push the result of the
-   * invocation onto the stack.
-   *
-   * Arguments are skipped, and `0` are specified as the numbers of arguments
-   * on the stack, if the expression is not a constant. We store expression of
-   * variable initializers to perform top-level inference, and arguments are
-   * never used to infer types.
-   *
-   * This operation should be used for invocation of a method invocation
-   * where `target` is known to be an object instance.
-   */
+  /// Pop the top `n` values from the stack (where `n` is obtained from
+  /// [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
+  /// `n` values from [UnlinkedExpr.strings] and use the lists of names and
+  /// values to create named arguments.  Then pop the top `m` values from the
+  /// stack (where `m` is obtained from [UnlinkedExpr.ints]) into a list (filled
+  /// from the end) and use them as positional arguments.  Use the lists of
+  /// positional and names arguments to invoke the method with the name from
+  /// [UnlinkedExpr.strings] of the target popped from the stack.  If `k` is
+  /// nonzero (where `k` is obtained from [UnlinkedExpr.ints]), obtain `k` type
+  /// arguments from [UnlinkedExpr.references] and use them as generic type
+  /// arguments for the aforementioned method.  Push the result of the
+  /// invocation onto the stack.
+  ///
+  /// Arguments are skipped, and `0` are specified as the numbers of arguments
+  /// on the stack, if the expression is not a constant. We store expression of
+  /// variable initializers to perform top-level inference, and arguments are
+  /// never used to infer types.
+  ///
+  /// This operation should be used for invocation of a method invocation
+  /// where `target` is known to be an object instance.
   invokeMethod,
 
-  /**
-   * Begin a new cascade section.  Duplicate the top value of the stack.
-   */
+  /// Begin a new cascade section.  Duplicate the top value of the stack.
   cascadeSectionBegin,
 
-  /**
-   * End a new cascade section.  Pop the top value from the stack and throw it
-   * away.
-   */
+  /// End a new cascade section.  Pop the top value from the stack and throw it
+  /// away.
   cascadeSectionEnd,
 
-  /**
-   * Pop the top value from the stack and cast it to the type with reference
-   * from [UnlinkedExpr.references], push the result into the stack.
-   */
+  /// Pop the top value from the stack and cast it to the type with reference
+  /// from [UnlinkedExpr.references], push the result into the stack.
   typeCast,
 
-  /**
-   * Pop the top value from the stack and check whether it is a subclass of the
-   * type with reference from [UnlinkedExpr.references], push the result into
-   * the stack.
-   */
+  /// Pop the top value from the stack and check whether it is a subclass of the
+  /// type with reference from [UnlinkedExpr.references], push the result into
+  /// the stack.
   typeCheck,
 
-  /**
-   * Pop the top value from the stack and raise an exception with this value.
-   */
+  /// Pop the top value from the stack and raise an exception with this value.
   throwException,
 
-  /**
-   * Obtain two values `n` and `m` from [UnlinkedExpr.ints].  Then, starting at
-   * the executable element for the expression being evaluated, if n > 0, pop to
-   * the nth enclosing function element.  Then, push the mth local function of
-   * that element onto the stack.
-   */
+  /// Obtain two values `n` and `m` from [UnlinkedExpr.ints].  Then, starting at
+  /// the executable element for the expression being evaluated, if n > 0, pop
+  /// to the nth enclosing function element.  Then, push the mth local function
+  /// of that element onto the stack.
   pushLocalFunctionReference,
 
-  /**
-   * Pop the top two values from the stack.  If the first value is non-null,
-   * keep it and discard the second.  Otherwise, keep the second and discard the
-   * first.
-   */
+  /// Pop the top two values from the stack.  If the first value is non-null,
+  /// keep it and discard the second.  Otherwise, keep the second and discard
+  /// the first.
   ifNull,
 
-  /**
-   * Pop the top value from the stack.  Treat it as a Future and await its
-   * completion.  Then push the awaited value onto the stack.
-   */
+  /// Pop the top value from the stack.  Treat it as a Future and await its
+  /// completion.  Then push the awaited value onto the stack.
   await,
 
-  /**
-   * Push an abstract value onto the stack. Abstract values mark the presence of
-   * a value, but whose details are not included.
-   *
-   * This is not used by the summary generators today, but it will be used to
-   * experiment with prunning the initializer expression tree, so only
-   * information that is necessary gets included in the output summary file.
-   */
+  /// Push an abstract value onto the stack. Abstract values mark the presence
+  /// of a value, but whose details are not included.
+  ///
+  /// This is not used by the summary generators today, but it will be used to
+  /// experiment with prunning the initializer expression tree, so only
+  /// information that is necessary gets included in the output summary file.
   pushUntypedAbstract,
 
-  /**
-   * Get the next type reference from [UnlinkedExpr.references] and push an
-   * abstract value onto the stack that has that type.
-   *
-   * Like [pushUntypedAbstract], this is also not used by the summary generators
-   * today. The plan is to experiment with prunning the initializer expression
-   * tree, and include just enough type information to perform strong-mode type
-   * inference, but not all the details of how this type was obtained.
-   */
+  /// Get the next type reference from [UnlinkedExpr.references] and push an
+  /// abstract value onto the stack that has that type.
+  ///
+  /// Like [pushUntypedAbstract], this is also not used by the summary
+  /// generators today. The plan is to experiment with prunning the initializer
+  /// expression tree, and include just enough type information to perform
+  /// strong-mode type inference, but not all the details of how this type was
+  /// obtained.
   pushTypedAbstract,
 
-  /**
-   * Push an error onto the stack.
-   *
-   * Like [pushUntypedAbstract], this is not used by summary generators today.
-   * This will be used to experiment with prunning the const expression tree. If
-   * a constant has an error, we can omit the subexpression containing the error
-   * and only include a marker that an error was detected.
-   */
+  /// Push an error onto the stack.
+  ///
+  /// Like [pushUntypedAbstract], this is not used by summary generators today.
+  /// This will be used to experiment with prunning the const expression tree.
+  /// If a constant has an error, we can omit the subexpression containing the
+  /// error and only include a marker that an error was detected.
   pushError,
 
-  /**
-   * Push `this` expression onto the stack.
-   */
+  /// Push `this` expression onto the stack.
   pushThis,
 
-  /**
-   * Push `super` expression onto the stack.
-   */
+  /// Push `super` expression onto the stack.
   pushSuper,
 }
 
-/**
- * Unlinked summary information about an import declaration.
- */
+/// Unlinked summary information about an import declaration.
 abstract class UnlinkedImport extends base.SummaryClass {
-  /**
-   * Annotations for this import declaration.
-   */
+  /// Annotations for this import declaration.
   @Id(8)
   List<UnlinkedExpr> get annotations;
 
-  /**
-   * Combinators contained in this import declaration.
-   */
+  /// Combinators contained in this import declaration.
   @Id(4)
   List<UnlinkedCombinator> get combinators;
 
-  /**
-   * Configurations used to control which library will actually be loaded at
-   * run-time.
-   */
+  /// Configurations used to control which library will actually be loaded at
+  /// run-time.
   @Id(10)
   List<UnlinkedConfiguration> get configurations;
 
-  /**
-   * Indicates whether the import declaration uses the `deferred` keyword.
-   */
+  /// Indicates whether the import declaration uses the `deferred` keyword.
   @Id(9)
   bool get isDeferred;
 
-  /**
-   * Indicates whether the import declaration is implicit.
-   */
+  /// Indicates whether the import declaration is implicit.
   @Id(5)
   bool get isImplicit;
 
-  /**
-   * If [isImplicit] is false, offset of the "import" keyword.  If [isImplicit]
-   * is true, zero.
-   */
+  /// If [isImplicit] is false, offset of the "import" keyword.  If [isImplicit]
+  /// is true, zero.
   @informative
   @Id(0)
   int get offset;
 
-  /**
-   * Offset of the prefix name relative to the beginning of the file, or zero
-   * if there is no prefix.
-   */
+  /// Offset of the prefix name relative to the beginning of the file, or zero
+  /// if there is no prefix.
   @informative
   @Id(6)
   int get prefixOffset;
 
-  /**
-   * Index into [UnlinkedUnit.references] of the prefix declared by this
-   * import declaration, or zero if this import declaration declares no prefix.
-   *
-   * Note that multiple imports can declare the same prefix.
-   */
+  /// Index into [UnlinkedUnit.references] of the prefix declared by this
+  /// import declaration, or zero if this import declaration declares no prefix.
+  ///
+  /// Note that multiple imports can declare the same prefix.
   @Id(7)
   int get prefixReference;
 
-  /**
-   * URI used in the source code to reference the imported library.
-   */
+  /// URI used in the source code to reference the imported library.
   @Id(1)
   String get uri;
 
-  /**
-   * End of the URI string (including quotes) relative to the beginning of the
-   * file.  If [isImplicit] is true, zero.
-   */
+  /// End of the URI string (including quotes) relative to the beginning of the
+  /// file.  If [isImplicit] is true, zero.
   @informative
   @Id(2)
   int get uriEnd;
 
-  /**
-   * Offset of the URI string (including quotes) relative to the beginning of
-   * the file.  If [isImplicit] is true, zero.
-   */
+  /// Offset of the URI string (including quotes) relative to the beginning of
+  /// the file.  If [isImplicit] is true, zero.
   @informative
   @Id(3)
   int get uriOffset;
 }
 
-/**
- * Unlinked summary information about a function parameter.
- */
+/// Unlinked summary information about a function parameter.
 abstract class UnlinkedParam extends base.SummaryClass {
-  /**
-   * Annotations for this parameter.
-   */
+  /// Annotations for this parameter.
   @Id(9)
   List<UnlinkedExpr> get annotations;
 
-  /**
-   * Code range of the parameter.
-   */
+  /// Code range of the parameter.
   @informative
   @Id(7)
   CodeRange get codeRange;
 
-  /**
-   * If the parameter has a default value, the source text of the constant
-   * expression in the default value.  Otherwise the empty string.
-   */
+  /// If the parameter has a default value, the source text of the constant
+  /// expression in the default value.  Otherwise the empty string.
   @informative
   @Id(13)
   String get defaultValueCode;
 
-  /**
-   * If this parameter's type is inferable, nonzero slot id identifying which
-   * entry in [LinkedLibrary.types] contains the inferred type.  If there is no
-   * matching entry in [LinkedLibrary.types], then no type was inferred for
-   * this variable, so its static type is `dynamic`.
-   *
-   * Note that although strong mode considers initializing formals to be
-   * inferable, they are not marked as such in the summary; if their type is
-   * not specified, they always inherit the static type of the corresponding
-   * field.
-   */
+  /// If this parameter's type is inferable, nonzero slot id identifying which
+  /// entry in [LinkedLibrary.types] contains the inferred type.  If there is no
+  /// matching entry in [LinkedLibrary.types], then no type was inferred for
+  /// this variable, so its static type is `dynamic`.
+  ///
+  /// Note that although strong mode considers initializing formals to be
+  /// inferable, they are not marked as such in the summary; if their type is
+  /// not specified, they always inherit the static type of the corresponding
+  /// field.
   @Id(2)
   int get inferredTypeSlot;
 
-  /**
-   * If this is a parameter of an instance method, a nonzero slot id which is
-   * unique within this compilation unit.  If this id is found in
-   * [LinkedUnit.parametersInheritingCovariant], then this parameter inherits
-   * `@covariant` behavior from a base class.
-   *
-   * Otherwise, zero.
-   */
+  /// If this is a parameter of an instance method, a nonzero slot id which is
+  /// unique within this compilation unit.  If this id is found in
+  /// [LinkedUnit.parametersInheritingCovariant], then this parameter inherits
+  /// `@covariant` behavior from a base class.
+  ///
+  /// Otherwise, zero.
   @Id(14)
   int get inheritsCovariantSlot;
 
-  /**
-   * The synthetic initializer function of the parameter.  Absent if the
-   * variable does not have an initializer.
-   */
+  /// The synthetic initializer function of the parameter.  Absent if the
+  /// variable does not have an initializer.
   @Id(12)
   UnlinkedExecutable get initializer;
 
-  /**
-   * Indicates whether this parameter is explicitly marked as being covariant.
-   */
+  /// Indicates whether this parameter is explicitly marked as being covariant.
   @Id(15)
   bool get isExplicitlyCovariant;
 
-  /**
-   * Indicates whether the parameter is declared using the `final` keyword.
-   */
+  /// Indicates whether the parameter is declared using the `final` keyword.
   @Id(16)
   bool get isFinal;
 
-  /**
-   * Indicates whether this is a function-typed parameter. A parameter is
-   * function-typed if the declaration of the parameter has explicit formal
-   * parameters
-   * ```
-   * int functionTyped(int p)
-   * ```
-   * but is not function-typed if it does not, even if the type of the parameter
-   * is a function type.
-   */
+  /// Indicates whether this is a function-typed parameter. A parameter is
+  /// function-typed if the declaration of the parameter has explicit formal
+  /// parameters
+  /// ```
+  /// int functionTyped(int p)
+  /// ```
+  /// but is not function-typed if it does not, even if the type of the
+  /// parameter is a function type.
   @Id(5)
   bool get isFunctionTyped;
 
-  /**
-   * Indicates whether this is an initializing formal parameter (i.e. it is
-   * declared using `this.` syntax).
-   */
+  /// Indicates whether this is an initializing formal parameter (i.e. it is
+  /// declared using `this.` syntax).
   @Id(6)
   bool get isInitializingFormal;
 
-  /**
-   * Kind of the parameter.
-   */
+  /// Kind of the parameter.
   @Id(4)
   UnlinkedParamKind get kind;
 
-  /**
-   * Name of the parameter.
-   */
+  /// Name of the parameter.
   @Id(0)
   String get name;
 
-  /**
-   * Offset of the parameter name relative to the beginning of the file.
-   */
+  /// Offset of the parameter name relative to the beginning of the file.
   @informative
   @Id(1)
   int get nameOffset;
 
-  /**
-   * If [isFunctionTyped] is `true`, the parameters of the function type.
-   */
+  /// If [isFunctionTyped] is `true`, the parameters of the function type.
   @Id(8)
   List<UnlinkedParam> get parameters;
 
-  /**
-   * If [isFunctionTyped] is `true`, the declared return type.  If
-   * [isFunctionTyped] is `false`, the declared type.  Absent if the type is
-   * implicit.
-   */
+  /// If [isFunctionTyped] is `true`, the declared return type.  If
+  /// [isFunctionTyped] is `false`, the declared type.  Absent if the type is
+  /// implicit.
   @Id(3)
   EntityRef get type;
 
-  /**
-   * The length of the visible range.
-   */
+  /// The length of the visible range.
   @informative
   @Id(10)
   int get visibleLength;
 
-  /**
-   * The beginning of the visible range.
-   */
+  /// The beginning of the visible range.
   @informative
   @Id(11)
   int get visibleOffset;
 }
 
-/**
- * Enum used to indicate the kind of a parameter.
- */
+/// Enum used to indicate the kind of a parameter.
 enum UnlinkedParamKind {
-  /**
-   * Parameter is required.
-   */
+  /// Parameter is required.
   required,
 
-  /**
-   * Parameter is positional optional (enclosed in `[]`)
-   */
+  /// Parameter is positional optional (enclosed in `[]`)
   positional,
 
-  /**
-   * Parameter is named optional (enclosed in `{}`)
-   */
+  /// Parameter is named optional (enclosed in `{}`)
   named
 }
 
-/**
- * Unlinked summary information about a part declaration.
- */
+/// Unlinked summary information about a part declaration.
 abstract class UnlinkedPart extends base.SummaryClass {
-  /**
-   * Annotations for this part declaration.
-   */
+  /// Annotations for this part declaration.
   @Id(2)
   List<UnlinkedExpr> get annotations;
 
-  /**
-   * End of the URI string (including quotes) relative to the beginning of the
-   * file.
-   */
+  /// End of the URI string (including quotes) relative to the beginning of the
+  /// file.
   @informative
   @Id(0)
   int get uriEnd;
 
-  /**
-   * Offset of the URI string (including quotes) relative to the beginning of
-   * the file.
-   */
+  /// Offset of the URI string (including quotes) relative to the beginning of
+  /// the file.
   @informative
   @Id(1)
   int get uriOffset;
 }
 
-/**
- * Unlinked summary information about a specific name contributed by a
- * compilation unit to a library's public namespace.
- *
- * TODO(paulberry): some of this information is redundant with information
- * elsewhere in the summary.  Consider reducing the redundancy to reduce
- * summary size.
- */
+/// Unlinked summary information about a specific name contributed by a
+/// compilation unit to a library's public namespace.
+///
+/// TODO(paulberry): some of this information is redundant with information
+/// elsewhere in the summary.  Consider reducing the redundancy to reduce
+/// summary size.
 abstract class UnlinkedPublicName extends base.SummaryClass {
-  /**
-   * The kind of object referred to by the name.
-   */
+  /// The kind of object referred to by the name.
   @Id(1)
   ReferenceKind get kind;
 
-  /**
-   * If this [UnlinkedPublicName] is a class, the list of members which can be
-   * referenced statically - static fields, static methods, and constructors.
-   * Otherwise empty.
-   *
-   * Unnamed constructors are not included since they do not constitute a
-   * separate name added to any namespace.
-   */
+  /// If this [UnlinkedPublicName] is a class, the list of members which can be
+  /// referenced statically - static fields, static methods, and constructors.
+  /// Otherwise empty.
+  ///
+  /// Unnamed constructors are not included since they do not constitute a
+  /// separate name added to any namespace.
   @Id(2)
   List<UnlinkedPublicName> get members;
 
-  /**
-   * The name itself.
-   */
+  /// The name itself.
   @Id(0)
   String get name;
 
-  /**
-   * If the entity being referred to is generic, the number of type parameters
-   * it accepts.  Otherwise zero.
-   */
+  /// If the entity being referred to is generic, the number of type parameters
+  /// it accepts.  Otherwise zero.
   @Id(3)
   int get numTypeParameters;
 }
 
-/**
- * Unlinked summary information about what a compilation unit contributes to a
- * library's public namespace.  This is the subset of [UnlinkedUnit] that is
- * required from dependent libraries in order to perform prelinking.
- */
+/// Unlinked summary information about what a compilation unit contributes to a
+/// library's public namespace.  This is the subset of [UnlinkedUnit] that is
+/// required from dependent libraries in order to perform prelinking.
 @TopLevel('UPNS')
 abstract class UnlinkedPublicNamespace extends base.SummaryClass {
   factory UnlinkedPublicNamespace.fromBuffer(List<int> buffer) =>
       generated.readUnlinkedPublicNamespace(buffer);
 
-  /**
-   * Export declarations in the compilation unit.
-   */
+  /// Export declarations in the compilation unit.
   @Id(2)
   List<UnlinkedExportPublic> get exports;
 
-  /**
-   * Public names defined in the compilation unit.
-   *
-   * TODO(paulberry): consider sorting these names to reduce unnecessary
-   * relinking.
-   */
+  /// Public names defined in the compilation unit.
+  ///
+  /// TODO(paulberry): consider sorting these names to reduce unnecessary
+  /// relinking.
   @Id(0)
   List<UnlinkedPublicName> get names;
 
-  /**
-   * URIs referenced by part declarations in the compilation unit.
-   */
+  /// URIs referenced by part declarations in the compilation unit.
   @Id(1)
   List<String> get parts;
 }
 
-/**
- * Unlinked summary information about a name referred to in one library that
- * might be defined in another.
- */
+/// Unlinked summary information about a name referred to in one library that
+/// might be defined in another.
 abstract class UnlinkedReference extends base.SummaryClass {
-  /**
-   * Name of the entity being referred to.  For the pseudo-type `dynamic`, the
-   * string is "dynamic".  For the pseudo-type `void`, the string is "void".
-   * For the pseudo-type `bottom`, the string is "*bottom*".
-   */
+  /// Name of the entity being referred to.  For the pseudo-type `dynamic`, the
+  /// string is "dynamic".  For the pseudo-type `void`, the string is "void".
+  /// For the pseudo-type `bottom`, the string is "*bottom*".
   @Id(0)
   String get name;
 
-  /**
-   * Prefix used to refer to the entity, or zero if no prefix is used.  This is
-   * an index into [UnlinkedUnit.references].
-   *
-   * Prefix references must always point backward; that is, for all i, if
-   * UnlinkedUnit.references[i].prefixReference != 0, then
-   * UnlinkedUnit.references[i].prefixReference < i.
-   */
+  /// Prefix used to refer to the entity, or zero if no prefix is used.  This is
+  /// an index into [UnlinkedUnit.references].
+  ///
+  /// Prefix references must always point backward; that is, for all i, if
+  /// UnlinkedUnit.references[i].prefixReference != 0, then
+  /// UnlinkedUnit.references[i].prefixReference < i.
   @Id(1)
   int get prefixReference;
 }
 
-/**
- * Unlinked summary information about a typedef declaration.
- */
+/// Unlinked summary information about a typedef declaration.
 abstract class UnlinkedTypedef extends base.SummaryClass {
-  /**
-   * Annotations for this typedef.
-   */
+  /// Annotations for this typedef.
   @Id(4)
   List<UnlinkedExpr> get annotations;
 
-  /**
-   * Code range of the typedef.
-   */
+  /// Code range of the typedef.
   @informative
   @Id(7)
   CodeRange get codeRange;
 
-  /**
-   * Documentation comment for the typedef, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the typedef, or `null` if there is no
+  /// documentation comment.
   @informative
   @Id(6)
   UnlinkedDocumentationComment get documentationComment;
 
-  /**
-   * Name of the typedef.
-   */
+  /// Name of the typedef.
   @Id(0)
   String get name;
 
-  /**
-   * Offset of the typedef name relative to the beginning of the file.
-   */
+  /// Offset of the typedef name relative to the beginning of the file.
   @informative
   @Id(1)
   int get nameOffset;
 
-  /**
-   * Parameters of the executable, if any.
-   */
+  /// Parameters of the executable, if any.
   @Id(3)
   List<UnlinkedParam> get parameters;
 
-  /**
-   * If [style] is [TypedefStyle.functionType], the return type of the typedef.
-   * If [style] is [TypedefStyle.genericFunctionType], the function type being
-   * defined.
-   */
+  /// If [style] is [TypedefStyle.functionType], the return type of the typedef.
+  /// If [style] is [TypedefStyle.genericFunctionType], the function type being
+  /// defined.
   @Id(2)
   EntityRef get returnType;
 
-  /**
-   * The style of the typedef.
-   */
+  /// The style of the typedef.
   @Id(8)
   TypedefStyle get style;
 
-  /**
-   * Type parameters of the typedef, if any.
-   */
+  /// Type parameters of the typedef, if any.
   @Id(5)
   List<UnlinkedTypeParam> get typeParameters;
 }
 
-/**
- * Unlinked summary information about a type parameter declaration.
- */
+/// Unlinked summary information about a type parameter declaration.
 abstract class UnlinkedTypeParam extends base.SummaryClass {
-  /**
-   * Annotations for this type parameter.
-   */
+  /// Annotations for this type parameter.
   @Id(3)
   List<UnlinkedExpr> get annotations;
 
-  /**
-   * Bound of the type parameter, if a bound is explicitly declared.  Otherwise
-   * null.
-   */
+  /// Bound of the type parameter, if a bound is explicitly declared.  Otherwise
+  /// null.
   @Id(2)
   EntityRef get bound;
 
-  /**
-   * Code range of the type parameter.
-   */
+  /// Code range of the type parameter.
   @informative
   @Id(4)
   CodeRange get codeRange;
 
-  /**
-   * Name of the type parameter.
-   */
+  /// Name of the type parameter.
   @Id(0)
   String get name;
 
-  /**
-   * Offset of the type parameter name relative to the beginning of the file.
-   */
+  /// Offset of the type parameter name relative to the beginning of the file.
   @informative
   @Id(1)
   int get nameOffset;
 }
 
-/**
- * Unlinked summary information about a compilation unit ("part file").
- */
+/// Unlinked summary information about a compilation unit ("part file").
 @TopLevel('UUnt')
 abstract class UnlinkedUnit extends base.SummaryClass {
   factory UnlinkedUnit.fromBuffer(List<int> buffer) =>
       generated.readUnlinkedUnit(buffer);
 
-  /**
-   * MD5 hash of the non-informative fields of the [UnlinkedUnit] (not
-   * including this one) as 16 unsigned 8-bit integer values.  This can be used
-   * to identify when the API of a unit may have changed.
-   */
+  /// MD5 hash of the non-informative fields of the [UnlinkedUnit] (not
+  /// including this one) as 16 unsigned 8-bit integer values.  This can be used
+  /// to identify when the API of a unit may have changed.
   @Id(19)
   List<int> get apiSignature;
 
-  /**
-   * Classes declared in the compilation unit.
-   */
+  /// Classes declared in the compilation unit.
   @Id(2)
   List<UnlinkedClass> get classes;
 
-  /**
-   * Code range of the unit.
-   */
+  /// Code range of the unit.
   @informative
   @Id(15)
   CodeRange get codeRange;
 
-  /**
-   * Enums declared in the compilation unit.
-   */
+  /// Enums declared in the compilation unit.
   @Id(12)
   List<UnlinkedEnum> get enums;
 
-  /**
-   * Top level executable objects (functions, getters, and setters) declared in
-   * the compilation unit.
-   */
+  /// Top level executable objects (functions, getters, and setters) declared in
+  /// the compilation unit.
   @Id(4)
   List<UnlinkedExecutable> get executables;
 
-  /**
-   * Export declarations in the compilation unit.
-   */
+  /// Export declarations in the compilation unit.
   @Id(13)
   List<UnlinkedExportNonPublic> get exports;
 
-  /**
-   * If this compilation unit was summarized in fallback mode, the path where
-   * the compilation unit may be found on disk.  Otherwise empty.
-   *
-   * When this field is non-empty, all other fields in the data structure have
-   * their default values.
-   */
+  /// If this compilation unit was summarized in fallback mode, the path where
+  /// the compilation unit may be found on disk.  Otherwise empty.
+  ///
+  /// When this field is non-empty, all other fields in the data structure have
+  /// their default values.
   @deprecated
   @Id(16)
   String get fallbackModePath;
 
-  /**
-   * Import declarations in the compilation unit.
-   */
+  /// Import declarations in the compilation unit.
   @Id(5)
   List<UnlinkedImport> get imports;
 
-  /**
-   * Indicates whether the unit contains a "part of" declaration.
-   */
+  /// Indicates whether the unit contains a "part of" declaration.
   @Id(18)
   bool get isPartOf;
 
-  /**
-   * Annotations for the library declaration, or the empty list if there is no
-   * library declaration.
-   */
+  /// Annotations for the library declaration, or the empty list if there is no
+  /// library declaration.
   @Id(14)
   List<UnlinkedExpr> get libraryAnnotations;
 
-  /**
-   * Documentation comment for the library, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the library, or `null` if there is no
+  /// documentation comment.
   @informative
   @Id(9)
   UnlinkedDocumentationComment get libraryDocumentationComment;
 
-  /**
-   * Name of the library (from a "library" declaration, if present).
-   */
+  /// Name of the library (from a "library" declaration, if present).
   @Id(6)
   String get libraryName;
 
-  /**
-   * Length of the library name as it appears in the source code (or 0 if the
-   * library has no name).
-   */
+  /// Length of the library name as it appears in the source code (or 0 if the
+  /// library has no name).
   @informative
   @Id(7)
   int get libraryNameLength;
 
-  /**
-   * Offset of the library name relative to the beginning of the file (or 0 if
-   * the library has no name).
-   */
+  /// Offset of the library name relative to the beginning of the file (or 0 if
+  /// the library has no name).
   @informative
   @Id(8)
   int get libraryNameOffset;
 
-  /**
-   * Offsets of the first character of each line in the source code.
-   */
+  /// Offsets of the first character of each line in the source code.
   @informative
   @Id(17)
   List<int> get lineStarts;
 
-  /**
-   * Mixins declared in the compilation unit.
-   */
+  /// Mixins declared in the compilation unit.
   @Id(20)
   List<UnlinkedClass> get mixins;
 
-  /**
-   * Part declarations in the compilation unit.
-   */
+  /// Part declarations in the compilation unit.
   @Id(11)
   List<UnlinkedPart> get parts;
 
-  /**
-   * Unlinked public namespace of this compilation unit.
-   */
+  /// Unlinked public namespace of this compilation unit.
   @Id(0)
   UnlinkedPublicNamespace get publicNamespace;
 
-  /**
-   * Top level and prefixed names referred to by this compilation unit.  The
-   * zeroth element of this array is always populated and is used to represent
-   * the absence of a reference in places where a reference is optional (for
-   * example [UnlinkedReference.prefixReference or
-   * UnlinkedImport.prefixReference]).
-   */
+  /// Top level and prefixed names referred to by this compilation unit.  The
+  /// zeroth element of this array is always populated and is used to represent
+  /// the absence of a reference in places where a reference is optional (for
+  /// example [UnlinkedReference.prefixReference or
+  /// UnlinkedImport.prefixReference]).
   @Id(1)
   List<UnlinkedReference> get references;
 
-  /**
-   * Typedefs declared in the compilation unit.
-   */
+  /// Typedefs declared in the compilation unit.
   @Id(10)
   List<UnlinkedTypedef> get typedefs;
 
-  /**
-   * Top level variables declared in the compilation unit.
-   */
+  /// Top level variables declared in the compilation unit.
   @Id(3)
   List<UnlinkedVariable> get variables;
 }
 
-/**
- * Unlinked summary information about a top level variable, local variable, or
- * a field.
- */
+/// Unlinked summary information about a top level variable, local variable, or
+/// a field.
 abstract class UnlinkedVariable extends base.SummaryClass {
-  /**
-   * Annotations for this variable.
-   */
+  /// Annotations for this variable.
   @Id(8)
   List<UnlinkedExpr> get annotations;
 
-  /**
-   * Code range of the variable.
-   */
+  /// Code range of the variable.
   @informative
   @Id(5)
   CodeRange get codeRange;
 
-  /**
-   * Documentation comment for the variable, or `null` if there is no
-   * documentation comment.
-   */
+  /// Documentation comment for the variable, or `null` if there is no
+  /// documentation comment.
   @informative
   @Id(10)
   UnlinkedDocumentationComment get documentationComment;
 
-  /**
-   * If this variable is inferable, nonzero slot id identifying which entry in
-   * [LinkedLibrary.types] contains the inferred type for this variable.  If
-   * there is no matching entry in [LinkedLibrary.types], then no type was
-   * inferred for this variable, so its static type is `dynamic`.
-   */
+  /// If this variable is inferable, nonzero slot id identifying which entry in
+  /// [LinkedLibrary.types] contains the inferred type for this variable.  If
+  /// there is no matching entry in [LinkedLibrary.types], then no type was
+  /// inferred for this variable, so its static type is `dynamic`.
   @Id(9)
   int get inferredTypeSlot;
 
-  /**
-   * If this is an instance non-final field, a nonzero slot id which is unique
-   * within this compilation unit.  If this id is found in
-   * [LinkedUnit.parametersInheritingCovariant], then the parameter of the
-   * synthetic setter inherits `@covariant` behavior from a base class.
-   *
-   * Otherwise, zero.
-   */
+  /// If this is an instance non-final field, a nonzero slot id which is unique
+  /// within this compilation unit.  If this id is found in
+  /// [LinkedUnit.parametersInheritingCovariant], then the parameter of the
+  /// synthetic setter inherits `@covariant` behavior from a base class.
+  ///
+  /// Otherwise, zero.
   @Id(15)
   int get inheritsCovariantSlot;
 
-  /**
-   * The synthetic initializer function of the variable.  Absent if the variable
-   * does not have an initializer.
-   */
+  /// The synthetic initializer function of the variable.  Absent if the
+  /// variable does not have an initializer.
   @Id(13)
   UnlinkedExecutable get initializer;
 
-  /**
-   * Indicates whether the variable is declared using the `const` keyword.
-   */
+  /// Indicates whether the variable is declared using the `const` keyword.
   @Id(6)
   bool get isConst;
 
-  /**
-   * Indicates whether this variable is declared using the `covariant` keyword.
-   * This should be false for everything except instance fields.
-   */
+  /// Indicates whether this variable is declared using the `covariant` keyword.
+  /// This should be false for everything except instance fields.
   @Id(14)
   bool get isCovariant;
 
-  /**
-   * Indicates whether the variable is declared using the `final` keyword.
-   */
+  /// Indicates whether the variable is declared using the `final` keyword.
   @Id(7)
   bool get isFinal;
 
-  /**
-   * Indicates whether the variable is declared using the `static` keyword.
-   *
-   * Note that for top level variables, this flag is false, since they are not
-   * declared using the `static` keyword (even though they are considered
-   * static for semantic purposes).
-   */
+  /// Indicates whether the variable is declared using the `static` keyword.
+  ///
+  /// Note that for top level variables, this flag is false, since they are not
+  /// declared using the `static` keyword (even though they are considered
+  /// static for semantic purposes).
   @Id(4)
   bool get isStatic;
 
-  /**
-   * Name of the variable.
-   */
+  /// Name of the variable.
   @Id(0)
   String get name;
 
-  /**
-   * Offset of the variable name relative to the beginning of the file.
-   */
+  /// Offset of the variable name relative to the beginning of the file.
   @informative
   @Id(1)
   int get nameOffset;
 
-  /**
-   * If this variable is propagable, nonzero slot id identifying which entry in
-   * [LinkedLibrary.types] contains the propagated type for this variable.  If
-   * there is no matching entry in [LinkedLibrary.types], then this variable's
-   * propagated type is the same as its declared type.
-   *
-   * Non-propagable variables have a [propagatedTypeSlot] of zero.
-   */
+  /// If this variable is propagable, nonzero slot id identifying which entry in
+  /// [LinkedLibrary.types] contains the propagated type for this variable.  If
+  /// there is no matching entry in [LinkedLibrary.types], then this variable's
+  /// propagated type is the same as its declared type.
+  ///
+  /// Non-propagable variables have a [propagatedTypeSlot] of zero.
   @Id(2)
   int get propagatedTypeSlot;
 
-  /**
-   * Declared type of the variable.  Absent if the type is implicit.
-   */
+  /// Declared type of the variable.  Absent if the type is implicit.
   @Id(3)
   EntityRef get type;
 
-  /**
-   * If a local variable, the length of the visible range; zero otherwise.
-   */
+  /// If a local variable, the length of the visible range; zero otherwise.
   @deprecated
   @informative
   @Id(11)
   int get visibleLength;
 
-  /**
-   * If a local variable, the beginning of the visible range; zero otherwise.
-   */
+  /// If a local variable, the beginning of the visible range; zero otherwise.
   @deprecated
   @informative
   @Id(12)
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index f97e1a3..c8f621c 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -64,6 +64,7 @@
 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/type.dart';
 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -78,7 +79,6 @@
 import 'package:analyzer/src/summary/prelink.dart';
 import 'package:analyzer/src/summary/resynthesize.dart';
 import 'package:analyzer/src/task/strong_mode.dart';
-import 'package:front_end/src/dependency_walker.dart';
 
 final _typesWithImplicitArguments = new Expando();
 
@@ -395,9 +395,6 @@
   bool get implicitCasts => true;
 
   @override
-  List<String> get nonnullableTypes => AnalysisOptionsImpl.NONNULLABLE_TYPES;
-
-  @override
   bool get previewDart2 => true;
 
   @override
@@ -458,6 +455,9 @@
   LibraryElementForLink get library => enclosingElement.library;
 
   @override
+  Source get librarySource => library.source;
+
+  @override
   List<MethodElementForLink> get methods;
 
   @override
@@ -2024,6 +2024,132 @@
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
+/**
+ * An instance of [DependencyWalker] contains the core algorithms for
+ * walking a dependency graph and evaluating nodes in a safe order.
+ */
+abstract class DependencyWalker<NodeType extends Node<NodeType>> {
+  /**
+   * Called by [walk] to evaluate a single non-cyclical node, after
+   * all that node's dependencies have been evaluated.
+   */
+  void evaluate(NodeType v);
+
+  /**
+   * Called by [walk] to evaluate a strongly connected component
+   * containing one or more nodes.  All dependencies of the strongly
+   * connected component have been evaluated.
+   */
+  void evaluateScc(List<NodeType> scc);
+
+  /**
+   * Walk the dependency graph starting at [startingPoint], finding
+   * strongly connected components and evaluating them in a safe order
+   * by calling [evaluate] and [evaluateScc].
+   *
+   * This is an implementation of Tarjan's strongly connected
+   * components algorithm
+   * (https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm).
+   */
+  void walk(NodeType startingPoint) {
+    // TODO(paulberry): consider rewriting in a non-recursive way so
+    // that long dependency chains don't cause stack overflow.
+
+    // TODO(paulberry): in the event that an exception occurs during
+    // the walk, restore the state of the [Node] data structures so
+    // that further evaluation will be safe.
+
+    // The index which will be assigned to the next node that is
+    // freshly visited.
+    int index = 1;
+
+    // Stack of nodes which have been seen so far and whose strongly
+    // connected component is still being determined.  Nodes are only
+    // popped off the stack when they are evaluated, so sometimes the
+    // stack contains nodes that were visited after the current node.
+    List<NodeType> stack = <NodeType>[];
+
+    void strongConnect(NodeType node) {
+      bool hasTrivialCycle = false;
+
+      // Assign the current node an index and add it to the stack.  We
+      // haven't seen any of its dependencies yet, so set its lowLink
+      // to its index, indicating that so far it is the only node in
+      // its strongly connected component.
+      node._index = node._lowLink = index++;
+      stack.add(node);
+
+      // Consider the node's dependencies one at a time.
+      for (NodeType dependency in Node.getDependencies(node)) {
+        // If the dependency has already been evaluated, it can't be
+        // part of this node's strongly connected component, so we can
+        // skip it.
+        if (dependency.isEvaluated) {
+          continue;
+        }
+        if (identical(node, dependency)) {
+          // If a node includes itself as a dependency, there is no need to
+          // explore the dependency further.
+          hasTrivialCycle = true;
+        } else if (dependency._index == 0) {
+          // The dependency hasn't been seen yet, so recurse on it.
+          strongConnect(dependency);
+          // If the dependency's lowLink refers to a node that was
+          // visited before the current node, that means that the
+          // current node, the dependency, and the node referred to by
+          // the dependency's lowLink are all part of the same
+          // strongly connected component, so we need to update the
+          // current node's lowLink accordingly.
+          if (dependency._lowLink < node._lowLink) {
+            node._lowLink = dependency._lowLink;
+          }
+        } else {
+          // The dependency has already been seen, so it is part of
+          // the current node's strongly connected component.  If it
+          // was visited earlier than the current node's lowLink, then
+          // it is a new addition to the current node's strongly
+          // connected component, so we need to update the current
+          // node's lowLink accordingly.
+          if (dependency._index < node._lowLink) {
+            node._lowLink = dependency._index;
+          }
+        }
+      }
+
+      // If the current node's lowLink is the same as its index, then
+      // we have finished visiting a strongly connected component, so
+      // pop the stack and evaluate it before moving on.
+      if (node._lowLink == node._index) {
+        // The strongly connected component has only one node.  If there is a
+        // cycle, it's a trivial one.
+        if (identical(stack.last, node)) {
+          stack.removeLast();
+          if (hasTrivialCycle) {
+            evaluateScc(<NodeType>[node]);
+          } else {
+            evaluate(node);
+          }
+        } else {
+          // There are multiple nodes in the strongly connected
+          // component.
+          List<NodeType> scc = <NodeType>[];
+          while (true) {
+            NodeType otherNode = stack.removeLast();
+            scc.add(otherNode);
+            if (identical(otherNode, node)) {
+              break;
+            }
+          }
+          evaluateScc(scc);
+        }
+      }
+    }
+
+    // Kick off the algorithm starting with the starting point.
+    strongConnect(startingPoint);
+  }
+}
+
 /// Base class for executable elements resynthesized from a summary during
 /// linking.
 abstract class ExecutableElementForLink extends Object
@@ -2110,6 +2236,9 @@
   }
 
   @override
+  bool get isAbstract => serializedExecutable.isAbstract;
+
+  @override
   bool get isGenerator => serializedExecutable.isGenerator;
 
   @override
@@ -2244,8 +2373,9 @@
       nameScope = new ClassScope(
           new TypeParameterScope(nameScope, enclosingClass), enclosingClass);
     }
+    var inheritance = new InheritanceManager2(linker.typeSystem);
     var resolverVisitor = new ResolverVisitor(
-        library, source, typeProvider, errorListener,
+        inheritance, library, source, typeProvider, errorListener,
         nameScope: nameScope,
         propagateTypes: false,
         reportConstEvaluationErrors: false);
@@ -2256,7 +2386,7 @@
         library, source, typeProvider, errorListener,
         nameScope: nameScope);
     var partialResolverVisitor = new PartialResolverVisitor(
-        library, source, typeProvider, errorListener,
+        inheritance, library, source, typeProvider, errorListener,
         nameScope: nameScope);
     return new ExprTypeComputer._(
         unit._unitResynthesizer,
@@ -3462,7 +3592,7 @@
 
   /// Get the inheritance manager for this library (creating it if necessary).
   InheritanceManager get inheritanceManager =>
-      _inheritanceManager ??= new InheritanceManager(this, ignoreErrors: true);
+      _inheritanceManager ??= new InheritanceManager(this);
 
   @override
   LibraryCycleForLink get libraryCycleForLink {
@@ -3746,6 +3876,47 @@
   String toString() => '$enclosingElement.$name';
 }
 
+/**
+ * Instances of [Node] represent nodes in a dependency graph.  The
+ * type parameter, [NodeType], is the derived type (this affords some
+ * extra type safety by making it difficult to accidentally construct
+ * bridges between unrelated dependency graphs).
+ */
+abstract class Node<NodeType> {
+  /**
+   * Index used by Tarjan's strongly connected components algorithm.
+   * Zero means the node has not been visited yet; a nonzero value
+   * counts the order in which the node was visited.
+   */
+  int _index = 0;
+
+  /**
+   * Low link used by Tarjan's strongly connected components
+   * algorithm.  This represents the smallest [_index] of all the nodes
+   * in the strongly connected component to which this node belongs.
+   */
+  int _lowLink = 0;
+
+  List<NodeType> _dependencies;
+
+  /**
+   * Indicates whether this node has been evaluated yet.
+   */
+  bool get isEvaluated;
+
+  /**
+   * Compute the dependencies of this node.
+   */
+  List<NodeType> computeDependencies();
+
+  /**
+   * Gets the dependencies of the given node, computing them if necessary.
+   */
+  static List<NodeType> getDependencies<NodeType>(Node<NodeType> node) {
+    return node._dependencies ??= node.computeDependencies();
+  }
+}
+
 /// Element used for references that result from trying to access a non-static
 /// member of an element that is not a container (e.g. accessing the "length"
 /// property of a constant).
@@ -4299,6 +4470,9 @@
   Element get enclosingElement => variable.enclosingElement;
 
   @override
+  bool get isAbstract => false;
+
+  @override
   bool get isGetter => !isSetter;
 
   @override
@@ -5103,9 +5277,15 @@
   CompilationUnitElementForLink _unit;
 
   @override
+  LibraryElement get library => _unit.library;
+
+  @override
   TypeProvider get typeProvider => _unit.library._linker.typeProvider;
 
   @override
+  TypeSystem get typeSystem => _unit.library._linker._typeSystem;
+
+  @override
   DartType buildType(ElementImpl context, EntityRef type) =>
       _unit.resolveTypeRef(context, type);
 
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index 18dc9b8..801ab29 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -17,7 +17,6 @@
 import 'package:analyzer/src/task/api/general.dart';
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:analyzer/src/task/dart.dart';
-import 'package:front_end/src/base/source.dart';
 
 /**
  * A [ConflictingSummaryException] indicates that two different summaries
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index 355b249..db40e7a 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -7,10 +7,8 @@
 import 'dart:collection';
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_ast_factory.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/dart/element/handle.dart';
 import 'package:analyzer/src/dart/element/member.dart';
@@ -198,6 +196,11 @@
   TypeProvider get typeProvider => _typeProvider;
 
   /**
+   * The [TypeSystem] used perform type operations.
+   */
+  TypeSystem get typeSystem => context.typeSystem;
+
+  /**
    * The client installed this resynthesizer into the context, and set its
    * type provider, so it is not safe to access type provider to create
    * additional types.
@@ -326,7 +329,7 @@
             new LibraryElementImpl(context, '', -1, 0);
         libraryElement.isSynthetic = true;
         CompilationUnitElementImpl unitElement =
-            new CompilationUnitElementImpl(librarySource.shortName);
+            new CompilationUnitElementImpl();
         libraryElement.definingCompilationUnit = unitElement;
         unitElement.source = librarySource;
         unitElement.librarySource = librarySource;
@@ -466,9 +469,15 @@
 /// An instance of [_UnitResynthesizer] is responsible for resynthesizing the
 /// elements in a single unit from that unit's summary.
 abstract class UnitResynthesizer {
+  /// Gets the [LibraryElement] being resynthesized.
+  LibraryElement get library;
+
   /// Gets the [TypeProvider], which may be used to create core types.
   TypeProvider get typeProvider;
 
+  /// Gets the [TypeSystem], which may be used to create core types.
+  TypeSystem get typeSystem;
+
   /// Builds a [DartType] object based on a [EntityRef].  This [DartType]
   /// may refer to elements in other libraries than the library being
   /// deserialized, so handles may be used to avoid having to deserialize other
@@ -1145,11 +1154,6 @@
   CompilationUnitElementImpl unit;
 
   /**
-   * The visitor to rewrite implicit `new` and `const`.
-   */
-  AstRewriteVisitor astRewriteVisitor;
-
-  /**
    * Map from slot id to the corresponding [EntityRef] object for linked types
    * (i.e. propagated and inferred types).
    */
@@ -1189,8 +1193,7 @@
         libraryResynthesizer.library,
         _resynthesizerContext,
         unlinkedUnit,
-        unlinkedPart,
-        unitSource?.shortName);
+        unlinkedPart);
 
     {
       List<int> lineStarts = unlinkedUnit.lineStarts;
@@ -1211,12 +1214,18 @@
     referenceInfos = new List<_ReferenceInfo>(numLinkedReferences);
   }
 
+  @override
+  LibraryElement get library => libraryResynthesizer.library;
+
   SummaryResynthesizer get summaryResynthesizer =>
       libraryResynthesizer.summaryResynthesizer;
 
   @override
   TypeProvider get typeProvider => summaryResynthesizer.typeProvider;
 
+  @override
+  TypeSystem get typeSystem => summaryResynthesizer.typeSystem;
+
   /**
    * Build [ElementAnnotationImpl] for the given [UnlinkedExpr].
    */
@@ -1586,22 +1595,7 @@
   }
 
   Expression _buildConstExpression(ElementImpl context, UnlinkedExpr uc) {
-    var expression = new ExprBuilder(this, context, uc).build();
-
-    if (expression != null) {
-      astRewriteVisitor ??= new AstRewriteVisitor(
-          libraryResynthesizer.summaryResynthesizer.context.typeSystem,
-          libraryResynthesizer.library,
-          unit.source,
-          typeProvider,
-          AnalysisErrorListener.NULL_LISTENER,
-          addConstKeyword: true);
-      var container = astFactory.expressionStatement(expression, null);
-      expression.accept(astRewriteVisitor);
-      expression = container.expression;
-    }
-
-    return expression;
+    return new ExprBuilder(this, context, uc).build();
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart
index 90c0d12..189ae80 100644
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart
@@ -12,7 +12,7 @@
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/public_namespace_computer.dart';
 import 'package:analyzer/src/summary/summarize_const_expr.dart';
-import 'package:front_end/src/base/api_signature.dart';
+import 'package:analyzer/src/summary/api_signature.dart';
 
 /// Serialize all the declarations in [compilationUnit] to an unlinked summary.
 ///
@@ -213,6 +213,9 @@
   final List<UnlinkedExportNonPublicBuilder> exports =
       <UnlinkedExportNonPublicBuilder>[];
 
+  /// Whether the current class declaration has a `const` constructor.
+  bool enclosingClassHasConstConstructor = false;
+
   /// List of objects which should be written to [UnlinkedUnit.mixins].
   final List<UnlinkedClassBuilder> mixins = <UnlinkedClassBuilder>[];
 
@@ -374,6 +377,9 @@
       Comment documentationComment,
       NodeList<Annotation> annotations) {
     int oldScopesLength = scopes.length;
+    enclosingClassHasConstConstructor = node is ClassDeclaration &&
+        node.members
+            .any((m) => m is ConstructorDeclaration && m.constKeyword != null);
     List<UnlinkedExecutableBuilder> oldExecutables = executables;
     executables = <UnlinkedExecutableBuilder>[];
     List<UnlinkedVariableBuilder> oldVariables = variables;
@@ -971,8 +977,11 @@
       }
 
       bool serializeBodyExpr = variable.isConst ||
-          variable.isFinal && isField && !isDeclaredStatic ||
-          _serializeInferrableFields && variables.type == null;
+          _serializeInferrableFields && variables.type == null ||
+          isField &&
+              !isDeclaredStatic &&
+              variables.isFinal &&
+              enclosingClassHasConstConstructor;
       b.initializer = serializeInitializerFunction(
           variable.initializer, serializeBodyExpr, b.isConst);
       if (isField && !isDeclaredStatic && !variables.isFinal) {
diff --git a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
index 40b9f9c..6bb8870 100644
--- a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
@@ -356,8 +356,11 @@
       }
     } else if (expr is FunctionExpressionInvocation) {
       isValidConst = false;
-      // TODO(scheglov) implement
-      operations.add(UnlinkedExprOperation.pushNull);
+      _serialize(expr.function);
+      _serializeArguments(expr.argumentList, expr.typeArguments != null);
+      strings.add('call');
+      _serializeTypeArguments(expr.typeArguments);
+      operations.add(UnlinkedExprOperation.invokeMethod);
     } else if (expr is AsExpression) {
       isValidConst = false;
       _serialize(expr.expression);
diff --git a/pkg/analyzer/lib/src/task/api/model.dart b/pkg/analyzer/lib/src/task/api/model.dart
index 703d8b8..fbfadff 100644
--- a/pkg/analyzer/lib/src/task/api/model.dart
+++ b/pkg/analyzer/lib/src/task/api/model.dart
@@ -12,9 +12,6 @@
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/task/driver.dart';
 import 'package:analyzer/src/task/model.dart';
-import 'package:front_end/src/base/analysis_target.dart';
-
-export 'package:front_end/src/base/analysis_target.dart' show AnalysisTarget;
 
 /**
  * A function that converts the given [key] and [value] into a [TaskInput].
@@ -69,6 +66,27 @@
 }
 
 /**
+ * An object with which an analysis result can be associated.
+ *
+ * Clients may implement this class when creating new kinds of targets.
+ * Instances of this type are used in hashed data structures, so subtypes are
+ * required to correctly implement [==] and [hashCode].
+ */
+abstract class AnalysisTarget {
+  /**
+   * If this target is associated with a library, return the source of the
+   * library's defining compilation unit; otherwise return `null`.
+   */
+  Source get librarySource;
+
+  /**
+   * Return the source associated with this target, or `null` if this target is
+   * not associated with a source.
+   */
+  Source get source;
+}
+
+/**
  * An object used to compute one or more analysis results associated with a
  * single target.
  *
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index 96e2632..139a257 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -18,14 +18,17 @@
 import 'package:analyzer/src/dart/ast/ast.dart'
     show NamespaceDirectiveImpl, UriBasedDirectiveImpl, UriValidationCode;
 import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dart/constant/constant_verifier.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/resolver/inheritance_manager.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/dart/sdk/patch.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/error/inheritance_override.dart';
 import 'package:analyzer/src/error/pending_error.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/declaration_resolver.dart';
@@ -2858,7 +2861,7 @@
     TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
 
     unit.accept(new BestPracticesVerifier(
-        errorReporter, typeProvider, libraryElement, inheritanceManager,
+        errorReporter, typeProvider, libraryElement,
         typeSystem: typeSystem));
     unit.accept(new OverrideVerifier(errorReporter, inheritanceManager));
     // Find to-do comments.
@@ -3399,6 +3402,7 @@
 
     CompilationUnit unit = getRequiredInput(UNIT_INPUT);
     TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    var inheritance = new InheritanceManager2(context.typeSystem);
 
     // If we're not in a dependency cycle, and we have no type annotation,
     // re-resolve the right hand side and do inference.
@@ -3414,7 +3418,7 @@
 
       ResolutionContext resolutionContext =
           ResolutionContextBuilder.contextFor(initializer);
-      ResolverVisitor visitor = new ResolverVisitor(
+      ResolverVisitor visitor = new ResolverVisitor(inheritance,
           variable.library, variable.source, typeProvider, errorListener,
           nameScope: resolutionContext.scope);
       if (resolutionContext.enclosingClassDeclaration != null) {
@@ -4018,11 +4022,16 @@
     CompilationUnit unit = getRequiredInput(UNIT_INPUT);
     CompilationUnitElement unitElement = unit.declaredElement;
     TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    var inheritance = new InheritanceManager2(context.typeSystem);
     //
     // Resolve references and record outputs.
     //
-    PartialResolverVisitor visitor = new PartialResolverVisitor(libraryElement,
-        unitElement.source, typeProvider, AnalysisErrorListener.NULL_LISTENER);
+    PartialResolverVisitor visitor = new PartialResolverVisitor(
+        inheritance,
+        libraryElement,
+        unitElement.source,
+        typeProvider,
+        AnalysisErrorListener.NULL_LISTENER);
     unit.accept(visitor);
     //
     // Record outputs.
@@ -4550,12 +4559,14 @@
     LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT);
     CompilationUnit unit = getRequiredInput(UNIT_INPUT);
     TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    var inheritance = new InheritanceManager2(context.typeSystem);
 
     CompilationUnitElement unitElement = unit.declaredElement;
     //
     // Resolve references.
     //
     InstanceFieldResolverVisitor visitor = new InstanceFieldResolverVisitor(
+        inheritance,
         libraryElement,
         unitElement.source,
         typeProvider,
@@ -4992,13 +5003,14 @@
     LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT);
     CompilationUnit unit = getRequiredInput(UNIT_INPUT);
     TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    var inheritance = new InheritanceManager2(context.typeSystem);
     //
     // Resolve everything.
     //
     CompilationUnitElement unitElement = unit.declaredElement;
     RecordingErrorListener errorListener = new RecordingErrorListener();
-    ResolverVisitor visitor = new ResolverVisitor(
-        libraryElement, unitElement.source, typeProvider, errorListener);
+    ResolverVisitor visitor = new ResolverVisitor(inheritance, libraryElement,
+        unitElement.source, typeProvider, errorListener);
     unit.accept(visitor);
     //
     // Compute constant expressions' dependencies.
@@ -5437,8 +5449,7 @@
           typeProvider,
           new StrongTypeSystemImpl(typeProvider,
               implicitCasts: options.implicitCasts,
-              declarationCasts: options.declarationCasts,
-              nonnullableTypes: options.nonnullableTypes),
+              declarationCasts: options.declarationCasts),
           errorListener,
           options);
       checker.visitCompilationUnit(unit);
@@ -5553,6 +5564,16 @@
     ConstantVerifier constantVerifier = new ConstantVerifier(
         errorReporter, libraryElement, typeProvider, context.declaredVariables);
     unit.accept(constantVerifier);
+
+    //
+    // Compute inheritance and override errors.
+    //
+    var typeSystem = libraryElement.context.typeSystem;
+    var inheritanceManager2 = new InheritanceManager2(typeSystem);
+    var inheritanceOverrideVerifier = new InheritanceOverrideVerifier(
+        typeSystem, inheritanceManager2, errorReporter);
+    inheritanceOverrideVerifier.verifyUnit(unit);
+
     //
     // Use the ErrorVerifier to compute errors.
     //
@@ -5561,6 +5582,7 @@
         libraryElement,
         typeProvider,
         new InheritanceManager(libraryElement),
+        inheritanceManager2,
         context.analysisOptions.enableSuperMixins,
         disableConflictingGenericsCheck: true);
     unit.accept(errorVerifier);
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 74f65da..2c7a72d 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -95,33 +95,6 @@
   return null;
 }
 
-/// Return the field on type corresponding to member, or null if none
-/// exists or the "field" is actually a getter/setter.
-FieldElement _getMemberField(
-    InterfaceType type, PropertyAccessorElement member) {
-  String memberName = member.name;
-  FieldElement field;
-  if (member.isGetter) {
-    // The subclass member is an explicit getter or a field
-    // - lookup the getter on the superclass.
-    var getter = type.getGetter(memberName);
-    if (getter == null || getter.isStatic) return null;
-    field = getter.variable;
-  } else if (!member.isSynthetic) {
-    // The subclass member is an explicit setter
-    // - lookup the setter on the superclass.
-    // Note: an implicit (synthetic) setter would have already been flagged on
-    // the getter above.
-    var setter = type.getSetter(memberName);
-    if (setter == null || setter.isStatic) return null;
-    field = setter.variable;
-  } else {
-    return null;
-  }
-  if (field.isSynthetic) return null;
-  return field;
-}
-
 /// Looks up the declaration that matches [member] in [type] and returns it's
 /// declared type.
 FunctionType _getMemberType(InterfaceType type, ExecutableElement member) {
@@ -254,24 +227,18 @@
   void visitBinaryExpression(BinaryExpression node) {
     var op = node.operator;
     if (op.isUserDefinableOperator) {
-      var element = node.staticElement;
-      if (element == null) {
+      var invokeType = node.staticInvokeType;
+      if (invokeType == null) {
         // Dynamic invocation
         // TODO(vsm): Move this logic to the resolver?
         if (op.type != TokenType.EQ_EQ && op.type != TokenType.BANG_EQ) {
           _recordDynamicInvoke(node, node.leftOperand);
         }
       } else {
-        // Method invocation.
-        if (element is MethodElement) {
-          var type = element.type;
-          // Analyzer should enforce number of parameter types, but check in
-          // case we have erroneous input.
-          if (type.normalParameterTypes.isNotEmpty) {
-            checkArgument(node.rightOperand, type.normalParameterTypes[0]);
-          }
-        } else {
-          // TODO(vsm): Assert that the analyzer found an error here?
+        // Analyzer should enforce number of parameter types, but check in
+        // case we have erroneous input.
+        if (invokeType.normalParameterTypes.isNotEmpty) {
+          checkArgument(node.rightOperand, invokeType.normalParameterTypes[0]);
         }
       }
     } else {
@@ -648,15 +615,6 @@
     VariableElement variableElement = node == null
         ? null
         : resolutionMap.elementDeclaredByVariableDeclaration(node);
-    if (!node.isConst &&
-        !node.isFinal &&
-        node.initializer == null &&
-        rules.isNonNullableType(variableElement?.type)) {
-      _recordMessage(
-          node,
-          StaticTypeWarningCode.NON_NULLABLE_FIELD_NOT_INITIALIZED,
-          [node.name, variableElement?.type]);
-    }
     AstNode parent = node.parent;
     if (variableElement != null &&
         parent is VariableDeclarationList &&
@@ -764,19 +722,6 @@
     }
   }
 
-  /// Checks if the assignment is valid with respect to non-nullable types.
-  /// Returns `false` if a nullable expression is assigned to a variable of
-  /// non-nullable type and `true` otherwise.
-  bool _checkNonNullAssignment(
-      Expression expression, DartType to, DartType from) {
-    if (rules.isNonNullableType(to) && rules.isNullableType(from)) {
-      _recordMessage(
-          expression, StaticTypeWarningCode.INVALID_ASSIGNMENT, [from, to]);
-      return false;
-    }
-    return true;
-  }
-
   void _checkReturnOrYield(Expression expression, AstNode node,
       {bool yieldStar: false}) {
     FunctionBody body = node.getAncestor((n) => n is FunctionBody);
@@ -1090,8 +1035,6 @@
       {DartType from, bool isDeclarationCast: false}) {
     from ??= _getExpressionType(expr);
 
-    if (!_checkNonNullAssignment(expr, to, from)) return false;
-
     // Void is considered Top, but may only be *explicitly* cast.
     if (from.isVoid) return null;
 
@@ -1276,11 +1219,8 @@
 /// applications.
 class _OverrideChecker {
   final StrongTypeSystemImpl rules;
-  final CodeChecker _checker;
 
-  _OverrideChecker(CodeChecker checker)
-      : _checker = checker,
-        rules = checker.rules;
+  _OverrideChecker(CodeChecker checker) : rules = checker.rules;
 
   void check(Declaration node) {
     var element =
@@ -1288,9 +1228,6 @@
     if (element.type.isObject) {
       return;
     }
-    _checkSuperOverrides(node, element);
-    _checkMixinApplicationOverrides(node, element);
-    _checkAllInterfaceOverrides(node, element);
     _checkForCovariantGenerics(node, element);
   }
 
@@ -1568,133 +1505,6 @@
     return genericSupertypes;
   }
 
-  /// Checks that most-derived concrete members on this class correctly override
-  /// all reachable interfaces, and reports errors if all interfaces are not
-  /// correctly implemented.
-  ///
-  /// This checks the soundness property: for all interfaces implemented by this
-  /// class (including inherited interfaces), we ensure that calls through that
-  /// interface will be sound.
-  void _checkAllInterfaceOverrides(Declaration node, ClassElement element) {
-    var interfaces = _collectInterfacesToCheck(element.type);
-    var visitedClasses = new Set<InterfaceType>();
-    var visitedMembers = new HashSet<String>();
-
-    // Checks all most-derived concrete members on this `type`. We skip over
-    // members that are already `visitedMembers`, because they were overridden
-    // and we've already checked that member.
-    //
-    // Because of that, it is important we visit types in the order that they
-    // will override members.
-    // If checkingMixin is true, then we are checking [type] in a mixin position
-    // and hence should consider its own mixins and superclass as abstract.
-    void checkType(InterfaceType type, AstNode location,
-        {bool checkingMixin: false}) {
-      // Skip `Object` because we don't need to check those members here.
-      // (because `Object` is the root of everything, it will be checked in
-      // _checkSuperOverrides for all classes).
-      if (type == null || type.isObject || !visitedClasses.add(type)) return;
-
-      // Check `member` against all `interfaces`.
-      void checkOverride(ExecutableElement member, [AstNode loc]) {
-        if (!visitedMembers.add(member.name)) return;
-        for (var interface in interfaces) {
-          if (_checkMemberOverride(member, interface, loc ?? location) ==
-              false) {
-            // Only report one error per member for interfaces.
-            // TODO(jmesserly): this is for backwards compatibility. Remove it?
-            break;
-          }
-        }
-      }
-
-      // When we're checking the class declaration node we started from, we
-      // can use a more precise error location for reporting override errors.
-      //
-      // Otherwise, we'll use the `extends` or `with` clause.
-      var isRootClass = identical(location, node);
-
-      // Check direct overrides on the class.
-      if (isRootClass) {
-        _checkClassMembers(node, checkOverride);
-      } else {
-        _checkTypeMembers(type, checkOverride);
-      }
-
-      // If we are currently checking a mixin, then its own mixins and
-      // superclass are abstract, and we should not check their members.
-      // This should only happen when super mixins is enabled, and we
-      // don't do proper checking for super mixins (we don't check that
-      // the contract implied by the mixin declaration is satisfied by
-      // the mixin use), but this prevents us from erroneously
-      // rejecting some super mixin patterns.
-      // If this is a mixin application (class A = Object with B)
-      // however, then we do still need to treat the mixin as concrete.
-      if (!checkingMixin || type.element.isMixinApplication) {
-        // Check mixin members against interfaces.
-        //
-        // We visit mixins in reverse order to reflect how they override
-        // eachother.
-        for (int i = type.mixins.length - 1; i >= 0; i--) {
-          checkType(type.mixins[i],
-              isRootClass ? _withClause(node).mixinTypes[i] : location,
-              checkingMixin: true);
-        }
-
-        // Check members on the superclass.
-        checkType(type.superclass,
-            isRootClass ? _extendsErrorLocation(node) : location,
-            checkingMixin: checkingMixin);
-      }
-    }
-
-    checkType(element.type, node);
-  }
-
-  /// Gets the set of all interfaces on [type] that should be checked to see
-  /// if type's members are overriding them correctly.
-  ///
-  /// In particular, we need to check these overrides for the definitions in
-  /// the class itself and each its superclasses (and mixins).
-  /// If a superclass (or mixin) is concrete, then we can skip its transitive
-  /// interfaces, but if it is abstract we must check them. For example, in:
-  ///
-  ///     B extends C implements G
-  ///     A extends B with E, F implements H, I
-  ///
-  /// we need to check the following interfaces:
-  ///
-  ///     C against G, H, and I
-  ///     B against G, H, and I
-  ///     E against H and I // no check against G because B is a concrete class
-  ///     F against H and I
-  ///     A against H and I
-  Set<InterfaceType> _collectInterfacesToCheck(InterfaceType type) {
-    var interfaces = new Set<InterfaceType>();
-    void collectInterfaces(InterfaceType t) {
-      if (t == null || t.isObject) return;
-      if (!interfaces.add(t)) return;
-      collectInterfaces(t.superclass);
-      t.mixins.forEach(collectInterfaces);
-      t.interfaces.forEach(collectInterfaces);
-    }
-
-    // Check all interfaces reachable from the `implements` clause in the
-    // current class against definitions here and in superclasses.
-    type.interfaces.forEach(collectInterfaces);
-
-    // Also collect interfaces from any abstract mixins or superclasses.
-    //
-    // For a concrete mixin/superclass, we'll check that we override the
-    // concrete members in _checkSuperOverrides and
-    // _checkMixinApplicationOverrides. But for abstract classes, we need to
-    // consider any abstract members it got from its interfaces.
-    for (var s in _getSuperclasses(type, (t) => t.element.isAbstract)) {
-      s.interfaces.forEach(collectInterfaces);
-    }
-    return interfaces;
-  }
-
   /// Visits each member on the class [node] and calls [checkMember] with the
   /// corresponding instance element and AST node (for error reporting).
   ///
@@ -1739,196 +1549,11 @@
     type.accessors.forEach(checkHelper);
   }
 
-  /// Check overrides from mixin applications themselves. For example, in:
-  ///
-  ///      A extends B with E, F
-  ///
-  ///  we check:
-  ///
-  ///      B & E against B (equivalently how E overrides B)
-  ///      B & E & F against B & E (equivalently how F overrides both B and E)
-  void _checkMixinApplicationOverrides(Declaration node, ClassElement element) {
-    var superclass = element.type.superclass;
-    var mixins = element.type.mixins;
-
-    // Check overrides from applying mixins
-    for (int i = 0; i < mixins.length; i++) {
-      var current = mixins[i];
-      var location = _withClause(node).mixinTypes[i];
-      var superclasses = mixins.sublist(0, i).reversed.toList()
-        ..add(superclass);
-
-      _checkTypeMembers(current, (m) {
-        for (var s in superclasses) {
-          if (_checkConcreteMemberOverride(m, s, location)) break;
-        }
-      });
-    }
-  }
-
-  /// Gets the member corresponding to [member] on [type], and returns `null`
-  /// if no member was found, or a boolean value to indicate whether the
-  /// override is valid.
-  ///
-  /// The [location] is a node where the error is reported. For example, a
-  /// bad override of a method in a class with respect to its superclass is
-  /// reported directly at the method declaration. However, invalid overrides
-  /// from base classes to interfaces, mixins to the base they are applied to,
-  /// or mixins to interfaces are reported at the class declaration, since the
-  /// base class or members on their own were not incorrect, only combining them
-  /// with the interface was problematic. For example, these are example error
-  /// locations in these cases:
-  ///
-  ///     error: base class introduces an invalid override. The type of B.foo is
-  ///     not a subtype of E.foo:
-  ///       class A extends B implements E { ... }
-  ///               ^^^^^^^^^
-  ///
-  ///     error: mixin introduces an invalid override. The type of C.foo is not
-  ///     a subtype of E.foo:
-  ///       class A extends B with C implements E { ... }
-  ///                              ^
-  ///
-  /// When checking for overrides from a type and it's super types, [node] is
-  /// the AST node that defines [member]. This is used to determine whether the
-  /// type of the element could be inferred from the types in the super classes.
-  bool _checkMemberOverride(
-      ExecutableElement member, InterfaceType type, AstNode location) {
-    assert(!member.isStatic);
-
-    FunctionType subType = _elementType(member);
-    FunctionType baseType = _getMemberType(type, member);
-    if (baseType == null) return null;
-
-    if (!rules.isOverrideSubtypeOf(subType, baseType)) {
-      ErrorCode errorCode;
-      var parent = location?.parent;
-      if (location is ExtendsClause ||
-          parent is ClassTypeAlias && parent.superclass == location) {
-        errorCode = StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_BASE;
-      } else if (parent is WithClause) {
-        errorCode = StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_MIXIN;
-      } else {
-        errorCode = StrongModeCode.INVALID_METHOD_OVERRIDE;
-      }
-
-      _checker._recordMessage(location, errorCode,
-          [member.enclosingElement.name, member.name, subType, type, baseType]);
-      return false;
-    }
-    return true;
-  }
-
-  /// Checks that a member override from a superclass (i.e. a concrete member)
-  /// is correct, reporting an error if needed, and returns `true` if we should
-  /// keep searching up the superclass chain.
-  bool _checkConcreteMemberOverride(
-      ExecutableElement member, InterfaceType type, AstNode location) {
-    _checkFieldOverride(member, type, location);
-    // Stop if a member was found, and we have no covariant parameters.
-    // If we have covariant parameters, we need to keep searching.
-    return _checkMemberOverride(member, type, location) != null &&
-        member.parameters.every((p) => !p.isCovariant);
-  }
-
-  void _checkFieldOverride(
-      Element member, InterfaceType type, AstNode location) {
-    if (member is PropertyAccessorElement) {
-      // Disallow overriding a non-virtual field.
-      var field = _getMemberField(type, member);
-      if (field != null && !field.isVirtual) {
-        FunctionType subType = _elementType(member);
-        FunctionType baseType = _getMemberType(type, member);
-        _checker._recordMessage(
-            location, StrongModeCode.INVALID_FIELD_OVERRIDE, [
-          member.enclosingElement.name,
-          member.name,
-          subType,
-          type,
-          baseType
-        ]);
-      }
-    }
-  }
-
-  /// Check overrides between a class and its superclasses and mixins. For
-  /// example, in:
-  ///
-  ///      A extends B with E, F
-  ///
-  /// we check A against B, B super classes, E, and F.
-  ///
-  /// Internally we avoid reporting errors twice and we visit classes bottom up
-  /// to ensure we report the most immediate invalid override first. For
-  /// example, in the following code we'll report that `Test` has an invalid
-  /// override with respect to `Parent` (as opposed to an invalid override with
-  /// respect to `Grandparent`):
-  ///
-  ///     class Grandparent {
-  ///         m(A a) {}
-  ///     }
-  ///     class Parent extends Grandparent {
-  ///         m(A a) {}
-  ///     }
-  ///     class Test extends Parent {
-  ///         m(B a) {} // invalid override
-  ///     }
-  void _checkSuperOverrides(Declaration node, ClassElement element) {
-    var superclasses = _getSuperclasses(element.type);
-    _checkClassMembers(node, (member, loc) {
-      for (var s in superclasses) {
-        if (_checkConcreteMemberOverride(member, s, loc)) break;
-      }
-    });
-  }
-
-  /// Collects all superclasses of [type], including any mixin application
-  /// classes.
-  ///
-  /// The search can be pruned by passing a [visitSuperclasses] function and
-  /// having it return `false` for types that should not be further explored.
-  Iterable<InterfaceType> _getSuperclasses(InterfaceType type,
-      [bool visitSuperclasses(InterfaceType t)]) {
-    var superclasses = new Set<InterfaceType>();
-    visit(InterfaceType t) {
-      if ((visitSuperclasses == null || visitSuperclasses(t)) &&
-          superclasses.add(t)) {
-        t.mixins.reversed.forEach(visit);
-        var s = t.superclass;
-        if (s != null && !s.isObject) visit(s);
-      }
-    }
-
-    type.mixins.reversed.forEach(visit);
-    var s = type.superclass;
-    if (s != null && !s.isObject) visit(s);
-
-    // Make sure we record Object last, and not when we visit our mixins.
-    if (!type.isObject) visit(rules.typeProvider.objectType);
-    return superclasses;
-  }
-
   /// If node is a [ClassDeclaration] returns its members, otherwise if node is
   /// a [ClassTypeAlias] this returns an empty list.
   Iterable<ClassMember> _classMembers(Declaration node) {
     return node is ClassDeclaration ? node.members : [];
   }
-
-  /// If node is a [ClassDeclaration] returns its members, otherwise if node is
-  /// a [ClassTypeAlias] this returns an empty list.
-  AstNode _extendsErrorLocation(Declaration node) {
-    return node is ClassDeclaration
-        ? node.extendsClause
-        : (node as ClassTypeAlias).superclass;
-  }
-
-  /// If node is a [ClassDeclaration] returns its members, otherwise if node is
-  /// a [ClassTypeAlias] this returns an empty list.
-  WithClause _withClause(Declaration node) {
-    return node is ClassDeclaration
-        ? node.withClause
-        : (node as ClassTypeAlias).withClause;
-  }
 }
 
 class _TopLevelInitializerValidator extends RecursiveAstVisitor<Null> {
diff --git a/pkg/analyzer/lib/src/util/uri.dart b/pkg/analyzer/lib/src/util/uri.dart
new file mode 100644
index 0000000..91bbdb2
--- /dev/null
+++ b/pkg/analyzer/lib/src/util/uri.dart
@@ -0,0 +1,12 @@
+// 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:path/path.dart';
+
+String fileUriToNormalizedPath(Context context, Uri fileUri) {
+  assert(fileUri.isScheme('file'));
+  var path = context.fromUri(fileUri);
+  path = context.normalize(path);
+  return path;
+}
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index da282cc..9b2b39e 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.33.0-alpha.0
+version: 0.33.0
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
@@ -11,10 +11,10 @@
   collection: ^1.10.1
   convert: ^2.0.0
   crypto: '>=1.1.1 <3.0.0'
-  front_end: 0.1.5
+  front_end: 0.1.6
   glob: ^1.0.3
   html: '>=0.12.0 <1.14.0'
-  kernel: 0.3.5
+  kernel: 0.3.6
   meta: ^1.0.2
   package_config: '>=0.1.5 <2.0.0'
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/analyzer/test/dart/element/builder_test.dart b/pkg/analyzer/test/dart/element/builder_test.dart
index 4d481a0..af30af8 100644
--- a/pkg/analyzer/test/dart/element/builder_test.dart
+++ b/pkg/analyzer/test/dart/element/builder_test.dart
@@ -216,7 +216,7 @@
   @override
   void setUp() {
     super.setUp();
-    compilationUnitElement = new CompilationUnitElementImpl('test.dart');
+    compilationUnitElement = new CompilationUnitElementImpl();
   }
 
   void test_metadata_localVariableDeclaration() {
@@ -2681,7 +2681,7 @@
   }
 
   void setUp() {
-    compilationUnitElement = new CompilationUnitElementImpl('test.dart');
+    compilationUnitElement = new CompilationUnitElementImpl();
   }
 
   void _assertVisibleRange(LocalElement element, int offset, int end) {
diff --git a/pkg/analyzer/test/file_system/physical_resource_provider_test.dart b/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
index 9b3adbc..4417780 100644
--- a/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
+++ b/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.test.file_system.physical_resource_provider_test;
-
-import 'dart:async';
 import 'dart:core';
 import 'dart:io' as io;
 
@@ -14,7 +11,6 @@
 import 'package:path/path.dart' as pathos;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
-import 'package:watcher/watcher.dart';
 
 main() {
   if (!new bool.fromEnvironment('skipPhysicalResourceProviderTests')) {
@@ -33,8 +29,22 @@
 String join(String part1, [String part2, String part3]) =>
     pathos.join(part1, part2, part3);
 
+class BaseTest {
+  io.Directory tempDirectory;
+  String tempPath;
+
+  setUp() {
+    tempDirectory = io.Directory.systemTemp.createTempSync('test_resource');
+    tempPath = tempDirectory.absolute.path;
+  }
+
+  tearDown() {
+    tempDirectory.deleteSync(recursive: true);
+  }
+}
+
 @reflectiveTest
-class FileTest extends _BaseTest {
+class FileTest extends BaseTest {
   String path;
   File file;
 
@@ -142,7 +152,8 @@
   }
 
   void test_readAsBytesSync_doesNotExist() {
-    File file = PhysicalResourceProvider.INSTANCE.getResource('/test.bin');
+    path = join(tempPath, 'doesNotExist.txt');
+    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
     expect(() {
       file.readAsBytesSync();
     }, throwsA(_isFileSystemException));
@@ -283,7 +294,7 @@
 }
 
 @reflectiveTest
-class FolderTest extends _BaseTest {
+class FolderTest extends BaseTest {
   String path;
   Folder folder;
 
@@ -530,14 +541,7 @@
 }
 
 @reflectiveTest
-class PhysicalResourceProviderTest extends _BaseTest {
-  test_getFolder_trailingSeparator() {
-    String path = tempPath;
-    PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
-    Folder folder = provider.getFolder('$path${pathos.separator}');
-    expect(folder.path, path);
-  }
-
+class PhysicalResourceProviderTest extends BaseTest {
   test_getModificationTimes() async {
     PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
     String path = join(tempPath, 'file1.txt');
@@ -558,166 +562,4 @@
     expect(folderTwo, isNot(equals(folderOne)));
     expect(provider.getStateLocation(idOne), equals(folderOne));
   }
-
-  test_watchFile_delete() {
-    var path = join(tempPath, 'foo');
-    var file = new io.File(path);
-    file.writeAsStringSync('contents 1');
-    return _watchingFile(path, (changesReceived) {
-      expect(changesReceived, hasLength(0));
-      file.deleteSync();
-      return _delayed(() {
-        expect(changesReceived, hasLength(1));
-        if (io.Platform.isWindows) {
-          // See https://github.com/dart-lang/sdk/issues/23762
-          // Not sure why this breaks under Windows, but testing to see whether
-          // we are running Windows causes the type to change. For now we print
-          // the type out of curiosity.
-          print(
-              'PhysicalResourceProviderTest:test_watchFile_delete received an event with type = ${changesReceived[0].type}');
-        } else {
-          expect(changesReceived[0].type, equals(ChangeType.REMOVE));
-        }
-        expect(changesReceived[0].path, equals(path));
-      });
-    });
-  }
-
-  test_watchFile_modify() {
-    var path = join(tempPath, 'foo');
-    var file = new io.File(path);
-    file.writeAsStringSync('contents 1');
-    return _watchingFile(path, (changesReceived) {
-      expect(changesReceived, hasLength(0));
-      file.writeAsStringSync('contents 2');
-      return _delayed(() {
-        expect(changesReceived, hasLength(1));
-        expect(changesReceived[0].type, equals(ChangeType.MODIFY));
-        expect(changesReceived[0].path, equals(path));
-      });
-    });
-  }
-
-  test_watchFolder_createFile() {
-    return _watchingFolder(tempPath, (changesReceived) {
-      expect(changesReceived, hasLength(0));
-      var path = join(tempPath, 'foo');
-      new io.File(path).writeAsStringSync('contents');
-      return _delayed(() {
-        // There should be an "add" event indicating that the file was added.
-        // Depending on how long it took to write the contents, it may be
-        // followed by "modify" events.
-        expect(changesReceived, isNotEmpty);
-        expect(changesReceived[0].type, equals(ChangeType.ADD));
-        expect(changesReceived[0].path, equals(path));
-        for (int i = 1; i < changesReceived.length; i++) {
-          expect(changesReceived[i].type, equals(ChangeType.MODIFY));
-          expect(changesReceived[i].path, equals(path));
-        }
-      });
-    });
-  }
-
-  test_watchFolder_deleteFile() {
-    var path = join(tempPath, 'foo');
-    var file = new io.File(path);
-    file.writeAsStringSync('contents 1');
-    return _watchingFolder(tempPath, (changesReceived) {
-      expect(changesReceived, hasLength(0));
-      file.deleteSync();
-      return _delayed(() {
-        expect(changesReceived, hasLength(1));
-        expect(changesReceived[0].type, equals(ChangeType.REMOVE));
-        expect(changesReceived[0].path, equals(path));
-      });
-    });
-  }
-
-  test_watchFolder_modifyFile() {
-    var path = join(tempPath, 'foo');
-    var file = new io.File(path);
-    file.writeAsStringSync('contents 1');
-    return _watchingFolder(tempPath, (changesReceived) {
-      expect(changesReceived, hasLength(0));
-      file.writeAsStringSync('contents 2');
-      return _delayed(() {
-        expect(changesReceived, hasLength(1));
-        expect(changesReceived[0].type, equals(ChangeType.MODIFY));
-        expect(changesReceived[0].path, equals(path));
-      });
-    });
-  }
-
-  test_watchFolder_modifyFile_inSubDir() {
-    var fooPath = join(tempPath, 'foo');
-    new io.Directory(fooPath).createSync();
-    var path = join(tempPath, 'bar');
-    var file = new io.File(path);
-    file.writeAsStringSync('contents 1');
-    return _watchingFolder(tempPath, (changesReceived) {
-      expect(changesReceived, hasLength(0));
-      file.writeAsStringSync('contents 2');
-      return _delayed(() {
-        expect(changesReceived, anyOf(hasLength(1), hasLength(2)));
-        expect(changesReceived[0].type, equals(ChangeType.MODIFY));
-        expect(changesReceived[0].path, equals(path));
-      });
-    });
-  }
-
-  Future _delayed(computation()) {
-    // Give the tests 1 second to detect the changes. While it may only
-    // take up to a few hundred ms, a whole second gives a good margin
-    // for when running tests.
-    return new Future.delayed(new Duration(seconds: 1), computation);
-  }
-
-  _watchingFile(String path, test(List<WatchEvent> changesReceived)) {
-    // Delay before we start watching the file.  This is necessary
-    // because on MacOS, file modifications that occur just before we
-    // start watching are sometimes misclassified as happening just after
-    // we start watching.
-    return _delayed(() {
-      File file = PhysicalResourceProvider.INSTANCE.getResource(path);
-      var changesReceived = <WatchEvent>[];
-      var subscription = file.changes.listen(changesReceived.add);
-      // Delay running the rest of the test to allow file.changes propagate.
-      return _delayed(() => test(changesReceived)).whenComplete(() {
-        subscription.cancel();
-      });
-    });
-  }
-
-  _watchingFolder(String path, test(List<WatchEvent> changesReceived)) {
-    // Delay before we start watching the folder.  This is necessary
-    // because on MacOS, file modifications that occur just before we
-    // start watching are sometimes misclassified as happening just after
-    // we start watching.
-    return _delayed(() {
-      Folder folder = PhysicalResourceProvider.INSTANCE.getResource(path);
-      var changesReceived = <WatchEvent>[];
-      var subscription = folder.changes.listen(changesReceived.add);
-      // Delay running the rest of the test to allow folder.changes to
-      // take a snapshot of the current directory state.  Otherwise it
-      // won't be able to reliably distinguish new files from modified
-      // ones.
-      return _delayed(() => test(changesReceived)).whenComplete(() {
-        subscription.cancel();
-      });
-    });
-  }
-}
-
-class _BaseTest {
-  io.Directory tempDirectory;
-  String tempPath;
-
-  setUp() {
-    tempDirectory = io.Directory.systemTemp.createTempSync('test_resource');
-    tempPath = tempDirectory.absolute.path;
-  }
-
-  tearDown() {
-    tempDirectory.deleteSync(recursive: true);
-  }
 }
diff --git a/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart b/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart
new file mode 100644
index 0000000..7c1cd9e
--- /dev/null
+++ b/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart
@@ -0,0 +1,175 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:core';
+import 'dart:io' as io;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:path/path.dart' as pathLib;
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:watcher/watcher.dart';
+
+import 'physical_resource_provider_test.dart' show BaseTest;
+
+main() {
+  if (!new bool.fromEnvironment('skipPhysicalResourceProviderTests')) {
+    defineReflectiveSuite(() {
+      defineReflectiveTests(PhysicalResourceProviderWatchTest);
+    });
+  }
+}
+
+@reflectiveTest
+class PhysicalResourceProviderWatchTest extends BaseTest {
+  test_watchFile_delete() {
+    var path = pathLib.join(tempPath, 'foo');
+    var file = new io.File(path);
+    file.writeAsStringSync('contents 1');
+    return _watchingFile(path, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      file.deleteSync();
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        if (io.Platform.isWindows) {
+          // See https://github.com/dart-lang/sdk/issues/23762
+          // Not sure why this breaks under Windows, but testing to see whether
+          // we are running Windows causes the type to change. For now we print
+          // the type out of curiosity.
+          print('PhysicalResourceProviderWatchTest:test_watchFile_delete '
+              'received an event with type = ${changesReceived[0].type}');
+        } else {
+          expect(changesReceived[0].type, equals(ChangeType.REMOVE));
+        }
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  test_watchFile_modify() {
+    var path = pathLib.join(tempPath, 'foo');
+    var file = new io.File(path);
+    file.writeAsStringSync('contents 1');
+    return _watchingFile(path, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      file.writeAsStringSync('contents 2');
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  test_watchFolder_createFile() {
+    return _watchingFolder(tempPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      var path = pathLib.join(tempPath, 'foo');
+      new io.File(path).writeAsStringSync('contents');
+      return _delayed(() {
+        // There should be an "add" event indicating that the file was added.
+        // Depending on how long it took to write the contents, it may be
+        // followed by "modify" events.
+        expect(changesReceived, isNotEmpty);
+        expect(changesReceived[0].type, equals(ChangeType.ADD));
+        expect(changesReceived[0].path, equals(path));
+        for (int i = 1; i < changesReceived.length; i++) {
+          expect(changesReceived[i].type, equals(ChangeType.MODIFY));
+          expect(changesReceived[i].path, equals(path));
+        }
+      });
+    });
+  }
+
+  test_watchFolder_deleteFile() {
+    var path = pathLib.join(tempPath, 'foo');
+    var file = new io.File(path);
+    file.writeAsStringSync('contents 1');
+    return _watchingFolder(tempPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      file.deleteSync();
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        expect(changesReceived[0].type, equals(ChangeType.REMOVE));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  test_watchFolder_modifyFile() {
+    var path = pathLib.join(tempPath, 'foo');
+    var file = new io.File(path);
+    file.writeAsStringSync('contents 1');
+    return _watchingFolder(tempPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      file.writeAsStringSync('contents 2');
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  test_watchFolder_modifyFile_inSubDir() {
+    var fooPath = pathLib.join(tempPath, 'foo');
+    new io.Directory(fooPath).createSync();
+    var path = pathLib.join(tempPath, 'bar');
+    var file = new io.File(path);
+    file.writeAsStringSync('contents 1');
+    return _watchingFolder(tempPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      file.writeAsStringSync('contents 2');
+      return _delayed(() {
+        expect(changesReceived, anyOf(hasLength(1), hasLength(2)));
+        expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  Future _delayed(computation()) {
+    // Give the tests 1 second to detect the changes. While it may only
+    // take up to a few hundred ms, a whole second gives a good margin
+    // for when running tests.
+    return new Future.delayed(new Duration(seconds: 1), computation);
+  }
+
+  _watchingFile(String path, test(List<WatchEvent> changesReceived)) {
+    // Delay before we start watching the file.  This is necessary
+    // because on MacOS, file modifications that occur just before we
+    // start watching are sometimes misclassified as happening just after
+    // we start watching.
+    return _delayed(() {
+      File file = PhysicalResourceProvider.INSTANCE.getResource(path);
+      var changesReceived = <WatchEvent>[];
+      var subscription = file.changes.listen(changesReceived.add);
+      // Delay running the rest of the test to allow file.changes propagate.
+      return _delayed(() => test(changesReceived)).whenComplete(() {
+        subscription.cancel();
+      });
+    });
+  }
+
+  _watchingFolder(String path, test(List<WatchEvent> changesReceived)) {
+    // Delay before we start watching the folder.  This is necessary
+    // because on MacOS, file modifications that occur just before we
+    // start watching are sometimes misclassified as happening just after
+    // we start watching.
+    return _delayed(() {
+      Folder folder = PhysicalResourceProvider.INSTANCE.getResource(path);
+      var changesReceived = <WatchEvent>[];
+      var subscription = folder.changes.listen(changesReceived.add);
+      // Delay running the rest of the test to allow folder.changes to
+      // take a snapshot of the current directory state.  Otherwise it
+      // won't be able to reliably distinguish new files from modified
+      // ones.
+      return _delayed(() => test(changesReceived)).whenComplete(() {
+        subscription.cancel();
+      });
+    });
+  }
+}
diff --git a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
index c08c9cd..4bb689e 100644
--- a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
+++ b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
@@ -42,7 +42,9 @@
   void test_resolveAbsolute_folder() {
     var uri = provider.pathContext.toUri(provider.convertPath('/folder'));
     Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNull);
+    expect(source, isNotNull);
+    expect(source.exists(), isFalse);
+    expect(source.fullName, provider.convertPath('/folder'));
   }
 
   void test_resolveAbsolute_notFile_dartUri() {
diff --git a/pkg/analyzer/test/file_system/test_all.dart b/pkg/analyzer/test/file_system/test_all.dart
index 05d9220..48ca361 100644
--- a/pkg/analyzer/test/file_system/test_all.dart
+++ b/pkg/analyzer/test/file_system/test_all.dart
@@ -7,6 +7,8 @@
 import 'memory_file_system_test.dart' as memory_file_system;
 import 'overlay_file_system_test.dart' as overlay_file_system;
 import 'physical_resource_provider_test.dart' as physical_resource_provider;
+import 'physical_resource_provider_watch_test.dart'
+    as physical_resource_provider_watch_test;
 import 'resource_uri_resolver_test.dart' as resource_uri_resolver;
 
 /// Utility for manually running all tests.
@@ -15,6 +17,7 @@
     memory_file_system.main();
     overlay_file_system.main();
     physical_resource_provider.main();
+    physical_resource_provider_watch_test.main();
     resource_uri_resolver.main();
   }, name: 'file system');
 }
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 87d7feb..4ac956a 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 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:analyzer/src/dart/ast/utilities.dart' hide ConstantEvaluator;
 import 'package:analyzer/src/dart/element/builder.dart';
@@ -32,6 +31,7 @@
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:path/path.dart' as path;
 import 'package:source_span/source_span.dart';
 import 'package:test/test.dart';
@@ -663,7 +663,7 @@
   }
 
   ElementBuilder _makeBuilder(ElementHolder holder) =>
-      new ElementBuilder(holder, new CompilationUnitElementImpl('test.dart'));
+      new ElementBuilder(holder, new CompilationUnitElementImpl());
 }
 
 @reflectiveTest
@@ -2053,8 +2053,7 @@
   }
 }
 
-class _SimpleDartSdkTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
+class _SimpleDartSdkTest extends Object with ResourceProviderMixin {
   String coreCorePath;
   String coreIntPath;
   DartSdk sdk;
diff --git a/pkg/analyzer/test/generated/analysis_context_factory.dart b/pkg/analyzer/test/generated/analysis_context_factory.dart
index 4754a57..0226a04 100644
--- a/pkg/analyzer/test/generated/analysis_context_factory.dart
+++ b/pkg/analyzer/test/generated/analysis_context_factory.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/dart/element/type.dart';
 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:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -44,7 +43,8 @@
    * system.
    */
   static InternalAnalysisContext contextWithCore(
-      {UriResolver contributedResolver, ResourceProvider resourceProvider}) {
+      {UriResolver contributedResolver,
+      MemoryResourceProvider resourceProvider}) {
     AnalysisContextForTests context = new AnalysisContextForTests();
     return initContextWithCore(context, contributedResolver, resourceProvider);
   }
@@ -56,7 +56,7 @@
    */
   static InternalAnalysisContext contextWithCoreAndOptions(
       AnalysisOptions options,
-      {ResourceProvider resourceProvider}) {
+      {MemoryResourceProvider resourceProvider}) {
     AnalysisContextForTests context = new AnalysisContextForTests();
     context._internalSetAnalysisOptions(options);
     return initContextWithCore(context, null, resourceProvider);
@@ -70,7 +70,7 @@
    */
   static InternalAnalysisContext contextWithCoreAndPackages(
       Map<String, String> packages,
-      {ResourceProvider resourceProvider}) {
+      {MemoryResourceProvider resourceProvider}) {
     AnalysisContextForTests context = new AnalysisContextForTests();
     return initContextWithCore(
         context, new TestPackageUriResolver(packages), resourceProvider);
@@ -85,10 +85,9 @@
   static InternalAnalysisContext initContextWithCore(
       InternalAnalysisContext context,
       [UriResolver contributedResolver,
-      ResourceProvider resourceProvider]) {
-    resourceProvider ??= PhysicalResourceProvider.INSTANCE;
+      MemoryResourceProvider resourceProvider]) {
     DartSdk sdk = new _AnalysisContextFactory_initContextWithCore(
-        resourceProvider, '/fake/sdk');
+        resourceProvider, resourceProvider.convertPath('/fake/sdk'));
     List<UriResolver> resolvers = <UriResolver>[
       new DartUriResolver(sdk),
       new ResourceUriResolver(resourceProvider)
@@ -103,8 +102,7 @@
     // dart:core
     //
     TestTypeProvider provider = new TestTypeProvider();
-    CompilationUnitElementImpl coreUnit =
-        new CompilationUnitElementImpl("core.dart");
+    CompilationUnitElementImpl coreUnit = new CompilationUnitElementImpl();
     Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
     coreContext.setContents(coreSource, "");
     coreUnit.librarySource = coreUnit.source = coreSource;
@@ -182,8 +180,7 @@
     //
     LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode(
         coreContext, AstTestFactory.libraryIdentifier2(["dart", "async"]));
-    CompilationUnitElementImpl asyncUnit =
-        new CompilationUnitElementImpl("async.dart");
+    CompilationUnitElementImpl asyncUnit = new CompilationUnitElementImpl();
     Source asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC);
     coreContext.setContents(asyncSource, "");
     asyncUnit.librarySource = asyncUnit.source = asyncSource;
@@ -276,8 +273,7 @@
     //
     // dart:html
     //
-    CompilationUnitElementImpl htmlUnit =
-        new CompilationUnitElementImpl("html_dartium.dart");
+    CompilationUnitElementImpl htmlUnit = new CompilationUnitElementImpl();
     Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
     coreContext.setContents(htmlSource, "");
     htmlUnit.librarySource = htmlUnit.source = htmlSource;
@@ -338,8 +334,7 @@
     //
     // dart:math
     //
-    CompilationUnitElementImpl mathUnit =
-        new CompilationUnitElementImpl("math.dart");
+    CompilationUnitElementImpl mathUnit = new CompilationUnitElementImpl();
     Source mathSource = sourceFactory.forUri(_DART_MATH);
     coreContext.setContents(mathSource, "");
     mathUnit.librarySource = mathUnit.source = mathSource;
diff --git a/pkg/analyzer/test/generated/bazel_test.dart b/pkg/analyzer/test/generated/bazel_test.dart
index 290f45f..e339b74 100644
--- a/pkg/analyzer/test/generated/bazel_test.dart
+++ b/pkg/analyzer/test/generated/bazel_test.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 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/generated/bazel.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -17,53 +17,52 @@
 }
 
 @reflectiveTest
-class BazelFileUriResolverTest extends _BaseTest {
+class BazelFileUriResolverTest extends Object with ResourceProviderMixin {
   BazelWorkspace workspace;
   BazelFileUriResolver resolver;
 
   void setUp() {
-    provider.newFile(_p('/workspace/WORKSPACE'), '');
-    provider.newFolder(_p('/workspace/bazel-genfiles'));
-    workspace = BazelWorkspace.find(provider, _p('/workspace'));
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/bazel-genfiles');
+    workspace =
+        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
     resolver = new BazelFileUriResolver(workspace);
-    provider.newFile(_p('/workspace/test.dart'), '');
-    provider.newFile(_p('/workspace/bazel-bin/gen1.dart'), '');
-    provider.newFile(_p('/workspace/bazel-genfiles/gen2.dart'), '');
+    newFile('/workspace/test.dart');
+    newFile('/workspace/bazel-bin/gen1.dart');
+    newFile('/workspace/bazel-genfiles/gen2.dart');
   }
 
   void test_resolveAbsolute_doesNotExist() {
     Source source = _resolvePath('/workspace/foo.dart');
     expect(source, isNotNull);
     expect(source.exists(), isFalse);
-    expect(source.fullName, _p('/workspace/foo.dart'));
+    expect(source.fullName, convertPath('/workspace/foo.dart'));
   }
 
   void test_resolveAbsolute_file() {
     Source source = _resolvePath('/workspace/test.dart');
     expect(source, isNotNull);
     expect(source.exists(), isTrue);
-    expect(source.fullName, _p('/workspace/test.dart'));
+    expect(source.fullName, convertPath('/workspace/test.dart'));
   }
 
   void test_resolveAbsolute_folder() {
     Source source = _resolvePath('/workspace');
-    expect(source, isNotNull);
-    expect(source.exists(), isFalse);
-    expect(source.fullName, _p('/workspace'));
+    expect(source, isNull);
   }
 
   void test_resolveAbsolute_generated_file_exists_one() {
     Source source = _resolvePath('/workspace/gen1.dart');
     expect(source, isNotNull);
     expect(source.exists(), isTrue);
-    expect(source.fullName, _p('/workspace/bazel-bin/gen1.dart'));
+    expect(source.fullName, convertPath('/workspace/bazel-bin/gen1.dart'));
   }
 
   void test_resolveAbsolute_generated_file_exists_two() {
     Source source = _resolvePath('/workspace/gen2.dart');
     expect(source, isNotNull);
     expect(source.exists(), isTrue);
-    expect(source.fullName, _p('/workspace/bazel-genfiles/gen2.dart'));
+    expect(source.fullName, convertPath('/workspace/bazel-genfiles/gen2.dart'));
   }
 
   void test_resolveAbsolute_notFile_dartUri() {
@@ -79,7 +78,8 @@
   }
 
   void test_restoreAbsolute() {
-    Uri uri = provider.pathContext.toUri(_p('/workspace/test.dart'));
+    Uri uri =
+        resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
     Source source = resolver.resolveAbsolute(uri);
     expect(source, isNotNull);
     expect(resolver.restoreAbsolute(source), uri);
@@ -90,14 +90,14 @@
   }
 
   Source _resolvePath(String absolutePosixPath) {
-    String absolutePath = provider.convertPath(absolutePosixPath);
-    Uri uri = provider.pathContext.toUri(absolutePath);
+    String absolutePath = convertPath(absolutePosixPath);
+    Uri uri = resourceProvider.pathContext.toUri(absolutePath);
     return resolver.resolveAbsolute(uri);
   }
 }
 
 @reflectiveTest
-class BazelPackageUriResolverTest extends _BaseTest {
+class BazelPackageUriResolverTest extends Object with ResourceProviderMixin {
   BazelWorkspace workspace;
   BazelPackageUriResolver resolver;
 
@@ -448,12 +448,13 @@
   void _addResources(List<String> paths, {String workspacePath: '/workspace'}) {
     for (String path in paths) {
       if (path.endsWith('/')) {
-        provider.newFolder(_p(path.substring(0, path.length - 1)));
+        newFolder(path.substring(0, path.length - 1));
       } else {
-        provider.newFile(_p(path), '');
+        newFile(path);
       }
     }
-    workspace = BazelWorkspace.find(provider, _p(workspacePath));
+    workspace =
+        BazelWorkspace.find(resourceProvider, convertPath(workspacePath));
     resolver = new BazelPackageUriResolver(workspace);
   }
 
@@ -462,7 +463,7 @@
     Uri uri = Uri.parse(uriStr);
     Source source = resolver.resolveAbsolute(uri);
     expect(source, isNotNull);
-    expect(source.fullName, _p(posixPath));
+    expect(source.fullName, convertPath(posixPath));
     expect(source.uri, uri);
     expect(source.exists(), exists);
     // If enabled, test also "restoreAbsolute".
@@ -473,7 +474,7 @@
   }
 
   void _assertRestore(String posixPath, String expectedUri) {
-    String path = _p(posixPath);
+    String path = convertPath(posixPath);
     _MockSource source = new _MockSource(path);
     Uri uri = resolver.restoreAbsolute(source);
     expect(uri?.toString(), expectedUri);
@@ -481,191 +482,194 @@
 }
 
 @reflectiveTest
-class BazelWorkspaceTest extends _BaseTest {
+class BazelWorkspaceTest extends Object with ResourceProviderMixin {
   void test_find_fail_notAbsolute() {
-    expect(() => BazelWorkspace.find(provider, _p('not_absolute')),
+    expect(
+        () =>
+            BazelWorkspace.find(resourceProvider, convertPath('not_absolute')),
         throwsArgumentError);
   }
 
   void test_find_hasReadonlyFolder() {
-    provider.newFolder(_p('/Users/user/test/READONLY/prime'));
-    provider.newFolder(_p('/Users/user/test/prime'));
-    provider.newFolder(_p('/Users/user/test/prime/bazel-genfiles'));
-    BazelWorkspace workspace =
-        BazelWorkspace.find(provider, _p('/Users/user/test/prime/my/module'));
-    expect(workspace.root, _p('/Users/user/test/prime'));
-    expect(workspace.readonly, _p('/Users/user/test/READONLY/prime'));
-    expect(workspace.bin, _p('/Users/user/test/prime/bazel-bin'));
-    expect(workspace.genfiles, _p('/Users/user/test/prime/bazel-genfiles'));
+    newFolder('/Users/user/test/READONLY/prime');
+    newFolder('/Users/user/test/prime');
+    newFolder('/Users/user/test/prime/bazel-genfiles');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+    expect(workspace.root, convertPath('/Users/user/test/prime'));
+    expect(workspace.readonly, convertPath('/Users/user/test/READONLY/prime'));
+    expect(workspace.bin, convertPath('/Users/user/test/prime/bazel-bin'));
+    expect(workspace.genfiles,
+        convertPath('/Users/user/test/prime/bazel-genfiles'));
   }
 
   void test_find_hasReadonlyFolder_bad_actuallyHasWorkspaceFile() {
-    provider.newFolder(_p('/Users/user/test/READONLY'));
-    provider.newFile(_p('/Users/user/test/prime/WORKSPACE'), '');
-    provider.newFolder(_p('/Users/user/test/prime/bazel-genfiles'));
-    BazelWorkspace workspace =
-        BazelWorkspace.find(provider, _p('/Users/user/test/prime/my/module'));
-    expect(workspace.root, _p('/Users/user/test/prime'));
+    newFolder('/Users/user/test/READONLY');
+    newFile('/Users/user/test/prime/WORKSPACE');
+    newFolder('/Users/user/test/prime/bazel-genfiles');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+    expect(workspace.root, convertPath('/Users/user/test/prime'));
     expect(workspace.readonly, isNull);
-    expect(workspace.bin, _p('/Users/user/test/prime/bazel-bin'));
-    expect(workspace.genfiles, _p('/Users/user/test/prime/bazel-genfiles'));
+    expect(workspace.bin, convertPath('/Users/user/test/prime/bazel-bin'));
+    expect(workspace.genfiles,
+        convertPath('/Users/user/test/prime/bazel-genfiles'));
   }
 
   void test_find_hasReadonlyFolder_blaze() {
-    provider.newFolder(_p('/Users/user/test/READONLY/prime'));
-    provider.newFolder(_p('/Users/user/test/prime'));
-    provider.newFolder(_p('/Users/user/test/prime/blaze-genfiles'));
-    BazelWorkspace workspace =
-        BazelWorkspace.find(provider, _p('/Users/user/test/prime/my/module'));
-    expect(workspace.root, _p('/Users/user/test/prime'));
-    expect(workspace.readonly, _p('/Users/user/test/READONLY/prime'));
-    expect(workspace.bin, _p('/Users/user/test/prime/blaze-bin'));
-    expect(workspace.genfiles, _p('/Users/user/test/prime/blaze-genfiles'));
+    newFolder('/Users/user/test/READONLY/prime');
+    newFolder('/Users/user/test/prime');
+    newFolder('/Users/user/test/prime/blaze-genfiles');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+    expect(workspace.root, convertPath('/Users/user/test/prime'));
+    expect(workspace.readonly, convertPath('/Users/user/test/READONLY/prime'));
+    expect(workspace.bin, convertPath('/Users/user/test/prime/blaze-bin'));
+    expect(workspace.genfiles,
+        convertPath('/Users/user/test/prime/blaze-genfiles'));
   }
 
   void test_find_hasWorkspaceFile() {
-    provider.newFile(_p('/workspace/WORKSPACE'), '');
-    provider.newFolder(_p('/workspace/bazel-genfiles'));
-    BazelWorkspace workspace =
-        BazelWorkspace.find(provider, _p('/workspace/my/module'));
-    expect(workspace.root, _p('/workspace'));
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/bazel-genfiles');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'));
+    expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
-    expect(workspace.bin, _p('/workspace/bazel-bin'));
-    expect(workspace.genfiles, _p('/workspace/bazel-genfiles'));
+    expect(workspace.bin, convertPath('/workspace/bazel-bin'));
+    expect(workspace.genfiles, convertPath('/workspace/bazel-genfiles'));
   }
 
   void test_find_hasWorkspaceFile_forModuleInWorkspace() {
-    provider.newFile(_p('/workspace/WORKSPACE'), '');
-    provider.newFolder(_p('/workspace/bazel-genfiles'));
-    BazelWorkspace workspace =
-        BazelWorkspace.find(provider, _p('/workspace/my/module'));
-    expect(workspace.root, _p('/workspace'));
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/bazel-genfiles');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'));
+    expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
-    expect(workspace.bin, _p('/workspace/bazel-bin'));
-    expect(workspace.genfiles, _p('/workspace/bazel-genfiles'));
+    expect(workspace.bin, convertPath('/workspace/bazel-bin'));
+    expect(workspace.genfiles, convertPath('/workspace/bazel-genfiles'));
   }
 
   void test_find_hasWorkspaceFile_forWorkspace() {
-    provider.newFile(_p('/workspace/WORKSPACE'), '');
-    provider.newFolder(_p('/workspace/bazel-genfiles'));
-    BazelWorkspace workspace = BazelWorkspace.find(provider, _p('/workspace'));
-    expect(workspace.root, _p('/workspace'));
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/bazel-genfiles');
+    BazelWorkspace workspace =
+        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
+    expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
-    expect(workspace.bin, _p('/workspace/bazel-bin'));
-    expect(workspace.genfiles, _p('/workspace/bazel-genfiles'));
+    expect(workspace.bin, convertPath('/workspace/bazel-bin'));
+    expect(workspace.genfiles, convertPath('/workspace/bazel-genfiles'));
   }
 
   void test_find_hasWorkspaceFile_forWorkspace_blaze() {
-    provider.newFile(_p('/workspace/WORKSPACE'), '');
-    provider.newFolder(_p('/workspace/blaze-genfiles'));
-    BazelWorkspace workspace = BazelWorkspace.find(provider, _p('/workspace'));
-    expect(workspace.root, _p('/workspace'));
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/blaze-genfiles');
+    BazelWorkspace workspace =
+        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
+    expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
-    expect(workspace.bin, _p('/workspace/blaze-bin'));
-    expect(workspace.genfiles, _p('/workspace/blaze-genfiles'));
+    expect(workspace.bin, convertPath('/workspace/blaze-bin'));
+    expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
   }
 
   void test_find_null_noWorkspaceMarkers() {
-    BazelWorkspace workspace =
-        BazelWorkspace.find(provider, _p('/workspace/my/module'));
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'));
     expect(workspace, isNull);
   }
 
   void test_find_null_noWorkspaceMarkers_inRoot() {
-    BazelWorkspace workspace = BazelWorkspace.find(provider, _p('/'));
+    BazelWorkspace workspace =
+        BazelWorkspace.find(resourceProvider, convertPath('/'));
     expect(workspace, isNull);
   }
 
   void test_find_null_symlinkPrefix() {
     String prefix = BazelWorkspace.defaultSymlinkPrefix;
-    provider.newFile(_p('/workspace/WORKSPACE'), '');
-    BazelWorkspace workspace =
-        BazelWorkspace.find(provider, _p('/workspace/my/module'));
-    expect(workspace.root, _p('/workspace'));
+    newFile('/workspace/WORKSPACE');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'));
+    expect(workspace.root, convertPath('/workspace'));
     expect(workspace.readonly, isNull);
-    expect(workspace.bin, _p('/workspace/$prefix-bin'));
-    expect(workspace.genfiles, _p('/workspace/$prefix-genfiles'));
+    expect(workspace.bin, convertPath('/workspace/$prefix-bin'));
+    expect(workspace.genfiles, convertPath('/workspace/$prefix-genfiles'));
   }
 
   void test_findFile_hasReadonlyFolder() {
-    provider.newFolder(_p('/Users/user/test/READONLY/prime'));
-    provider.newFolder(_p('/Users/user/test/prime'));
-    provider.newFile(_p('/Users/user/test/prime/my/module/test1.dart'), '');
-    provider.newFile(_p('/Users/user/test/prime/my/module/test2.dart'), '');
-    provider.newFile(_p('/Users/user/test/prime/my/module/test3.dart'), '');
-    provider.newFile(
-        _p('/Users/user/test/prime/bazel-bin/my/module/test2.dart'), '');
-    provider.newFile(
-        _p('/Users/user/test/prime/bazel-genfiles/my/module/test3.dart'), '');
-    provider.newFile(
-        _p('/Users/user/test/READONLY/prime/other/module/test4.dart'), '');
-    BazelWorkspace workspace =
-        BazelWorkspace.find(provider, _p('/Users/user/test/prime/my/module'));
+    newFolder('/Users/user/test/READONLY/prime');
+    newFolder('/Users/user/test/prime');
+    newFile('/Users/user/test/prime/my/module/test1.dart');
+    newFile('/Users/user/test/prime/my/module/test2.dart');
+    newFile('/Users/user/test/prime/my/module/test3.dart');
+    newFile('/Users/user/test/prime/bazel-bin/my/module/test2.dart');
+    newFile('/Users/user/test/prime/bazel-genfiles/my/module/test3.dart');
+    newFile('/Users/user/test/READONLY/prime/other/module/test4.dart');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
     expect(
         workspace
-            .findFile(_p('/Users/user/test/prime/my/module/test1.dart'))
+            .findFile(
+                convertPath('/Users/user/test/prime/my/module/test1.dart'))
             .path,
-        _p('/Users/user/test/prime/my/module/test1.dart'));
+        convertPath('/Users/user/test/prime/my/module/test1.dart'));
     expect(
         workspace
-            .findFile(_p('/Users/user/test/prime/my/module/test2.dart'))
+            .findFile(
+                convertPath('/Users/user/test/prime/my/module/test2.dart'))
             .path,
-        _p('/Users/user/test/prime/bazel-bin/my/module/test2.dart'));
+        convertPath('/Users/user/test/prime/bazel-bin/my/module/test2.dart'));
     expect(
         workspace
-            .findFile(_p('/Users/user/test/prime/my/module/test3.dart'))
+            .findFile(
+                convertPath('/Users/user/test/prime/my/module/test3.dart'))
             .path,
-        _p('/Users/user/test/prime/bazel-genfiles/my/module/test3.dart'));
+        convertPath(
+            '/Users/user/test/prime/bazel-genfiles/my/module/test3.dart'));
     expect(
         workspace
-            .findFile(_p('/Users/user/test/prime/other/module/test4.dart'))
+            .findFile(
+                convertPath('/Users/user/test/prime/other/module/test4.dart'))
             .path,
-        _p('/Users/user/test/READONLY/prime/other/module/test4.dart'));
+        convertPath('/Users/user/test/READONLY/prime/other/module/test4.dart'));
   }
 
   void test_findFile_main_overrides_readonly() {
-    provider.newFolder(_p('/Users/user/test/READONLY/prime'));
-    provider.newFolder(_p('/Users/user/test/prime'));
-    provider.newFolder(_p('/Users/user/test/prime/bazel-genfiles'));
-    provider.newFile(_p('/Users/user/test/prime/my/module/test.dart'), '');
-    provider.newFile(
-        _p('/Users/user/test/READONLY/prime/my/module/test.dart'), '');
-    BazelWorkspace workspace =
-        BazelWorkspace.find(provider, _p('/Users/user/test/prime/my/module'));
+    newFolder('/Users/user/test/READONLY/prime');
+    newFolder('/Users/user/test/prime');
+    newFolder('/Users/user/test/prime/bazel-genfiles');
+    newFile('/Users/user/test/prime/my/module/test.dart');
+    newFile('/Users/user/test/READONLY/prime/my/module/test.dart');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
     expect(
         workspace
-            .findFile(_p('/Users/user/test/prime/my/module/test.dart'))
+            .findFile(convertPath('/Users/user/test/prime/my/module/test.dart'))
             .path,
-        _p('/Users/user/test/prime/my/module/test.dart'));
+        convertPath('/Users/user/test/prime/my/module/test.dart'));
   }
 
   void test_findFile_noReadOnly() {
-    provider.newFile(_p('/workspace/WORKSPACE'), '');
-    provider.newFile(_p('/workspace/my/module/test1.dart'), '');
-    provider.newFile(_p('/workspace/my/module/test2.dart'), '');
-    provider.newFile(_p('/workspace/my/module/test3.dart'), '');
-    provider.newFile(_p('/workspace/bazel-bin/my/module/test2.dart'), '');
-    provider.newFile(_p('/workspace/bazel-genfiles/my/module/test3.dart'), '');
-    BazelWorkspace workspace =
-        BazelWorkspace.find(provider, _p('/workspace/my/module'));
-    expect(workspace.findFile(_p('/workspace/my/module/test1.dart')).path,
-        _p('/workspace/my/module/test1.dart'));
-    expect(workspace.findFile(_p('/workspace/my/module/test2.dart')).path,
-        _p('/workspace/bazel-bin/my/module/test2.dart'));
-    expect(workspace.findFile(_p('/workspace/my/module/test3.dart')).path,
-        _p('/workspace/bazel-genfiles/my/module/test3.dart'));
+    newFile('/workspace/WORKSPACE');
+    newFile('/workspace/my/module/test1.dart');
+    newFile('/workspace/my/module/test2.dart');
+    newFile('/workspace/my/module/test3.dart');
+    newFile('/workspace/bazel-bin/my/module/test2.dart');
+    newFile('/workspace/bazel-genfiles/my/module/test3.dart');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'));
+    expect(
+        workspace.findFile(convertPath('/workspace/my/module/test1.dart')).path,
+        convertPath('/workspace/my/module/test1.dart'));
+    expect(
+        workspace.findFile(convertPath('/workspace/my/module/test2.dart')).path,
+        convertPath('/workspace/bazel-bin/my/module/test2.dart'));
+    expect(
+        workspace.findFile(convertPath('/workspace/my/module/test3.dart')).path,
+        convertPath('/workspace/bazel-genfiles/my/module/test3.dart'));
   }
 }
 
-class _BaseTest {
-  final MemoryResourceProvider provider = new MemoryResourceProvider();
-
-  /**
-   * Return the [provider] specific path for the given Posix [path].
-   */
-  String _p(String path) => provider.convertPath(path);
-}
-
 class _MockSource implements Source {
   @override
   final String fullName;
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 724f3b8..e4e4784 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -1511,12 +1511,7 @@
 }
 ''');
     await computeAnalysisResult(source);
-    // TODO(a14n): the error CONST_WITH_NON_CONSTANT_ARGUMENT is redundant and
-    // ought to be suppressed.
-    assertErrors(source, [
-      CompileTimeErrorCode.CONST_WITH_NON_CONST,
-      CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT
-    ]);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONST]);
     verify([source]);
   }
 
@@ -1542,11 +1537,8 @@
 }
 f(p) { return const A(p); }''');
     await computeAnalysisResult(source);
-    // TODO(paulberry): the error INVALID_CONSTANT is redundant and ought to be
-    // suppressed.
     assertErrors(source, [
       CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT,
-      CompileTimeErrorCode.INVALID_CONSTANT
     ]);
     verify([source]);
   }
@@ -2649,10 +2641,17 @@
   test_implementsDisallowedClass_class_String_num() async {
     Source source = addSource("class A implements String, num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
-      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    if (enableNewAnalysisDriver) {
+      assertErrors(source, [
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+      ]);
+    } else {
+      assertErrors(source, [
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+      ]);
+    }
     verify([source]);
   }
 
@@ -2722,10 +2721,17 @@
 class M {}
 class C = A with M implements String, num;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
-      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    if (enableNewAnalysisDriver) {
+      assertErrors(source, [
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+      ]);
+    } else {
+      assertErrors(source, [
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+      ]);
+    }
     verify([source]);
   }
 
@@ -3139,6 +3145,23 @@
     verify([source]);
   }
 
+  test_instantiate_to_bounds_not_matching_bounds() async {
+    Source source = addSource('''
+class Foo<T> {}
+class Bar<T extends Foo<T>> {}
+class Baz extends Bar {}
+void main() {}
+''');
+    var result = await computeAnalysisResult(source);
+    // Instantiate-to-bounds should have instantiated "Bar" to "Bar<Foo>"
+    expect(result.unit.declaredElement.getType('Baz').supertype.toString(),
+        'Bar<Foo<dynamic>>');
+    // Therefore there should be an error, since Bar's type argument T is Foo,
+    // which doesn't extends Foo<T>.
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+  }
+
   test_instantiateEnum_const() async {
     Source source = addSource(r'''
 enum E { ONE }
@@ -4231,9 +4254,8 @@
 class A {}
 class C = A with String, num;''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
+    if (enableNewAnalysisDriver) {
       assertErrors(source, [
-        StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_MIXIN,
         CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
         CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
       ]);
@@ -5533,6 +5555,24 @@
     verify([source]);
   }
 
+  test_recursiveCompileTimeConstant_fromMapLiteral() async {
+    resourceProvider.newFile(
+      resourceProvider.convertPath('/constants.dart'),
+      r'''
+const int x = y;
+const int y = x;
+''',
+    );
+    Source source = addSource(r'''
+import 'constants.dart';
+final z = {x: 0, y: 1};
+''');
+    await computeAnalysisResult(source);
+    // No errors, because the cycle is not in this source.
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_recursiveCompileTimeConstant_initializer_after_toplevel_var() async {
     Source source = addSource('''
 const y = const C();
@@ -5565,6 +5605,28 @@
     verify([source]);
   }
 
+  test_recursiveCompileTimeConstant_singleVariable_fromConstList() async {
+    Source source = addSource(r'''
+const elems = const [
+  const [
+    1, elems, 3,
+  ],
+];
+''');
+    await computeAnalysisResult(source);
+    if (!enableNewAnalysisDriver) {
+      assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT,
+      ]);
+    } else {
+      assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT,
+        StrongModeCode.TOP_LEVEL_CYCLE,
+      ]);
+    }
+    verify([source]);
+  }
+
   test_recursiveConstructorRedirect() async {
     Source source = addSource(r'''
 class A {
@@ -6252,8 +6314,10 @@
   test_typeAliasCannotReferenceItself_typeVariableBounds() async {
     Source source = addSource("typedef A<T extends A<int>>();");
     await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    assertErrors(source, [
+      CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
+      StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
+    ]);
     verify([source]);
   }
 
@@ -6271,6 +6335,18 @@
     verify([source]);
   }
 
+  test_typedef_infiniteParameterBoundCycle() async {
+    Source source = addSource(r'''
+typedef F<X extends F> = F Function();
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
+      StrongModeCode.NOT_INSTANTIATED_BOUND,
+    ]);
+    verify([source]);
+  }
+
   test_undefinedAnnotation_unresolved_identifier() async {
     Source source = addSource(r'''
 @unresolved
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index 7285321..75e534a 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -10,16 +10,16 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
 import 'package:analyzer/src/generated/element_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
-import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:analyzer/src/source/source_resource.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -303,7 +303,7 @@
 }
 
 @reflectiveTest
-class ElementResolverTest extends EngineTestCase {
+class ElementResolverTest extends EngineTestCase with ResourceProviderMixin {
   /**
    * The error listener to which errors will be reported.
    */
@@ -312,7 +312,7 @@
   /**
    * The type provider used to access the types.
    */
-  TestTypeProvider _typeProvider;
+  TypeProvider _typeProvider;
 
   /**
    * The library containing the code being resolved.
@@ -382,8 +382,7 @@
   void setUp() {
     super.setUp();
     _listener = new GatheringErrorListener();
-    _typeProvider = new TestTypeProvider();
-    _resolver = _createResolver();
+    _createResolver();
   }
 
   test_lookUpMethodInInterfaces() async {
@@ -1136,20 +1135,21 @@
   /**
    * Create and return the resolver used by the tests.
    */
-  ElementResolver _createResolver() {
-    MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
+  void _createResolver() {
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(
         resourceProvider: resourceProvider);
-    Source source = new FileSource(resourceProvider.getFile("/test.dart"));
-    CompilationUnitElementImpl unit =
-        new CompilationUnitElementImpl("test.dart");
+    _typeProvider = context.typeProvider;
+
+    var inheritance = new InheritanceManager2(context.typeSystem);
+    Source source = new FileSource(getFile("/test.dart"));
+    CompilationUnitElementImpl unit = new CompilationUnitElementImpl();
     unit.librarySource = unit.source = source;
     _definingLibrary = ElementFactory.library(context, "test");
     _definingLibrary.definingCompilationUnit = unit;
     _visitor = new ResolverVisitor(
-        _definingLibrary, source, _typeProvider, _listener,
+        inheritance, _definingLibrary, source, _typeProvider, _listener,
         nameScope: new LibraryScope(_definingLibrary));
-    return _visitor.elementResolver;
+    _resolver = _visitor.elementResolver;
   }
 
   /**
diff --git a/pkg/analyzer/test/generated/gn_test.dart b/pkg/analyzer/test/generated/gn_test.dart
index cf548fc..5655b69 100644
--- a/pkg/analyzer/test/generated/gn_test.dart
+++ b/pkg/analyzer/test/generated/gn_test.dart
@@ -2,10 +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.
 
-library analyzer.test.generated.gn_test;
-
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/generated/gn.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -16,148 +14,136 @@
 }
 
 @reflectiveTest
-class GnWorkspaceTest extends _BaseTest {
+class GnWorkspaceTest extends Object with ResourceProviderMixin {
   void test_find_noJiriRoot() {
-    provider.newFolder(_p('/workspace'));
-    GnWorkspace workspace = GnWorkspace.find(provider, _p('/workspace'));
+    newFolder('/workspace');
+    GnWorkspace workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace'));
     expect(workspace, isNull);
   }
 
   void test_find_notAbsolute() {
-    expect(() => GnWorkspace.find(provider, _p('not_absolute')),
+    expect(
+        () => GnWorkspace.find(resourceProvider, convertPath('not_absolute')),
         throwsArgumentError);
   }
 
   void test_find_withRoot() {
-    provider.newFolder(_p('/workspace/.jiri_root'));
-    provider.newFolder(_p('/workspace/some/code'));
-    provider.newFile(_p('/workspace/some/code/pubspec.yaml'), '');
-    String buildDir = _p('out/debug-x87_128');
-    provider.newFile(_p('/workspace/.config'),
-        'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
-    provider.newFile(
-        _p('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages'),
-        '');
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String buildDir = convertPath('out/debug-x87_128');
+    newFile('/workspace/.config',
+        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages');
     GnWorkspace workspace =
-        GnWorkspace.find(provider, _p('/workspace/some/code'));
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
     expect(workspace, isNotNull);
-    expect(workspace.root, _p('/workspace/some/code'));
+    expect(workspace.root, convertPath('/workspace/some/code'));
   }
 
   void test_packages() {
-    provider.newFolder(_p('/workspace/.jiri_root'));
-    provider.newFolder(_p('/workspace/some/code'));
-    provider.newFile(_p('/workspace/some/code/pubspec.yaml'), '');
-    String buildDir = _p('out/debug-x87_128');
-    provider.newFile(_p('/workspace/.config'),
-        'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
-    String packageLocation = _p('/workspace/this/is/the/package');
-    Uri packageUri = provider.pathContext.toUri(packageLocation);
-    provider.newFile(
-        _p('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages'),
-        'flutter:$packageUri');
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String buildDir = convertPath('out/debug-x87_128');
+    newFile('/workspace/.config',
+        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
+    String packageLocation = convertPath('/workspace/this/is/the/package');
+    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
+        content: 'flutter:$packageUri');
     GnWorkspace workspace =
-        GnWorkspace.find(provider, _p('/workspace/some/code'));
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
     expect(workspace, isNotNull);
-    expect(workspace.root, _p('/workspace/some/code'));
+    expect(workspace.root, convertPath('/workspace/some/code'));
     expect(workspace.packageMap.length, 1);
     expect(workspace.packageMap['flutter'][0].path, packageLocation);
   }
 
   void test_packages_absoluteBuildDir() {
-    provider.newFolder(_p('/workspace/.jiri_root'));
-    provider.newFolder(_p('/workspace/some/code'));
-    provider.newFile(_p('/workspace/some/code/pubspec.yaml'), '');
-    String buildDir = _p('/workspace/out/debug-x87_128');
-    provider.newFile(_p('/workspace/.config'),
-        'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
-    String packageLocation = _p('/workspace/this/is/the/package');
-    Uri packageUri = provider.pathContext.toUri(packageLocation);
-    provider.newFile(
-        _p('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages'),
-        'flutter:$packageUri');
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String buildDir = convertPath('/workspace/out/debug-x87_128');
+    newFile('/workspace/.config',
+        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
+    String packageLocation = convertPath('/workspace/this/is/the/package');
+    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
+        content: 'flutter:$packageUri');
     GnWorkspace workspace =
-        GnWorkspace.find(provider, _p('/workspace/some/code'));
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
     expect(workspace, isNotNull);
-    expect(workspace.root, _p('/workspace/some/code'));
+    expect(workspace.root, convertPath('/workspace/some/code'));
+    expect(workspace.packageMap.length, 1);
+    expect(workspace.packageMap['flutter'][0].path, packageLocation);
+  }
+
+  void test_packages_fallbackBuildDir() {
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String packageLocation = convertPath('/workspace/this/is/the/package');
+    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
+        content: 'flutter:$packageUri');
+    GnWorkspace workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
+    expect(workspace, isNotNull);
+    expect(workspace.root, convertPath('/workspace/some/code'));
     expect(workspace.packageMap.length, 1);
     expect(workspace.packageMap['flutter'][0].path, packageLocation);
   }
 
   void test_packages_multipleCandidates() {
-    provider.newFolder(_p('/workspace/.jiri_root'));
-    provider.newFolder(_p('/workspace/some/code'));
-    provider.newFile(_p('/workspace/some/code/pubspec.yaml'), '');
-    String buildDir = _p('out/release-y22_256');
-    provider.newFile(_p('/workspace/.config'),
-        'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
-    String packageLocation = _p('/workspace/this/is/the/package');
-    Uri packageUri = provider.pathContext.toUri(packageLocation);
-    provider.newFile(
-        _p('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages'),
-        'flutter:$packageUri');
-    String otherPackageLocation = _p('/workspace/here/too');
-    Uri otherPackageUri = provider.pathContext.toUri(otherPackageLocation);
-    provider.newFile(
-        _p('/workspace/out/release-y22_256/dartlang/gen/some/code/foo.packages'),
-        'rettulf:$otherPackageUri');
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String buildDir = convertPath('out/release-y22_256');
+    newFile('/workspace/.config',
+        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
+    String packageLocation = convertPath('/workspace/this/is/the/package');
+    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
+        content: 'flutter:$packageUri');
+    String otherPackageLocation = convertPath('/workspace/here/too');
+    Uri otherPackageUri =
+        resourceProvider.pathContext.toUri(otherPackageLocation);
+    newFile(
+        '/workspace/out/release-y22_256/dartlang/gen/some/code/foo.packages',
+        content: 'rettulf:$otherPackageUri');
     GnWorkspace workspace =
-        GnWorkspace.find(provider, _p('/workspace/some/code'));
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
     expect(workspace, isNotNull);
-    expect(workspace.root, _p('/workspace/some/code'));
+    expect(workspace.root, convertPath('/workspace/some/code'));
     expect(workspace.packageMap.length, 1);
     expect(workspace.packageMap['rettulf'][0].path, otherPackageLocation);
   }
 
-  void test_packages_fallbackBuildDir() {
-    provider.newFolder(_p('/workspace/.jiri_root'));
-    provider.newFolder(_p('/workspace/some/code'));
-    provider.newFile(_p('/workspace/some/code/pubspec.yaml'), '');
-    String packageLocation = _p('/workspace/this/is/the/package');
-    Uri packageUri = provider.pathContext.toUri(packageLocation);
-    provider.newFile(
-        _p('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages'),
-        'flutter:$packageUri');
-    GnWorkspace workspace =
-        GnWorkspace.find(provider, _p('/workspace/some/code'));
-    expect(workspace, isNotNull);
-    expect(workspace.root, _p('/workspace/some/code'));
-    expect(workspace.packageMap.length, 1);
-    expect(workspace.packageMap['flutter'][0].path, packageLocation);
-  }
-
   void test_packages_multipleFiles() {
-    provider.newFolder(_p('/workspace/.jiri_root'));
-    provider.newFolder(_p('/workspace/some/code'));
-    provider.newFile(_p('/workspace/some/code/pubspec.yaml'), '');
-    String buildDir = _p('out/debug-x87_128');
-    provider.newFile(_p('/workspace/.config'),
-        'FOO=foo\n' + 'FUCHSIA_BUILD_DIR=$buildDir\n' + 'BAR=bar\n');
-    String packageOneLocation = _p('/workspace/this/is/the/package');
-    Uri packageOneUri = provider.pathContext.toUri(packageOneLocation);
-    provider.newFile(
-        _p('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages'),
-        'flutter:$packageOneUri');
-    String packageTwoLocation = _p('/workspace/this/is/the/other/package');
-    Uri packageTwoUri = provider.pathContext.toUri(packageTwoLocation);
-    provider.newFile(
-        _p('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_test.packages'),
-        'rettulf:$packageTwoUri');
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String buildDir = convertPath('out/debug-x87_128');
+    newFile('/workspace/.config',
+        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR=$buildDir\n' + 'BAR=bar\n');
+    String packageOneLocation = convertPath('/workspace/this/is/the/package');
+    Uri packageOneUri = resourceProvider.pathContext.toUri(packageOneLocation);
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
+        content: 'flutter:$packageOneUri');
+    String packageTwoLocation =
+        convertPath('/workspace/this/is/the/other/package');
+    Uri packageTwoUri = resourceProvider.pathContext.toUri(packageTwoLocation);
+    newFile(
+        '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_test.packages',
+        content: 'rettulf:$packageTwoUri');
     GnWorkspace workspace =
-        GnWorkspace.find(provider, _p('/workspace/some/code'));
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
     expect(workspace, isNotNull);
-    expect(workspace.root, _p('/workspace/some/code'));
+    expect(workspace.root, convertPath('/workspace/some/code'));
     expect(workspace.packageMap.length, 2);
     expect(workspace.packageMap['flutter'][0].path, packageOneLocation);
     expect(workspace.packageMap['rettulf'][0].path, packageTwoLocation);
   }
 }
-
-class _BaseTest {
-  final MemoryResourceProvider provider = new MemoryResourceProvider();
-
-  /**
-   * Return the [provider] specific path for the given Posix [path].
-   */
-  String _p(String path) => provider.convertPath(path);
-}
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index 1789773..e4d808c 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -1542,17 +1542,6 @@
     verify([source]);
   }
 
-  test_invalidSealedAnnotation_onNonClass() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-
-@sealed m({a = 1}) => null;
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.INVALID_SEALED_ANNOTATION]);
-    verify([source]);
-  }
-
   test_invalidSealedAnnotation_onClass() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:meta/meta.dart';
@@ -1564,6 +1553,17 @@
     verify([source]);
   }
 
+  test_invalidSealedAnnotation_onMixin() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+
+@sealed mixin M {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_invalidSealedAnnotation_onMixinApplication() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:meta/meta.dart';
@@ -1579,14 +1579,14 @@
     verify([source]);
   }
 
-  test_invalidSealedAnnotation_onMixin() async {
+  test_invalidSealedAnnotation_onNonClass() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:meta/meta.dart';
 
-@sealed mixin M {}
+@sealed m({a = 1}) => null;
 ''');
     await computeAnalysisResult(source);
-    assertNoErrors(source);
+    assertErrors(source, [HintCode.INVALID_SEALED_ANNOTATION]);
     verify([source]);
   }
 
@@ -1651,6 +1651,33 @@
     verify([source]);
   }
 
+  test_invalidUseOfProtectedMember_fromSuperclassConstraint() async {
+    Source sourceA = addNamedSource('/a.dart', r'''
+import 'package:meta/meta.dart';
+
+abstract class A {
+  @protected
+  void foo() {}
+}
+''');
+    Source sourceM = addNamedSource('/m.dart', r'''
+import 'a.dart';
+
+mixin M on A {
+  @override
+  void foo() {
+    super.foo();
+  }
+}
+''');
+
+    await computeAnalysisResult(sourceA);
+    await computeAnalysisResult(sourceM);
+    assertNoErrors(sourceA);
+    assertNoErrors(sourceM);
+    verify([sourceA, sourceM]);
+  }
+
   test_invalidUseOfProtectedMember_function() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:meta/meta.dart';
@@ -2016,166 +2043,6 @@
     verify([source]);
   }
 
-  test_invalidUseOfVisibleForTestingMember_constructor() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-class A {
-  int _x;
-
-  @visibleForTesting
-  A.forTesting(this._x);
-}
-''');
-    Source source2 = addNamedSource('/lib2.dart', r'''
-import 'lib1.dart';
-
-void main() {
-  new A.forTesting(0);
-}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source2, [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
-    verify([source, source2]);
-  }
-
-  test_invalidUseOfVisibleForTestingMember_method() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-class A {
-  @visibleForTesting
-  void a(){ }
-}
-''');
-    Source source2 = addNamedSource('/lib2.dart', r'''
-import 'lib1.dart';
-
-class B {
-  void b() => new A().a();
-}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source2, [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
-    verify([source, source2]);
-  }
-
-  test_invalidUseOfVisibleForTestingMember_method_OK() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-class A {
-  @visibleForTesting
-  void a(){ }
-}
-''');
-    Source source2 = addNamedSource('/test/test1.dart', r'''
-import '../lib1.dart';
-
-class B {
-  void b() => new A().a();
-}
-''');
-    Source source3 = addNamedSource('/testing/lib1.dart', r'''
-import '../lib1.dart';
-
-class C {
-  void b() => new A().a();
-}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    await computeAnalysisResult(source3);
-    assertNoErrors(source2);
-    assertNoErrors(source3);
-    verify([source, source2, source3]);
-  }
-
-  test_invalidUseOfVisibleForTestingMember_export_OK() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-
-@visibleForTesting
-int fn0() => 1;
-''');
-    Source source2 = addNamedSource('/lib2.dart', r'''
-export 'lib1.dart' show fn0;
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  test_invalidUseOfVisibleForTestingMember_propertyAccess() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-class A {
-  @visibleForTesting
-  int get a => 7;
-
-  @visibleForTesting
-  set b(_) => 7;
-}
-''');
-    Source source2 = addNamedSource('/lib2.dart', r'''
-import 'lib1.dart';
-
-void main() {
-  new A().a;
-  new A().b = 6;
-}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source2, [
-      HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER,
-      HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER
-    ]);
-    verify([source, source2]);
-  }
-
-  test_invalidUseOfVisibleForTestingMember_topLevelFunction() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-
-@visibleForTesting
-int fn0() => 1;
-''');
-    Source source2 = addNamedSource('/lib2.dart', r'''
-import 'lib1.dart';
-
-void main() {
-  fn0();
-}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source2, [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
-    verify([source, source2]);
-  }
-
-  test_invalidUseProtectedAndForTesting_asProtected_OK() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:meta/meta.dart';
-class A {
-  @protected
-  @visibleForTesting
-  void a(){ }
-}
-''');
-    Source source2 = addNamedSource('/lib2.dart', r'''
-import 'lib1.dart';
-
-class B extends A {
-  void b() => new A().a();
-}
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
   test_invalidUseOfVisibleForTemplateMember_constructor() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:angular_meta/angular_meta.dart';
@@ -2200,6 +2067,22 @@
     verify([source, source2]);
   }
 
+  test_invalidUseOfVisibleForTemplateMember_export_OK() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:angular_meta/angular_meta.dart';
+
+@visibleForTemplate
+int fn0() => 1;
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+export 'lib1.dart' show fn0;
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
   test_invalidUseOfVisibleForTemplateMember_method() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:angular_meta/angular_meta.dart';
@@ -2243,22 +2126,6 @@
     verify([source, source2]);
   }
 
-  test_invalidUseOfVisibleForTemplateMember_export_OK() async {
-    Source source = addNamedSource('/lib1.dart', r'''
-import 'package:angular_meta/angular_meta.dart';
-
-@visibleForTemplate
-int fn0() => 1;
-''');
-    Source source2 = addNamedSource('/lib2.dart', r'''
-export 'lib1.dart' show fn0;
-''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
   test_invalidUseOfVisibleForTemplateMember_propertyAccess() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:angular_meta/angular_meta.dart';
@@ -2308,6 +2175,144 @@
     verify([source, source2]);
   }
 
+  test_invalidUseOfVisibleForTestingMember_constructor() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  int _x;
+
+  @visibleForTesting
+  A.forTesting(this._x);
+}
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+void main() {
+  new A.forTesting(0);
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source2, [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    verify([source, source2]);
+  }
+
+  test_invalidUseOfVisibleForTestingMember_export_OK() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+
+@visibleForTesting
+int fn0() => 1;
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+export 'lib1.dart' show fn0;
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  test_invalidUseOfVisibleForTestingMember_method() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  @visibleForTesting
+  void a(){ }
+}
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+class B {
+  void b() => new A().a();
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source2, [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    verify([source, source2]);
+  }
+
+  test_invalidUseOfVisibleForTestingMember_method_OK() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  @visibleForTesting
+  void a(){ }
+}
+''');
+    Source source2 = addNamedSource('/test/test1.dart', r'''
+import '../lib1.dart';
+
+class B {
+  void b() => new A().a();
+}
+''');
+    Source source3 = addNamedSource('/testing/lib1.dart', r'''
+import '../lib1.dart';
+
+class C {
+  void b() => new A().a();
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    await computeAnalysisResult(source3);
+    assertNoErrors(source2);
+    assertNoErrors(source3);
+    verify([source, source2, source3]);
+  }
+
+  test_invalidUseOfVisibleForTestingMember_propertyAccess() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  @visibleForTesting
+  int get a => 7;
+
+  @visibleForTesting
+  set b(_) => 7;
+}
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+void main() {
+  new A().a;
+  new A().b = 6;
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source2, [
+      HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER,
+      HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER
+    ]);
+    verify([source, source2]);
+  }
+
+  test_invalidUseOfVisibleForTestingMember_topLevelFunction() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+
+@visibleForTesting
+int fn0() => 1;
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+void main() {
+  fn0();
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source2, [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    verify([source, source2]);
+  }
+
   test_invalidUseProtectedAndForTemplate_asProtected_OK() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:angular_meta/angular_meta.dart';
@@ -2354,6 +2359,28 @@
     verify([source, source2]);
   }
 
+  test_invalidUseProtectedAndForTesting_asProtected_OK() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  @protected
+  @visibleForTesting
+  void a(){ }
+}
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+class B extends A {
+  void b() => new A().a();
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
   test_invalidUseProtectedAndForTesting_asTesting_OK() async {
     Source source = addNamedSource('/lib1.dart', r'''
 import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/test/generated/inheritance_manager_test.dart b/pkg/analyzer/test/generated/inheritance_manager_test.dart
index d89fec8..369b90b 100644
--- a/pkg/analyzer/test/generated/inheritance_manager_test.dart
+++ b/pkg/analyzer/test/generated/inheritance_manager_test.dart
@@ -4,12 +4,8 @@
 
 library analyzer.test.generated.inheritance_manager_test;
 
-import 'dart:collection';
-
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
@@ -21,11 +17,11 @@
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/source/source_resource.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'analysis_context_factory.dart';
-import 'test_support.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -34,7 +30,7 @@
 }
 
 @reflectiveTest
-class InheritanceManagerTest {
+class InheritanceManagerTest extends Object with ResourceProviderMixin {
   /**
    * The type provider used to access the types.
    */
@@ -63,6 +59,7 @@
         objectType.methods.length + objectType.accessors.length;
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromClasses_accessor_extends() {
     // class A { int get g; }
     // class B extends A {}
@@ -79,10 +76,9 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject + 1);
     expect(mapB[getterName], same(getterG));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromClasses_accessor_implements() {
     // class A { int get g; }
     // class B implements A {}
@@ -100,10 +96,9 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject);
     expect(mapB[getterName], isNull);
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromClasses_accessor_with() {
     // class A { int get g; }
     // class B extends Object with A {}
@@ -121,19 +116,18 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject + 1);
     expect(mapB[getterName], same(getterG));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromClasses_implicitExtends() {
     // class A {}
     ClassElementImpl classA = ElementFactory.classElement2("A");
     Map<String, ExecutableElement> mapA =
         _inheritanceManager.getMembersInheritedFromClasses(classA);
     expect(mapA.length, _numOfMembersInObject);
-    _assertNoErrors(classA);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromClasses_method_extends() {
     // class A { int g(); }
     // class B extends A {}
@@ -151,10 +145,9 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject + 1);
     expect(mapB[methodName], same(methodM));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromClasses_method_implements() {
     // class A { int g(); }
     // class B implements A {}
@@ -172,10 +165,9 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject);
     expect(mapB[methodName], isNull);
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromClasses_method_with() {
     // class A { int g(); }
     // class B extends Object with A {}
@@ -193,10 +185,9 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject + 1);
     expect(mapB[methodName], same(methodM));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromClasses_method_with_two_mixins() {
     // class A1 { int m(); }
     // class A2 { int m(); }
@@ -215,11 +206,9 @@
     Map<String, ExecutableElement> mapB =
         _inheritanceManager.getMembersInheritedFromClasses(classB);
     expect(mapB[methodName], same(methodA2M));
-    _assertNoErrors(classA1);
-    _assertNoErrors(classA2);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromInterfaces_accessor_extends() {
     // class A { int get g; }
     // class B extends A {}
@@ -236,10 +225,9 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject + 1);
     expect(mapB[getterName], same(getterG));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromInterfaces_accessor_implements() {
     // class A { int get g; }
     // class B implements A {}
@@ -257,10 +245,9 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject + 1);
     expect(mapB[getterName], same(getterG));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromInterfaces_accessor_with() {
     // class A { int get g; }
     // class B extends Object with A {}
@@ -278,10 +265,9 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject + 1);
     expect(mapB[getterName], same(getterG));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromInterfaces_field_indirectWith() {
     // class A { int f; }
     // class B extends A {}
@@ -303,20 +289,18 @@
     expect(mapC, hasLength(_numOfMembersInObject + 2));
     expect(mapC[fieldName], same(fieldF.getter));
     expect(mapC['$fieldName='], same(fieldF.setter));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-    _assertNoErrors(classC);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromInterfaces_implicitExtends() {
     // class A {}
     ClassElementImpl classA = ElementFactory.classElement2("A");
     Map<String, ExecutableElement> mapA =
         _inheritanceManager.getMembersInheritedFromInterfaces(classA);
     expect(mapA.length, _numOfMembersInObject);
-    _assertNoErrors(classA);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromInterfaces_method_extends() {
     // class A { int g(); }
     // class B extends A {}
@@ -333,10 +317,9 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject + 1);
     expect(mapB[methodName], same(methodM));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromInterfaces_method_implements() {
     // class A { int g(); }
     // class B implements A {}
@@ -354,10 +337,9 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject + 1);
     expect(mapB[methodName], same(methodM));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromInterfaces_method_with() {
     // class A { int g(); }
     // class B extends Object with A {}
@@ -375,10 +357,9 @@
     expect(mapA.length, _numOfMembersInObject);
     expect(mapB.length, _numOfMembersInObject + 1);
     expect(mapB[methodName], same(methodM));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
+  @deprecated
   void test_getMapOfMembersInheritedFromInterfaces_union_differentNames() {
     // class I1 { int m1(); }
     // class I2 { int m2(); }
@@ -400,9 +381,9 @@
     expect(mapA.length, _numOfMembersInObject + 2);
     expect(mapA[methodName1], same(methodM1));
     expect(mapA[methodName2], same(methodM2));
-    _assertNoErrors(classA);
   }
 
+  @deprecated
   void
       test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_getters() {
     // class I1 { int get g; }
@@ -426,9 +407,9 @@
     syntheticAccessor = ElementFactory.getterElement(
         accessorName, false, _typeProvider.intType);
     expect(mapA[accessorName].type, syntheticAccessor.type);
-    _assertNoErrors(classA);
   }
 
+  @deprecated
   void
       test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods() {
     // class I1 { dynamic m(int); }
@@ -462,9 +443,9 @@
     syntheticMethod = ElementFactory.methodElement(
         methodName, _typeProvider.dynamicType, [_typeProvider.numType]);
     expect(mapA[methodName].type, syntheticMethod.type);
-    _assertNoErrors(classA);
   }
 
+  @deprecated
   void
       test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_setters() {
     // class I1 { set s(int); }
@@ -489,9 +470,9 @@
         accessorName, false, _typeProvider.numType);
     syntheticAccessor.returnType = VoidTypeImpl.instance;
     expect(mapA["$accessorName="].type, syntheticAccessor.type);
-    _assertNoErrors(classA);
   }
 
+  @deprecated
   void
       test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters() {
     // class A {}
@@ -530,9 +511,9 @@
     syntheticAccessor =
         ElementFactory.getterElement(accessorName, false, classC.type);
     expect(mapD[accessorName].type, syntheticAccessor.type);
-    _assertNoErrors(classD);
   }
 
+  @deprecated
   void
       test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods() {
     // class A {}
@@ -586,9 +567,9 @@
     syntheticMethod = ElementFactory.methodElement(
         methodName, _typeProvider.dynamicType, [classA.type]);
     expect(mapD[methodName].type, syntheticMethod.type);
-    _assertNoErrors(classD);
   }
 
+  @deprecated
   void
       test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_setters() {
     // class A {}
@@ -628,9 +609,9 @@
         ElementFactory.setterElement(accessorName, false, classA.type);
     syntheticAccessor.returnType = VoidTypeImpl.instance;
     expect(mapD["$accessorName="].type, syntheticAccessor.type);
-    _assertNoErrors(classD);
   }
 
+  @deprecated
   void
       test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods() {
     // class I1 { int m(); }
@@ -656,9 +637,9 @@
         _inheritanceManager.getMembersInheritedFromInterfaces(classA);
     expect(mapA.length, _numOfMembersInObject + 1);
     expect(mapA[methodName], same(methodM2));
-    _assertNoErrors(classA);
   }
 
+  @deprecated
   void
       test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods() {
     // class I1 { int m(); }
@@ -702,9 +683,9 @@
         _inheritanceManager.getMembersInheritedFromInterfaces(classA);
     expect(mapA.length, _numOfMembersInObject + 1);
     expect(mapA[methodName], same(methodM3));
-    _assertNoErrors(classA);
   }
 
+  @deprecated
   void
       test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_4_methods() {
     // class I1 { int m(); }
@@ -754,9 +735,9 @@
         _inheritanceManager.getMembersInheritedFromInterfaces(classA);
     expect(mapA.length, _numOfMembersInObject + 1);
     expect(mapA[methodName], same(methodM4));
-    _assertNoErrors(classA);
   }
 
+  @deprecated
   void test_getMembersInheritedFromClasses_field_indirectWith() {
     // class A { int f; }
     // class B extends A {}
@@ -776,9 +757,6 @@
     Map<String, ExecutableElement> mapC =
         _inheritanceManager.getMembersInheritedFromClasses(classC);
     expect(mapC, hasLength(_numOfMembersInObject));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-    _assertNoErrors(classC);
   }
 
   void test_lookupInheritance_interface_getter() {
@@ -791,8 +769,6 @@
     classB.interfaces = <InterfaceType>[classA.type];
     expect(_inheritanceManager.lookupInheritance(classB, getterName),
         same(getterG));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_interface_method() {
@@ -805,8 +781,6 @@
     classB.interfaces = <InterfaceType>[classA.type];
     expect(_inheritanceManager.lookupInheritance(classB, methodName),
         same(methodM));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_interface_setter() {
@@ -819,8 +793,6 @@
     classB.interfaces = <InterfaceType>[classA.type];
     expect(_inheritanceManager.lookupInheritance(classB, "$setterName="),
         same(setterS));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_interface_staticMember() {
@@ -833,15 +805,12 @@
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.interfaces = <InterfaceType>[classA.type];
     expect(_inheritanceManager.lookupInheritance(classB, methodName), isNull);
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_interfaces_infiniteLoop() {
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.interfaces = <InterfaceType>[classA.type];
     expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
-    _assertNoErrors(classA);
   }
 
   void test_lookupInheritance_interfaces_infiniteLoop2() {
@@ -850,8 +819,6 @@
     classA.interfaces = <InterfaceType>[classB.type];
     classB.interfaces = <InterfaceType>[classA.type];
     expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_interfaces_union2() {
@@ -872,9 +839,6 @@
         same(methodM1));
     expect(_inheritanceManager.lookupInheritance(classA, methodName2),
         same(methodM2));
-    _assertNoErrors(classI1);
-    _assertNoErrors(classI2);
-    _assertNoErrors(classA);
   }
 
   void test_lookupInheritance_mixin_getter() {
@@ -887,8 +851,6 @@
     classB.mixins = <InterfaceType>[classA.type];
     expect(_inheritanceManager.lookupInheritance(classB, getterName),
         same(getterG));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_mixin_method() {
@@ -901,8 +863,6 @@
     classB.mixins = <InterfaceType>[classA.type];
     expect(_inheritanceManager.lookupInheritance(classB, methodName),
         same(methodM));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_mixin_setter() {
@@ -915,8 +875,6 @@
     classB.mixins = <InterfaceType>[classA.type];
     expect(_inheritanceManager.lookupInheritance(classB, "$setterName="),
         same(setterS));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_mixin_staticMember() {
@@ -929,14 +887,11 @@
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.mixins = <InterfaceType>[classA.type];
     expect(_inheritanceManager.lookupInheritance(classB, methodName), isNull);
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_noMember() {
     ClassElementImpl classA = ElementFactory.classElement2("A");
     expect(_inheritanceManager.lookupInheritance(classA, "a"), isNull);
-    _assertNoErrors(classA);
   }
 
   void test_lookupInheritance_superclass_getter() {
@@ -948,15 +903,12 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     expect(_inheritanceManager.lookupInheritance(classB, getterName),
         same(getterG));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_superclass_infiniteLoop() {
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.supertype = classA.type;
     expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
-    _assertNoErrors(classA);
   }
 
   void test_lookupInheritance_superclass_infiniteLoop2() {
@@ -965,8 +917,6 @@
     classA.supertype = classB.type;
     classB.supertype = classA.type;
     expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_superclass_method() {
@@ -978,8 +928,6 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     expect(_inheritanceManager.lookupInheritance(classB, methodName),
         same(methodM));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_superclass_setter() {
@@ -991,8 +939,6 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     expect(_inheritanceManager.lookupInheritance(classB, "$setterName="),
         same(setterS));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_superclass_staticMember() {
@@ -1004,8 +950,6 @@
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     expect(_inheritanceManager.lookupInheritance(classB, methodName), isNull);
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupMember_getter() {
@@ -1015,7 +959,6 @@
         ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     expect(_inheritanceManager.lookupMember(classA, getterName), same(getterG));
-    _assertNoErrors(classA);
   }
 
   void test_lookupMember_getter_static() {
@@ -1025,7 +968,6 @@
         ElementFactory.getterElement(getterName, true, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     expect(_inheritanceManager.lookupMember(classA, getterName), isNull);
-    _assertNoErrors(classA);
   }
 
   void test_lookupMember_method() {
@@ -1035,7 +977,6 @@
         ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     expect(_inheritanceManager.lookupMember(classA, methodName), same(methodM));
-    _assertNoErrors(classA);
   }
 
   void test_lookupMember_method_static() {
@@ -1046,13 +987,11 @@
     (methodM as MethodElementImpl).isStatic = true;
     classA.methods = <MethodElement>[methodM];
     expect(_inheritanceManager.lookupMember(classA, methodName), isNull);
-    _assertNoErrors(classA);
   }
 
   void test_lookupMember_noMember() {
     ClassElementImpl classA = ElementFactory.classElement2("A");
     expect(_inheritanceManager.lookupMember(classA, "a"), isNull);
-    _assertNoErrors(classA);
   }
 
   void test_lookupMember_setter() {
@@ -1063,7 +1002,6 @@
     classA.accessors = <PropertyAccessorElement>[setterS];
     expect(_inheritanceManager.lookupMember(classA, "$setterName="),
         same(setterS));
-    _assertNoErrors(classA);
   }
 
   void test_lookupMember_setter_static() {
@@ -1073,7 +1011,6 @@
         ElementFactory.setterElement(setterName, true, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[setterS];
     expect(_inheritanceManager.lookupMember(classA, setterName), isNull);
-    _assertNoErrors(classA);
   }
 
   void test_lookupOverrides_noParentClasses() {
@@ -1084,7 +1021,6 @@
     classA.methods = <MethodElement>[methodM];
     expect(
         _inheritanceManager.lookupOverrides(classA, methodName), hasLength(0));
-    _assertNoErrors(classA);
   }
 
   void test_lookupOverrides_overrideBaseClass() {
@@ -1100,8 +1036,6 @@
     List<ExecutableElement> overrides =
         _inheritanceManager.lookupOverrides(classB, methodName);
     expect(overrides, unorderedEquals([methodMinA]));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupOverrides_overrideInterface() {
@@ -1118,8 +1052,6 @@
     List<ExecutableElement> overrides =
         _inheritanceManager.lookupOverrides(classB, methodName);
     expect(overrides, unorderedEquals([methodMinA]));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
   }
 
   void test_lookupOverrides_overrideTwoInterfaces() {
@@ -1140,26 +1072,6 @@
     List<ExecutableElement> overrides =
         _inheritanceManager.lookupOverrides(classC, methodName);
     expect(overrides, unorderedEquals([methodMinA, methodMinB]));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-    _assertNoErrors(classC);
-  }
-
-  void _assertErrors(ClassElement classElt,
-      [List<ErrorCode> expectedErrorCodes = const <ErrorCode>[]]) {
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    HashSet<AnalysisError> actualErrors =
-        _inheritanceManager.getErrors(classElt);
-    if (actualErrors != null) {
-      for (AnalysisError error in actualErrors) {
-        errorListener.onError(error);
-      }
-    }
-    errorListener.assertErrorsWithCodes(expectedErrorCodes);
-  }
-
-  void _assertNoErrors(ClassElement classElt) {
-    _assertErrors(classElt);
   }
 
   /**
@@ -1168,12 +1080,11 @@
    * @return the inheritance manager that was created
    */
   InheritanceManager _createInheritanceManager() {
-    MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
     AnalysisContext context = AnalysisContextFactory.contextWithCore(
         resourceProvider: resourceProvider);
-    Source source = new FileSource(resourceProvider.getFile("/test.dart"));
+    Source source = new FileSource(getFile("/test.dart"));
     CompilationUnitElementImpl definingCompilationUnit =
-        new CompilationUnitElementImpl("test.dart");
+        new CompilationUnitElementImpl();
     definingCompilationUnit.librarySource =
         definingCompilationUnit.source = source;
     _definingLibrary = ElementFactory.library(context, "test");
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index a687345..24cbf3d 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -47,6 +47,42 @@
     verify([source]);
   }
 
+  test_deadCode_afterForEachWithBreakLabel() async {
+    Source source = addSource('''
+f() {
+  named: {
+    for (var x in [1]) {
+      if (x == null)
+        break named;
+    }
+    return;
+  }
+  print('not dead');
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_deadCode_afterForWithBreakLabel() async {
+    Source source = addSource('''
+f() {
+  named: {
+    for (int i = 0; i < 7; i++) {
+      if (i == null)
+        break named;
+    }
+    return;
+  }
+  print('not dead');
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_deadCode_afterTryCatch() async {
     Source source = addSource('''
 main() {
@@ -235,42 +271,6 @@
     verify([source]);
   }
 
-  test_deadCode_afterForEachWithBreakLabel() async {
-    Source source = addSource('''
-f() {
-  named: {
-    for (var x in [1]) {
-      if (x == null)
-        break named;
-    }
-    return;
-  }
-  print('not dead');
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deadCode_afterForWithBreakLabel() async {
-    Source source = addSource('''
-f() {
-  named: {
-    for (int i = 0; i < 7; i++) {
-      if (i == null)
-        break named;
-    }
-    return;
-  }
-  print('not dead');
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_deprecatedAnnotationUse_namedParameter_inDefiningFunction() async {
     Source source = addSource(r'''
 f({@deprecated int x}) => x;
@@ -658,7 +658,10 @@
 }''');
     await computeAnalysisResult(source);
     if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+      assertErrors(
+        source,
+        [CompileTimeErrorCode.INVALID_OVERRIDE],
+      );
     } else {
       assertNoErrors(source);
     }
@@ -682,7 +685,10 @@
 }''');
     await computeAnalysisResult(source);
     if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+      assertErrors(
+        source,
+        [CompileTimeErrorCode.INVALID_OVERRIDE],
+      );
     } else {
       assertNoErrors(source);
     }
@@ -717,6 +723,29 @@
     verify([source]);
   }
 
+  @FailingTest(
+      reason: 'We should not use types here. '
+          'There is a member in a superinterface, so we override something.')
+  test_overrideOnNonOverridingMethod_dontUseInterface() async {
+    Source source = addSource(r'''
+abstract class A {
+  void foo(int _);
+}
+
+abstract class B {
+  void foo(double _);
+}
+
+abstract class X implements A, B {
+  @override
+  void foo(Object _) {}
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_overrideOnNonOverridingMethod_inInterface() async {
     Source source = addSource(r'''
 class A {
diff --git a/pkg/analyzer/test/generated/package_build_test.dart b/pkg/analyzer/test/generated/package_build_test.dart
index af65df1..81b7d35 100644
--- a/pkg/analyzer/test/generated/package_build_test.dart
+++ b/pkg/analyzer/test/generated/package_build_test.dart
@@ -3,10 +3,10 @@
 // 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/src/context/builder.dart';
 import 'package:analyzer/src/generated/package_build.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:package_config/packages.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -46,45 +46,42 @@
 }
 
 @reflectiveTest
-class PackageBuildFileUriResolverTest extends _BaseTest {
+class PackageBuildFileUriResolverTest extends Object
+    with ResourceProviderMixin {
   PackageBuildWorkspace workspace;
   PackageBuildFileUriResolver resolver;
 
   void setUp() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/lib'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     final MockContextBuilder contextBuilder = new MockContextBuilder();
     final Packages packages = new MockPackages();
-    contextBuilder.packagesMapMap[_p('/workspace')] = packages;
+    contextBuilder.packagesMapMap[convertPath('/workspace')] = packages;
     contextBuilder.packagesToMapMap[packages] = {'project': []};
-    workspace =
-        PackageBuildWorkspace.find(provider, _p('/workspace'), contextBuilder);
+    workspace = PackageBuildWorkspace.find(
+        resourceProvider, convertPath('/workspace'), contextBuilder);
     resolver = new PackageBuildFileUriResolver(workspace);
-    provider.newFile(_p('/workspace/test.dart'), '');
-    provider.newFile(
-        _p('/workspace/.dart_tool/build/generated/project/gen.dart'), '');
+    newFile('/workspace/test.dart');
+    newFile('/workspace/.dart_tool/build/generated/project/gen.dart');
   }
 
   void test_resolveAbsolute_doesNotExist() {
     Source source = _resolvePath('/workspace/foo.dart');
     expect(source, isNotNull);
     expect(source.exists(), isFalse);
-    expect(source.fullName, _p('/workspace/foo.dart'));
+    expect(source.fullName, convertPath('/workspace/foo.dart'));
   }
 
   void test_resolveAbsolute_file() {
     Source source = _resolvePath('/workspace/test.dart');
     expect(source, isNotNull);
     expect(source.exists(), isTrue);
-    expect(source.fullName, _p('/workspace/test.dart'));
+    expect(source.fullName, convertPath('/workspace/test.dart'));
   }
 
   void test_resolveAbsolute_folder() {
     Source source = _resolvePath('/workspace');
-    expect(source, isNotNull);
-    expect(source.exists(), isFalse);
-    expect(source.fullName, _p('/workspace'));
+    expect(source, isNull);
   }
 
   void test_resolveAbsolute_generated_file_exists_one() {
@@ -92,7 +89,7 @@
     expect(source, isNotNull);
     expect(source.exists(), isTrue);
     expect(source.fullName,
-        _p('/workspace/.dart_tool/build/generated/project/gen.dart'));
+        convertPath('/workspace/.dart_tool/build/generated/project/gen.dart'));
   }
 
   void test_resolveAbsolute_notFile_dartUri() {
@@ -108,7 +105,8 @@
   }
 
   void test_restoreAbsolute() {
-    Uri uri = provider.pathContext.toUri(_p('/workspace/test.dart'));
+    Uri uri =
+        resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
     Source source = resolver.resolveAbsolute(uri);
     expect(source, isNotNull);
     expect(resolver.restoreAbsolute(source), uri);
@@ -119,14 +117,15 @@
   }
 
   Source _resolvePath(String absolutePosixPath) {
-    String absolutePath = provider.convertPath(absolutePosixPath);
-    Uri uri = provider.pathContext.toUri(absolutePath);
+    String absolutePath = resourceProvider.convertPath(absolutePosixPath);
+    Uri uri = resourceProvider.pathContext.toUri(absolutePath);
     return resolver.resolveAbsolute(uri);
   }
 }
 
 @reflectiveTest
-class PackageBuildPackageUriResolverTest extends _BaseTest {
+class PackageBuildPackageUriResolverTest extends Object
+    with ResourceProviderMixin {
   PackageBuildWorkspace workspace;
   PackageBuildPackageUriResolver resolver;
   MockUriResolver packageUriResolver;
@@ -134,16 +133,15 @@
   Uri addPackageSource(String path, String uriStr, {bool create: true}) {
     Uri uri = Uri.parse(uriStr);
     final File file = create
-        ? provider.newFile(_p(path), '')
-        : provider.getResource(_p(path));
+        ? newFile(path)
+        : resourceProvider.getResource(convertPath(path));
     final Source source = file.createSource(uri);
     packageUriResolver.resolveAbsoluteMap[uri] = source;
     return uri;
   }
 
   void setUp() {
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
   }
 
   void test_resolveAbsolute_generated() {
@@ -199,17 +197,17 @@
   void _addResources(List<String> paths, {String workspacePath: '/workspace'}) {
     for (String path in paths) {
       if (path.endsWith('/')) {
-        provider.newFolder(_p(path.substring(0, path.length - 1)));
+        newFolder(path.substring(0, path.length - 1));
       } else {
-        provider.newFile(_p(path), '');
+        newFile(path);
       }
     }
     final contextBuilder = new MockContextBuilder();
     final packages = new MockPackages();
-    contextBuilder.packagesMapMap[_p(workspacePath)] = packages;
+    contextBuilder.packagesMapMap[convertPath(workspacePath)] = packages;
     contextBuilder.packagesToMapMap[packages] = {'project': []};
-    workspace =
-        PackageBuildWorkspace.find(provider, _p(workspacePath), contextBuilder);
+    workspace = PackageBuildWorkspace.find(
+        resourceProvider, convertPath(workspacePath), contextBuilder);
     packageUriResolver = new MockUriResolver();
     resolver =
         new PackageBuildPackageUriResolver(workspace, packageUriResolver);
@@ -219,7 +217,7 @@
       {bool exists: true, bool restore: true}) {
     Source source = resolver.resolveAbsolute(uri);
     expect(source, isNotNull);
-    expect(source.fullName, _p(posixPath));
+    expect(source.fullName, convertPath(posixPath));
     expect(source.uri, uri);
     expect(source.exists(), exists);
     // If enabled, test also "restoreAbsolute".
@@ -232,43 +230,40 @@
 }
 
 @reflectiveTest
-class PackageBuildWorkspaceTest extends _BaseTest {
+class PackageBuildWorkspaceTest extends Object with ResourceProviderMixin {
   void test_builtFile_currentProject() {
-    provider.newFolder(_p('/workspace/.dart_tool/build'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
-    final libFile = provider.newFile(
-        _p('/workspace/.dart_tool/build/generated/project/lib/file.dart'), '');
-    expect(workspace.builtFile(_p('lib/file.dart'), 'project'), libFile);
+    final libFile =
+        newFile('/workspace/.dart_tool/build/generated/project/lib/file.dart');
+    expect(
+        workspace.builtFile(convertPath('lib/file.dart'), 'project'), libFile);
   }
 
   void test_builtFile_importedPackage() {
-    provider.newFolder(_p('/workspace/.dart_tool/build'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project', 'foo']);
 
-    final libFile = provider.newFile(
-        _p('/workspace/.dart_tool/build/generated/foo/lib/file.dart'), '');
-    expect(workspace.builtFile(_p('lib/file.dart'), 'foo'), libFile);
+    final libFile =
+        newFile('/workspace/.dart_tool/build/generated/foo/lib/file.dart');
+    expect(workspace.builtFile(convertPath('lib/file.dart'), 'foo'), libFile);
   }
 
   void test_builtFile_notInPackagesGetsHidden() {
-    provider.newFolder(_p('/workspace/.dart_tool/build'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
 
     // Ensure package:bar is not configured.
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project', 'foo']);
 
     // Create a generated file in package:bar.
-    provider.newFile(
-        _p('/workspace/.dart_tool/build/generated/bar/lib/file.dart'), '');
+    newFile('/workspace/.dart_tool/build/generated/bar/lib/file.dart');
 
     // Bar not in packages, file should not be returned.
     expect(workspace.builtFile('lib/file.dart', 'bar'), isNull);
@@ -276,207 +271,201 @@
 
   void test_find_fail_notAbsolute() {
     expect(
-        () => PackageBuildWorkspace.find(
-            provider, _p('not_absolute'), new MockContextBuilder()),
+        () => PackageBuildWorkspace.find(resourceProvider,
+            convertPath('not_absolute'), new MockContextBuilder()),
         throwsArgumentError);
   }
 
   void test_find_hasDartToolAndPubspec() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/lib'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        provider, _p('/workspace'), new MockContextBuilder());
-    expect(workspace.root, _p('/workspace'));
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace'));
     expect(workspace.projectPackageName, 'project');
   }
 
   void test_find_hasDartToolAndPubspec_inParentDirectory() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/lib'));
-    provider.newFolder(_p('/workspace/opened/up/a/child/dir/.dart_tool/build'));
-    provider.newFileWithBytes(
-        _p('/workspace/opened/up/a/child/dir/pubspec.yaml'),
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
+    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
         'name: subproject'.codeUnits);
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(provider,
-        _p('/workspace/opened/up/a/child/dir'), new MockContextBuilder());
-    expect(workspace.root, _p('/workspace/opened/up/a/child/dir'));
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider,
+        convertPath('/workspace/opened/up/a/child/dir'),
+        new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace/opened/up/a/child/dir'));
     expect(workspace.projectPackageName, 'subproject');
   }
 
   void
       test_find_hasDartToolAndPubspec_inParentDirectory_ignoresMalformedPubspec() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/lib'));
-    provider.newFolder(_p('/workspace/opened/up/a/child/dir/.dart_tool/build'));
-    provider.newFileWithBytes(
-        _p('/workspace/opened/up/a/child/dir/pubspec.yaml'),
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
+    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
         'not: yaml: here!!! 111'.codeUnits);
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(provider,
-        _p('/workspace/opened/up/a/child/dir'), new MockContextBuilder());
-    expect(workspace.root, _p('/workspace'));
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider,
+        convertPath('/workspace/opened/up/a/child/dir'),
+        new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace'));
     expect(workspace.projectPackageName, 'project');
   }
 
   void test_find_hasDartToolAndPubspec_inParentDirectory_ignoresSoloDartTool() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/lib'));
-    provider.newFolder(_p('/workspace/opened/up/a/child/dir'));
-    provider.newFolder(_p('/workspace/opened/up/a/child/dir/.dart_tool/build'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(provider,
-        _p('/workspace/opened/up/a/child/dir'), new MockContextBuilder());
-    expect(workspace.root, _p('/workspace'));
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFolder('/workspace/opened/up/a/child/dir');
+    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider,
+        convertPath('/workspace/opened/up/a/child/dir'),
+        new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace'));
     expect(workspace.projectPackageName, 'project');
   }
 
   void test_find_hasDartToolAndPubspec_inParentDirectory_ignoresSoloPubspec() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/lib'));
-    provider.newFolder(_p('/workspace/opened/up/a/child/dir'));
-    provider.newFileWithBytes(
-        _p('/workspace/opened/up/a/child/dir/pubspec.yaml'),
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFolder('/workspace/opened/up/a/child/dir');
+    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
         'name: subproject'.codeUnits);
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(provider,
-        _p('/workspace/opened/up/a/child/dir'), new MockContextBuilder());
-    expect(workspace.root, _p('/workspace'));
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider,
+        convertPath('/workspace/opened/up/a/child/dir'),
+        new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace'));
     expect(workspace.projectPackageName, 'project');
   }
 
   void test_find_hasDartToolNoBuild() {
     // Edge case: an empty .dart_tool directory. Don't assume package:build.
-    provider.newFolder(_p('/workspace/.dart_tool'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        provider, _p('/workspace'), new MockContextBuilder());
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
     expect(workspace, isNull);
   }
 
   void test_find_hasDartToolNoPubspec() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/lib'));
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        provider, _p('/workspace'), new MockContextBuilder());
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
     expect(workspace, isNull);
   }
 
   void test_find_hasDartToolPubButNotBuild() {
     // Dart projects will have this directory, that don't use package:build.
-    provider.newFolder(_p('/workspace/.dart_tool/pub'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/pub');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        provider, _p('/workspace'), new MockContextBuilder());
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
     expect(workspace, isNull);
   }
 
   void test_find_hasMalformedPubspec() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/lib'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'not: yaml: here! 1111'.codeUnits);
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFileWithBytes(
+        '/workspace/pubspec.yaml', 'not: yaml: here! 1111'.codeUnits);
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        provider, _p('/workspace'), new MockContextBuilder());
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
     expect(workspace, isNull);
   }
 
   void test_find_hasPubspecNoDartTool() {
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        provider, _p('/workspace'), new MockContextBuilder());
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
     expect(workspace, isNull);
   }
 
   void test_findFile_bin() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/bin'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build/generated/project/bin');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
-    final binFile = provider.newFile(_p('/workspace/bin/file.dart'), '');
-    expect(workspace.findFile(_p('/workspace/bin/file.dart')), binFile);
+    final binFile = newFile('/workspace/bin/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/bin/file.dart')), binFile);
   }
 
   void test_findFile_binGenerated() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/bin'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build/generated/project/bin');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
-    final binFile = provider.newFile(
-        _p('/workspace/.dart_tool/build/generated/project/bin/file.dart'), '');
-    expect(workspace.findFile(_p('/workspace/bin/file.dart')), binFile);
+    final binFile =
+        newFile('/workspace/.dart_tool/build/generated/project/bin/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/bin/file.dart')), binFile);
   }
 
   void test_findFile_libGenerated() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/lib'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
-    final libFile = provider.newFile(
-        _p('/workspace/.dart_tool/build/generated/project/lib/file.dart'), '');
-    expect(workspace.findFile(_p('/workspace/lib/file.dart')), libFile);
+    final libFile =
+        newFile('/workspace/.dart_tool/build/generated/project/lib/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/lib/file.dart')), libFile);
   }
 
   void test_findFile_test() {
-    provider
-        .newFolder(_p('/workspace/.dart_tool/build/generated/project/test'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build/generated/project/test');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
-    final testFile = provider.newFile(_p('/workspace/test/file.dart'), '');
-    expect(workspace.findFile(_p('/workspace/test/file.dart')), testFile);
+    final testFile = newFile('/workspace/test/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/test/file.dart')), testFile);
   }
 
   void test_findFile_testGenerated() {
-    provider
-        .newFolder(_p('/workspace/.dart_tool/build/generated/project/test'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build/generated/project/test');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
-    final testFile = provider.newFile(
-        _p('/workspace/.dart_tool/build/generated/project/test/file.dart'), '');
-    expect(workspace.findFile(_p('/workspace/test/file.dart')), testFile);
+    final testFile =
+        newFile('/workspace/.dart_tool/build/generated/project/test/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/test/file.dart')), testFile);
   }
 
   void test_findFile_web() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/web'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build/generated/project/web');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
-    final webFile = provider.newFile(_p('/workspace/web/file.dart'), '');
-    expect(workspace.findFile(_p('/workspace/web/file.dart')), webFile);
+    final webFile = newFile('/workspace/web/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/web/file.dart')), webFile);
   }
 
   void test_findFile_webGenerated() {
-    provider.newFolder(_p('/workspace/.dart_tool/build/generated/project/web'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build/generated/project/web');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project']);
 
-    final webFile = provider.newFile(
-        _p('/workspace/.dart_tool/build/generated/project/web/file.dart'), '');
-    expect(workspace.findFile(_p('/workspace/web/file.dart')), webFile);
+    final webFile =
+        newFile('/workspace/.dart_tool/build/generated/project/web/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/web/file.dart')), webFile);
   }
 
   void test_supports_flutter() {
-    provider.newFolder(_p('/workspace/.dart_tool/build'));
-    provider.newFileWithBytes(
-        _p('/workspace/pubspec.yaml'), 'name: project'.codeUnits);
+    newFolder('/workspace/.dart_tool/build');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
     PackageBuildWorkspace workspace =
         _createWorkspace('/workspace', ['project', 'flutter']);
 
@@ -489,17 +478,9 @@
     final packages = new MockPackages();
     final packageMap = new Map<String, List<Folder>>.fromIterable(packageNames,
         value: ((_) => []));
-    contextBuilder.packagesMapMap[_p(root)] = packages;
+    contextBuilder.packagesMapMap[convertPath(root)] = packages;
     contextBuilder.packagesToMapMap[packages] = packageMap;
-    return PackageBuildWorkspace.find(provider, _p(root), contextBuilder);
+    return PackageBuildWorkspace.find(
+        resourceProvider, convertPath(root), contextBuilder);
   }
 }
-
-class _BaseTest {
-  final MemoryResourceProvider provider = new MemoryResourceProvider();
-
-  /**
-   * Return the [provider] specific path for the given Posix [path].
-   */
-  String _p(String path) => provider.convertPath(path);
-}
diff --git a/pkg/analyzer/test/generated/package_test.dart b/pkg/analyzer/test/generated/package_test.dart
index 0fbf4fb..5f62679 100644
--- a/pkg/analyzer/test/generated/package_test.dart
+++ b/pkg/analyzer/test/generated/package_test.dart
@@ -33,18 +33,19 @@
 @reflectiveTest
 class DependencyFinderTest extends ResolverTestCase {
   void test_transitiveDependenciesFor_circularDependencies() {
+    var pathContext = resourceProvider.pathContext;
     String packageA = resourceProvider.convertPath('/pub-cache/a-1.0');
     String packageB = resourceProvider.convertPath('/pub-cache/b-1.0');
     String packageC = resourceProvider.convertPath('/pub-cache/c-1.0');
-    resourceProvider.newFile('$packageA/$pubspecName', '''
+    resourceProvider.newFile(pathContext.join(packageA, pubspecName), '''
     dependencies:
       b: any
     ''');
-    resourceProvider.newFile('$packageB/$pubspecName', '''
+    resourceProvider.newFile(pathContext.join(packageB, pubspecName), '''
     dependencies:
       c: any
     ''');
-    resourceProvider.newFile('$packageC/$pubspecName', '''
+    resourceProvider.newFile(pathContext.join(packageC, pubspecName), '''
     dependencies:
       a: any
     ''');
@@ -61,7 +62,7 @@
   }
 
   void test_transitiveDependenciesFor_missingPubspec() {
-    String packagePath = '/pub-cache/a-1.0';
+    String packagePath = resourceProvider.convertPath('/pub-cache/a-1.0');
     Map<String, List<Folder>> packageMap = <String, List<Folder>>{
       'a': <Folder>[resourceProvider.getFolder(packagePath)]
     };
@@ -72,8 +73,9 @@
   }
 
   void test_transitiveDependenciesFor_noDependencies() {
-    String packagePath = '/pub-cache/a-1.0';
-    resourceProvider.newFile('$packagePath/$pubspecName', '');
+    var pathContext = resourceProvider.pathContext;
+    String packagePath = resourceProvider.convertPath('/pub-cache/a-1.0');
+    resourceProvider.newFile(pathContext.join(packagePath, pubspecName), '');
     Map<String, List<Folder>> packageMap = <String, List<Folder>>{
       'a': <Folder>[resourceProvider.getFolder(packagePath)]
     };
@@ -85,24 +87,25 @@
   }
 
   void test_transitiveDependenciesFor_overlappingDependencies() {
+    var pathContext = resourceProvider.pathContext;
     String packageA = resourceProvider.convertPath('/pub-cache/a-1.0');
     String packageB = resourceProvider.convertPath('/pub-cache/b-1.0');
     String packageC = resourceProvider.convertPath('/pub-cache/c-1.0');
     String packageD = resourceProvider.convertPath('/pub-cache/d-1.0');
-    resourceProvider.newFile('$packageA/$pubspecName', '''
+    resourceProvider.newFile(pathContext.join(packageA, pubspecName), '''
     dependencies:
       b: any
       c: any
     ''');
-    resourceProvider.newFile('$packageB/$pubspecName', '''
+    resourceProvider.newFile(pathContext.join(packageB, pubspecName), '''
     dependencies:
       d: any
     ''');
-    resourceProvider.newFile('$packageC/$pubspecName', '''
+    resourceProvider.newFile(pathContext.join(packageC, pubspecName), '''
     dependencies:
       d: any
     ''');
-    resourceProvider.newFile('$packageD/$pubspecName', '');
+    resourceProvider.newFile(pathContext.join(packageD, pubspecName), '');
     Map<String, List<Folder>> packageMap = <String, List<Folder>>{
       'a': <Folder>[resourceProvider.getFolder(packageA)],
       'b': <Folder>[resourceProvider.getFolder(packageB)],
@@ -117,16 +120,17 @@
   }
 
   void test_transitiveDependenciesFor_simpleDependencies() {
+    var pathContext = resourceProvider.pathContext;
     String packageA = resourceProvider.convertPath('/pub-cache/a-1.0');
     String packageB = resourceProvider.convertPath('/pub-cache/b-1.0');
     String packageC = resourceProvider.convertPath('/pub-cache/c-1.0');
-    resourceProvider.newFile('$packageA/$pubspecName', '''
+    resourceProvider.newFile(pathContext.join(packageA, pubspecName), '''
     dependencies:
       b: any
       c: any
     ''');
-    resourceProvider.newFile('$packageB/$pubspecName', '');
-    resourceProvider.newFile('$packageC/$pubspecName', '');
+    resourceProvider.newFile(pathContext.join(packageB, pubspecName), '');
+    resourceProvider.newFile(pathContext.join(packageC, pubspecName), '');
     Map<String, List<Folder>> packageMap = <String, List<Folder>>{
       'a': <Folder>[resourceProvider.getFolder(packageA)],
       'b': <Folder>[resourceProvider.getFolder(packageB)],
@@ -190,23 +194,24 @@
 @reflectiveTest
 class PackageManagerTest extends ResolverTestCase {
   void test_getContext() {
+    var pathContext = resourceProvider.pathContext;
     String packageA = resourceProvider.convertPath('/pub-cache/a-1.0');
     String packageB1 = resourceProvider.convertPath('/pub-cache/b-1.0');
     String packageB2 = resourceProvider.convertPath('/pub-cache/b-2.0');
     String packageC = resourceProvider.convertPath('/pub-cache/c-1.0');
-    resourceProvider.newFile('$packageA/$pubspecName', '''
+    resourceProvider.newFile(pathContext.join(packageA, pubspecName), '''
     dependencies:
       b: any
       c: any
     ''');
-    resourceProvider.newFile('$packageB1/$pubspecName', '');
-    resourceProvider.newFile('$packageB2/$pubspecName', '');
-    resourceProvider.newFile('$packageC/$pubspecName', '');
+    resourceProvider.newFile(pathContext.join(packageB1, pubspecName), '');
+    resourceProvider.newFile(pathContext.join(packageB2, pubspecName), '');
+    resourceProvider.newFile(pathContext.join(packageC, pubspecName), '');
 
     Packages packages1 = new _MockPackages(<String, Uri>{
-      'a': new Uri.file(packageA),
-      'b': new Uri.file(packageB1),
-      'c': new Uri.file(packageC),
+      'a': pathContext.toUri(packageA),
+      'b': pathContext.toUri(packageB1),
+      'c': pathContext.toUri(packageC),
     });
     DartUriResolver resolver = new DartUriResolver(new MockSdk());
     AnalysisOptions options = new AnalysisOptionsImpl();
@@ -227,9 +232,9 @@
     // Verify that if we have a different package map we get a different context.
     //
     Packages packages3 = new _MockPackages(<String, Uri>{
-      'a': new Uri.file(packageA),
-      'b': new Uri.file(packageB2),
-      'c': new Uri.file(packageC),
+      'a': pathContext.toUri(packageA),
+      'b': pathContext.toUri(packageB2),
+      'c': pathContext.toUri(packageC),
     });
     AnalysisContext context3 =
         manager.getContext(packageA, packages3, resolver, options);
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index bf161b0..1b44cb5 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -98,6 +98,24 @@
           expectedError(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, 21, 2)
         ]);
   }
+
+  void test_partialNamedConstructor() {
+    parseCompilationUnit('class C { C. }', errors: [
+      expectedError(ParserErrorCode.MISSING_IDENTIFIER, 13, 1),
+      expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 10, 1),
+      expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 13, 1),
+    ]);
+  }
+
+  void test_staticOperatorNamedMethod() {
+    // operator can be used as a method name
+    parseCompilationUnit('class C { static operator(x) => x; }');
+  }
+
+  void test_yieldAsLabel() {
+    // yield can be used as a label
+    parseCompilationUnit('main() { yield: break yield; }');
+  }
 }
 
 /**
@@ -145,15 +163,6 @@
     // Lazy assignment operators are always enabled
   }
 
-  @override
-  set enableNnbd(bool value) {
-    if (value == true) {
-      // TODO(paulberry,ahe): non-null-by-default syntax is not supported by
-      // Fasta.
-      throw new UnimplementedError();
-    }
-  }
-
   set enableOptionalNewAndConst(bool enable) {
     // ignored
   }
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 86c3bec..29dabbb 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -56,8 +56,6 @@
 
   void set enableLazyAssignmentOperators(bool value);
 
-  void set enableNnbd(bool value);
-
   /**
    * Set a flag indicating whether the parser should parse instance creation
    * expressions that lack either the `new` or `const` keyword.
@@ -1762,23 +1760,7 @@
  * Tests of the analyzer parser based on [ComplexParserTestMixin].
  */
 @reflectiveTest
-class ComplexParserTest extends ParserTestCase with ComplexParserTestMixin {
-  void test_logicalAndExpression_precedence_nullableType() {
-    enableNnbd = true;
-    BinaryExpression expression = parseExpression("x is C? && y is D");
-    expect(expression.leftOperand, new TypeMatcher<IsExpression>());
-    expect(expression.rightOperand, new TypeMatcher<IsExpression>());
-  }
-
-  void test_logicalOrExpression_precedence_nullableType() {
-    enableNnbd = true;
-    BinaryExpression expression = parseExpression("a is X? || (b ? c : d)");
-    expect(expression.leftOperand, new TypeMatcher<IsExpression>());
-    expect(expression.rightOperand, new TypeMatcher<ParenthesizedExpression>());
-    expect((expression.rightOperand as ParenthesizedExpression).expression,
-        new TypeMatcher<ConditionalExpression>());
-  }
-}
+class ComplexParserTest extends ParserTestCase with ComplexParserTestMixin {}
 
 /**
  * The class `ComplexParserTest` defines parser tests that test the parsing of more complex
@@ -2274,42 +2256,6 @@
         [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 0, 1)]);
     expect(expression.isSynthetic, isTrue);
   }
-
-  void test_nullableTypeInExtends() {
-    enableNnbd = true;
-    createParser('extends B?');
-    ExtendsClause clause = parser.parseExtendsClause();
-    expectNotNullIfNoErrors(clause);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.NULLABLE_TYPE_IN_EXTENDS, 9, 1)]);
-  }
-
-  void test_nullableTypeInImplements() {
-    enableNnbd = true;
-    createParser('implements I?');
-    ImplementsClause clause = parser.parseImplementsClause();
-    expectNotNullIfNoErrors(clause);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.NULLABLE_TYPE_IN_IMPLEMENTS, 12, 1)]);
-  }
-
-  void test_nullableTypeInWith() {
-    enableNnbd = true;
-    createParser('with M?');
-    WithClause clause = parser.parseWithClause();
-    expectNotNullIfNoErrors(clause);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.NULLABLE_TYPE_IN_WITH, 6, 1)]);
-  }
-
-  void test_nullableTypeParameter() {
-    enableNnbd = true;
-    createParser('T?');
-    TypeParameter parameter = parser.parseTypeParameter();
-    expectNotNullIfNoErrors(parameter);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.NULLABLE_TYPE_PARAMETER, 1, 1)]);
-  }
 }
 
 abstract class ErrorParserTestMixin implements AbstractParserTestCase {
@@ -5746,50 +5692,7 @@
 
 @reflectiveTest
 class ExpressionParserTest extends ParserTestCase
-    with ExpressionParserTestMixin {
-  void test_parseInstanceCreationExpression_type_typeArguments_nullable() {
-    enableNnbd = true;
-    Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    InstanceCreationExpression expression =
-        parseInstanceCreationExpression('A<B?>()', token);
-    expect(expression, isNotNull);
-    assertNoErrors();
-    expect(expression.keyword.keyword, Keyword.NEW);
-    ConstructorName name = expression.constructorName;
-    expect(name, isNotNull);
-    TypeName type = name.type;
-    expect(type, isNotNull);
-    expect(name.period, isNull);
-    expect(name.name, isNull);
-    expect(expression.argumentList, isNotNull);
-    NodeList<TypeAnnotation> arguments = type.typeArguments.arguments;
-    expect(arguments, hasLength(1));
-    expect((arguments[0] as TypeName).question, isNotNull);
-  }
-
-  void test_parseRelationalExpression_as_nullable() {
-    enableNnbd = true;
-    Expression expression = parseRelationalExpression('x as Y?)');
-    expect(expression, isNotNull);
-    assertNoErrors();
-    var asExpression = expression as AsExpression;
-    expect(asExpression.expression, isNotNull);
-    expect(asExpression.asOperator, isNotNull);
-    expect(asExpression.type, new TypeMatcher<TypeName>());
-  }
-
-  void test_parseRelationalExpression_is_nullable() {
-    enableNnbd = true;
-    Expression expression = parseRelationalExpression('x is y?)');
-    expect(expression, isNotNull);
-    assertNoErrors();
-    var isExpression = expression as IsExpression;
-    expect(isExpression.expression, isNotNull);
-    expect(isExpression.isOperator, isNotNull);
-    expect(isExpression.notOperator, isNull);
-    expect(isExpression.type, isNotNull);
-  }
-}
+    with ExpressionParserTestMixin {}
 
 abstract class ExpressionParserTestMixin implements AbstractParserTestCase {
   void test_namedArgument() {
@@ -8066,93 +7969,7 @@
  */
 @reflectiveTest
 class FormalParameterParserTest extends ParserTestCase
-    with FormalParameterParserTestMixin {
-  void test_parseNormalFormalParameter_function_noType_nullable() {
-    enableNnbd = true;
-    NormalFormalParameter parameter = parseNormalFormalParameter('a()?');
-    expect(parameter, isNotNull);
-    assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
-    FunctionTypedFormalParameter functionParameter = parameter;
-    expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
-    expect(functionParameter.typeParameters, isNull);
-    expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.question, isNotNull);
-  }
-
-  void
-      test_parseNormalFormalParameter_function_noType_typeParameters_nullable() {
-    enableNnbd = true;
-    NormalFormalParameter parameter = parseNormalFormalParameter('a<E>()?');
-    expect(parameter, isNotNull);
-    assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
-    FunctionTypedFormalParameter functionParameter = parameter;
-    expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
-    expect(functionParameter.typeParameters, isNotNull);
-    expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.question, isNotNull);
-  }
-
-  void test_parseNormalFormalParameter_function_type_nullable() {
-    enableNnbd = true;
-    NormalFormalParameter parameter = parseNormalFormalParameter('A a()?');
-    expect(parameter, isNotNull);
-    assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
-    FunctionTypedFormalParameter functionParameter = parameter;
-    expect(functionParameter.returnType, isNotNull);
-    expect(functionParameter.identifier, isNotNull);
-    expect(functionParameter.typeParameters, isNull);
-    expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.question, isNotNull);
-  }
-
-  void test_parseNormalFormalParameter_function_type_typeParameters_nullable() {
-    enableNnbd = true;
-    NormalFormalParameter parameter = parseNormalFormalParameter('A a<E>()?');
-    expect(parameter, isNotNull);
-    assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
-    FunctionTypedFormalParameter functionParameter = parameter;
-    expect(functionParameter.returnType, isNotNull);
-    expect(functionParameter.identifier, isNotNull);
-    expect(functionParameter.typeParameters, isNotNull);
-    expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.question, isNotNull);
-  }
-
-  void test_parseNormalFormalParameter_function_void_nullable() {
-    enableNnbd = true;
-    NormalFormalParameter parameter = parseNormalFormalParameter('void a()?');
-    expect(parameter, isNotNull);
-    assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
-    FunctionTypedFormalParameter functionParameter = parameter;
-    expect(functionParameter.returnType, isNotNull);
-    expect(functionParameter.identifier, isNotNull);
-    expect(functionParameter.typeParameters, isNull);
-    expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.question, isNotNull);
-  }
-
-  void test_parseNormalFormalParameter_function_void_typeParameters_nullable() {
-    enableNnbd = true;
-    NormalFormalParameter parameter =
-        parseNormalFormalParameter('void a<E>()?');
-    expect(parameter, isNotNull);
-    assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
-    FunctionTypedFormalParameter functionParameter = parameter;
-    expect(functionParameter.returnType, isNotNull);
-    expect(functionParameter.identifier, isNotNull);
-    expect(functionParameter.typeParameters, isNotNull);
-    expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.question, isNotNull);
-  }
-}
+    with FormalParameterParserTestMixin {}
 
 /**
  * The class [FormalParameterParserTestMixin] defines parser tests that test
@@ -9107,8 +8924,6 @@
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNotNull);
     expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.question, isNull);
-    expect(functionParameter.question, isNull);
   }
 
   void test_parseNormalFormalParameter_function_type() {
@@ -9121,7 +8936,6 @@
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.question, isNull);
   }
 
   void test_parseNormalFormalParameter_function_type_typeParameters() {
@@ -9134,7 +8948,6 @@
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNotNull);
     expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.question, isNull);
   }
 
   void test_parseNormalFormalParameter_function_typeVoid_covariant() {
@@ -9161,7 +8974,6 @@
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNull);
     expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.question, isNull);
   }
 
   void test_parseNormalFormalParameter_function_void_typeParameters() {
@@ -9174,7 +8986,6 @@
     expect(functionParameter.identifier, isNotNull);
     expect(functionParameter.typeParameters, isNotNull);
     expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.question, isNull);
   }
 
   void test_parseNormalFormalParameter_function_withDocComment() {
@@ -9332,12 +9143,6 @@
   bool enableLazyAssignmentOperators = false;
 
   /**
-   * A flag indicating whether the parser is to parse the non-nullable modifier
-   * in type names.
-   */
-  bool enableNnbd = false;
-
-  /**
    * A flag indicating whether the parser should parse instance creation
    * expressions that lack either the `new` or `const` keyword.
    */
@@ -9414,7 +9219,6 @@
     parser = new Parser(source, listener);
     parser.allowNativeClause = allowNativeClause;
     parser.parseFunctionBodies = parseFunctionBodies;
-    parser.enableNnbd = enableNnbd;
     parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
     parser.currentToken = token;
   }
@@ -12370,42 +12174,6 @@
     expect(new Parser(NonExistingSource.unknown, null), isNotNull);
   }
 
-  void test_parseTypeName_parameterized_nullable() {
-    enableNnbd = true;
-    createParser('List<int>?');
-    TypeName typeName = parser.parseTypeName(false);
-    expectNotNullIfNoErrors(typeName);
-    assertNoErrors();
-    expect(typeName.name, isNotNull);
-    expect(typeName.typeArguments, isNotNull);
-    expect(typeName.question, isNotNull);
-  }
-
-  void test_parseTypeName_simple_nullable() {
-    enableNnbd = true;
-    createParser('String?');
-    TypeName typeName = parser.parseTypeName(false);
-    expectNotNullIfNoErrors(typeName);
-    assertNoErrors();
-    expect(typeName.name, isNotNull);
-    expect(typeName.typeArguments, isNull);
-    expect(typeName.question, isNotNull);
-  }
-
-  void test_parseTypeParameter_bounded_nullable() {
-    enableNnbd = true;
-    createParser('A extends B?');
-    TypeParameter parameter = parser.parseTypeParameter();
-    expectNotNullIfNoErrors(parameter);
-    assertNoErrors();
-    expect(parameter.bound, new TypeMatcher<TypeName>());
-    expect(parameter.extendsKeyword, isNotNull);
-    expect(parameter.name, isNotNull);
-    TypeName bound = parameter.bound;
-    expect(bound, isNotNull);
-    expect(bound.question, isNotNull);
-  }
-
   void test_skipPrefixedIdentifier_invalid() {
     createParser('+');
     Token following = parser.skipPrefixedIdentifier(parser.currentToken);
@@ -14379,7 +14147,6 @@
     assertNoErrors();
     expect(typeName.name, isNotNull);
     expect(typeName.typeArguments, isNotNull);
-    expect(typeName.question, isNull);
   }
 
   void test_parseTypeName_simple() {
@@ -14389,7 +14156,6 @@
     assertNoErrors();
     expect(typeName.name, isNotNull);
     expect(typeName.typeArguments, isNull);
-    expect(typeName.question, isNull);
   }
 
   void test_parseTypeParameter_bounded_functionType_noReturn() {
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index a786c34..613c0b9 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/builder.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -29,6 +28,7 @@
 import 'package:analyzer/src/generated/testing/element_search.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:analyzer/src/source/source_resource.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -273,7 +273,8 @@
   }
 
   void test_creation_nonEmpty() {
-    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    AnalysisContext context = AnalysisContextFactory.contextWithCore(
+        resourceProvider: resourceProvider);
     String importedTypeName = "A";
     ClassElement importedType = new ClassElementImpl.forNode(
         AstTestFactory.identifier3(importedTypeName));
@@ -293,7 +294,8 @@
   }
 
   void test_prefixedAndNonPrefixed() {
-    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    AnalysisContext context = AnalysisContextFactory.contextWithCore(
+        resourceProvider: resourceProvider);
     String typeName = "C";
     String prefixName = "p";
     ClassElement prefixedType = ElementFactory.classElement2(typeName);
@@ -333,7 +335,8 @@
   }
 
   void test_creation_nonEmpty() {
-    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    AnalysisContext context = AnalysisContextFactory.contextWithCore(
+        resourceProvider: resourceProvider);
     String importedTypeName = "A";
     ClassElement importedType = new ClassElementImpl.forNode(
         AstTestFactory.identifier3(importedTypeName));
@@ -1297,8 +1300,7 @@
     InterfaceType stringType = _classElement("String", objectType).type;
     InterfaceType symbolType = _classElement("Symbol", objectType).type;
     InterfaceType typeType = _classElement("Type", objectType).type;
-    CompilationUnitElementImpl coreUnit =
-        new CompilationUnitElementImpl("core.dart");
+    CompilationUnitElementImpl coreUnit = new CompilationUnitElementImpl();
     coreUnit.types = <ClassElement>[
       boolType.element,
       doubleType.element,
@@ -1313,8 +1315,7 @@
       symbolType.element,
       typeType.element
     ];
-    CompilationUnitElementImpl asyncUnit =
-        new CompilationUnitElementImpl("async.dart");
+    CompilationUnitElementImpl asyncUnit = new CompilationUnitElementImpl();
     asyncUnit.types = <ClassElement>[
       futureType.element,
       futureOrType.element,
@@ -1377,7 +1378,8 @@
 }
 
 @reflectiveTest
-class TypeResolverVisitorTest extends ParserTestCase {
+class TypeResolverVisitorTest extends ParserTestCase
+    with ResourceProviderMixin {
   /**
    * The error listener to which errors will be reported.
    */
@@ -1421,15 +1423,12 @@
 
   void setUp({bool shouldSetElementSupertypes: false}) {
     _listener = new GatheringErrorListener();
-    MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(
         resourceProvider: resourceProvider);
-    Source librarySource =
-        new FileSource(resourceProvider.getFile("/lib.dart"));
+    Source librarySource = new FileSource(getFile("/lib.dart"));
     LibraryElementImpl element = new LibraryElementImpl.forNode(
         context, AstTestFactory.libraryIdentifier2(["lib"]));
-    element.definingCompilationUnit =
-        new CompilationUnitElementImpl("lib.dart");
+    element.definingCompilationUnit = new CompilationUnitElementImpl();
     _typeProvider = new TestTypeProvider();
     libraryScope = new LibraryScope(element);
     _visitor = new TypeResolverVisitor(
@@ -1451,7 +1450,7 @@
 }
 A V = new A();
 ''');
-    var unitElement = new CompilationUnitElementImpl('/test.dart');
+    var unitElement = new CompilationUnitElementImpl();
     ClassElementImpl A = ElementFactory.classElement2('A');
 
     // Build API elements.
@@ -1462,10 +1461,9 @@
 
     // Resolve API types.
     {
-      MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
       InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(
           resourceProvider: resourceProvider);
-      var source = resourceProvider.getFile('/test.dart').createSource();
+      var source = getFile('/test.dart').createSource();
       var libraryElement = new LibraryElementImpl.forNode(context, null)
         ..definingCompilationUnit = unitElement;
       var libraryScope = new LibraryScope(libraryElement);
@@ -2321,7 +2319,7 @@
   void _resolveTypeModeLocal(
       String code, AstNode getNodeToResolve(CompilationUnit unit)) {
     CompilationUnit unit = parseCompilationUnit2(code);
-    var unitElement = new CompilationUnitElementImpl('/test.dart');
+    var unitElement = new CompilationUnitElementImpl();
 
     // Build API elements.
     {
@@ -2333,10 +2331,9 @@
     LibraryScope libraryScope;
     TypeResolverVisitor visitor;
     {
-      MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
       InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(
           resourceProvider: resourceProvider);
-      var source = resourceProvider.getFile('/test.dart').createSource();
+      var source = getFile('/test.dart').createSource();
       var libraryElement = new LibraryElementImpl.forNode(context, null)
         ..definingCompilationUnit = unitElement;
       libraryScope = new LibraryScope(libraryElement);
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index b16d635..d7a954d 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -26,8 +26,8 @@
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:test/test.dart';
 
 import '../src/context/mock_sdk.dart';
@@ -560,8 +560,10 @@
    *
    * @return the library element that was created
    */
-  LibraryElementImpl createDefaultTestLibrary() =>
-      createTestLibrary(AnalysisContextFactory.contextWithCore(), "test");
+  LibraryElementImpl createDefaultTestLibrary() => createTestLibrary(
+      AnalysisContextFactory.contextWithCore(
+          resourceProvider: resourceProvider),
+      "test");
 
   /**
    * Create a source object representing a file with the given [fileName] and
@@ -583,7 +585,7 @@
   LibraryElementImpl createTestLibrary(
       AnalysisContext context, String libraryName,
       [List<String> typeNames]) {
-    String fileName = "/test/$libraryName.dart";
+    String fileName = resourceProvider.convertPath("/test/$libraryName.dart");
     Source definingCompilationUnitSource = createNamedSource(fileName);
     List<CompilationUnitElement> sourcedCompilationUnits;
     if (typeNames == null) {
@@ -597,7 +599,7 @@
             new ClassElementImpl.forNode(AstTestFactory.identifier3(typeName));
         String fileName = "$typeName.dart";
         CompilationUnitElementImpl compilationUnit =
-            new CompilationUnitElementImpl(fileName);
+            new CompilationUnitElementImpl();
         compilationUnit.source = createNamedSource(fileName);
         compilationUnit.librarySource = definingCompilationUnitSource;
         compilationUnit.types = <ClassElement>[type];
@@ -605,7 +607,7 @@
       }
     }
     CompilationUnitElementImpl compilationUnit =
-        new CompilationUnitElementImpl(fileName);
+        new CompilationUnitElementImpl();
     compilationUnit.librarySource =
         compilationUnit.source = definingCompilationUnitSource;
     LibraryElementImpl library = new LibraryElementImpl.forNode(
diff --git a/pkg/analyzer/test/generated/source_factory_test.dart b/pkg/analyzer/test/generated/source_factory_test.dart
index 91338f9..09a3c10 100644
--- a/pkg/analyzer/test/generated/source_factory_test.dart
+++ b/pkg/analyzer/test/generated/source_factory_test.dart
@@ -116,7 +116,7 @@
           expect(uri, isNull);
         });
         test('Non-package URI', () {
-          var testResolver = new CustomUriResolver(uriPath: 'test_uri');
+          var testResolver = new CustomUriResolver(uriPath: _p('/test.dart'));
           String uri = resolvePackageUri(config: '''
 unittest:${_u('/home/somebody/.pub/cache/unittest-0.9.9/lib/')}
 ''', uri: 'custom:custom.dart', customResolver: testResolver);
@@ -159,8 +159,8 @@
 async:${_u('/home/somebody/.pub/cache/async-1.1.0/lib/')}
 quiver:${_u('/home/somebody/.pub/cache/quiver-1.2.1/lib')}
 ''',
-              source: new FileSource(resourceProvider.getFile(
-                  '/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart')));
+              source: new FileSource(resourceProvider.getFile(_p(
+                  '/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart'))));
           expect(uri, isNotNull);
           expect(uri.toString(), equals('package:unittest/unittest.dart'));
         });
@@ -301,8 +301,8 @@
   }
 
   void test_restoreUri() {
-    File file1 = resourceProvider.getFile("/some/file1.dart");
-    File file2 = resourceProvider.getFile("/some/file2.dart");
+    File file1 = resourceProvider.getFile(_p("/some/file1.dart"));
+    File file2 = resourceProvider.getFile(_p("/some/file2.dart"));
     Source source1 = new FileSource(file1);
     Source source2 = new FileSource(file2);
     Uri expected1 = Uri.parse("file:///my_file.dart");
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index c8195cd..8995879 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -8,8 +8,9 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/file_system/memory_file_system.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/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -20,6 +21,7 @@
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/source/source_resource.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -183,7 +185,7 @@
 }
 
 @reflectiveTest
-class StaticTypeAnalyzerTest extends EngineTestCase {
+class StaticTypeAnalyzerTest extends EngineTestCase with ResourceProviderMixin {
   /**
    * The error listener to which errors will be reported.
    */
@@ -557,9 +559,10 @@
 
   void test_visitBinaryExpression_slash() {
     // 2 / 2
-    BinaryExpression node = AstTestFactory.binaryExpression(
+    BinaryExpressionImpl node = AstTestFactory.binaryExpression(
         _resolvedInteger(2), TokenType.SLASH, _resolvedInteger(2));
     node.staticElement = getMethod(_typeProvider.numType, "/");
+    node.staticInvokeType = node.staticElement.type;
     expect(_analyze(node), same(_typeProvider.doubleType));
     _listener.assertNoErrors();
   }
@@ -574,12 +577,13 @@
     MethodElement operator =
         ElementFactory.methodElement("*", typeA, [_typeProvider.doubleType]);
     classA.methods = <MethodElement>[operator];
-    BinaryExpression node = AstTestFactory.binaryExpression(
+    BinaryExpressionImpl node = AstTestFactory.binaryExpression(
         AstTestFactory.asExpression(
             AstTestFactory.identifier3("a"), AstTestFactory.typeName(classA)),
         TokenType.PLUS,
         _resolvedDouble(2.0));
     node.staticElement = operator;
+    node.staticInvokeType = node.staticElement.type;
     expect(_analyze(node), same(typeA));
     _listener.assertNoErrors();
   }
@@ -1525,7 +1529,6 @@
    * Create the analyzer used by the tests.
    */
   StaticTypeAnalyzer _createAnalyzer({bool strongMode: false}) {
-    MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
     InternalAnalysisContext context;
     if (strongMode) {
       AnalysisOptionsImpl options = new AnalysisOptionsImpl();
@@ -1535,9 +1538,10 @@
       context = AnalysisContextFactory.contextWithCore(
           resourceProvider: resourceProvider);
     }
-    Source source = new FileSource(resourceProvider.getFile("/lib.dart"));
+    var inheritance = new InheritanceManager2(context.typeSystem);
+    Source source = new FileSource(getFile("/lib.dart"));
     CompilationUnitElementImpl definingCompilationUnit =
-        new CompilationUnitElementImpl("lib.dart");
+        new CompilationUnitElementImpl();
     definingCompilationUnit.librarySource =
         definingCompilationUnit.source = source;
     LibraryElementImpl definingLibrary =
@@ -1545,7 +1549,7 @@
     definingLibrary.definingCompilationUnit = definingCompilationUnit;
     _typeProvider = context.typeProvider;
     _visitor = new ResolverVisitor(
-        definingLibrary, source, _typeProvider, _listener,
+        inheritance, definingLibrary, source, _typeProvider, _listener,
         nameScope: new LibraryScope(definingLibrary));
     _visitor.overrideManager.enterScope();
     return _visitor.typeAnalyzer;
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index ec2a320..81d1c82 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -88,15 +88,6 @@
 ''', [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
-  fail_typeArgumentNotMatchingBounds_ofFunctionTypeAlias() async {
-    await assertErrorsInCode(r'''
-class A {}
-class B {}
-typedef F<T extends A>();
-F<B> fff;
-''', [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-  }
-
   fail_undefinedEnumConstant() async {
     // We need a way to set the parseEnum flag in the parser to true.
     await assertErrorsInCode(r'''
@@ -702,6 +693,15 @@
 }''', previewDart2 ? [] : [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
 
+  test_invocationOfNonFunction_dynamic() async {
+    await assertErrorsInCode(r'''
+main() {
+  dynamic d;
+  d.hashCode();
+}
+''', [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
+  }
+
   test_invocationOfNonFunction_localGenericFunction() async {
     // Invoking `.call` on a `Function` type works similarly to invoking it on
     // `dynamic`--the invocation is accepted at compile time, and all type
@@ -1149,6 +1149,15 @@
 ''', [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
   }
 
+  test_typeArgumentNotMatchingBounds_ofFunctionTypeAlias() async {
+    await assertErrorsInCode(r'''
+class A {}
+class B {}
+typedef F<T extends A>();
+F<B> fff;
+''', [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+  }
+
   test_typeArgumentNotMatchingBounds_parameter() async {
     await assertErrorsInCode(r'''
 class A {}
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index 5003da0..c2074ea 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -1411,6 +1411,61 @@
     assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
   }
 
+  test_generalizedVoid_interpolateVoidValueError() async {
+    Source source = addSource(r'''
+void main() {
+  void x;
+  "$x";
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
+  }
+
+  test_generalizedVoid_orVoidLhsError() async {
+    Source source = addSource(r'''
+void main() {
+  void x;
+  x || true;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
+  }
+
+  test_generalizedVoid_orVoidRhsError() async {
+    Source source = addSource(r'''
+void main() {
+  void x;
+  false || x;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
+  }
+
+  test_generalizedVoid_andVoidLhsError() async {
+    Source source = addSource(r'''
+void main() {
+  void x;
+  x && true;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
+  }
+
+  test_generalizedVoid_andVoidRhsError() async {
+    Source source = addSource(r'''
+void main() {
+  void x;
+  true && x;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
+  }
+
   test_generalizedVoid_unaryNegativeVoidValueError() async {
     Source source = addSource(r'''
 void main() {
@@ -1820,6 +1875,46 @@
     assertNoErrors(source);
   }
 
+  test_generalizedVoid_yieldStarVoid_asyncStar() async {
+    Source source = addSource(r'''
+main(void x) async* {
+  yield* x;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
+  }
+
+  test_generalizedVoid_yieldStarVoid_syncStar() async {
+    Source source = addSource(r'''
+main(void x) sync* {
+  yield* x;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
+  }
+
+  test_generalizedVoid_yieldVoid_asyncStar() async {
+    Source source = addSource(r'''
+main(void x) async* {
+  yield x;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
+  }
+
+  test_generalizedVoid_yieldVoid_syncStar() async {
+    Source source = addSource(r'''
+main(void x) sync* {
+  yield x;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
+  }
+
   test_importDuplicatedLibraryNamed() async {
     Source source = addSource(r'''
 library test;
@@ -1859,12 +1954,7 @@
   String get g { return 'a'; }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -1877,17 +1967,10 @@
   int f;
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [
-        StrongModeCode.INVALID_METHOD_OVERRIDE,
-        StrongModeCode.INVALID_METHOD_OVERRIDE
-      ]);
-    } else {
-      assertErrors(source, [
-        StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE,
-        StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
-      ]);
-    }
+    assertErrors(source, [
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+      CompileTimeErrorCode.INVALID_OVERRIDE
+    ]);
     verify([source]);
   }
 
@@ -1905,12 +1988,10 @@
   String get getter => null;
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
-    }
+    assertErrors(source, [
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+    ]);
     verify([source]);
   }
 
@@ -1926,12 +2007,10 @@
   double get g => null;
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
-    }
+    assertErrors(source, [
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+      CompileTimeErrorCode.INVALID_OVERRIDE
+    ]);
     verify([source]);
   }
 
@@ -1944,12 +2023,7 @@
   m({String a}) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -1962,12 +2036,7 @@
   m(String a) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -1980,12 +2049,7 @@
   m(String a) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2001,15 +2065,10 @@
   m(double d) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [
-        StrongModeCode.INVALID_METHOD_OVERRIDE,
-        StrongModeCode.INVALID_METHOD_OVERRIDE
-      ]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
-    }
+    assertErrors(source, [
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+      CompileTimeErrorCode.INVALID_OVERRIDE
+    ]);
     verify([source]);
   }
 
@@ -2026,12 +2085,10 @@
   m(String n) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
-    }
+    assertErrors(source, [
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+      CompileTimeErrorCode.INVALID_OVERRIDE
+    ]);
     verify([source]);
   }
 
@@ -2048,12 +2105,10 @@
   m(double d) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
-    }
+    assertErrors(source, [
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+      CompileTimeErrorCode.INVALID_OVERRIDE
+    ]);
     verify([source]);
   }
 
@@ -2066,12 +2121,7 @@
   m([String a]) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2088,12 +2138,10 @@
   m([String n]) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE]);
-    }
+    assertErrors(source, [
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+      CompileTimeErrorCode.INVALID_OVERRIDE
+    ]);
     verify([source]);
   }
 
@@ -2106,12 +2154,7 @@
   String m() { return 'a'; }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2126,12 +2169,7 @@
   String m() { return 'a'; }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2144,12 +2182,7 @@
   String m() { return 'a'; }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2162,12 +2195,7 @@
   String m() { return 'a'; }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2182,12 +2210,7 @@
   String m() { return 'a'; }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2204,12 +2227,10 @@
   String m() => '';
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
-    }
+    assertErrors(source, [
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+      CompileTimeErrorCode.INVALID_OVERRIDE
+    ]);
     verify([source]);
   }
 
@@ -2222,12 +2243,7 @@
   void m() {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2393,7 +2409,7 @@
 }''');
     await computeAnalysisResult(source);
     if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     } else {
       assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_NAMED]);
     }
@@ -2410,7 +2426,7 @@
 }''');
     await computeAnalysisResult(source);
     if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     } else {
       assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_NAMED]);
     }
@@ -2427,7 +2443,7 @@
 }''');
     await computeAnalysisResult(source);
     if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     } else {
       assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
     }
@@ -2444,7 +2460,7 @@
 }''');
     await computeAnalysisResult(source);
     if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     } else {
       assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
     }
@@ -2461,7 +2477,7 @@
 }''');
     await computeAnalysisResult(source);
     if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     } else {
       assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
     }
@@ -2478,7 +2494,7 @@
 }''');
     await computeAnalysisResult(source);
     if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     } else {
       assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_REQUIRED]);
     }
@@ -2495,7 +2511,7 @@
 }''');
     await computeAnalysisResult(source);
     if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     } else {
       assertErrors(source,
           [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
@@ -2518,9 +2534,8 @@
     await computeAnalysisResult(source);
     if (previewDart2) {
       assertErrors(source, [
-        StrongModeCode.INVALID_METHOD_OVERRIDE,
-        StrongModeCode.INVALID_METHOD_OVERRIDE,
-        StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_BASE
+        CompileTimeErrorCode.INVALID_OVERRIDE,
+        CompileTimeErrorCode.INVALID_OVERRIDE,
       ]);
     } else {
       assertErrors(source,
@@ -2544,7 +2559,10 @@
 }''');
     await computeAnalysisResult(source);
     if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+      assertErrors(source, [
+        CompileTimeErrorCode.INVALID_OVERRIDE,
+        CompileTimeErrorCode.INVALID_OVERRIDE
+      ]);
     } else {
       assertErrors(source,
           [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
@@ -2565,7 +2583,10 @@
 }''');
     await computeAnalysisResult(source);
     if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+      assertErrors(source, [
+        CompileTimeErrorCode.INVALID_OVERRIDE,
+        CompileTimeErrorCode.INVALID_OVERRIDE
+      ]);
     } else {
       assertErrors(source,
           [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
@@ -2923,12 +2944,7 @@
 }
 class E extends C implements D {}''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_BASE]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/strong_mode_driver_test.dart b/pkg/analyzer/test/generated/strong_mode_driver_test.dart
index 4e83452..ec98e5b 100644
--- a/pkg/analyzer/test/generated/strong_mode_driver_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_driver_test.dart
@@ -2,8 +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/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'resolver_test_case.dart';
 import 'strong_mode_test.dart';
 
 main() {
@@ -22,10 +24,17 @@
 
 @reflectiveTest
 class StrongModeStaticTypeAnalyzer2Test_Driver
-    extends StrongModeStaticTypeAnalyzer2Test {
+    extends StaticTypeAnalyzer2TestShared
+    with StrongModeStaticTypeAnalyzer2TestCases {
   @override
   bool get enableNewAnalysisDriver => true;
 
+  void setUp() {
+    super.setUp();
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    resetWith(options: options);
+  }
+
   @failingTest
   @override
   test_genericFunction_parameter() {
@@ -67,15 +76,35 @@
   }
 
   @override
-  test_notInstantiatedBound_class_error_recursion() {
-    // overridden because not failing
-    return super.test_notInstantiatedBound_class_error_recursion();
+  @failingTest
+  test_genericMethod_nestedCaptureBounds() {
+    // https://github.com/dart-lang/sdk/issues/30236
+    return super.test_genericMethod_nestedCaptureBounds();
   }
 
   @override
-  test_notInstantiatedBound_class_error_recursion_less_direct() {
-    // overridden because not failing
-    return super.test_notInstantiatedBound_class_error_recursion_less_direct();
+  @failingTest
+  test_genericMethod_tearoff_instantiated() {
+    return super.test_genericMethod_tearoff_instantiated();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_class_error_extension_malbounded() {
+    return super.test_instantiateToBounds_class_error_extension_malbounded();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_class_error_instantiation_malbounded() {
+    return super
+        .test_instantiateToBounds_class_error_instantiation_malbounded();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_generic_function_error_malbounded() {
+    return super.test_instantiateToBounds_generic_function_error_malbounded();
   }
 }
 
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 0456a6f..2c0ada5 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -2796,18 +2796,67 @@
  * Strong mode static analyzer end to end tests
  */
 @reflectiveTest
-class StrongModeStaticTypeAnalyzer2Test extends StaticTypeAnalyzer2TestShared {
-  void expectStaticInvokeType(String search, String type) {
-    var invocation = findIdentifier(search).parent as MethodInvocation;
-    expect(invocation.staticInvokeType.toString(), type);
-  }
-
+class StrongModeStaticTypeAnalyzer2Test extends StaticTypeAnalyzer2TestShared
+    with StrongModeStaticTypeAnalyzer2TestCases {
   void setUp() {
     super.setUp();
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     resetWith(options: options);
   }
 
+  @override
+  @failingTest
+  test_genericMethod_nestedCaptureBounds() {
+    // https://github.com/dart-lang/sdk/issues/30236
+    return super.test_genericMethod_nestedCaptureBounds();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_tearoff_instantiated() {
+    return super.test_genericMethod_tearoff_instantiated();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_class_error_extension_malbounded() {
+    return super.test_instantiateToBounds_class_error_extension_malbounded();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_class_error_instantiation_malbounded() {
+    return super
+        .test_instantiateToBounds_class_error_instantiation_malbounded();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_generic_function_error_malbounded() {
+    return super.test_instantiateToBounds_generic_function_error_malbounded();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_class_error_recursion() {
+    return super.test_notInstantiatedBound_class_error_recursion();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_class_error_recursion_less_direct() {
+    return super.test_notInstantiatedBound_class_error_recursion_less_direct();
+  }
+}
+
+/// Test cases for [StrongModeStaticTypeAnalyzer2Test]
+abstract class StrongModeStaticTypeAnalyzer2TestCases
+    implements StaticTypeAnalyzer2TestShared {
+  void expectStaticInvokeType(String search, String type) {
+    var invocation = findIdentifier(search).parent as MethodInvocation;
+    expect(invocation.staticInvokeType.toString(), type);
+  }
+
   test_dynamicObjectGetter_hashCode() async {
     String code = r'''
 main() {
@@ -3348,7 +3397,6 @@
     expectIdentifierType('f;', '<Sâ‚€>(Sâ‚€) → S');
   }
 
-  @failingTest // https://github.com/dart-lang/sdk/issues/30236
   test_genericMethod_nestedCaptureBounds() async {
     await resolveTestUnit(r'''
 class C<T> {
@@ -3460,7 +3508,7 @@
   T f<T extends B>(T x) => null;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -3475,7 +3523,7 @@
   T f<T extends A>(T x) => null;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -3488,7 +3536,7 @@
   String f<S>(S x) => null;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -3501,7 +3549,7 @@
   S f<T, S>(T x) => null;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -3574,7 +3622,6 @@
     expectIdentifierType('paramTearOff', "<T>(T) → T");
   }
 
-  @failingTest
   test_genericMethod_tearoff_instantiated() async {
     await resolveTestUnit(r'''
 class C<E> {
@@ -3715,7 +3762,6 @@
     expect(p.enclosingElement, same(fType.element));
   }
 
-  @failingTest
   test_instantiateToBounds_class_error_extension_malbounded() async {
     // Test that superclasses are strictly checked for malbounded default
     // types
@@ -3727,7 +3773,6 @@
     assertErrors(testSource, [StrongModeCode.NO_DEFAULT_BOUNDS]);
   }
 
-  @failingTest
   test_instantiateToBounds_class_error_instantiation_malbounded() async {
     // Test that instance creations are strictly checked for malbounded default
     // types
@@ -3856,7 +3901,6 @@
     expectIdentifierType('d;', 'D<A<dynamic>>');
   }
 
-  @failingTest
   test_instantiateToBounds_generic_function_error_malbounded() async {
     // Test that generic methods are strictly checked for malbounded default
     // types
@@ -3941,7 +3985,6 @@
 ''');
   }
 
-  @failingTest
   test_notInstantiatedBound_class_error_recursion() async {
     String code = r'''
 class A<T extends B> {} // points to a
@@ -3956,7 +3999,6 @@
     ]);
   }
 
-  @failingTest
   test_notInstantiatedBound_class_error_recursion_less_direct() async {
     String code = r'''
 class A<T extends B<A>> {}
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 8e490e9..3b976b4 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -31,6 +31,7 @@
 import 'non_error_resolver_test.dart' as non_error_resolver_test;
 import 'non_hint_code_driver_test.dart' as non_hint_code_driver_test;
 import 'non_hint_code_test.dart' as non_hint_code_test;
+import 'package_build_test.dart' as package_build_test;
 import 'package_test.dart' as package_test;
 import 'parser_fasta_test.dart' as parser_fasta_test;
 import 'parser_test.dart' as parser_test;
@@ -81,6 +82,7 @@
     non_error_resolver_test.main();
     non_hint_code_driver_test.main();
     non_hint_code_test.main();
+    package_build_test.main();
     package_test.main();
     parser_fasta_test.main();
     parser_test.main();
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 4ede46d..8a6e9d4 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/exception/exception.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
@@ -61,7 +62,8 @@
   }
 
   AnalysisContext createAnalysisContext() {
-    return AnalysisContextFactory.contextWithCore();
+    return AnalysisContextFactory.contextWithCore(
+        resourceProvider: new MemoryResourceProvider());
   }
 
   /**
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index 2968718..67110dd 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/dart/ast/token.dart' show Keyword;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/ast/token.dart' show KeywordToken;
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -61,7 +62,8 @@
   DartType get voidType => VoidTypeImpl.instance;
 
   void setUp() {
-    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(
+        resourceProvider: new MemoryResourceProvider());
     typeProvider = context.typeProvider;
     var simpleFunctionElement =
         ElementFactory.genericTypeAliasElement('A', returnType: voidType);
@@ -168,7 +170,9 @@
   DartType list(DartType T) => typeProvider.listType.instantiate([T]);
 
   void setUp() {
-    typeProvider = AnalysisContextFactory.contextWithCore().typeProvider;
+    typeProvider = AnalysisContextFactory.contextWithCore(
+            resourceProvider: new MemoryResourceProvider())
+        .typeProvider;
     typeSystem = new StrongTypeSystemImpl(typeProvider);
     T = _newTypeParameter('T');
   }
@@ -1882,7 +1886,9 @@
   DartType get voidType => VoidTypeImpl.instance;
 
   void setUp() {
-    typeProvider = AnalysisContextFactory.contextWithCore().typeProvider;
+    typeProvider = AnalysisContextFactory.contextWithCore(
+            resourceProvider: new MemoryResourceProvider())
+        .typeProvider;
     typeSystem = new StrongTypeSystemImpl(typeProvider);
   }
 
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 43d2d3b..4568043 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -28,7 +28,6 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(AstClonerTest);
     defineReflectiveTests(BooleanArrayTest);
-    defineReflectiveTests(DirectedGraphTest);
     defineReflectiveTests(ExceptionHandlingDelegatingAstVisitorTest);
     defineReflectiveTests(LineInfoTest);
     defineReflectiveTests(MultipleMapIteratorTest);
@@ -1330,271 +1329,6 @@
 }
 
 @reflectiveTest
-class DirectedGraphTest extends EngineTestCase {
-  void test_addEdge() {
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    expect(graph.isEmpty, isTrue);
-    graph.addEdge(new DirectedGraphTest_Node(), new DirectedGraphTest_Node());
-    expect(graph.isEmpty, isFalse);
-  }
-
-  void test_addNode() {
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    expect(graph.isEmpty, isTrue);
-    graph.addNode(new DirectedGraphTest_Node());
-    expect(graph.isEmpty, isFalse);
-  }
-
-  void test_containsPath_noCycles() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    graph.addEdge(node1, node2);
-    graph.addEdge(node2, node3);
-    expect(graph.containsPath(node1, node1), isTrue);
-    expect(graph.containsPath(node1, node2), isTrue);
-    expect(graph.containsPath(node1, node3), isTrue);
-    expect(graph.containsPath(node2, node1), isFalse);
-    expect(graph.containsPath(node2, node2), isTrue);
-    expect(graph.containsPath(node2, node3), isTrue);
-    expect(graph.containsPath(node3, node1), isFalse);
-    expect(graph.containsPath(node3, node2), isFalse);
-    expect(graph.containsPath(node3, node3), isTrue);
-  }
-
-  void test_containsPath_withCycles() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node4 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    graph.addEdge(node1, node2);
-    graph.addEdge(node2, node1);
-    graph.addEdge(node1, node3);
-    graph.addEdge(node3, node4);
-    graph.addEdge(node4, node3);
-    expect(graph.containsPath(node1, node1), isTrue);
-    expect(graph.containsPath(node1, node2), isTrue);
-    expect(graph.containsPath(node1, node3), isTrue);
-    expect(graph.containsPath(node1, node4), isTrue);
-    expect(graph.containsPath(node2, node1), isTrue);
-    expect(graph.containsPath(node2, node2), isTrue);
-    expect(graph.containsPath(node2, node3), isTrue);
-    expect(graph.containsPath(node2, node4), isTrue);
-    expect(graph.containsPath(node3, node1), isFalse);
-    expect(graph.containsPath(node3, node2), isFalse);
-    expect(graph.containsPath(node3, node3), isTrue);
-    expect(graph.containsPath(node3, node4), isTrue);
-    expect(graph.containsPath(node4, node1), isFalse);
-    expect(graph.containsPath(node4, node2), isFalse);
-    expect(graph.containsPath(node4, node3), isTrue);
-    expect(graph.containsPath(node4, node4), isTrue);
-  }
-
-  void test_creation() {
-    expect(new DirectedGraph<DirectedGraphTest_Node>(), isNotNull);
-  }
-
-  void test_findCycleContaining_complexCycle() {
-    // Two overlapping loops: (1, 2, 3) and (3, 4, 5)
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node4 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node5 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    graph.addEdge(node1, node2);
-    graph.addEdge(node2, node3);
-    graph.addEdge(node3, node1);
-    graph.addEdge(node3, node4);
-    graph.addEdge(node4, node5);
-    graph.addEdge(node5, node3);
-    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node1);
-    expect(cycle, hasLength(5));
-    expect(cycle.contains(node1), isTrue);
-    expect(cycle.contains(node2), isTrue);
-    expect(cycle.contains(node3), isTrue);
-    expect(cycle.contains(node4), isTrue);
-    expect(cycle.contains(node5), isTrue);
-  }
-
-  void test_findCycleContaining_cycle() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    graph.addEdge(node1, node2);
-    graph.addEdge(node2, node3);
-    graph.addEdge(node2, new DirectedGraphTest_Node());
-    graph.addEdge(node3, node1);
-    graph.addEdge(node3, new DirectedGraphTest_Node());
-    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node1);
-    expect(cycle, hasLength(3));
-    expect(cycle.contains(node1), isTrue);
-    expect(cycle.contains(node2), isTrue);
-    expect(cycle.contains(node3), isTrue);
-  }
-
-  void test_findCycleContaining_notInGraph() {
-    DirectedGraphTest_Node node = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node);
-    expect(cycle, hasLength(1));
-    expect(cycle[0], node);
-  }
-
-  void test_findCycleContaining_null() {
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    expect(() => graph.findCycleContaining(null), throwsArgumentError);
-  }
-
-  void test_findCycleContaining_singleton() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    graph.addEdge(node1, node2);
-    graph.addEdge(node2, node3);
-    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node1);
-    expect(cycle, hasLength(1));
-    expect(cycle[0], node1);
-  }
-
-  void test_getNodeCount() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    expect(graph.nodeCount, 0);
-    graph.addNode(node1);
-    expect(graph.nodeCount, 1);
-    graph.addNode(node2);
-    expect(graph.nodeCount, 2);
-    graph.removeNode(node1);
-    expect(graph.nodeCount, 1);
-  }
-
-  void test_getTails() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    expect(graph.getTails(node1), hasLength(0));
-    graph.addEdge(node1, node2);
-    expect(graph.getTails(node1), hasLength(1));
-    graph.addEdge(node1, node3);
-    expect(graph.getTails(node1), hasLength(2));
-  }
-
-  void test_removeAllNodes() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    List<DirectedGraphTest_Node> nodes = new List<DirectedGraphTest_Node>();
-    nodes.add(node1);
-    nodes.add(node2);
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    graph.addEdge(node1, node2);
-    graph.addEdge(node2, node1);
-    expect(graph.isEmpty, isFalse);
-    graph.removeAllNodes(nodes);
-    expect(graph.isEmpty, isTrue);
-  }
-
-  void test_removeEdge() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    graph.addEdge(node1, node2);
-    graph.addEdge(node1, node3);
-    expect(graph.getTails(node1), hasLength(2));
-    graph.removeEdge(node1, node2);
-    expect(graph.getTails(node1), hasLength(1));
-  }
-
-  void test_removeNode() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    graph.addEdge(node1, node2);
-    graph.addEdge(node1, node3);
-    expect(graph.getTails(node1), hasLength(2));
-    graph.removeNode(node2);
-    expect(graph.getTails(node1), hasLength(1));
-  }
-
-  void test_removeSink() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    graph.addEdge(node1, node2);
-    expect(graph.removeSink(), same(node2));
-    expect(graph.removeSink(), same(node1));
-    expect(graph.isEmpty, isTrue);
-  }
-
-  void test_topologicalSort_noCycles() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    graph.addEdge(node1, node2);
-    graph.addEdge(node1, node3);
-    graph.addEdge(node2, node3);
-    List<List<DirectedGraphTest_Node>> topologicalSort =
-        graph.computeTopologicalSort();
-    expect(topologicalSort, hasLength(3));
-    expect(topologicalSort[0], hasLength(1));
-    expect(topologicalSort[0][0], node3);
-    expect(topologicalSort[1], hasLength(1));
-    expect(topologicalSort[1][0], node2);
-    expect(topologicalSort[2], hasLength(1));
-    expect(topologicalSort[2][0], node1);
-  }
-
-  void test_topologicalSort_withCycles() {
-    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
-    DirectedGraphTest_Node node4 = new DirectedGraphTest_Node();
-    DirectedGraph<DirectedGraphTest_Node> graph =
-        new DirectedGraph<DirectedGraphTest_Node>();
-    graph.addEdge(node1, node2);
-    graph.addEdge(node2, node1);
-    graph.addEdge(node1, node3);
-    graph.addEdge(node3, node4);
-    graph.addEdge(node4, node3);
-    List<List<DirectedGraphTest_Node>> topologicalSort =
-        graph.computeTopologicalSort();
-    expect(topologicalSort, hasLength(2));
-    expect(topologicalSort[0], unorderedEquals([node3, node4]));
-    expect(topologicalSort[1], unorderedEquals([node1, node2]));
-  }
-}
-
-/**
- * Instances of the class `Node` represent simple nodes used for testing purposes.
- */
-class DirectedGraphTest_Node {}
-
-@reflectiveTest
 class ExceptionHandlingDelegatingAstVisitorTest extends EngineTestCase {
   void test_handlerIsCalled() {
     AstVisitor exceptionThrowingVisitor = new _ExceptionThrowingVisitor();
diff --git a/pkg/analyzer/test/source/package_map_resolver_test.dart b/pkg/analyzer/test/source/package_map_resolver_test.dart
index 6072255..ec716dc 100644
--- a/pkg/analyzer/test/source/package_map_resolver_test.dart
+++ b/pkg/analyzer/test/source/package_map_resolver_test.dart
@@ -76,10 +76,8 @@
     provider.newFile(pkgFileB, 'library lib_b;');
     PackageMapUriResolver resolver =
         new PackageMapUriResolver(provider, <String, List<Folder>>{
-      'pkgA': <Folder>[
-        provider.getResource(provider.convertPath('/pkgA/lib/'))
-      ],
-      'pkgB': <Folder>[provider.getResource(provider.convertPath('/pkgB/lib/'))]
+      'pkgA': <Folder>[provider.getResource(provider.convertPath('/pkgA/lib'))],
+      'pkgB': <Folder>[provider.getResource(provider.convertPath('/pkgB/lib'))]
     });
     {
       Uri uri = Uri.parse('package:pkgA/libA.dart');
@@ -134,10 +132,8 @@
     provider.newFile(pkgFileB, 'library lib_b;');
     PackageMapUriResolver resolver =
         new PackageMapUriResolver(provider, <String, List<Folder>>{
-      'pkgA': <Folder>[
-        provider.getResource(provider.convertPath('/pkgA/lib/'))
-      ],
-      'pkgB': <Folder>[provider.getResource(provider.convertPath('/pkgB/lib/'))]
+      'pkgA': <Folder>[provider.getResource(provider.convertPath('/pkgA/lib'))],
+      'pkgB': <Folder>[provider.getResource(provider.convertPath('/pkgB/lib'))]
     });
     {
       Source source =
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index b242bb1..b33ce36 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/cancelable_future.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/context/context.dart';
@@ -27,6 +26,7 @@
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/task/html.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:html/dom.dart' show Document;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -42,7 +42,8 @@
 }
 
 @reflectiveTest
-class AnalysisContextImplTest extends AbstractContextTest {
+class AnalysisContextImplTest extends AbstractContextTest
+    with ResourceProviderMixin {
   void fail_getErrors_html_some() {
     Source source = addSource("/test.html", r'''
 <html><head>
@@ -298,8 +299,7 @@
   }
 
   void test_applyChanges_changedSource_updateModificationTime() {
-    String path = resourceProvider.convertPath('/test.dart');
-    File file = resourceProvider.newFile(path, 'var V = 1;');
+    File file = newFile('/test.dart', content: 'var V = 1;');
     Source source = file.createSource();
     context.applyChanges(new ChangeSet()..addedSource(source));
     // Analyze all.
@@ -307,7 +307,7 @@
     expect(context.analysisCache.getState(source, RESOLVED_UNIT),
         CacheState.INVALID);
     // Update the file and notify the context about the change.
-    resourceProvider.updateFile(path, 'var V = 2;');
+    modifyFile('/test.dart', 'var V = 2;');
     context.applyChanges(new ChangeSet()..changedSource(source));
     // The analysis results are invalidated.
     // We have seen the new contents, so 'modificationTime' is also updated.
@@ -552,11 +552,10 @@
     var stat = PerformanceStatistics.cacheConsistencyValidationStatistics;
     stat.reset();
     // Add sources.
-    MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
     String path1 = '/test1.dart';
     String path2 = '/test2.dart';
-    Source source1 = resourceProvider.newFile(path1, '// 1-1').createSource();
-    Source source2 = resourceProvider.newFile(path2, '// 2-1').createSource();
+    Source source1 = newFile(path1, content: '// 1-1').createSource();
+    Source source2 = newFile(path2, content: '// 2-1').createSource();
     context.applyChanges(
         new ChangeSet()..addedSource(source1)..addedSource(source2));
     // Same modification times.
@@ -589,11 +588,10 @@
     var stat = PerformanceStatistics.cacheConsistencyValidationStatistics;
     stat.reset();
     // Add sources.
-    MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
     String path1 = '/test1.dart';
     String path2 = '/test2.dart';
-    Source source1 = resourceProvider.newFile(path1, '// 1-1').createSource();
-    Source source2 = resourceProvider.newFile(path2, '// 2-1').createSource();
+    Source source1 = newFile(path1, content: '// 1-1').createSource();
+    Source source2 = newFile(path2, content: '// 2-1').createSource();
     context.applyChanges(
         new ChangeSet()..addedSource(source1)..addedSource(source2));
     // Same modification times.
@@ -624,11 +622,10 @@
   void test_cacheConsistencyValidator_getSources() {
     CacheConsistencyValidator validator = context.cacheConsistencyValidator;
     // Add sources.
-    MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
     String path1 = '/test1.dart';
     String path2 = '/test2.dart';
-    Source source1 = resourceProvider.newFile(path1, '// 1-1').createSource();
-    Source source2 = resourceProvider.newFile(path2, '// 2-1').createSource();
+    Source source1 = newFile(path1, content: '// 1-1').createSource();
+    Source source2 = newFile(path2, content: '// 2-1').createSource();
     context.applyChanges(
         new ChangeSet()..addedSource(source1)..addedSource(source2));
     // Verify.
@@ -1080,8 +1077,7 @@
     String newCode = r'''
 import 'dart:async';
 ''';
-    String path = resourceProvider.convertPath('/test.dart');
-    Source source = resourceProvider.newFile(path, oldCode).createSource();
+    Source source = newFile('/test.dart', content: oldCode).createSource();
     context.applyChanges(new ChangeSet()..addedSource(source));
     context.resolveCompilationUnit2(source, source);
     // Flush all results units.
@@ -1092,7 +1088,7 @@
       return false;
     });
     // Update the file, but don't notify the context.
-    resourceProvider.updateFile(path, newCode);
+    modifyFile('/test.dart', newCode);
     // Driver must detect that the file was changed and recover.
     CompilationUnit unit = context.resolveCompilationUnit2(source, source);
     expect(unit, isNotNull);
@@ -1106,8 +1102,7 @@
 import 'dart:async';
 main() {}
 ''';
-    String path = resourceProvider.convertPath('/test.dart');
-    Source source = resourceProvider.newFile(path, oldCode).createSource();
+    Source source = newFile('/test.dart', content: oldCode).createSource();
     context.applyChanges(new ChangeSet()..addedSource(source));
     context.resolveCompilationUnit2(source, source);
     // Flush all results units.
@@ -1120,7 +1115,7 @@
       return false;
     });
     // Update the file, but don't notify the context.
-    resourceProvider.updateFile(path, newCode);
+    modifyFile('/test.dart', newCode);
     // Driver must detect that the file was changed and recover.
     CompilationUnit unit = context.resolveCompilationUnit2(source, source);
     expect(unit, isNotNull);
@@ -1762,7 +1757,7 @@
     // Add the source.
     String oldCode = 'foo() {}';
     String newCode = 'bar() {}';
-    var file = resourceProvider.newFile('/test.dart', oldCode);
+    var file = newFile('/test.dart', content: oldCode);
     Source source = file.createSource();
     context.applyChanges(new ChangeSet()..addedSource(source));
     _analyzeAll_assertFinished();
@@ -1773,8 +1768,7 @@
     // 3. Notify the context, and because this is the first time when we
     //    update the content cache, we don't know "originalContents".
     // The source must be invalidated, because it has different contents now.
-    resourceProvider.updateFile(
-        resourceProvider.convertPath('/test.dart'), newCode);
+    modifyFile('/test.dart', newCode);
     contentCache.setContents(source, newCode);
     context.handleContentsChanged(source, null, newCode, true);
     expect(context.getResolvedCompilationUnit2(source, source), isNull);
@@ -1919,7 +1913,7 @@
 
   void test_parseCompilationUnit_nonExistentSource() {
     Source source = newSource('/test.dart');
-    resourceProvider.deleteFile(resourceProvider.convertPath('/test.dart'));
+    deleteFile('/test.dart');
     try {
       context.parseCompilationUnit(source);
       fail("Expected AnalysisException because file does not exist");
@@ -2331,10 +2325,7 @@
     addSource('/test.dart', 'main() {}');
     _analyzeAll_assertFinished();
     // verify
-    String testUri = resourceProvider
-        .getFile(resourceProvider.convertPath('/test.dart'))
-        .toUri()
-        .toString();
+    String testUri = getFile('/test.dart').toUri().toString();
     expect(libraryElementUris, contains(testUri));
     expect(parsedUnitUris, contains(testUri));
     expect(resolvedUnitUris, contains(testUri));
@@ -2342,20 +2333,20 @@
 
   void test_performAnalysisTask_switchPackageVersion() {
     // version 1
-    resourceProvider.newFile('/pkgs/crypto-1/lib/crypto.dart', r'''
+    newFile('/pkgs/crypto-1/lib/crypto.dart', content: r'''
 library crypto;
 part 'src/hash_utils.dart';
 ''');
-    resourceProvider.newFile('/pkgs/crypto-1/lib/src/hash_utils.dart', r'''
+    newFile('/pkgs/crypto-1/lib/src/hash_utils.dart', content: r'''
 part of crypto;
 const _MASK_8 = 0xff;
 ''');
     // version 2
-    resourceProvider.newFile('/pkgs/crypto-2/lib/crypto.dart', r'''
+    newFile('/pkgs/crypto-2/lib/crypto.dart', content: r'''
 library crypto;
 part 'src/hash_utils.dart';
 ''');
-    resourceProvider.newFile('/pkgs/crypto-2/lib/src/hash_utils.dart', r'''
+    newFile('/pkgs/crypto-2/lib/src/hash_utils.dart', content: r'''
 part of crypto;
 const _MASK_8 = 0xff;
 ''');
@@ -2364,7 +2355,7 @@
       sdkResolver,
       resourceResolver,
       new PackageMapUriResolver(resourceProvider, {
-        'crypto': [resourceProvider.getFolder('/pkgs/crypto-1/lib')]
+        'crypto': [getFolder('/pkgs/crypto-1/lib')]
       })
     ]);
     // analyze
@@ -2377,7 +2368,7 @@
       sdkResolver,
       resourceResolver,
       new PackageMapUriResolver(resourceProvider, {
-        'crypto': [resourceProvider.getFolder('/pkgs/crypto-2/lib')]
+        'crypto': [getFolder('/pkgs/crypto-2/lib')]
       })
     ]);
     _analyzeAll_assertFinished();
@@ -2693,11 +2684,10 @@
   }
 
   void test_validateCacheConsistency_deletedFile() {
-    MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-    String pathA = resourceProvider.convertPath('/a.dart');
-    String pathB = resourceProvider.convertPath('/b.dart');
-    var fileA = resourceProvider.newFile(pathA, "");
-    var fileB = resourceProvider.newFile(pathB, "import 'a.dart';");
+    String pathA = '/a.dart';
+    String pathB = '/b.dart';
+    var fileA = newFile(pathA, content: "");
+    var fileB = newFile(pathB, content: "import 'a.dart';");
     Source sourceA = fileA.createSource();
     Source sourceB = fileB.createSource();
     context.applyChanges(
@@ -2705,7 +2695,7 @@
     // analyze everything
     _analyzeAll_assertFinished();
     // delete a.dart
-    resourceProvider.deleteFile(pathA);
+    deleteFile(pathA);
     // analysis should eventually stop
     _analyzeAll_assertFinished();
   }
@@ -2793,8 +2783,7 @@
   void _checkFlushSingleResolvedUnit(String code,
       void validate(CompilationUnitElement unitElement, String reason)) {
     prepareAnalysisContext(new AnalysisOptionsImpl());
-    String path = resourceProvider.convertPath('/test.dart');
-    Source source = resourceProvider.newFile(path, code).createSource();
+    Source source = newFile('/test.dart', content: code).createSource();
     context.applyChanges(new ChangeSet()..addedSource(source));
     CompilationUnitElement unitElement =
         context.resolveCompilationUnit2(source, source).declaredElement;
@@ -2845,7 +2834,7 @@
   }
 
   void _removeSource(Source source) {
-    resourceProvider.deleteFile(source.fullName);
+    deleteFile(source.fullName);
     ChangeSet changeSet = new ChangeSet();
     changeSet.removedSource(source);
     context.applyChanges(changeSet);
diff --git a/pkg/analyzer/test/src/context/mock_sdk.dart b/pkg/analyzer/test/src/context/mock_sdk.dart
index 73c70d6..6dd644f 100644
--- a/pkg/analyzer/test/src/context/mock_sdk.dart
+++ b/pkg/analyzer/test/src/context/mock_sdk.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 analyzer.test.src.context.mock_sdk;
-
 import 'package:analyzer/file_system/file_system.dart' as resource;
 import 'package:analyzer/file_system/memory_file_system.dart' as resource;
 import 'package:analyzer/src/context/cache.dart';
@@ -339,11 +337,6 @@
   _CompileTimeError(this._errorMsg);
 }
 
-class _ConstantExpressionError {
-  const _ConstantExpressionError();
-  external _throw(error);
-}
-
 class AbstractClassInstantiationError {
   AbstractClassInstantiationError(String className);
 }
diff --git a/pkg/analyzer/test/src/context/source_test.dart b/pkg/analyzer/test/src/context/source_test.dart
index 21c47ad..18cc9b8 100644
--- a/pkg/analyzer/test/src/context/source_test.dart
+++ b/pkg/analyzer/test/src/context/source_test.dart
@@ -20,7 +20,7 @@
 @reflectiveTest
 class SourceFactoryImplTest extends AbstractContextTest {
   void test_restoreUri() {
-    String libPath = resourceProvider.convertPath('/pkgs/somepkg/lib/');
+    String libPath = resourceProvider.convertPath('/pkgs/somepkg/lib');
     Uri libUri = resourceProvider.getFolder(libPath).toUri();
     Map<String, Uri> packageUriMap = <String, Uri>{'foo': libUri};
     SourceFactoryImpl sourceFactory = new SourceFactoryImpl(
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index a3f21c0..e9f6eaa 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -16,8 +16,8 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:test/test.dart';
 
 import '../../context/mock_sdk.dart';
diff --git a/pkg/front_end/test/src/byte_store/byte_store_test.dart b/pkg/analyzer/test/src/dart/analysis/byte_store_test.dart
similarity index 97%
rename from pkg/front_end/test/src/byte_store/byte_store_test.dart
rename to pkg/analyzer/test/src/dart/analysis/byte_store_test.dart
index 28e77ac..ad06c6a 100644
--- a/pkg/front_end/test/src/byte_store/byte_store_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/byte_store_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.
 
-import 'package:front_end/src/byte_store/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/front_end/test/src/byte_store/cache_test.dart b/pkg/analyzer/test/src/dart/analysis/cache_test.dart
similarity index 97%
rename from pkg/front_end/test/src/byte_store/cache_test.dart
rename to pkg/analyzer/test/src/dart/analysis/cache_test.dart
index 6221e43..20f190d 100644
--- a/pkg/front_end/test/src/byte_store/cache_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/cache_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.
 
-import 'package:front_end/src/byte_store/cache.dart';
+import 'package:analyzer/src/dart/analysis/cache.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/front_end/test/src/byte_store/crc32_test.dart b/pkg/analyzer/test/src/dart/analysis/crc32_test.dart
similarity index 93%
rename from pkg/front_end/test/src/byte_store/crc32_test.dart
rename to pkg/analyzer/test/src/dart/analysis/crc32_test.dart
index 0d209bb..2480507 100644
--- a/pkg/front_end/test/src/byte_store/crc32_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/crc32_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:convert';
 
-import 'package:front_end/src/byte_store/crc32.dart';
+import 'package:analyzer/src/dart/analysis/crc32.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 1fd77a5..b0adc84 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -24,8 +24,8 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -1770,21 +1770,21 @@
 
   test_getResult_invalidUri() async {
     String content = r'''
-import '[invalid uri]';
+import ':[invalid uri]';
 import '[invalid uri]:foo.dart';
 import 'package:aaa/a1.dart';
-import '[invalid uri]';
+import ':[invalid uri]';
 import '[invalid uri]:foo.dart';
 
-export '[invalid uri]';
+export ':[invalid uri]';
 export '[invalid uri]:foo.dart';
 export 'package:aaa/a2.dart';
-export '[invalid uri]';
+export ':[invalid uri]';
 export '[invalid uri]:foo.dart';
 
-part '[invalid uri]';
+part ':[invalid uri]';
 part 'a3.dart';
-part '[invalid uri]';
+part ':[invalid uri]';
 ''';
     addTestFile(content);
 
@@ -2322,6 +2322,33 @@
     await waitForIdleWithoutExceptions();
   }
 
+  test_issue34619() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, r'''
+class C {
+  final Set<String> f = new Set<String>();
+
+  @override
+  List<int> foo() {}
+}
+''');
+
+    driver.addFile(a);
+    await waitForIdleWithoutExceptions();
+
+    // Update the file in a
+    provider.updateFile(a, r'''
+class C {
+  final Set<String> f = a + b + c;
+
+  @override
+  List<int> foo() {}
+}
+''');
+    driver.changeFile(a);
+    await waitForIdleWithoutExceptions();
+  }
+
   test_knownFiles() async {
     var a = _p('/test/lib/a.dart');
     var b = _p('/test/lib/b.dart');
diff --git a/pkg/front_end/test/src/byte_store/file_byte_store_test.dart b/pkg/analyzer/test/src/dart/analysis/file_byte_store_test.dart
similarity index 95%
rename from pkg/front_end/test/src/byte_store/file_byte_store_test.dart
rename to pkg/analyzer/test/src/dart/analysis/file_byte_store_test.dart
index a2aa7ed..5975150 100644
--- a/pkg/front_end/test/src/byte_store/file_byte_store_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_byte_store_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.
 
-import 'package:front_end/src/byte_store/file_byte_store.dart';
+import 'package:analyzer/src/dart/analysis/file_byte_store.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 104997b..1bbdb6d 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -16,8 +16,8 @@
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:convert/convert.dart';
 import 'package:crypto/crypto.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -397,13 +397,13 @@
     String a3 = _p('/aaa/lib/a3.dart');
     String content_a1 = r'''
 import 'package:aaa/a1.dart';
-import '[invalid uri]';
+import ':[invalid uri]';
 
 export 'package:aaa/a2.dart';
-export '[invalid uri]';
+export ':[invalid uri]';
 
 part 'a3.dart';
-part '[invalid uri]';
+part ':[invalid uri]';
 ''';
     provider.newFile(a, content_a1);
 
diff --git a/pkg/front_end/test/src/byte_store/fletcher16_test.dart b/pkg/analyzer/test/src/dart/analysis/fletcher16_test.dart
similarity index 92%
rename from pkg/front_end/test/src/byte_store/fletcher16_test.dart
rename to pkg/analyzer/test/src/dart/analysis/fletcher16_test.dart
index a80dcc8..e44e3a7 100644
--- a/pkg/front_end/test/src/byte_store/fletcher16_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/fletcher16_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.
 
-import 'package:front_end/src/byte_store/fletcher16.dart';
+import 'package:analyzer/src/dart/analysis/fletcher16.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart b/pkg/analyzer/test/src/dart/analysis/protected_file_byte_store_test.dart
similarity index 98%
rename from pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
rename to pkg/analyzer/test/src/dart/analysis/protected_file_byte_store_test.dart
index ad88088..05bcad5 100644
--- a/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/protected_file_byte_store_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 import 'dart:io' as io;
 
-import 'package:front_end/src/byte_store/protected_file_byte_store.dart';
+import 'package:analyzer/src/dart/analysis/protected_file_byte_store.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 0eab813..0c00794 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -46,7 +46,7 @@
     String uri = 'uri';
 
     var source = new _SourceMock(Uri.parse(uri));
-    var unit = new CompilationUnitElementImpl('')
+    var unit = new CompilationUnitElementImpl()
       ..librarySource = source
       ..source = source;
     var library = new LibraryElementImpl(null, null, null, null)
@@ -119,7 +119,7 @@
 
   void _initializeSDK() {
     CompilationUnitElementImpl newUnit(String name) {
-      CompilationUnitElementImpl unit = new CompilationUnitElementImpl(name);
+      CompilationUnitElementImpl unit = new CompilationUnitElementImpl();
       unit.accessors = [];
       unit.enums = [];
       unit.functions = [];
diff --git a/pkg/analyzer/test/src/dart/analysis/test_all.dart b/pkg/analyzer/test/src/dart/analysis/test_all.dart
index f4f9c49..ac21ffc 100644
--- a/pkg/analyzer/test/src/dart/analysis/test_all.dart
+++ b/pkg/analyzer/test/src/dart/analysis/test_all.dart
@@ -5,15 +5,21 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'analysis_context_collection_test.dart' as analysis_context_collection;
+import 'byte_store_test.dart' as byte_store_test;
+import 'cache_test.dart' as cache_test;
 import 'context_builder_test.dart' as context_builder;
 import 'context_locator_test.dart' as context_locator;
 import 'context_root_test.dart' as context_root;
+import 'crc32_test.dart' as crc32_test;
 import 'defined_names_test.dart' as defined_names;
 import 'driver_resolution_test.dart' as driver_resolution;
 import 'driver_test.dart' as driver;
+import 'file_byte_store_test.dart' as file_byte_store_test;
 import 'file_state_test.dart' as file_state;
+import 'fletcher16_test.dart' as fletcher16_test;
 import 'index_test.dart' as index;
 import 'mutex_test.dart' as mutex;
+import 'protected_file_byte_store_test.dart' as protected_file_byte_store_test;
 import 'referenced_names_test.dart' as referenced_names;
 import 'search_test.dart' as search;
 import 'session_helper_test.dart' as session_helper;
@@ -24,19 +30,25 @@
 main() {
   defineReflectiveSuite(() {
     analysis_context_collection.main();
+    byte_store_test.main();
+    cache_test.main();
     context_builder.main();
     context_locator.main();
     context_root.main();
+    crc32_test.main();
     defined_names.main();
     driver.main();
     driver_resolution.main();
+    file_byte_store_test.main();
     file_state.main();
+    fletcher16_test.main();
     index.main();
     mutex.main();
+    protected_file_byte_store_test.main();
     referenced_names.main();
     search.main();
-    session_helper.main();
     session.main();
+    session_helper.main();
     unlinked_api_signature.main();
     uri_converter.main();
   }, name: 'analysis');
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 dae6df2..2ef0d59 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
@@ -12,8 +12,8 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -308,6 +308,48 @@
 ''');
   }
 
+  test_class_field_withType_hasConstConstructor() async {
+    await assertSameSignature(r'''
+class C {
+  int a = 1;
+  const C();
+}
+''', r'''
+class C {
+  int a = 2;
+  const C();
+}
+''');
+  }
+
+  test_class_field_withType_static_final_hasConstConstructor() async {
+    await assertSameSignature(r'''
+class C {
+  static final int a = 1;
+  const C();
+}
+''', r'''
+class C {
+  static final int a = 2;
+  const C();
+}
+''');
+  }
+
+  test_class_field_withType_static_hasConstConstructor() async {
+    await assertSameSignature(r'''
+class C {
+  static int a = 1;
+  const C();
+}
+''', r'''
+class C {
+  static int a = 2;
+  const C();
+}
+''');
+  }
+
   test_class_implements() async {
     await assertNotSameSignature(r'''
 class A {}
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index b280033..715eccf 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -557,8 +557,7 @@
 
   void test_visitCompilationUnit() {
     CompilationUnit fromNode = AstTestFactory.compilationUnit();
-    CompilationUnitElement element =
-        new CompilationUnitElementImpl("test.dart");
+    CompilationUnitElement element = new CompilationUnitElementImpl();
     fromNode.element = element;
     CompilationUnit toNode = AstTestFactory.compilationUnit();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index 1af4ce5..0a08cae 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -2,27 +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 'dart:async';
-
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/constant.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
-import 'package:analyzer/src/task/dart.dart';
 import 'package:path/path.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -32,1473 +23,10 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ConstantValueComputerTest);
     defineReflectiveTests(ConstantVisitorTest);
-    defineReflectiveTests(StrongConstantValueComputerTest);
   });
 }
 
-/**
- * Implementation of [ConstantEvaluationValidator] used during unit tests;
- * verifies that any nodes referenced during constant evaluation are present in
- * the dependency graph.
- */
-class ConstantEvaluationValidator_ForTest
-    implements ConstantEvaluationValidator {
-  final InternalAnalysisContext context;
-  ConstantValueComputer computer;
-  ConstantEvaluationTarget _nodeBeingEvaluated;
-
-  ConstantEvaluationValidator_ForTest(this.context);
-
-  @override
-  void beforeComputeValue(ConstantEvaluationTarget constant) {
-    _nodeBeingEvaluated = constant;
-  }
-
-  @override
-  void beforeGetConstantInitializers(ConstructorElement constructor) =>
-      _checkPathTo(constructor);
-
-  @override
-  void beforeGetEvaluationResult(ConstantEvaluationTarget constant) =>
-      _checkPathTo(constant);
-
-  @override
-  void beforeGetFieldEvaluationResult(FieldElementImpl field) =>
-      _checkPathTo(field);
-
-  @override
-  void beforeGetParameterDefault(ParameterElement parameter) =>
-      _checkPathTo(parameter);
-
-  void _checkPathTo(ConstantEvaluationTarget target) {
-    if (computer.referenceGraph.containsPath(_nodeBeingEvaluated, target)) {
-      return; // pass
-    }
-    // print a nice error message on failure
-    StringBuffer out = new StringBuffer();
-    out.writeln("missing path in constant dependency graph");
-    out.writeln("from $_nodeBeingEvaluated to $target");
-    for (var s in context.analysisCache.sources) {
-      String text = context.getContents(s).data;
-      if (text != "") {
-        out.writeln('''
-=== ${s.shortName}
-$text''');
-      }
-    }
-    fail(out.toString());
-  }
-}
-
-@reflectiveTest
-class ConstantValueComputerTest extends ResolverTestCase {
-  test_annotation_constConstructor() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A {
-  final int i;
-  const A(this.i);
-}
-
-class C {
-  @A(5)
-  f() {}
-}
-''');
-    EvaluationResultImpl result =
-        _evaluateAnnotation(compilationUnit, "C", "f");
-    Map<String, DartObjectImpl> annotationFields = _assertType(result, 'A');
-    _assertIntField(annotationFields, 'i', 5);
-  }
-
-  test_annotation_constConstructor_named() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A {
-  final int i;
-  const A.named(this.i);
-}
-
-class C {
-  @A.named(5)
-  f() {}
-}
-''');
-    EvaluationResultImpl result =
-        _evaluateAnnotation(compilationUnit, "C", "f");
-    Map<String, DartObjectImpl> annotationFields = _assertType(result, 'A');
-    _assertIntField(annotationFields, 'i', 5);
-  }
-
-  test_annotation_constConstructor_noArgs() async {
-    // Failing to pass arguments to an annotation which is a constant
-    // constructor is illegal, but shouldn't crash analysis.
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A {
-  final int i;
-  const A(this.i);
-}
-
-class C {
-  @A
-  f() {}
-}
-''');
-    _evaluateAnnotation(compilationUnit, "C", "f");
-  }
-
-  test_annotation_constConstructor_noArgs_named() async {
-    // Failing to pass arguments to an annotation which is a constant
-    // constructor is illegal, but shouldn't crash analysis.
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A {
-  final int i;
-  const A.named(this.i);
-}
-
-class C {
-  @A.named
-  f() {}
-}
-''');
-    _evaluateAnnotation(compilationUnit, "C", "f");
-  }
-
-  test_annotation_nonConstConstructor() async {
-    // Calling a non-const constructor from an annotation that is illegal, but
-    // shouldn't crash analysis.
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A {
-  final int i;
-  A(this.i);
-}
-
-class C {
-  @A(5)
-  f() {}
-}
-''');
-    _evaluateAnnotation(compilationUnit, "C", "f");
-  }
-
-  test_annotation_staticConst() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class C {
-  static const int i = 5;
-
-  @i
-  f() {}
-}
-''');
-    EvaluationResultImpl result =
-        _evaluateAnnotation(compilationUnit, "C", "f");
-    expect(_assertValidInt(result), 5);
-  }
-
-  test_annotation_staticConst_args() async {
-    // Applying arguments to an annotation that is a static const is
-    // illegal, but shouldn't crash analysis.
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class C {
-  static const int i = 5;
-
-  @i(1)
-  f() {}
-}
-''');
-    _evaluateAnnotation(compilationUnit, "C", "f");
-  }
-
-  test_annotation_staticConst_otherClass() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A {
-  static const int i = 5;
-}
-
-class C {
-  @A.i
-  f() {}
-}
-''');
-    EvaluationResultImpl result =
-        _evaluateAnnotation(compilationUnit, "C", "f");
-    expect(_assertValidInt(result), 5);
-  }
-
-  test_annotation_staticConst_otherClass_args() async {
-    // Applying arguments to an annotation that is a static const is
-    // illegal, but shouldn't crash analysis.
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A {
-  static const int i = 5;
-}
-
-class C {
-  @A.i(1)
-  f() {}
-}
-''');
-    _evaluateAnnotation(compilationUnit, "C", "f");
-  }
-
-  test_annotation_topLevelVariable() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const int i = 5;
-class C {
-  @i
-  f() {}
-}
-''');
-    EvaluationResultImpl result =
-        _evaluateAnnotation(compilationUnit, "C", "f");
-    expect(_assertValidInt(result), 5);
-  }
-
-  test_annotation_topLevelVariable_args() async {
-    // Applying arguments to an annotation that is a top-level variable is
-    // illegal, but shouldn't crash analysis.
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const int i = 5;
-class C {
-  @i(1)
-  f() {}
-}
-''');
-    _evaluateAnnotation(compilationUnit, "C", "f");
-  }
-
-  test_computeValues_cycle() async {
-    TestLogger logger = new TestLogger();
-    AnalysisEngine.instance.logger = logger;
-    try {
-      Source source = addSource(r'''
-  const int a = c;
-  const int b = a;
-  const int c = b;''');
-      LibraryElement libraryElement = resolve2(source);
-      CompilationUnit unit =
-          analysisContext.resolveCompilationUnit(source, libraryElement);
-      analysisContext.computeErrors(source);
-      expect(unit, isNotNull);
-      ConstantValueComputer computer = _makeConstantValueComputer();
-      computer.add(unit);
-      computer.computeValues();
-      NodeList<CompilationUnitMember> members = unit.declarations;
-      expect(members, hasLength(3));
-      _validate(false, (members[0] as TopLevelVariableDeclaration).variables);
-      _validate(false, (members[1] as TopLevelVariableDeclaration).variables);
-      _validate(false, (members[2] as TopLevelVariableDeclaration).variables);
-    } finally {
-      AnalysisEngine.instance.logger = Logger.NULL;
-    }
-  }
-
-  test_computeValues_dependentVariables() async {
-    Source source = addSource(r'''
-const int b = a;
-const int a = 0;''');
-    LibraryElement libraryElement = resolve2(source);
-    CompilationUnit unit =
-        analysisContext.resolveCompilationUnit(source, libraryElement);
-    expect(unit, isNotNull);
-    ConstantValueComputer computer = _makeConstantValueComputer();
-    computer.add(unit);
-    computer.computeValues();
-    NodeList<CompilationUnitMember> members = unit.declarations;
-    expect(members, hasLength(2));
-    _validate(true, (members[0] as TopLevelVariableDeclaration).variables);
-    _validate(true, (members[1] as TopLevelVariableDeclaration).variables);
-  }
-
-  test_computeValues_empty() async {
-    ConstantValueComputer computer = _makeConstantValueComputer();
-    computer.computeValues();
-  }
-
-  test_computeValues_multipleSources() async {
-    Source librarySource = addNamedSource("/lib.dart", r'''
-library lib;
-part 'part.dart';
-const int c = b;
-const int a = 0;''');
-    Source partSource = addNamedSource("/part.dart", r'''
-part of lib;
-const int b = a;
-const int d = c;''');
-    LibraryElement libraryElement = resolve2(librarySource);
-    CompilationUnit libraryUnit =
-        analysisContext.resolveCompilationUnit(librarySource, libraryElement);
-    expect(libraryUnit, isNotNull);
-    CompilationUnit partUnit =
-        analysisContext.resolveCompilationUnit(partSource, libraryElement);
-    expect(partUnit, isNotNull);
-    ConstantValueComputer computer = _makeConstantValueComputer();
-    computer.add(libraryUnit);
-    computer.add(partUnit);
-    computer.computeValues();
-    NodeList<CompilationUnitMember> libraryMembers = libraryUnit.declarations;
-    expect(libraryMembers, hasLength(2));
-    _validate(
-        true, (libraryMembers[0] as TopLevelVariableDeclaration).variables);
-    _validate(
-        true, (libraryMembers[1] as TopLevelVariableDeclaration).variables);
-    NodeList<CompilationUnitMember> partMembers = libraryUnit.declarations;
-    expect(partMembers, hasLength(2));
-    _validate(true, (partMembers[0] as TopLevelVariableDeclaration).variables);
-    _validate(true, (partMembers[1] as TopLevelVariableDeclaration).variables);
-  }
-
-  test_computeValues_singleVariable() async {
-    Source source = addSource("const int a = 0;");
-    LibraryElement libraryElement = resolve2(source);
-    CompilationUnit unit =
-        analysisContext.resolveCompilationUnit(source, libraryElement);
-    expect(unit, isNotNull);
-    ConstantValueComputer computer = _makeConstantValueComputer();
-    computer.add(unit);
-    computer.computeValues();
-    NodeList<CompilationUnitMember> members = unit.declarations;
-    expect(members, hasLength(1));
-    _validate(true, (members[0] as TopLevelVariableDeclaration).variables);
-  }
-
-  test_computeValues_value_depends_on_enum() async {
-    Source source = addSource('''
-enum E { id0, id1 }
-const E e = E.id0;
-''');
-    LibraryElement libraryElement = resolve2(source);
-    CompilationUnit unit =
-        analysisContext.resolveCompilationUnit(source, libraryElement);
-    expect(unit, isNotNull);
-    ConstantValueComputer computer = _makeConstantValueComputer();
-    computer.add(unit);
-    computer.computeValues();
-    TopLevelVariableDeclaration declaration = unit.declarations
-        .firstWhere((member) => member is TopLevelVariableDeclaration);
-    _validate(true, declaration.variables);
-  }
-
-  test_dependencyOnConstructor() async {
-    // x depends on "const A()"
-    await _assertProperDependencies(r'''
-class A {
-  const A();
-}
-const x = const A();''');
-  }
-
-  test_dependencyOnConstructorArgument() async {
-    // "const A(x)" depends on x
-    await _assertProperDependencies(r'''
-class A {
-  const A(this.next);
-  final A next;
-}
-const A x = const A(null);
-const A y = const A(x);''');
-  }
-
-  test_dependencyOnConstructorArgument_unresolvedConstructor() async {
-    // "const A.a(x)" depends on x even if the constructor A.a can't be found.
-    await _assertProperDependencies(r'''
-class A {
-}
-const int x = 1;
-const A y = const A.a(x);''',
-        [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR]);
-  }
-
-  test_dependencyOnConstructorInitializer() async {
-    // "const A()" depends on x
-    await _assertProperDependencies(r'''
-const int x = 1;
-class A {
-  const A() : v = x;
-  final int v;
-}''');
-  }
-
-  test_dependencyOnExplicitSuperConstructor() async {
-    // b depends on B() depends on A()
-    await _assertProperDependencies(r'''
-class A {
-  const A(this.x);
-  final int x;
-}
-class B extends A {
-  const B() : super(5);
-}
-const B b = const B();''');
-  }
-
-  test_dependencyOnExplicitSuperConstructorParameters() async {
-    // b depends on B() depends on i
-    await _assertProperDependencies(r'''
-class A {
-  const A(this.x);
-  final int x;
-}
-class B extends A {
-  const B() : super(i);
-}
-const B b = const B();
-const int i = 5;''');
-  }
-
-  test_dependencyOnFactoryRedirect() async {
-    // a depends on A.foo() depends on A.bar()
-    await _assertProperDependencies(
-        r'''
-const A a = const A.foo();
-class A {
-  factory const A.foo() = A.bar;
-  const A.bar();
-}''',
-        Parser.useFasta
-            ? const <ErrorCode>[ParserErrorCode.CONST_AFTER_FACTORY]
-            : const <ErrorCode>[]);
-  }
-
-  test_dependencyOnFactoryRedirectWithTypeParams() async {
-    await _assertProperDependencies(r'''
-class A {
-  const factory A(int a) = B<int>;
-}
-
-class B<T> implements A {
-  final T x;
-  const B(this.x);
-}
-
-const A a = const A(10);''');
-  }
-
-  test_dependencyOnImplicitSuperConstructor() async {
-    // b depends on B() depends on A()
-    await _assertProperDependencies(r'''
-class A {
-  const A() : x = 5;
-  final int x;
-}
-class B extends A {
-  const B();
-}
-const B b = const B();''');
-  }
-
-  test_dependencyOnInitializedFinal() async {
-    // a depends on A() depends on A.x
-    await _assertProperDependencies('''
-class A {
-  const A();
-  final int x = 1;
-}
-const A a = const A();
-''');
-  }
-
-  test_dependencyOnInitializedNonStaticConst() async {
-    // Even though non-static consts are not allowed by the language, we need
-    // to handle them for error recovery purposes.
-    // a depends on A() depends on A.x
-    await _assertProperDependencies('''
-class A {
-  const A();
-  const int x = 1;
-}
-const A a = const A();
-''', [CompileTimeErrorCode.CONST_INSTANCE_FIELD]);
-  }
-
-  test_dependencyOnNonFactoryRedirect() async {
-    // a depends on A.foo() depends on A.bar()
-    await _assertProperDependencies(r'''
-const A a = const A.foo();
-class A {
-  const A.foo() : this.bar();
-  const A.bar();
-}''');
-  }
-
-  test_dependencyOnNonFactoryRedirect_arg() async {
-    // a depends on A.foo() depends on b
-    await _assertProperDependencies(r'''
-const A a = const A.foo();
-const int b = 1;
-class A {
-  const A.foo() : this.bar(b);
-  const A.bar(x) : y = x;
-  final int y;
-}''');
-  }
-
-  test_dependencyOnNonFactoryRedirect_defaultValue() async {
-    // a depends on A.foo() depends on A.bar() depends on b
-    await _assertProperDependencies(r'''
-const A a = const A.foo();
-const int b = 1;
-class A {
-  const A.foo() : this.bar();
-  const A.bar([x = b]) : y = x;
-  final int y;
-}''');
-  }
-
-  test_dependencyOnNonFactoryRedirect_toMissing() async {
-    // a depends on A.foo() which depends on nothing, since A.bar() is
-    // missing.
-    await _assertProperDependencies(r'''
-const A a = const A.foo();
-class A {
-  const A.foo() : this.bar();
-}''', [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR]);
-  }
-
-  test_dependencyOnNonFactoryRedirect_toNonConst() async {
-    // a depends on A.foo() which depends on nothing, since A.bar() is
-    // non-const.
-    await _assertProperDependencies(r'''
-const A a = const A.foo();
-class A {
-  const A.foo() : this.bar();
-  A.bar();
-}''');
-  }
-
-  test_dependencyOnNonFactoryRedirect_unnamed() async {
-    // a depends on A.foo() depends on A()
-    await _assertProperDependencies(r'''
-const A a = const A.foo();
-class A {
-  const A.foo() : this();
-  const A();
-}''');
-  }
-
-  test_dependencyOnOptionalParameterDefault() async {
-    // a depends on A() depends on B()
-    await _assertProperDependencies(r'''
-class A {
-  const A([x = const B()]) : b = x;
-  final B b;
-}
-class B {
-  const B();
-}
-const A a = const A();''');
-  }
-
-  test_dependencyOnVariable() async {
-    // x depends on y
-    await _assertProperDependencies(r'''
-const x = y + 1;
-const y = 2;''');
-  }
-
-  test_final_initialized_at_declaration() async {
-    CompilationUnit compilationUnit = await resolveSource('''
-class A {
-  final int i = 123;
-  const A();
-}
-
-const A a = const A();
-''');
-    EvaluationResultImpl result =
-        _evaluateTopLevelVariable(compilationUnit, 'a');
-    Map<String, DartObjectImpl> fields = _assertType(result, "A");
-    expect(fields, hasLength(1));
-    _assertIntField(fields, "i", 123);
-  }
-
-  test_fromEnvironment_bool_default_false() async {
-    expect(_assertValidBool(await _check_fromEnvironment_bool(null, "false")),
-        false);
-  }
-
-  test_fromEnvironment_bool_default_overridden() async {
-    expect(_assertValidBool(await _check_fromEnvironment_bool("false", "true")),
-        false);
-  }
-
-  test_fromEnvironment_bool_default_parseError() async {
-    expect(
-        _assertValidBool(
-            await _check_fromEnvironment_bool("parseError", "true")),
-        true);
-  }
-
-  test_fromEnvironment_bool_default_true() async {
-    expect(_assertValidBool(await _check_fromEnvironment_bool(null, "true")),
-        true);
-  }
-
-  test_fromEnvironment_bool_false() async {
-    expect(_assertValidBool(await _check_fromEnvironment_bool("false", null)),
-        false);
-  }
-
-  test_fromEnvironment_bool_parseError() async {
-    expect(
-        _assertValidBool(await _check_fromEnvironment_bool("parseError", null)),
-        false);
-  }
-
-  test_fromEnvironment_bool_true() async {
-    expect(_assertValidBool(await _check_fromEnvironment_bool("true", null)),
-        true);
-  }
-
-  test_fromEnvironment_bool_undeclared() async {
-    _assertValidUnknown(await _check_fromEnvironment_bool(null, null));
-  }
-
-  test_fromEnvironment_int_default_overridden() async {
-    expect(
-        _assertValidInt(await _check_fromEnvironment_int("234", "123")), 234);
-  }
-
-  test_fromEnvironment_int_default_parseError() async {
-    expect(
-        _assertValidInt(await _check_fromEnvironment_int("parseError", "123")),
-        123);
-  }
-
-  test_fromEnvironment_int_default_undeclared() async {
-    expect(_assertValidInt(await _check_fromEnvironment_int(null, "123")), 123);
-  }
-
-  test_fromEnvironment_int_ok() async {
-    expect(_assertValidInt(await _check_fromEnvironment_int("234", null)), 234);
-  }
-
-  test_fromEnvironment_int_parseError() async {
-    _assertValidNull(await _check_fromEnvironment_int("parseError", null));
-  }
-
-  test_fromEnvironment_int_parseError_nullDefault() async {
-    _assertValidNull(await _check_fromEnvironment_int("parseError", "null"));
-  }
-
-  test_fromEnvironment_int_undeclared() async {
-    _assertValidUnknown(await _check_fromEnvironment_int(null, null));
-  }
-
-  test_fromEnvironment_int_undeclared_nullDefault() async {
-    _assertValidNull(await _check_fromEnvironment_int(null, "null"));
-  }
-
-  test_fromEnvironment_string_default_overridden() async {
-    expect(
-        _assertValidString(await _check_fromEnvironment_string("abc", "'def'")),
-        "abc");
-  }
-
-  test_fromEnvironment_string_default_undeclared() async {
-    expect(
-        _assertValidString(await _check_fromEnvironment_string(null, "'def'")),
-        "def");
-  }
-
-  test_fromEnvironment_string_empty() async {
-    expect(
-        _assertValidString(await _check_fromEnvironment_string("", null)), "");
-  }
-
-  test_fromEnvironment_string_ok() async {
-    expect(_assertValidString(await _check_fromEnvironment_string("abc", null)),
-        "abc");
-  }
-
-  test_fromEnvironment_string_undeclared() async {
-    _assertValidUnknown(await _check_fromEnvironment_string(null, null));
-  }
-
-  test_fromEnvironment_string_undeclared_nullDefault() async {
-    _assertValidNull(await _check_fromEnvironment_string(null, "null"));
-  }
-
-  test_getConstructor_redirectingFactory() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A {
-  factory const A() = B;
-}
-
-class B implements A {
-  const B();
-}
-
-class C {
-  @A()
-  f() {}
-}
-''');
-    EvaluationResultImpl result =
-        _evaluateAnnotation(compilationUnit, "C", "f");
-    expect(result.value.getInvocation().constructor.isFactory, isTrue);
-  }
-
-  test_getConstructor_withArgs() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A {
-  final int i;
-  const A(this.i);
-}
-
-class C {
-  @A(5)
-  f() {}
-}
-''');
-    EvaluationResultImpl result =
-        _evaluateAnnotation(compilationUnit, "C", "f");
-    ConstructorInvocation invocation = result.value.getInvocation();
-    expect(invocation.constructor, isNotNull);
-    expect(invocation.positionalArguments, hasLength(1));
-    expect(invocation.positionalArguments.single.toIntValue(), 5);
-    expect(invocation.namedArguments, isEmpty);
-  }
-
-  test_getConstructor_withNamedArgs() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A {
-  final int i;
-  const A({this.i});
-}
-
-class C {
-  @A(i: 5)
-  f() {}
-}
-''');
-    EvaluationResultImpl result =
-        _evaluateAnnotation(compilationUnit, "C", "f");
-    ConstructorInvocation invocation = result.value.getInvocation();
-    expect(invocation.constructor, isNotNull);
-    expect(invocation.positionalArguments, isEmpty);
-    expect(invocation.namedArguments, isNotEmpty);
-    expect(invocation.namedArguments['i'].toIntValue(), 5);
-  }
-
-  test_instanceCreationExpression_computedField() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A(4, 5);
-class A {
-  const A(int i, int j) : k = 2 * i + j;
-  final int k;
-}''');
-    EvaluationResultImpl result =
-        _evaluateTopLevelVariable(compilationUnit, "foo");
-    Map<String, DartObjectImpl> fields = _assertType(result, "A");
-    expect(fields, hasLength(1));
-    _assertIntField(fields, "k", 13);
-  }
-
-  test_instanceCreationExpression_computedField_namedOptionalWithDefault() async {
-    await _checkInstanceCreationOptionalParams(false, true, true);
-  }
-
-  test_instanceCreationExpression_computedField_namedOptionalWithoutDefault() async {
-    await _checkInstanceCreationOptionalParams(false, true, false);
-  }
-
-  test_instanceCreationExpression_computedField_unnamedOptionalWithDefault() async {
-    await _checkInstanceCreationOptionalParams(false, false, true);
-  }
-
-  test_instanceCreationExpression_computedField_unnamedOptionalWithoutDefault() async {
-    await _checkInstanceCreationOptionalParams(false, false, false);
-  }
-
-  test_instanceCreationExpression_computedField_usesConstConstructor() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A(3);
-class A {
-  const A(int i) : b = const B(4);
-  final int b;
-}
-class B {
-  const B(this.k);
-  final int k;
-}''');
-    EvaluationResultImpl result =
-        _evaluateTopLevelVariable(compilationUnit, "foo");
-    Map<String, DartObjectImpl> fieldsOfA = _assertType(result, "A");
-    expect(fieldsOfA, hasLength(1));
-    Map<String, DartObjectImpl> fieldsOfB =
-        _assertFieldType(fieldsOfA, "b", "B");
-    expect(fieldsOfB, hasLength(1));
-    _assertIntField(fieldsOfB, "k", 4);
-  }
-
-  test_instanceCreationExpression_computedField_usesStaticConst() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A(3);
-class A {
-  const A(int i) : k = i + B.bar;
-  final int k;
-}
-class B {
-  static const bar = 4;
-}''');
-    EvaluationResultImpl result =
-        _evaluateTopLevelVariable(compilationUnit, "foo");
-    Map<String, DartObjectImpl> fields = _assertType(result, "A");
-    expect(fields, hasLength(1));
-    _assertIntField(fields, "k", 7);
-  }
-
-  test_instanceCreationExpression_computedField_usesTopLevelConst() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A(3);
-const bar = 4;
-class A {
-  const A(int i) : k = i + bar;
-  final int k;
-}''');
-    EvaluationResultImpl result =
-        _evaluateTopLevelVariable(compilationUnit, "foo");
-    Map<String, DartObjectImpl> fields = _assertType(result, "A");
-    expect(fields, hasLength(1));
-    _assertIntField(fields, "k", 7);
-  }
-
-  test_instanceCreationExpression_explicitSuper() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const B(4, 5);
-class A {
-  const A(this.x);
-  final int x;
-}
-class B extends A {
-  const B(int x, this.y) : super(x * 2);
-  final int y;
-}''');
-    EvaluationResultImpl result =
-        _evaluateTopLevelVariable(compilationUnit, "foo");
-    Map<String, DartObjectImpl> fields = _assertType(result, "B");
-    expect(fields, hasLength(2));
-    _assertIntField(fields, "y", 5);
-    Map<String, DartObjectImpl> superclassFields =
-        _assertFieldType(fields, GenericState.SUPERCLASS_FIELD, "A");
-    expect(superclassFields, hasLength(1));
-    _assertIntField(superclassFields, "x", 8);
-  }
-
-  test_instanceCreationExpression_fieldFormalParameter() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A(42);
-class A {
-  int x;
-  const A(this.x)
-}''');
-    EvaluationResultImpl result =
-        _evaluateTopLevelVariable(compilationUnit, "foo");
-    Map<String, DartObjectImpl> fields = _assertType(result, "A");
-    expect(fields, hasLength(1));
-    _assertIntField(fields, "x", 42);
-  }
-
-  test_instanceCreationExpression_fieldFormalParameter_namedOptionalWithDefault() async {
-    await _checkInstanceCreationOptionalParams(true, true, true);
-  }
-
-  test_instanceCreationExpression_fieldFormalParameter_namedOptionalWithoutDefault() async {
-    await _checkInstanceCreationOptionalParams(true, true, false);
-  }
-
-  test_instanceCreationExpression_fieldFormalParameter_unnamedOptionalWithDefault() async {
-    await _checkInstanceCreationOptionalParams(true, false, true);
-  }
-
-  test_instanceCreationExpression_fieldFormalParameter_unnamedOptionalWithoutDefault() async {
-    await _checkInstanceCreationOptionalParams(true, false, false);
-  }
-
-  test_instanceCreationExpression_implicitSuper() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const B(4);
-class A {
-  const A() : x = 3;
-  final int x;
-}
-class B extends A {
-  const B(this.y);
-  final int y;
-}''');
-    EvaluationResultImpl result =
-        _evaluateTopLevelVariable(compilationUnit, "foo");
-    Map<String, DartObjectImpl> fields = _assertType(result, "B");
-    expect(fields, hasLength(2));
-    _assertIntField(fields, "y", 4);
-    Map<String, DartObjectImpl> superclassFields =
-        _assertFieldType(fields, GenericState.SUPERCLASS_FIELD, "A");
-    expect(superclassFields, hasLength(1));
-    _assertIntField(superclassFields, "x", 3);
-  }
-
-  test_instanceCreationExpression_nonFactoryRedirect() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A.a1();
-class A {
-  const A.a1() : this.a2();
-  const A.a2() : x = 5;
-  final int x;
-}''');
-    Map<String, DartObjectImpl> aFields =
-        _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
-    _assertIntField(aFields, 'x', 5);
-  }
-
-  test_instanceCreationExpression_nonFactoryRedirect_arg() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A.a1(1);
-class A {
-  const A.a1(x) : this.a2(x + 100);
-  const A.a2(x) : y = x + 10;
-  final int y;
-}''');
-    Map<String, DartObjectImpl> aFields =
-        _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
-    _assertIntField(aFields, 'y', 111);
-  }
-
-  test_instanceCreationExpression_nonFactoryRedirect_cycle() async {
-    // It is an error to have a cycle in non-factory redirects; however, we
-    // need to make sure that even if the error occurs, attempting to evaluate
-    // the constant will terminate.
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A();
-class A {
-  const A() : this.b();
-  const A.b() : this();
-}''');
-    _assertValidUnknown(_evaluateTopLevelVariable(compilationUnit, "foo"));
-  }
-
-  test_instanceCreationExpression_nonFactoryRedirect_defaultArg() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A.a1();
-class A {
-  const A.a1() : this.a2();
-  const A.a2([x = 100]) : y = x + 10;
-  final int y;
-}''');
-    Map<String, DartObjectImpl> aFields =
-        _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
-    _assertIntField(aFields, 'y', 110);
-  }
-
-  test_instanceCreationExpression_nonFactoryRedirect_toMissing() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A.a1();
-class A {
-  const A.a1() : this.a2();
-}''');
-    // We don't care what value foo evaluates to (since there is a compile
-    // error), but we shouldn't crash, and we should figure
-    // out that it evaluates to an instance of class A.
-    _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
-  }
-
-  test_instanceCreationExpression_nonFactoryRedirect_toNonConst() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A.a1();
-class A {
-  const A.a1() : this.a2();
-  A.a2();
-}''');
-    // We don't care what value foo evaluates to (since there is a compile
-    // error), but we shouldn't crash, and we should figure
-    // out that it evaluates to an instance of class A.
-    _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
-  }
-
-  test_instanceCreationExpression_nonFactoryRedirect_unnamed() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A.a1();
-class A {
-  const A.a1() : this();
-  const A() : x = 5;
-  final int x;
-}''');
-    Map<String, DartObjectImpl> aFields =
-        _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
-    _assertIntField(aFields, 'x', 5);
-  }
-
-  test_instanceCreationExpression_redirect() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A();
-class A {
-  const factory A() = B;
-}
-class B implements A {
-  const B();
-}''');
-    _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "B");
-  }
-
-  test_instanceCreationExpression_redirect_cycle() async {
-    // It is an error to have a cycle in factory redirects; however, we need
-    // to make sure that even if the error occurs, attempting to evaluate the
-    // constant will terminate.
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A();
-class A {
-  const factory A() = A.b;
-  const factory A.b() = A;
-}''');
-    _assertValidUnknown(_evaluateTopLevelVariable(compilationUnit, "foo"));
-  }
-
-  test_instanceCreationExpression_redirect_external() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A();
-class A {
-  external const factory A();
-}''');
-    _assertValidUnknown(_evaluateTopLevelVariable(compilationUnit, "foo"));
-  }
-
-  test_instanceCreationExpression_redirect_generic() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A<int>();
-class A<T> {
-  const A() : this._();
-  const A._();
-}
-''');
-    _assertType(_evaluateTopLevelVariable(compilationUnit, 'foo'), 'A<int>');
-  }
-
-  test_instanceCreationExpression_redirect_nonConst() async {
-    // It is an error for a const factory constructor redirect to a non-const
-    // constructor; however, we need to make sure that even if the error
-    // attempting to evaluate the constant won't cause a crash.
-    CompilationUnit compilationUnit = await resolveSource(r'''
-const foo = const A();
-class A {
-  const factory A() = A.b;
-  A.b();
-}''');
-    _assertValidUnknown(_evaluateTopLevelVariable(compilationUnit, "foo"));
-  }
-
-  test_instanceCreationExpression_redirectWithTypeParams() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A {
-  const factory A(var a) = B<int>;
-}
-
-class B<T> implements A {
-  final T x;
-  const B(this.x);
-}
-
-const A a = const A(10);''');
-    EvaluationResultImpl result =
-        _evaluateTopLevelVariable(compilationUnit, "a");
-    Map<String, DartObjectImpl> fields = _assertType(result, "B<int>");
-    expect(fields, hasLength(1));
-    _assertIntField(fields, "x", 10);
-  }
-
-  test_instanceCreationExpression_redirectWithTypeSubstitution() async {
-    // To evaluate the redirection of A<int>,
-    // A's template argument (T=int) must be substituted
-    // into B's template argument (B<U> where U=T) to get B<int>.
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class A<T> {
-  const factory A(var a) = B<T>;
-}
-
-class B<U> implements A {
-  final U x;
-  const B(this.x);
-}
-
-const A<int> a = const A<int>(10);''');
-    EvaluationResultImpl result =
-        _evaluateTopLevelVariable(compilationUnit, "a");
-    Map<String, DartObjectImpl> fields = _assertType(result, "B<int>");
-    expect(fields, hasLength(1));
-    _assertIntField(fields, "x", 10);
-  }
-
-  test_instanceCreationExpression_symbol() async {
-    CompilationUnit compilationUnit =
-        await resolveSource("const foo = const Symbol('a');");
-    EvaluationResultImpl evaluationResult =
-        _evaluateTopLevelVariable(compilationUnit, "foo");
-    expect(evaluationResult.value, isNotNull);
-    DartObjectImpl value = evaluationResult.value;
-    expect(value.type, typeProvider.symbolType);
-    expect(value.toSymbolValue(), "a");
-  }
-
-  test_instanceCreationExpression_withSupertypeParams_explicit() async {
-    await _checkInstanceCreation_withSupertypeParams(true);
-  }
-
-  test_instanceCreationExpression_withSupertypeParams_implicit() async {
-    await _checkInstanceCreation_withSupertypeParams(false);
-  }
-
-  test_instanceCreationExpression_withTypeParams() async {
-    CompilationUnit compilationUnit = await resolveSource(r'''
-class C<E> {
-  const C();
-}
-const c_int = const C<int>();
-const c_num = const C<num>();''');
-    EvaluationResultImpl c_int =
-        _evaluateTopLevelVariable(compilationUnit, "c_int");
-    _assertType(c_int, "C<int>");
-    DartObjectImpl c_int_value = c_int.value;
-    EvaluationResultImpl c_num =
-        _evaluateTopLevelVariable(compilationUnit, "c_num");
-    _assertType(c_num, "C<num>");
-    DartObjectImpl c_num_value = c_num.value;
-    expect(c_int_value == c_num_value, isFalse);
-  }
-
-  test_isValidSymbol() async {
-    expect(ConstantEvaluationEngine.isValidPublicSymbol(""), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo"), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo.bar"), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo\$"), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo\$bar"), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("iff"), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("gif"), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("if\$"), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("\$if"), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo="), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo.bar="), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo.+"), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("void"), isTrue);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("_foo"), isFalse);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("_foo.bar"), isFalse);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo._bar"), isFalse);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("if"), isFalse);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("if.foo"), isFalse);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo.if"), isFalse);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo=.bar"), isFalse);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo."), isFalse);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("+.foo"), isFalse);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("void.foo"), isFalse);
-    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo.void"), isFalse);
-  }
-
-  test_length_of_improperly_typed_string_expression() async {
-    // Since type annotations are ignored in unchecked mode, the improper
-    // types on s1 and s2 shouldn't prevent us from evaluating i to
-    // 'alpha'.length.
-    CompilationUnit compilationUnit = await resolveSource('''
-const int s1 = 'alpha';
-const int s2 = 'beta';
-const int i = (true ? s1 : s2).length;
-''');
-    ConstTopLevelVariableElementImpl element =
-        findTopLevelDeclaration(compilationUnit, 'i').declaredElement;
-    EvaluationResultImpl result = element.evaluationResult;
-    expect(_assertValidInt(result), 5);
-  }
-
-  test_length_of_improperly_typed_string_identifier() async {
-    // Since type annotations are ignored in unchecked mode, the improper type
-    // on s shouldn't prevent us from evaluating i to 'alpha'.length.
-    CompilationUnit compilationUnit = await resolveSource('''
-const int s = 'alpha';
-const int i = s.length;
-''');
-    ConstTopLevelVariableElementImpl element =
-        findTopLevelDeclaration(compilationUnit, 'i').declaredElement;
-    EvaluationResultImpl result = element.evaluationResult;
-    expect(_assertValidInt(result), 5);
-  }
-
-  test_non_static_const_initialized_at_declaration() async {
-    // Even though non-static consts are not allowed by the language, we need
-    // to handle them for error recovery purposes.
-    CompilationUnit compilationUnit = await resolveSource('''
-class A {
-  const int i = 123;
-  const A();
-}
-
-const A a = const A();
-''');
-    EvaluationResultImpl result =
-        _evaluateTopLevelVariable(compilationUnit, 'a');
-    Map<String, DartObjectImpl> fields = _assertType(result, "A");
-    expect(fields, hasLength(1));
-    _assertIntField(fields, "i", 123);
-  }
-
-  test_symbolLiteral_void() async {
-    CompilationUnit compilationUnit =
-        await resolveSource("const voidSymbol = #void;");
-    VariableDeclaration voidSymbol =
-        findTopLevelDeclaration(compilationUnit, "voidSymbol");
-    EvaluationResultImpl voidSymbolResult =
-        (voidSymbol.declaredElement as VariableElementImpl).evaluationResult;
-    DartObjectImpl value = voidSymbolResult.value;
-    expect(value.type, typeProvider.symbolType);
-    expect(value.toSymbolValue(), "void");
-  }
-
-  Map<String, DartObjectImpl> _assertFieldType(
-      Map<String, DartObjectImpl> fields,
-      String fieldName,
-      String expectedType) {
-    DartObjectImpl field = fields[fieldName];
-    expect(field.type.displayName, expectedType);
-    return field.fields;
-  }
-
-  void _assertIntField(
-      Map<String, DartObjectImpl> fields, String fieldName, int expectedValue) {
-    DartObjectImpl field = fields[fieldName];
-    expect(field.type.name, "int");
-    expect(field.toIntValue(), expectedValue);
-  }
-
-  void _assertNullField(Map<String, DartObjectImpl> fields, String fieldName) {
-    DartObjectImpl field = fields[fieldName];
-    expect(field.isNull, isTrue);
-  }
-
-  Future<Null> _assertProperDependencies(String sourceText,
-      [List<ErrorCode> expectedErrorCodes = const <ErrorCode>[]]) async {
-    Source source = addSource(sourceText);
-    LibraryElement element = resolve2(source);
-    CompilationUnit unit =
-        analysisContext.resolveCompilationUnit(source, element);
-    expect(unit, isNotNull);
-    ConstantValueComputer computer = _makeConstantValueComputer();
-    computer.add(unit);
-    computer.computeValues();
-    await computeAnalysisResult(source);
-    assertErrors(source, expectedErrorCodes);
-  }
-
-  Map<String, DartObjectImpl> _assertType(
-      EvaluationResultImpl result, String typeName) {
-    expect(result.value, isNotNull);
-    DartObjectImpl value = result.value;
-    expect(value.type.displayName, typeName);
-    return value.fields;
-  }
-
-  bool _assertValidBool(EvaluationResultImpl result) {
-    expect(result.value, isNotNull);
-    DartObjectImpl value = result.value;
-    expect(value.type, typeProvider.boolType);
-    bool boolValue = value.toBoolValue();
-    expect(boolValue, isNotNull);
-    return boolValue;
-  }
-
-  int _assertValidInt(EvaluationResultImpl result) {
-    expect(result, isNotNull);
-    expect(result.value, isNotNull);
-    DartObjectImpl value = result.value;
-    expect(value.type, typeProvider.intType);
-    return value.toIntValue();
-  }
-
-  void _assertValidNull(EvaluationResultImpl result) {
-    expect(result.value, isNotNull);
-    DartObjectImpl value = result.value;
-    expect(value.type, typeProvider.nullType);
-  }
-
-  String _assertValidString(EvaluationResultImpl result) {
-    expect(result.value, isNotNull);
-    DartObjectImpl value = result.value;
-    expect(value.type, typeProvider.stringType);
-    return value.toStringValue();
-  }
-
-  void _assertValidUnknown(EvaluationResultImpl result) {
-    expect(result.value, isNotNull);
-    DartObjectImpl value = result.value;
-    expect(value.isUnknown, isTrue);
-  }
-
-  Future<EvaluationResultImpl> _check_fromEnvironment_bool(
-      String valueInEnvironment, String defaultExpr) async {
-    String envVarName = "x";
-    String varName = "foo";
-    if (valueInEnvironment != null) {
-      if (enableNewAnalysisDriver) {
-        driver.declaredVariables =
-            new DeclaredVariables.fromMap({envVarName: valueInEnvironment});
-      } else {
-        (analysisContext2 as AnalysisContextImpl).declaredVariables =
-            new DeclaredVariables.fromMap({envVarName: valueInEnvironment});
-      }
-    }
-    String defaultArg =
-        defaultExpr == null ? "" : ", defaultValue: $defaultExpr";
-    CompilationUnit compilationUnit = await resolveSource(
-        "const $varName = const bool.fromEnvironment('$envVarName'$defaultArg);");
-    return _evaluateTopLevelVariable(compilationUnit, varName);
-  }
-
-  Future<EvaluationResultImpl> _check_fromEnvironment_int(
-      String valueInEnvironment, String defaultExpr) async {
-    String envVarName = "x";
-    String varName = "foo";
-    if (valueInEnvironment != null) {
-      if (enableNewAnalysisDriver) {
-        driver.declaredVariables =
-            new DeclaredVariables.fromMap({envVarName: valueInEnvironment});
-      } else {
-        (analysisContext2 as AnalysisContextImpl).declaredVariables =
-            new DeclaredVariables.fromMap({envVarName: valueInEnvironment});
-      }
-    }
-    String defaultArg =
-        defaultExpr == null ? "" : ", defaultValue: $defaultExpr";
-    CompilationUnit compilationUnit = await resolveSource(
-        "const $varName = const int.fromEnvironment('$envVarName'$defaultArg);");
-    return _evaluateTopLevelVariable(compilationUnit, varName);
-  }
-
-  Future<EvaluationResultImpl> _check_fromEnvironment_string(
-      String valueInEnvironment, String defaultExpr) async {
-    String envVarName = "x";
-    String varName = "foo";
-    if (valueInEnvironment != null) {
-      if (enableNewAnalysisDriver) {
-        driver.declaredVariables =
-            new DeclaredVariables.fromMap({envVarName: valueInEnvironment});
-      } else {
-        (analysisContext2 as AnalysisContextImpl).declaredVariables =
-            new DeclaredVariables.fromMap({envVarName: valueInEnvironment});
-      }
-    }
-    String defaultArg =
-        defaultExpr == null ? "" : ", defaultValue: $defaultExpr";
-    CompilationUnit compilationUnit = await resolveSource(
-        "const $varName = const String.fromEnvironment('$envVarName'$defaultArg);");
-    return _evaluateTopLevelVariable(compilationUnit, varName);
-  }
-
-  Future<Null> _checkInstanceCreation_withSupertypeParams(
-      bool isExplicit) async {
-    String superCall = isExplicit ? " : super()" : "";
-    CompilationUnit compilationUnit = await resolveSource("""
-class A<T> {
-  const A();
-}
-class B<T, U> extends A<T> {
-  const B()$superCall;
-}
-class C<T, U> extends A<U> {
-  const C()$superCall;
-}
-const b_int_num = const B<int, num>();
-const c_int_num = const C<int, num>();""");
-    EvaluationResultImpl b_int_num =
-        _evaluateTopLevelVariable(compilationUnit, "b_int_num");
-    Map<String, DartObjectImpl> b_int_num_fields =
-        _assertType(b_int_num, "B<int, num>");
-    _assertFieldType(b_int_num_fields, GenericState.SUPERCLASS_FIELD, "A<int>");
-    EvaluationResultImpl c_int_num =
-        _evaluateTopLevelVariable(compilationUnit, "c_int_num");
-    Map<String, DartObjectImpl> c_int_num_fields =
-        _assertType(c_int_num, "C<int, num>");
-    _assertFieldType(c_int_num_fields, GenericState.SUPERCLASS_FIELD, "A<num>");
-  }
-
-  Future<Null> _checkInstanceCreationOptionalParams(
-      bool isFieldFormal, bool isNamed, bool hasDefault) async {
-    String fieldName = "j";
-    String paramName = isFieldFormal ? fieldName : "i";
-    String formalParam =
-        "${isFieldFormal ? "this." : "int "}$paramName${hasDefault ? " = 3" : ""}";
-    CompilationUnit compilationUnit = await resolveSource("""
-const x = const A();
-const y = const A(${isNamed ? '$paramName: ' : ''}10);
-class A {
-  const A(${isNamed ? "{$formalParam}" : "[$formalParam]"})${isFieldFormal ? "" : " : $fieldName = $paramName"};
-  final int $fieldName;
-}""");
-    EvaluationResultImpl x = _evaluateTopLevelVariable(compilationUnit, "x");
-    Map<String, DartObjectImpl> fieldsOfX = _assertType(x, "A");
-    expect(fieldsOfX, hasLength(1));
-    if (hasDefault) {
-      _assertIntField(fieldsOfX, fieldName, 3);
-    } else {
-      _assertNullField(fieldsOfX, fieldName);
-    }
-    EvaluationResultImpl y = _evaluateTopLevelVariable(compilationUnit, "y");
-    Map<String, DartObjectImpl> fieldsOfY = _assertType(y, "A");
-    expect(fieldsOfY, hasLength(1));
-    _assertIntField(fieldsOfY, fieldName, 10);
-  }
-
-  /**
-   * Search [compilationUnit] for a class named [className], containing a
-   * method [methodName], with exactly one annotation.  Return the constant
-   * value of the annotation.
-   */
-  EvaluationResultImpl _evaluateAnnotation(
-      CompilationUnit compilationUnit, String className, String memberName) {
-    for (CompilationUnitMember member in compilationUnit.declarations) {
-      if (member is ClassDeclaration && member.name.name == className) {
-        for (ClassMember classMember in member.members) {
-          if (classMember is MethodDeclaration &&
-              classMember.name.name == memberName) {
-            expect(classMember.metadata, hasLength(1));
-            ElementAnnotationImpl elementAnnotation =
-                classMember.metadata[0].elementAnnotation;
-            return elementAnnotation.evaluationResult;
-          }
-        }
-      }
-    }
-    fail('Class member not found');
-  }
-
-  EvaluationResultImpl _evaluateTopLevelVariable(
-      CompilationUnit compilationUnit, String name) {
-    VariableDeclaration varDecl =
-        findTopLevelDeclaration(compilationUnit, name);
-    ConstTopLevelVariableElementImpl varElement = varDecl.declaredElement;
-    return varElement.evaluationResult;
-  }
-
-  ConstantValueComputer _makeConstantValueComputer() {
-    ConstantEvaluationValidator_ForTest validator =
-        new ConstantEvaluationValidator_ForTest(analysisContext2);
-    validator.computer = new ConstantValueComputer(
-        analysisContext2.typeProvider,
-        analysisContext2.declaredVariables,
-        validator,
-        analysisContext2.typeSystem);
-    return validator.computer;
-  }
-
-  void _validate(bool shouldBeValid, VariableDeclarationList declarationList) {
-    for (VariableDeclaration declaration in declarationList.variables) {
-      VariableElementImpl element =
-          declaration.declaredElement as VariableElementImpl;
-      expect(element, isNotNull);
-      EvaluationResultImpl result = element.evaluationResult;
-      if (shouldBeValid) {
-        expect(result.value, isNotNull);
-      } else {
-        expect(result.value, isNull);
-      }
-    }
-  }
-}
-
 @reflectiveTest
 class ConstantVisitorTest extends ResolverTestCase {
   test_visitBinaryExpression_questionQuestion_notNull_notNull() async {
@@ -1699,11 +227,3 @@
     return result;
   }
 }
-
-@reflectiveTest
-class StrongConstantValueComputerTest extends ConstantValueComputerTest {
-  void setUp() {
-    super.setUp();
-    reset();
-  }
-}
diff --git a/pkg/analyzer/test/src/dart/constant/utilities_test.dart b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
index 3a195fb..96a3968 100644
--- a/pkg/analyzer/test/src/dart/constant/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
-import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -275,14 +274,8 @@
 
 @reflectiveTest
 class ReferenceFinderTest {
-  DirectedGraph<ConstantEvaluationTarget> _referenceGraph;
-  VariableElement _head;
   Element _tail;
-
-  void setUp() {
-    _referenceGraph = new DirectedGraph<ConstantEvaluationTarget>();
-    _head = ElementFactory.topLevelVariableElement2("v1");
-  }
+  List<ConstantEvaluationTarget> _dependencies = [];
 
   void test_visitSimpleIdentifier_const() {
     _visitNode(_makeTailVariable("v2", true));
@@ -307,20 +300,14 @@
   }
 
   void _assertNoArcs() {
-    Set<ConstantEvaluationTarget> tails = _referenceGraph.getTails(_head);
-    expect(tails, hasLength(0));
+    expect(_dependencies, isEmpty);
   }
 
   void _assertOneArc(Element tail) {
-    Set<ConstantEvaluationTarget> tails = _referenceGraph.getTails(_head);
-    expect(tails, hasLength(1));
-    expect(tails.first, same(tail));
+    expect(_dependencies, hasLength(1));
+    expect(_dependencies[0], same(tail));
   }
 
-  ReferenceFinder _createReferenceFinder(ConstantEvaluationTarget source) =>
-      new ReferenceFinder((ConstantEvaluationTarget dependency) {
-        _referenceGraph.addEdge(source, dependency);
-      });
   SuperConstructorInvocation _makeTailSuperConstructorInvocation(
       String name, bool isConst) {
     List<ConstructorInitializer> initializers =
@@ -356,7 +343,10 @@
   }
 
   void _visitNode(AstNode node) {
-    node.accept(_createReferenceFinder(_head));
+    var referenceFinder = new ReferenceFinder((dependency) {
+      _dependencies.add(dependency);
+    });
+    node.accept(referenceFinder);
   }
 }
 
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 f96c9a5..b4978ae 100644
--- a/pkg/analyzer/test/src/dart/element/function_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/function_type_test.dart
@@ -87,6 +87,7 @@
       mapType.instantiate([keyType, valueType]);
 
   test_forInstantiatedTypedef_bothTypeParameters() {
+    // typedef F<T> = Map<T, U> Function<U>();
     var t = new MockTypeParameterElement('T');
     var u = new MockTypeParameterElement('U');
     var e = new MockGenericTypeAliasElement('F',
@@ -95,6 +96,8 @@
         returnType: mapOf(t.type, u.type));
     FunctionType f =
         new FunctionTypeImpl.forTypedef(e, typeArguments: [objectType]);
+    // Note: forTypedef returns the type `() -> Map<Object, U>`.
+    // See https://github.com/dart-lang/sdk/issues/34657.
     basicChecks(f,
         element: same(e),
         displayName: 'F<Object>',
@@ -104,11 +107,48 @@
         returnType: mapOf(objectType, u.type));
   }
 
+  test_forInstantiatedTypedef_bothTypeParameters_noTypeArgs() {
+    // typedef F<T> = Map<T, U> Function<U>();
+    var t = new MockTypeParameterElement('T');
+    var u = new MockTypeParameterElement('U');
+    var e = new MockGenericTypeAliasElement('F',
+        typeParameters: [t],
+        innerTypeParameters: [u],
+        returnType: mapOf(t.type, u.type));
+    FunctionType f = new FunctionTypeImpl.forTypedef(e);
+    // Note: forTypedef returns the type `<T>() -> Map<T, U>`.
+    // See https://github.com/dart-lang/sdk/issues/34657.
+    basicChecks(f,
+        element: same(e),
+        displayName: 'F',
+        name: 'F',
+        typeFormals: [same(t)],
+        returnType: mapOf(t.type, u.type));
+  }
+
   test_forInstantiatedTypedef_innerTypeParameter() {
+    // typedef F = T F<T>();
     var t = new MockTypeParameterElement('T');
     var e = new MockGenericTypeAliasElement('F',
         innerTypeParameters: [t], returnType: t.type);
     FunctionType f = new FunctionTypeImpl.forTypedef(e, typeArguments: []);
+    // Note: forTypedef returns the type `() -> T`.
+    // See https://github.com/dart-lang/sdk/issues/34657.
+    basicChecks(f,
+        element: same(e),
+        displayName: 'F',
+        name: 'F',
+        returnType: same(t.type));
+  }
+
+  test_forInstantiatedTypedef_innerTypeParameter_noTypeArgs() {
+    // typedef F = T F<T>();
+    var t = new MockTypeParameterElement('T');
+    var e = new MockGenericTypeAliasElement('F',
+        innerTypeParameters: [t], returnType: t.type);
+    FunctionType f = new FunctionTypeImpl.forTypedef(e);
+    // Note: forTypedef returns the type `() -> T`.
+    // See https://github.com/dart-lang/sdk/issues/34657.
     basicChecks(f,
         element: same(e),
         displayName: 'F',
@@ -117,17 +157,29 @@
   }
 
   test_forInstantiatedTypedef_noTypeParameters() {
+    // typedef F = void Function();
     var e = new MockGenericTypeAliasElement('F');
     FunctionType f = new FunctionTypeImpl.forTypedef(e, typeArguments: []);
+    // Note: forTypedef returns the type `() -> void`.
+    basicChecks(f, element: same(e), displayName: 'F', name: 'F');
+  }
+
+  test_forInstantiatedTypedef_noTypeParameters_noTypeArgs() {
+    // typedef F = void Function();
+    var e = new MockGenericTypeAliasElement('F');
+    FunctionType f = new FunctionTypeImpl.forTypedef(e);
+    // Note: forTypedef returns the type `() -> void`.
     basicChecks(f, element: same(e), displayName: 'F', name: 'F');
   }
 
   test_forInstantiatedTypedef_outerTypeParameters() {
+    // typedef F<T> = T Function();
     var t = new MockTypeParameterElement('T');
     var e = new MockGenericTypeAliasElement('F',
         typeParameters: [t], returnType: t.type);
     FunctionType f =
         new FunctionTypeImpl.forTypedef(e, typeArguments: [objectType]);
+    // Note: forTypedef returns the type `() -> Object`.
     basicChecks(f,
         element: same(e),
         displayName: 'F<Object>',
@@ -137,6 +189,22 @@
         returnType: same(objectType));
   }
 
+  test_forInstantiatedTypedef_outerTypeParameters_noTypeArgs() {
+    // typedef F<T> = T Function();
+    var t = new MockTypeParameterElement('T');
+    var e = new MockGenericTypeAliasElement('F',
+        typeParameters: [t], returnType: t.type);
+    FunctionType f = new FunctionTypeImpl.forTypedef(e);
+    // Note: forTypedef returns the type `<T>() -> T`.
+    // See https://github.com/dart-lang/sdk/issues/34657.
+    basicChecks(f,
+        element: same(e),
+        displayName: 'F',
+        name: 'F',
+        typeFormals: [same(t)],
+        returnType: same(t.type));
+  }
+
   test_forTypedef() {
     var e = new MockGenericTypeAliasElement('F');
     basicChecks(e.type, element: same(e), displayName: 'F', name: 'F');
@@ -1277,4 +1345,7 @@
   noSuchMethod(Invocation invocation) {
     return super.noSuchMethod(invocation);
   }
+
+  @override
+  toString() => name;
 }
diff --git a/pkg/analyzer/test/src/dart/element/inheritance_manager2_test.dart b/pkg/analyzer/test/src/dart/element/inheritance_manager2_test.dart
new file mode 100644
index 0000000..ee760b5
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/element/inheritance_manager2_test.dart
@@ -0,0 +1,57 @@
+// 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/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../analysis/base.dart';
+import '../resolution/find_element.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InheritanceManager2Test);
+  });
+}
+
+@reflectiveTest
+class InheritanceManager2Test extends BaseAnalysisDriverTest {
+  AnalysisResult result;
+  FindElement findElement;
+  InheritanceManager2 manager;
+
+  TypeProvider get typeProvider =>
+      result.unit.declaredElement.context.typeProvider;
+
+  Future resolveTestFile() async {
+    result = await driver.getResult(testFile);
+    findElement = new FindElement(result.unit);
+    manager =
+        new InheritanceManager2(result.unit.declaredElement.context.typeSystem);
+  }
+
+  void test_computeNode_ClassDeclaration() async {
+    addTestFile('''
+abstract class I1 {
+  void f(int i);
+}
+abstract class I2 {
+  void f(Object o);
+}
+abstract class C implements I1, I2 {}
+''');
+    await resolveTestFile();
+    ClassElement c = findElement.class_('C');
+    FunctionType memberType =
+        manager.getMember(c.type, new Name(c.library.source.uri, 'f'));
+    expect(memberType, isNotNull);
+    expect(memberType.parameters, hasLength(1));
+    DartType parameterType = memberType.parameters[0].type;
+    expect(parameterType.name, 'Object');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/element/test_all.dart b/pkg/analyzer/test/src/dart/element/test_all.dart
index b2a1b2e..f75596d 100644
--- a/pkg/analyzer/test/src/dart/element/test_all.dart
+++ b/pkg/analyzer/test/src/dart/element/test_all.dart
@@ -2,17 +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.
 
-library analyzer.test.src.dart.element.test_all;
-
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'element_test.dart' as element;
 import 'function_type_test.dart' as function_type;
+import 'inheritance_manager2_test.dart' as inheritance_manager2;
 
 /// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
     element.main();
     function_type.main();
+    inheritance_manager2.main();
   }, name: 'element');
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
index 02afc12..a0cc4ee 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -1291,7 +1291,7 @@
     expect(method.isStatic, isTrue);
   }
 
-  test_inconsistentMethodInheritance_parameterType() async {
+  test_inconsistentInheritance_parameterType() async {
     addTestFile(r'''
 abstract class A {
   x(int i);
@@ -1303,11 +1303,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
 
-  test_inconsistentMethodInheritance_requiredParameters() async {
+  test_inconsistentInheritance_requiredParameters() async {
     addTestFile(r'''
 abstract class A {
   x();
@@ -1319,11 +1319,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
 
-  test_inconsistentMethodInheritance_returnType() async {
+  test_inconsistentInheritance_returnType() async {
     addTestFile(r'''
 abstract class A {
   int x();
@@ -1335,11 +1335,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
 
-  test_inconsistentMethodInheritanceGetterAndMethod_getter_method() async {
+  test_inconsistentInheritanceGetterAndMethod_getter_method() async {
     addTestFile(r'''
 abstract class A {
   int get x;
@@ -1351,11 +1351,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
     ]);
   }
 
-  test_inconsistentMethodInheritanceGetterAndMethod_method_getter() async {
+  test_inconsistentInheritanceGetterAndMethod_method_getter() async {
     addTestFile(r'''
 abstract class A {
   int x();
@@ -1367,7 +1367,7 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
     ]);
   }
 
@@ -1482,7 +1482,9 @@
     await resolveTestFile();
     assertTestErrors([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
+      StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
     ]);
   }
 
@@ -1539,7 +1541,6 @@
     assertTestErrors([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS,
       StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
-      StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE
     ]);
   }
 
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 ddcfe34..a9896de 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -42,6 +42,7 @@
       findElement.class_('Foo'),
       'Foo<int>',
       constructorName: 'bar',
+      expectedConstructorMember: true,
     );
   }
 
@@ -71,6 +72,7 @@
       import.importedLibrary.getType('Foo'),
       'Foo<int>',
       constructorName: 'bar',
+      expectedConstructorMember: true,
       expectedPrefix: import.prefix,
     );
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index 52d0187..df7494a 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -1046,6 +1046,28 @@
     assertNoTestErrors();
   }
 
+  test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_super_covariant() async {
+    addTestFile(r'''
+class A {
+  bar(num n) {}
+}
+
+mixin M on A {
+  test() {
+    super.bar(3.14);
+  }
+}
+
+class B implements A {
+  bar(covariant int i) {}
+}
+
+class C extends B with M {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
   test_error_mixinApplicationNoConcreteSuperInvokedMember_setter() async {
     addTestFile(r'''
 abstract class A {
@@ -1423,7 +1445,7 @@
     assertTypeName(bRef, findElement.class_('B'), 'B');
   }
 
-  test_inconsistentMethodInheritance_implements_parameterType() async {
+  test_inconsistentInheritance_implements_parameterType() async {
     addTestFile(r'''
 abstract class A {
   x(int i);
@@ -1435,11 +1457,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
 
-  test_inconsistentMethodInheritance_implements_requiredParameters() async {
+  test_inconsistentInheritance_implements_requiredParameters() async {
     addTestFile(r'''
 abstract class A {
   x();
@@ -1451,11 +1473,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
 
-  test_inconsistentMethodInheritance_implements_returnType() async {
+  test_inconsistentInheritance_implements_returnType() async {
     addTestFile(r'''
 abstract class A {
   int x();
@@ -1467,11 +1489,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
 
-  test_inconsistentMethodInheritance_on_parameterType() async {
+  test_inconsistentInheritance_on_parameterType() async {
     addTestFile(r'''
 abstract class A {
   x(int i);
@@ -1483,11 +1505,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
 
-  test_inconsistentMethodInheritance_on_requiredParameters() async {
+  test_inconsistentInheritance_on_requiredParameters() async {
     addTestFile(r'''
 abstract class A {
   x();
@@ -1499,11 +1521,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
 
-  test_inconsistentMethodInheritance_on_returnType() async {
+  test_inconsistentInheritance_on_returnType() async {
     addTestFile(r'''
 abstract class A {
   int x();
@@ -1515,11 +1537,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
 
-  test_inconsistentMethodInheritanceGetterAndMethod_implements_getter_method() async {
+  test_inconsistentInheritanceGetterAndMethod_implements_getter_method() async {
     addTestFile(r'''
 abstract class A {
   int get x;
@@ -1531,11 +1553,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
     ]);
   }
 
-  test_inconsistentMethodInheritanceGetterAndMethod_implements_method_getter() async {
+  test_inconsistentInheritanceGetterAndMethod_implements_method_getter() async {
     addTestFile(r'''
 abstract class A {
   int x();
@@ -1547,11 +1569,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
     ]);
   }
 
-  test_inconsistentMethodInheritanceGetterAndMethod_on_getter_method() async {
+  test_inconsistentInheritanceGetterAndMethod_on_getter_method() async {
     addTestFile(r'''
 abstract class A {
   int get x;
@@ -1563,11 +1585,11 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
     ]);
   }
 
-  test_inconsistentMethodInheritanceGetterAndMethod_on_method_getter() async {
+  test_inconsistentInheritanceGetterAndMethod_on_method_getter() async {
     addTestFile(r'''
 abstract class A {
   int x();
@@ -1579,7 +1601,31 @@
 ''');
     await resolveTestFile();
     assertTestErrors([
-      StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
+      CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
+    ]);
+  }
+
+  test_invalid_unresolved_before_mixin() async {
+    addTestFile(r'''
+abstract class A {
+  int foo();
+}
+
+mixin M on A {
+  void bar() {
+    super.foo();
+  }
+}
+
+abstract class X extends A with U1, U2, M {}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
+      CompileTimeErrorCode.MIXIN_OF_NON_CLASS,
+      CompileTimeErrorCode.MIXIN_OF_NON_CLASS,
+      StaticWarningCode.UNDEFINED_CLASS,
+      StaticWarningCode.UNDEFINED_CLASS,
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
new file mode 100644
index 0000000..6b9d107
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
@@ -0,0 +1,161 @@
+// 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/element/element.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+import 'resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(OptionalConstDriverResolutionTest);
+  });
+}
+
+@reflectiveTest
+class OptionalConstDriverResolutionTest extends DriverResolutionTest
+    with OptionalConstMixin {}
+
+abstract class OptionalConstMixin implements ResolutionTest {
+  Map<String, LibraryElement> libraries = {};
+
+  LibraryElement get libraryA => libraries['package:test/a.dart'];
+
+  test_instantiateToBounds_notPrefixed_named() async {
+    var creation = await _resolveImplicitConst('B.named()');
+    assertInstanceCreation(
+      creation,
+      libraryA.getType('B'),
+      'B<num>',
+      constructorName: 'named',
+      expectedConstructorMember: true,
+    );
+  }
+
+  test_instantiateToBounds_notPrefixed_unnamed() async {
+    var creation = await _resolveImplicitConst('B()');
+    assertInstanceCreation(
+      creation,
+      libraryA.getType('B'),
+      'B<num>',
+      expectedConstructorMember: true,
+    );
+  }
+
+  test_instantiateToBounds_prefixed_named() async {
+    var creation = await _resolveImplicitConst('p.B.named()', prefix: 'p');
+    assertInstanceCreation(
+      creation,
+      libraryA.getType('B'),
+      'B<num>',
+      constructorName: 'named',
+      expectedConstructorMember: true,
+    );
+  }
+
+  test_instantiateToBounds_prefixed_unnamed() async {
+    var creation = await _resolveImplicitConst('p.B()', prefix: 'p');
+    assertInstanceCreation(
+      creation,
+      libraryA.getType('B'),
+      'B<num>',
+      expectedConstructorMember: true,
+    );
+  }
+
+  test_notPrefixed_named() async {
+    var creation = await _resolveImplicitConst('A.named()');
+    assertInstanceCreation(
+      creation,
+      libraryA.getType('A'),
+      'A',
+      constructorName: 'named',
+    );
+  }
+
+  test_notPrefixed_unnamed() async {
+    var creation = await _resolveImplicitConst('A()');
+    assertInstanceCreation(
+      creation,
+      libraryA.getType('A'),
+      'A',
+    );
+  }
+
+  test_prefixed_named() async {
+    var creation = await _resolveImplicitConst('p.A.named()', prefix: 'p');
+    // Note, that we don't resynthesize the import prefix.
+    assertInstanceCreation(
+      creation,
+      libraryA.getType('A'),
+      'A',
+      constructorName: 'named',
+    );
+  }
+
+  test_prefixed_unnamed() async {
+    var creation = await _resolveImplicitConst('p.A()', prefix: 'p');
+    // Note, that we don't resynthesize the import prefix.
+    assertInstanceCreation(
+      creation,
+      libraryA.getType('A'),
+      'A',
+    );
+  }
+
+  void _fillLibraries([LibraryElement library]) {
+    library ??= result.unit.declaredElement.library;
+    var uriStr = library.source.uri.toString();
+    if (!libraries.containsKey(uriStr)) {
+      libraries[uriStr] = library;
+      library.importedLibraries.forEach(_fillLibraries);
+    }
+  }
+
+  Future<InstanceCreationExpression> _resolveImplicitConst(String expr,
+      {String prefix}) async {
+    newFile('/test/lib/a.dart', content: '''
+class A {
+  const A();
+  const A.named();
+}
+class B<T extends num> {
+  const B();
+  const B.named();
+}
+''');
+
+    if (prefix != null) {
+      newFile('/test/lib/b.dart', content: '''
+import 'a.dart' as $prefix;
+const a = $expr;
+''');
+    } else {
+      newFile('/test/lib/b.dart', content: '''
+import 'a.dart';
+const a = $expr;
+''');
+    }
+
+    addTestFile(r'''
+import 'b.dart';
+var v = a;
+''');
+    await resolveTestFile();
+    _fillLibraries();
+
+    PropertyAccessorElement vg = findNode.simple('a;').staticElement;
+    var v = vg.variable as ConstVariableElement;
+
+    InstanceCreationExpression creation = v.constantInitializer;
+    expect(creation.keyword.keyword, Keyword.CONST);
+
+    return creation;
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 27ee8fb..5f220e8 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/dart/element/handle.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
@@ -69,6 +70,7 @@
 
   void assertElement(AstNode node, Element expected) {
     Element actual = getNodeElement(node);
+    actual = _unwrapHandle(actual);
     expect(actual, same(expected));
   }
 
@@ -158,7 +160,9 @@
 
   void assertInstanceCreation(InstanceCreationExpression creation,
       ClassElement expectedClassElement, String expectedType,
-      {String constructorName, PrefixElement expectedPrefix}) {
+      {String constructorName,
+      bool expectedConstructorMember: false,
+      PrefixElement expectedPrefix}) {
     String expectedClassName = expectedClassElement.name;
 
     ConstructorElement expectedConstructorElement;
@@ -177,10 +181,18 @@
     }
 
     var actualConstructorElement = getNodeElement(creation);
-    if (actualConstructorElement is ConstructorMember) {
+    if (creation.constructorName.name != null) {
+      expect(
+        creation.constructorName.name.staticElement,
+        same(actualConstructorElement),
+      );
+    }
+
+    if (expectedConstructorMember) {
+      expect(actualConstructorElement, const TypeMatcher<Member>());
       assertMember(creation, expectedType, expectedConstructorElement);
     } else {
-      assertElement(creation, actualConstructorElement);
+      assertElement(creation, expectedConstructorElement);
     }
 
     assertType(creation, expectedType);
@@ -302,6 +314,13 @@
   }
 
   void setAnalysisOptions({bool enableSuperMixins});
+
+  Element _unwrapHandle(Element element) {
+    if (element is ElementHandle && element is! Member) {
+      return element.actualElement;
+    }
+    return element;
+  }
 }
 
 class TestAnalysisResult {
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index 744c8d9..f0c2ee6 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -6,6 +6,7 @@
 
 import 'assignment_test.dart' as assignment_test;
 import 'class_test.dart' as class_test;
+import 'optional_const_test.dart' as optional_const_test;
 import 'enum_test.dart' as enum_test;
 import 'for_in_test.dart' as for_in_test;
 import 'generic_type_alias_test.dart' as generic_type_alias_test;
@@ -30,6 +31,7 @@
     instance_member_inference_class_test.main();
     instance_member_inference_mixin_test.main();
     mixin_test.main();
+    optional_const_test.main();
     top_type_inference_test.main();
   }, name: 'resolution');
 }
diff --git a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
index 7f1a7c5..f0e1f65 100644
--- a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
+++ b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
@@ -5,7 +5,6 @@
 library analyzer.test.generated.sdk_test;
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/context/builder.dart' show EmbedderYamlLocator;
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -13,6 +12,7 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/summarize_elements.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -112,12 +112,7 @@
 }
 
 @reflectiveTest
-class FolderBasedDartSdkTest {
-  /**
-   * The resource provider used by these tests.
-   */
-  MemoryResourceProvider resourceProvider;
-
+class FolderBasedDartSdkTest extends Object with ResourceProviderMixin {
   void test_addExtensions() {
     FolderBasedDartSdk sdk = _createDartSdk();
     String uri = 'dart:my.internal';
@@ -154,10 +149,7 @@
 
   void test_fromFile_invalid() {
     FolderBasedDartSdk sdk = _createDartSdk();
-    expect(
-        sdk.fromFileUri(
-            resourceProvider.getFile("/not/in/the/sdk.dart").toUri()),
-        isNull);
+    expect(sdk.fromFileUri(getFile("/not/in/the/sdk.dart").toUri()), isNull);
   }
 
   void test_fromFile_library() {
@@ -264,9 +256,7 @@
   }
 
   FolderBasedDartSdk _createDartSdk() {
-    resourceProvider = new MemoryResourceProvider();
-    Folder sdkDirectory =
-        resourceProvider.getFolder(resourceProvider.convertPath('/sdk'));
+    Folder sdkDirectory = getFolder('/sdk');
     _createFile(sdkDirectory,
         ['lib', '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'],
         content: _librariesFileContent());
@@ -292,7 +282,7 @@
       parent = parent.getChildAssumingFolder(segments[i]);
     }
     File file = parent.getChildAssumingFile(segments[last]);
-    resourceProvider.newFile(file.path, content);
+    newFile(file.path, content: content);
   }
 
   String _librariesFileContent() => '''
@@ -327,14 +317,9 @@
 }
 
 @reflectiveTest
-class SdkExtensionFinderTest {
-  MemoryResourceProvider resourceProvider;
-
+class SdkExtensionFinderTest extends Object with ResourceProviderMixin {
   void setUp() {
-    resourceProvider = new MemoryResourceProvider();
-    resourceProvider.newFolder(resourceProvider.convertPath('/empty'));
-    resourceProvider.newFolder(resourceProvider.convertPath('/tmp'));
-    resourceProvider.newFile(resourceProvider.convertPath('/tmp/_sdkext'), r'''
+    newFile('/tmp/_sdkext', content: r'''
 {
   "dart:fox": "slippy.dart",
   "dart:bear": "grizzly.dart",
@@ -346,9 +331,7 @@
 
   test_create_noSdkExtPackageMap() {
     var resolver = new SdkExtensionFinder({
-      'fox': <Folder>[
-        resourceProvider.getResource(resourceProvider.convertPath('/empty'))
-      ]
+      'fox': <Folder>[getFolder('/empty')]
     });
     expect(resolver.urlMappings.length, equals(0));
   }
@@ -360,40 +343,25 @@
 
   test_create_sdkExtPackageMap() {
     var resolver = new SdkExtensionFinder({
-      'fox': <Folder>[
-        resourceProvider.getResource(resourceProvider.convertPath('/tmp'))
-      ]
+      'fox': <Folder>[getFolder('/tmp')]
     });
     // We have four mappings.
     Map<String, String> urlMappings = resolver.urlMappings;
     expect(urlMappings.length, equals(4));
     // Check that they map to the correct paths.
-    expect(urlMappings['dart:fox'],
-        equals(resourceProvider.convertPath("/tmp/slippy.dart")));
-    expect(urlMappings['dart:bear'],
-        equals(resourceProvider.convertPath("/tmp/grizzly.dart")));
-    expect(urlMappings['dart:relative'],
-        equals(resourceProvider.convertPath("/relative.dart")));
+    expect(urlMappings['dart:fox'], equals(convertPath("/tmp/slippy.dart")));
+    expect(urlMappings['dart:bear'], equals(convertPath("/tmp/grizzly.dart")));
+    expect(urlMappings['dart:relative'], equals(convertPath("/relative.dart")));
     expect(urlMappings['dart:deep'],
-        equals(resourceProvider.convertPath("/tmp/deep/directory/file.dart")));
+        equals(convertPath("/tmp/deep/directory/file.dart")));
   }
 }
 
 @reflectiveTest
-class SdkLibrariesReaderTest extends EngineTestCase {
-  /**
-   * The resource provider used by these tests.
-   */
-  MemoryResourceProvider resourceProvider;
-
-  @override
-  void setUp() {
-    resourceProvider = new MemoryResourceProvider();
-  }
-
+class SdkLibrariesReaderTest extends EngineTestCase with ResourceProviderMixin {
   void test_readFrom_dart2js() {
-    LibraryMap libraryMap = new SdkLibrariesReader(true)
-        .readFromFile(resourceProvider.getFile("/libs.dart"), r'''
+    LibraryMap libraryMap =
+        new SdkLibrariesReader(true).readFromFile(getFile("/libs.dart"), r'''
 final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
   'first' : const LibraryInfo(
     'first/first.dart',
@@ -416,15 +384,15 @@
   }
 
   void test_readFrom_empty() {
-    LibraryMap libraryMap = new SdkLibrariesReader(false)
-        .readFromFile(resourceProvider.getFile("/libs.dart"), "");
+    LibraryMap libraryMap =
+        new SdkLibrariesReader(false).readFromFile(getFile("/libs.dart"), "");
     expect(libraryMap, isNotNull);
     expect(libraryMap.size(), 0);
   }
 
   void test_readFrom_normal() {
-    LibraryMap libraryMap = new SdkLibrariesReader(false)
-        .readFromFile(resourceProvider.getFile("/libs.dart"), r'''
+    LibraryMap libraryMap =
+        new SdkLibrariesReader(false).readFromFile(getFile("/libs.dart"), r'''
 final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
   'first' : const LibraryInfo(
     'first/first.dart',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
index af6f438..e932751 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
@@ -27,6 +27,17 @@
           new TestDescriptor('named', 'class A',
               [ParserErrorCode.MISSING_CLASS_BODY], 'class A {}'),
           new TestDescriptor(
+              'extend',
+              'class A extend',
+              [
+                ParserErrorCode.EXPECTED_INSTEAD,
+                ParserErrorCode.EXPECTED_TYPE_NAME,
+                ParserErrorCode.MISSING_CLASS_BODY
+              ],
+              'class A extend _s_ {}',
+              expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_INSTEAD],
+              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+          new TestDescriptor(
               'extends',
               'class A extends',
               [
@@ -35,6 +46,17 @@
               ],
               'class A extends _s_ {}',
               failing: ['functionVoid', 'functionNonVoid', 'getter']),
+          new TestDescriptor(
+              'on',
+              'class A on',
+              [
+                ParserErrorCode.EXPECTED_INSTEAD,
+                ParserErrorCode.EXPECTED_TYPE_NAME,
+                ParserErrorCode.MISSING_CLASS_BODY
+              ],
+              'class A on _s_ {}',
+              expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_INSTEAD],
+              failing: ['functionVoid', 'functionNonVoid', 'getter']),
           new TestDescriptor('extendsBody', 'class A extends {}',
               [ParserErrorCode.EXPECTED_TYPE_NAME], 'class A extends _s_ {}'),
           new TestDescriptor(
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart
index e2e5d7b..33fe03f 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart
@@ -35,6 +35,28 @@
               ],
               'mixin A on _s_ {}',
               failing: ['functionVoid', 'functionNonVoid', 'getter']),
+          new TestDescriptor(
+              'extend',
+              'mixin A extend',
+              [
+                ParserErrorCode.EXPECTED_INSTEAD,
+                ParserErrorCode.EXPECTED_TYPE_NAME,
+                ParserErrorCode.MISSING_CLASS_BODY
+              ],
+              'mixin A extend _s_ {}',
+              expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_INSTEAD],
+              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+          new TestDescriptor(
+              'extends',
+              'mixin A extends',
+              [
+                ParserErrorCode.EXPECTED_INSTEAD,
+                ParserErrorCode.EXPECTED_TYPE_NAME,
+                ParserErrorCode.MISSING_CLASS_BODY
+              ],
+              'mixin A extends _s_ {}',
+              expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_INSTEAD],
+              failing: ['functionVoid', 'functionNonVoid', 'getter']),
           new TestDescriptor('onBody', 'mixin A on {}',
               [ParserErrorCode.EXPECTED_TYPE_NAME], 'mixin A on _s_ {}'),
           new TestDescriptor(
diff --git a/pkg/analyzer/test/src/source/source_resource_test.dart b/pkg/analyzer/test/src/source/source_resource_test.dart
index cde9868..abf46f6 100644
--- a/pkg/analyzer/test/src/source/source_resource_test.dart
+++ b/pkg/analyzer/test/src/source/source_resource_test.dart
@@ -3,7 +3,6 @@
 // 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:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/java_engine_io.dart';
@@ -11,6 +10,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/source/source_resource.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -23,26 +23,24 @@
 }
 
 @reflectiveTest
-class FileSourceTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class FileSourceTest extends Object with ResourceProviderMixin {
   void test_equals_false_differentFiles() {
-    File file1 = resourceProvider.getFile("/does/not/exist1.dart");
-    File file2 = resourceProvider.getFile("/does/not/exist2.dart");
+    File file1 = getFile("/does/not/exist1.dart");
+    File file2 = getFile("/does/not/exist2.dart");
     FileSource source1 = new FileSource(file1);
     FileSource source2 = new FileSource(file2);
     expect(source1 == source2, isFalse);
   }
 
   void test_equals_false_null() {
-    File file = resourceProvider.getFile("/does/not/exist1.dart");
+    File file = getFile("/does/not/exist1.dart");
     FileSource source1 = new FileSource(file);
     expect(source1 == null, isFalse);
   }
 
   void test_equals_true() {
-    File file1 = resourceProvider.getFile("/does/not/exist.dart");
-    File file2 = resourceProvider.getFile("/does/not/exist.dart");
+    File file1 = getFile("/does/not/exist.dart");
+    File file2 = getFile("/does/not/exist.dart");
     FileSource source1 = new FileSource(file1);
     FileSource source2 = new FileSource(file2);
     expect(source1 == source2, isTrue);
@@ -92,28 +90,26 @@
   void test_getEncoding() {
     SourceFactory factory =
         new SourceFactory([new ResourceUriResolver(resourceProvider)]);
-    String fullPath = resourceProvider.convertPath("/does/not/exist.dart");
-    File file = resourceProvider.getFile(fullPath);
+    File file = getFile("/does/not/exist.dart");
     FileSource source = new FileSource(file);
     expect(factory.fromEncoding(source.encoding), source);
   }
 
   void test_getFullName() {
-    String fullPath = "/does/not/exist.dart";
-    File file = resourceProvider.getFile(fullPath);
+    File file = getFile("/does/not/exist.dart");
     FileSource source = new FileSource(file);
     expect(source.fullName, file.path);
   }
 
   void test_getShortName() {
-    File file = resourceProvider.getFile("/does/not/exist.dart");
+    File file = getFile("/does/not/exist.dart");
     FileSource source = new FileSource(file);
     expect(source.shortName, "exist.dart");
   }
 
   void test_hashCode() {
-    File file1 = resourceProvider.getFile("/does/not/exist.dart");
-    File file2 = resourceProvider.getFile("/does/not/exist.dart");
+    File file1 = getFile("/does/not/exist.dart");
+    File file2 = getFile("/does/not/exist.dart");
     FileSource source1 = new FileSource(file1);
     FileSource source2 = new FileSource(file2);
     expect(source2.hashCode, source1.hashCode);
@@ -134,7 +130,7 @@
   }
 
   void test_isInSystemLibrary_false() {
-    File file = resourceProvider.getFile("/does/not/exist.dart");
+    File file = getFile("/does/not/exist.dart");
     FileSource source = new FileSource(file);
     expect(source, isNotNull);
     expect(source.fullName, file.path);
@@ -143,8 +139,7 @@
 
   void test_issue14500() {
     // see https://code.google.com/p/dart/issues/detail?id=14500
-    FileSource source =
-        new FileSource(resourceProvider.getFile("/some/packages/foo:bar.dart"));
+    FileSource source = new FileSource(getFile("/some/packages/foo:bar.dart"));
     expect(source, isNotNull);
     expect(source.exists(), isFalse);
   }
@@ -156,7 +151,7 @@
       // this test.
       return;
     }
-    File file = resourceProvider.getFile("/a/b/test.dart");
+    File file = getFile("/a/b/test.dart");
     FileSource source = new FileSource(file);
     expect(source, isNotNull);
     Uri relative = resolveRelativeUri(source.uri, Uri.parse("lib.dart"));
@@ -171,7 +166,7 @@
       // this test.
       return;
     }
-    File file = resourceProvider.getFile("/a/b/test.dart");
+    File file = getFile("/a/b/test.dart");
     FileSource source = new FileSource(file);
     expect(source, isNotNull);
     Uri relative = resolveRelativeUri(source.uri, Uri.parse("c/lib.dart"));
@@ -185,7 +180,7 @@
       // believe is not consistent across all machines that might run this test.
       return;
     }
-    File file = resourceProvider.getFile("/a/b/test.dart");
+    File file = getFile("/a/b/test.dart");
     FileSource source = new FileSource(file);
     expect(source, isNotNull);
     Uri relative = resolveRelativeUri(source.uri, Uri.parse("../c/lib.dart"));
@@ -194,7 +189,7 @@
   }
 
   void test_system() {
-    File file = resourceProvider.getFile("/does/not/exist.dart");
+    File file = getFile("/does/not/exist.dart");
     FileSource source = new FileSource(file, Uri.parse("dart:core"));
     expect(source, isNotNull);
     expect(source.fullName, file.path);
diff --git a/pkg/front_end/test/src/base/api_signature_test.dart b/pkg/analyzer/test/src/summary/api_signature_test.dart
similarity index 97%
rename from pkg/front_end/test/src/base/api_signature_test.dart
rename to pkg/analyzer/test/src/summary/api_signature_test.dart
index 0dbb846..348d091 100644
--- a/pkg/front_end/test/src/base/api_signature_test.dart
+++ b/pkg/analyzer/test/src/summary/api_signature_test.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/src/summary/format.dart';
 import 'package:convert/convert.dart';
 import 'package:crypto/crypto.dart';
-import 'package:front_end/src/base/api_signature.dart';
+import 'package:analyzer/src/summary/api_signature.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/front_end/test/src/dependency_walker_test.dart b/pkg/analyzer/test/src/summary/dependency_walker_test.dart
similarity index 98%
rename from pkg/front_end/test/src/dependency_walker_test.dart
rename to pkg/analyzer/test/src/summary/dependency_walker_test.dart
index d4c731b..15a7306 100644
--- a/pkg/front_end/test/src/dependency_walker_test.dart
+++ b/pkg/analyzer/test/src/summary/dependency_walker_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.
 
-import 'package:front_end/src/dependency_walker.dart';
+import 'package:analyzer/src/summary/link.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/front_end/test/src/base/flat_buffers_test.dart b/pkg/analyzer/test/src/summary/flat_buffers_test.dart
similarity index 99%
rename from pkg/front_end/test/src/base/flat_buffers_test.dart
rename to pkg/analyzer/test/src/summary/flat_buffers_test.dart
index facd4ae..c8fb485 100644
--- a/pkg/front_end/test/src/base/flat_buffers_test.dart
+++ b/pkg/analyzer/test/src/summary/flat_buffers_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:typed_data';
 
-import 'package:front_end/src/base/flat_buffers.dart';
+import 'package:analyzer/src/summary/flat_buffers.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index d9a2ab2..e8ce239 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -4553,6 +4553,15 @@
 ''');
   }
 
+  test_field_typed() async {
+    var library = await checkLibrary('class C { int x = 0; }');
+    checkElementText(library, r'''
+class C {
+  int x;
+}
+''');
+  }
+
   test_field_untyped() async {
     var library = await checkLibrary('class C { var x = 0; }');
     checkElementText(library, r'''
@@ -6028,21 +6037,21 @@
     allowMissingFiles = true;
     shouldCompareLibraryElements = false;
     var library = await checkLibrary(r'''
-import '[invalid uri]';
-import '[invalid uri]:foo.dart';
+import ':[invaliduri]';
+import ':[invaliduri]:foo.dart';
 import 'a1.dart';
-import '[invalid uri]';
-import '[invalid uri]:foo.dart';
+import ':[invaliduri]';
+import ':[invaliduri]:foo.dart';
 
-export '[invalid uri]';
-export '[invalid uri]:foo.dart';
+export ':[invaliduri]';
+export ':[invaliduri]:foo.dart';
 export 'a2.dart';
-export '[invalid uri]';
-export '[invalid uri]:foo.dart';
+export ':[invaliduri]';
+export ':[invaliduri]:foo.dart';
 
-part '[invalid uri]';
+part ':[invaliduri]';
 part 'a3.dart';
-part '[invalid uri]';
+part ':[invaliduri]';
 ''');
     checkElementText(library, r'''
 import '<unresolved>';
@@ -7417,9 +7426,9 @@
     var library = await checkLibrary('library my.lib; part "foo/";');
     checkElementText(library, r'''
 library my.lib;
-part '<unresolved>';
+part '';
 --------------------
-unit: null
+unit: foo
 
 ''');
   }
@@ -8531,13 +8540,6 @@
 ''');
   }
 
-  test_variable_final_top_level_untyped() async {
-    var library = await checkLibrary('final v = 0;');
-    checkElementText(library, r'''
-final int v;
-''');
-  }
-
   test_variable_getterInLib_setterInPart() async {
     addSource('/a.dart', '''
 part of my.lib;
@@ -8613,6 +8615,34 @@
 ''');
   }
 
+  test_variable_initializer() async {
+    var library = await checkLibrary('int v = 0;');
+    checkElementText(library, r'''
+int v;
+''');
+  }
+
+  test_variable_initializer_final() async {
+    var library = await checkLibrary('final int v = 0;');
+    checkElementText(library, r'''
+final int v;
+''');
+  }
+
+  test_variable_initializer_final_untyped() async {
+    var library = await checkLibrary('final v = 0;');
+    checkElementText(library, r'''
+final int v;
+''');
+  }
+
+  test_variable_initializer_untyped() async {
+    var library = await checkLibrary('var v = 0;');
+    checkElementText(library, r'''
+int v;
+''');
+  }
+
   test_variable_propagatedType_const_noDep() async {
     var library = await checkLibrary('const i = 0;');
     checkElementText(library, r'''
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index daac93b..bd6427c 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -5992,7 +5992,7 @@
   }
 
   test_export_uri_invalid() {
-    String uriString = '[invalid uri]';
+    String uriString = ':[invalid uri]';
     String libraryText = 'export "$uriString";';
     serializeLibraryText(libraryText);
     expect(unlinkedUnits[0].publicNamespace.exports, hasLength(1));
@@ -6618,7 +6618,14 @@
 ''');
     assertUnlinkedConst(variable.initializer.bodyExpr,
         isValidConst: false,
-        operators: [UnlinkedExprOperation.pushNull],
+        operators: [
+          UnlinkedExprOperation.pushLocalFunctionReference,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.invokeMethod
+        ],
+        ints: [0, 0, 1, 2, 0, 2, 0],
+        strings: ['call'],
         forTypeInferenceOnly: true);
   }
 
@@ -6628,7 +6635,14 @@
 ''');
     assertUnlinkedConst(variable.initializer.bodyExpr,
         isValidConst: false,
-        operators: [UnlinkedExprOperation.pushNull],
+        operators: [
+          UnlinkedExprOperation.pushLocalFunctionReference,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.invokeMethod
+        ],
+        ints: [0, 0, 1, 2, 0, 2, 0],
+        strings: ['call'],
         forTypeInferenceOnly: true);
   }
 
@@ -6766,13 +6780,17 @@
   }
 
   test_expr_invalid_typeParameter_asPrefix() {
-    var c = serializeClassText('''
+    var variable = serializeClassText('''
 class C<T> {
   final f = T.k;
 }
-''');
-    assertUnlinkedConst(c.fields[0].initializer.bodyExpr,
-        isValidConst: false, operators: []);
+''').fields[0];
+    if (containsNonConstExprs) {
+      assertUnlinkedConst(variable.initializer.bodyExpr,
+          isValidConst: false, operators: []);
+    } else {
+      expect(variable.initializer.bodyExpr, isNull);
+    }
   }
 
   test_expr_invokeMethod_instance() {
@@ -7096,38 +7114,33 @@
     checkDocumentationComment(variable.documentationComment, text);
   }
 
-  test_field_final() {
-    UnlinkedVariable variable =
-        serializeClassText('class C { final int i = 0; }').fields[0];
-    expect(variable.isFinal, isTrue);
-    expect(variable.inheritsCovariantSlot, 0);
-    assertUnlinkedConst(variable.initializer.bodyExpr,
-        operators: [UnlinkedExprOperation.pushInt], ints: [0]);
-  }
-
   test_field_final_notConstExpr() {
     UnlinkedVariable variable = serializeClassText(r'''
 class C {
-  final int f = 1 + m();
+  final f = 1 + m();
   static int m() => 42;
 }''').fields[0];
     expect(variable.isFinal, isTrue);
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.invokeMethodRef,
-      UnlinkedExprOperation.add,
-    ], ints: [
-      1,
-      0,
-      0,
-      0
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, 'm',
-              expectedKind: ReferenceKind.method,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
-              ])
-    ]);
+    if (containsNonConstExprs) {
+      assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+        UnlinkedExprOperation.pushInt,
+        UnlinkedExprOperation.invokeMethodRef,
+        UnlinkedExprOperation.add,
+      ], ints: [
+        1,
+        0,
+        0,
+        0
+      ], strings: [], referenceValidators: [
+        (EntityRef r) => checkTypeRef(r, null, 'm',
+                expectedKind: ReferenceKind.method,
+                prefixExpectations: [
+                  new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
+                ])
+      ]);
+    } else {
+      expect(variable.initializer.bodyExpr, isNull);
+    }
   }
 
   test_field_final_typeParameter() {
@@ -7136,10 +7149,14 @@
   final f = <T>[];
 }''').fields[0];
     expect(variable.isFinal, isTrue);
-    assertUnlinkedConst(variable.initializer.bodyExpr,
-        operators: [UnlinkedExprOperation.makeTypedList],
-        ints: [0],
-        referenceValidators: [(EntityRef r) => checkParamTypeRef(r, 1)]);
+    if (containsNonConstExprs) {
+      assertUnlinkedConst(variable.initializer.bodyExpr,
+          operators: [UnlinkedExprOperation.makeTypedList],
+          ints: [0],
+          referenceValidators: [(EntityRef r) => checkParamTypeRef(r, 1)]);
+    } else {
+      expect(variable.initializer.bodyExpr, isNull);
+    }
   }
 
   test_field_formal_param_inferred_type_explicit() {
@@ -7212,6 +7229,127 @@
     expect(v.inferredTypeSlot, 0);
   }
 
+  test_field_initializer_constConstructor_typed() {
+    UnlinkedVariable variable = serializeClassText('''
+class C {
+  int x = 0;
+  const C();
+}
+''').fields[0];
+    expect(variable.initializer.bodyExpr, isNull);
+    expect(variable.inheritsCovariantSlot, isNot(0));
+  }
+
+  test_field_initializer_final_constConstructor_typed() {
+    UnlinkedVariable variable = serializeClassText('''
+class C {
+  final int x = 0;
+  const C();
+}
+''').fields[0];
+    expect(variable.initializer.bodyExpr, isNotNull);
+    expect(variable.inheritsCovariantSlot, 0);
+  }
+
+  test_field_initializer_final_constConstructor_untyped() {
+    UnlinkedVariable variable = serializeClassText('''
+class C {
+  final x = 0;
+  const C();
+}
+''').fields[0];
+    expect(variable.initializer.bodyExpr, isNotNull);
+    expect(variable.inheritsCovariantSlot, 0);
+  }
+
+  test_field_initializer_final_typed() {
+    UnlinkedVariable variable =
+        serializeClassText('class C { final int x = 0; }').fields[0];
+    expect(variable.initializer.bodyExpr, isNull);
+    expect(variable.inheritsCovariantSlot, 0);
+  }
+
+  test_field_initializer_final_untyped() {
+    UnlinkedVariable variable =
+        serializeClassText('class C { final x = 0; }').fields[0];
+    if (containsNonConstExprs) {
+      expect(variable.initializer.bodyExpr, isNotNull);
+    } else {
+      expect(variable.initializer.bodyExpr, isNull);
+    }
+    expect(variable.inheritsCovariantSlot, 0);
+  }
+
+  test_field_initializer_static_constConstructor_typed() {
+    UnlinkedVariable variable = serializeClassText('''
+class C {
+  static int x = 0;
+  const C();
+}
+''').fields[0];
+    expect(variable.initializer.bodyExpr, isNull);
+    expect(variable.inheritsCovariantSlot, 0);
+  }
+
+  test_field_initializer_static_constConstructor_untyped() {
+    UnlinkedVariable variable = serializeClassText('''
+class C {
+  static var x = 0;
+  const C();
+}
+''').fields[0];
+    if (containsNonConstExprs) {
+      expect(variable.initializer.bodyExpr, isNotNull);
+    } else {
+      expect(variable.initializer.bodyExpr, isNull);
+    }
+    expect(variable.inheritsCovariantSlot, 0);
+  }
+
+  test_field_initializer_static_final_constConstructor_typed() {
+    UnlinkedVariable variable = serializeClassText('''
+class C {
+  static final int x = 0;
+  const C();
+}
+''').fields[0];
+    expect(variable.initializer.bodyExpr, isNull);
+    expect(variable.inheritsCovariantSlot, 0);
+  }
+
+  test_field_initializer_static_final_constConstructor_untyped() {
+    UnlinkedVariable variable = serializeClassText('''
+class C {
+  static final x = 0;
+  const C();
+}
+''').fields[0];
+    if (containsNonConstExprs) {
+      expect(variable.initializer.bodyExpr, isNotNull);
+    } else {
+      expect(variable.initializer.bodyExpr, isNull);
+    }
+    expect(variable.inheritsCovariantSlot, 0);
+  }
+
+  test_field_initializer_typed() {
+    UnlinkedVariable variable =
+        serializeClassText('class C { int x = 0; }').fields[0];
+    expect(variable.initializer.bodyExpr, isNull);
+    expect(variable.inheritsCovariantSlot, isNot(0));
+  }
+
+  test_field_initializer_untyped() {
+    UnlinkedVariable variable =
+        serializeClassText('class C { var x = 0; }').fields[0];
+    if (containsNonConstExprs) {
+      expect(variable.initializer.bodyExpr, isNotNull);
+    } else {
+      expect(variable.initializer.bodyExpr, isNull);
+    }
+    expect(variable.inheritsCovariantSlot, isNot(0));
+  }
+
   test_field_static() {
     UnlinkedVariable variable =
         serializeClassText('class C { static int i; }').fields[0];
@@ -7251,17 +7389,6 @@
     expect(variable.inheritsCovariantSlot, 0);
   }
 
-  test_field_untyped() {
-    UnlinkedVariable variable =
-        serializeClassText('class C { var x = 0; }').fields[0];
-    if (containsNonConstExprs) {
-      expect(variable.initializer.bodyExpr, isNotNull);
-    } else {
-      expect(variable.initializer.bodyExpr, isNull);
-    }
-    expect(variable.inheritsCovariantSlot, isNot(0));
-  }
-
   test_fully_linked_references_follow_other_references() {
     if (skipFullyLinkedData) {
       return;
@@ -7647,7 +7774,7 @@
   }
 
   test_import_uri_invalid() {
-    String uriString = '[invalid uri]';
+    String uriString = ':[invalid uri]';
     String libraryText = 'import "$uriString";';
     serializeLibraryText(libraryText);
     // Second import is the implicit import of dart:core
@@ -9035,7 +9162,7 @@
   }
 
   test_part_uri_invalid() {
-    String uriString = '[invalid uri]';
+    String uriString = ':[invalid uri]';
     String libraryText = 'part "$uriString";';
     serializeLibraryText(libraryText);
     expect(unlinkedUnits[0].publicNamespace.parts, hasLength(1));
@@ -9813,20 +9940,6 @@
     checkDynamicTypeRef(variable.type);
   }
 
-  test_variable_final_top_level() {
-    UnlinkedVariable variable =
-        serializeVariableText('final int i = 0;', variableName: 'i');
-    expect(variable.isFinal, isTrue);
-    expect(variable.initializer.bodyExpr, isNull);
-  }
-
-  test_variable_final_top_level_untyped() {
-    if (skipFullyLinkedData) return;
-    UnlinkedVariable variable = serializeVariableText('final v = 0;');
-    var typeRef = getTypeRefForSlot(variable.inferredTypeSlot);
-    checkLinkedTypeRef(typeRef, 'dart:core', 'int');
-  }
-
   test_variable_implicit_dynamic() {
     UnlinkedVariable variable = serializeVariableText('var v;');
     expect(variable.type, isNull);
@@ -9847,6 +9960,31 @@
     expect(v.inferredTypeSlot, 0);
   }
 
+  test_variable_initializer() {
+    UnlinkedVariable variable =
+        serializeVariableText('int i = 0;', variableName: 'i');
+    expect(variable.initializer.bodyExpr, isNull);
+  }
+
+  test_variable_initializer_final() {
+    UnlinkedVariable variable =
+        serializeVariableText('final int i = 0;', variableName: 'i');
+    expect(variable.isFinal, isTrue);
+    expect(variable.initializer.bodyExpr, isNull);
+  }
+
+  test_variable_initializer_final_untyped() {
+    if (skipFullyLinkedData) return;
+    UnlinkedVariable variable = serializeVariableText('final v = 0;');
+    var typeRef = getTypeRefForSlot(variable.inferredTypeSlot);
+    checkLinkedTypeRef(typeRef, 'dart:core', 'int');
+    if (containsNonConstExprs) {
+      expect(variable.initializer.bodyExpr, isNotNull);
+    } else {
+      expect(variable.initializer.bodyExpr, isNull);
+    }
+  }
+
   test_variable_initializer_literal() {
     UnlinkedVariable variable = serializeVariableText('var v = 42;');
     UnlinkedExecutable initializer = variable.initializer;
@@ -9861,6 +9999,18 @@
     expect(variable.initializer, isNull);
   }
 
+  test_variable_initializer_untyped() {
+    if (skipFullyLinkedData) return;
+    UnlinkedVariable variable = serializeVariableText('var v = 0;');
+    var typeRef = getTypeRefForSlot(variable.inferredTypeSlot);
+    checkLinkedTypeRef(typeRef, 'dart:core', 'int');
+    if (containsNonConstExprs) {
+      expect(variable.initializer.bodyExpr, isNotNull);
+    } else {
+      expect(variable.initializer.bodyExpr, isNull);
+    }
+  }
+
   test_variable_initializer_withLocals() {
     String text = 'var v = <dynamic, dynamic>{"1": () { f1() {} var v1; }, '
         '"2": () { f2() {} var v2; }};';
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index 939596c..bf6a1bc 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -332,7 +332,7 @@
   String aaa;
 }
 class C implements A, B {
-  /*error:INVALID_METHOD_OVERRIDE*/var aaa;
+  /*error:INVALID_OVERRIDE,error:INVALID_OVERRIDE*/var aaa;
 }
 ''';
     await checkFile(content);
@@ -798,7 +798,6 @@
 ''');
   }
 
-  @failingTest
   test_initializer_functionExpressionInvocation_noTypeParameters() async {
     var library = await _encodeDecodeLibrary(r'''
 var v = (() => 42)();
diff --git a/pkg/analyzer/test/src/task/dart_test.dart b/pkg/analyzer/test/src/task/dart_test.dart
index d5cd7ac..a2a0da0 100644
--- a/pkg/analyzer/test/src/task/dart_test.dart
+++ b/pkg/analyzer/test/src/task/dart_test.dart
@@ -895,7 +895,7 @@
 part '$invalidUri';
 '''
     });
-    expect(libraryElement.parts, isEmpty);
+    expect(libraryElement.parts, hasLength(1));
   }
 
   test_perform_isLaunchable_inDefiningUnit() {
@@ -960,13 +960,15 @@
     CompilationUnitElement unitElement1 = partUnits
         .singleWhere((u) => resolutionMap
             .elementDeclaredByCompilationUnit(u)
-            .name
+            .source
+            .fullName
             .endsWith('part1.dart'))
         .declaredElement;
     CompilationUnitElement unitElement2 = partUnits
         .singleWhere((u) => resolutionMap
             .elementDeclaredByCompilationUnit(u)
-            .name
+            .source
+            .fullName
             .endsWith('part2.dart'))
         .declaredElement;
     PropertyAccessorElement getter = unitElement1.accessors[0];
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index e2a8682..e00db4f 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -227,9 +227,6 @@
         removeCode(StrongModeCode.INVALID_SUPER_INVOCATION);
         removeCode(StrongModeCode.NON_GROUND_TYPE_CHECK_INFO);
         removeCode(StrongModeCode.DYNAMIC_INVOKE);
-        removeCode(StrongModeCode.INVALID_METHOD_OVERRIDE);
-        removeCode(StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_BASE);
-        removeCode(StrongModeCode.INVALID_METHOD_OVERRIDE_FROM_MIXIN);
         removeCode(StrongModeCode.INVALID_FIELD_OVERRIDE);
         removeCode(StrongModeCode.IMPLICIT_DYNAMIC_PARAMETER);
         removeCode(StrongModeCode.IMPLICIT_DYNAMIC_RETURN);
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 994a8bd..9265133f 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -156,7 +156,7 @@
   const B(Object a) : super(/*info:DOWN_CAST_IMPLICIT*/a);
 }
 void foo(Object o) {
-  var a = const A(/*info:DOWN_CAST_IMPLICIT, error:CONST_WITH_NON_CONSTANT_ARGUMENT, error:INVALID_CONSTANT*/o);
+  var a = const A(/*info:DOWN_CAST_IMPLICIT, error:CONST_WITH_NON_CONSTANT_ARGUMENT*/o);
 }
 ''');
   }
@@ -172,7 +172,7 @@
 abstract class Base implements I1 {}
 
 class T1 extends Base {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 ''');
   }
@@ -190,10 +190,7 @@
     implements I1 {}
 
 class T1 extends Base {
-    // not reported technically because if the class is concrete,
-    // it should implement all its interfaces and hence it is
-    // sufficient to check overrides against it.
-    m(B a) {}
+    /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 ''');
   }
@@ -209,7 +206,7 @@
 abstract class I2 implements I1 {}
 
 class T1 implements I2 {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 ''');
   }
@@ -225,7 +222,7 @@
 abstract class I2 extends Object with M1 {}
 
 class T1 implements I2 {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 ''');
   }
@@ -241,7 +238,7 @@
 abstract class I2 extends I1 {}
 
 class T1 implements I2 {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 ''');
   }
@@ -546,20 +543,21 @@
 class G extends E implements D {}
 
 class D_error extends C {
-  /*error:INVALID_METHOD_OVERRIDE*/int f(int x) => x;
+  /*error:INVALID_OVERRIDE*/int f(int x) => x;
 }
 class E_error extends D {
-  /*error:INVALID_METHOD_OVERRIDE*/int f(@checked double x) => 0;
+  /*error:INVALID_OVERRIDE*/int f(@checked double x) => 0;
 }
 class F_error extends E {
-  /*error:INVALID_METHOD_OVERRIDE*/int f(@checked double x) => 0;
+  /*error:INVALID_OVERRIDE*/int f(@checked double x) => 0;
 }
 class G_error extends E implements D {
-  /*error:INVALID_METHOD_OVERRIDE*/int f(@checked double x) => 0;
+  /*error:INVALID_OVERRIDE*/int f(@checked double x) => 0;
 }
     ''');
   }
 
+  @failingTest
   test_covariantOverride_fields() async {
     _addMetaLibrary();
     await checkFile(r'''
@@ -579,7 +577,7 @@
   @virtual int foo;
 }
 class E extends D {
-  @virtual /*error:INVALID_METHOD_OVERRIDE*/num foo;
+  @virtual num foo;
 }
     ''');
   }
@@ -628,16 +626,16 @@
 class G extends E implements D {}
 
 class D_error extends C {
-  /*error:INVALID_METHOD_OVERRIDE*/int f(String x) => 0;
+  /*error:INVALID_OVERRIDE*/int f(String x) => 0;
 }
 class E_error extends D {
-  /*error:INVALID_METHOD_OVERRIDE*/int f(double x) => 0;
+  /*error:INVALID_OVERRIDE*/int f(double x) => 0;
 }
 class F_error extends E {
-  /*error:INVALID_METHOD_OVERRIDE*/int f(double x) => 0;
+  /*error:INVALID_OVERRIDE*/int f(double x) => 0;
 }
 class G_error extends E implements D {
-  /*error:INVALID_METHOD_OVERRIDE*/int f(double x) => 0;
+  /*error:INVALID_OVERRIDE*/int f(double x) => 0;
 }
     ''');
   }
@@ -730,17 +728,17 @@
 }
 
 class Child extends Base {
-  /*error:INVALID_METHOD_OVERRIDE*/A f1; // invalid for getter
-  /*error:INVALID_METHOD_OVERRIDE*/C f2; // invalid for setter
+  /*error:INVALID_OVERRIDE*/A f1; // invalid for getter
+  /*error:INVALID_OVERRIDE*/C f2; // invalid for setter
   var f3;
-  /*error:INVALID_METHOD_OVERRIDE*/dynamic f4;
+  /*error:INVALID_OVERRIDE*/dynamic f4;
 }
 
 class Child2 implements Base {
-  /*error:INVALID_METHOD_OVERRIDE*/A f1; // invalid for getter
-  /*error:INVALID_METHOD_OVERRIDE*/C f2; // invalid for setter
+  /*error:INVALID_OVERRIDE*/A f1; // invalid for getter
+  /*error:INVALID_OVERRIDE*/C f2; // invalid for setter
   var f3;
-  /*error:INVALID_METHOD_OVERRIDE*/dynamic f4;
+  /*error:INVALID_OVERRIDE*/dynamic f4;
 }
 ''');
   }
@@ -759,17 +757,17 @@
 }
 
 class Child extends Base {
-  /*error:INVALID_METHOD_OVERRIDE*/A get f1 => null;
+  /*error:INVALID_OVERRIDE*/A get f1 => null;
   C get f2 => null;
   get f3 => null;
-  /*error:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
+  /*error:INVALID_OVERRIDE*/dynamic get f4 => null;
 }
 
 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR*/Child2 implements Base {
-  /*error:INVALID_METHOD_OVERRIDE*/A get f1 => null;
+  /*error:INVALID_OVERRIDE*/A get f1 => null;
   C get f2 => null;
   get f3 => null;
-  /*error:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
+  /*error:INVALID_OVERRIDE*/dynamic get f4 => null;
 }
 ''');
   }
@@ -783,12 +781,12 @@
 }
 
 class G extends F {
-  /*error:INVALID_METHOD_OVERRIDE*/final ToVoid<int> f = null;
+  /*error:INVALID_OVERRIDE*/final ToVoid<int> f = null;
   final ToVoid<dynamic> g = null;
 }
 
 class H implements F {
-  /*error:INVALID_METHOD_OVERRIDE*/final ToVoid<int> f = null;
+  /*error:INVALID_OVERRIDE*/final ToVoid<int> f = null;
   final ToVoid<dynamic> g = null;
 }
  ''');
@@ -846,7 +844,7 @@
   B get f5 => null;
 
   void set f1(A value) {}
-  /*error:INVALID_METHOD_OVERRIDE*/void set f2(C value) {}
+  /*error:INVALID_OVERRIDE*/void set f2(C value) {}
   void set f3(value) {}
   void set f4(dynamic value) {}
   set f5(B value) {}
@@ -860,7 +858,7 @@
   B get f5 => null;
 
   void set f1(A value) {}
-  /*error:INVALID_METHOD_OVERRIDE*/void set f2(C value) {}
+  /*error:INVALID_OVERRIDE*/void set f2(C value) {}
   void set f3(value) {}
   void set f4(dynamic value) {}
   set f5(B value) {}
@@ -1966,7 +1964,7 @@
 }
 
 class Derived<S extends A> extends Base<B> {
-  /*error:INVALID_METHOD_OVERRIDE*/S foo() => null;
+  /*error:INVALID_OVERRIDE*/S foo() => null;
 }
 
 class Derived2<S extends B> extends Base<B> {
@@ -2074,10 +2072,10 @@
 }
 
 class Child extends Base {
-  /*error:INVALID_METHOD_OVERRIDE*/A get f1 => null;
+  /*error:INVALID_OVERRIDE*/A get f1 => null;
   C get f2 => null;
   get f3 => null;
-  /*error:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null;
+  /*error:INVALID_OVERRIDE*/dynamic get f4 => null;
 }
 ''');
   }
@@ -2092,12 +2090,12 @@
 }
 
 class G extends F {
-  /*error:INVALID_METHOD_OVERRIDE*/ToVoid<int> get f => null;
+  /*error:INVALID_OVERRIDE*/ToVoid<int> get f => null;
   ToVoid<dynamic> get g => null;
 }
 
 class H implements F {
-  /*error:INVALID_METHOD_OVERRIDE*/ToVoid<int> get f => null;
+  /*error:INVALID_OVERRIDE*/ToVoid<int> get f => null;
   ToVoid<dynamic> get g => null;
 }
 ''');
@@ -2552,7 +2550,7 @@
   set x(Object y) {}
 }
 class D implements B, C {
-  /*error:INVALID_METHOD_OVERRIDE*/int x;
+  /*error:INVALID_OVERRIDE*/int x;
 }
     ''');
   }
@@ -2566,13 +2564,13 @@
 abstract class M implements I {}
 
 class C extends Object with M {
-  /*error:INVALID_METHOD_OVERRIDE*/String x;
+  /*error:INVALID_OVERRIDE*/String x;
 }
 
 abstract class M2 = Object with M;
 
 class C2 extends Object with M2 {
-  /*error:INVALID_METHOD_OVERRIDE*/String x;
+  /*error:INVALID_OVERRIDE*/String x;
 }
     ''');
   }
@@ -2603,13 +2601,13 @@
 abstract class M<E> implements I<E> {}
 
 class C extends Object with M<int> {
-  /*error:INVALID_METHOD_OVERRIDE*/String x;
+  /*error:INVALID_OVERRIDE*/String x;
 }
 
 abstract class D extends Object with M<num> {}
 /*error:CONFLICTING_GENERIC_INTERFACES*/
 /*error:CONFLICTING_GENERIC_INTERFACES*/class E extends D with M<int> {
-  /*error:INVALID_METHOD_OVERRIDE*/int x;
+  /*error:INVALID_OVERRIDE*/int x;
 }
 /*error:CONFLICTING_GENERIC_INTERFACES*/
 /*error:CONFLICTING_GENERIC_INTERFACES*/class F extends D with M<int> {
@@ -2631,8 +2629,8 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1
-    /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Base implements I {}
+class /*error:INCONSISTENT_INHERITANCE*/T1
+    extends Base implements I {}
 ''');
   }
 
@@ -2646,37 +2644,37 @@
 }
 
 class T1 extends Base {
-  /*error:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,error:INVALID_METHOD_OVERRIDE*/B get f => null;
+  /*error:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,error:INVALID_OVERRIDE*/B get f => null;
 }
 
 class T2 extends Base {
-  /*error:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,error:INVALID_METHOD_OVERRIDE*/set f(
+  /*error:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,error:INVALID_OVERRIDE*/set f(
       B b) => null;
 }
 
 class T3 extends Base {
-  /*error:INVALID_METHOD_OVERRIDE*/final B
+  /*error:INVALID_OVERRIDE*/final B
       /*error:FINAL_NOT_INITIALIZED*/f;
 }
 class T4 extends Base {
   // two: one for the getter one for the setter.
-  /*error:INVALID_METHOD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/B f;
+  /*error:INVALID_OVERRIDE, error:INVALID_OVERRIDE*/B f;
 }
 
 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T5 implements Base {
-  /*error:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_METHOD_OVERRIDE*/B get f => null;
+  /*error:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_OVERRIDE*/B get f => null;
 }
 
 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T6 implements Base {
-  /*error:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_METHOD_OVERRIDE*/set f(B b) => null;
+  /*error:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_OVERRIDE*/set f(B b) => null;
 }
 
 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T7 implements Base {
-  /*error:INVALID_METHOD_OVERRIDE*/final B f = null;
+  /*error:INVALID_OVERRIDE*/final B f = null;
 }
 class T8 implements Base {
   // two: one for the getter one for the setter.
-  /*error:INVALID_METHOD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/B f;
+  /*error:INVALID_OVERRIDE, error:INVALID_OVERRIDE*/B f;
 }
 ''');
   }
@@ -2691,7 +2689,7 @@
 }
 
 class Test extends Base {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 ''');
   }
@@ -2706,11 +2704,12 @@
 }
 
 class T1 implements I {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 ''');
   }
 
+  @failingTest
   test_invalidOverrides_doubleOverride() async {
     await checkFile('''
 class A {}
@@ -2725,11 +2724,12 @@
 
 class Test extends Parent {
     // Reported only once
-    /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+    /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 ''');
   }
 
+  @failingTest
   test_invalidOverrides_doubleOverride2() async {
     await checkFile('''
 class A {}
@@ -2739,7 +2739,7 @@
     m(A a) {}
 }
 class Parent extends Grandparent {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 
 class Test extends Parent {
@@ -2761,7 +2761,7 @@
 }
 
 class Test extends Parent {
-    /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+    /*error:INVALID_OVERRIDE*/m(B a) {}
     int x;
 }
 ''');
@@ -2780,12 +2780,12 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1
-    extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M
+class /*error:INCONSISTENT_INHERITANCE*/T1
+    extends Object with M
     implements I {}
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Object
-    with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M implements I;
+class /*error:INCONSISTENT_INHERITANCE*/U1 = Object
+    with M implements I;
 ''');
   }
 
@@ -2807,20 +2807,20 @@
     int x;
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
-    with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {}
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 extends Base
-    with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1, M2 {}
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T3 extends Base
-    with M2, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {}
+class /*error:INCONSISTENT_INHERITANCE*/T1 extends Base
+    with /*error:INVALID_OVERRIDE*/M1 {}
+class /*error:INCONSISTENT_INHERITANCE*/T2 extends Base
+    with /*error:INVALID_OVERRIDE*/M1, M2 {}
+class /*error:INCONSISTENT_INHERITANCE*/T3 extends Base
+    with M2, /*error:INVALID_OVERRIDE*/M1 {}
 
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Base
-    with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1;
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U2 = Base
-    with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1, M2;
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U3 = Base
-    with M2, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1;
+class /*error:INCONSISTENT_INHERITANCE*/U1 = Base
+    with /*error:INVALID_OVERRIDE*/M1;
+class /*error:INCONSISTENT_INHERITANCE*/U2 = Base
+    with /*error:INVALID_OVERRIDE*/M1, M2;
+class /*error:INCONSISTENT_INHERITANCE*/U3 = Base
+    with M2, /*error:INVALID_OVERRIDE*/M1;
 ''');
   }
 
@@ -2842,16 +2842,17 @@
     int x;
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
+class /*error:INCONSISTENT_INHERITANCE*/T1 extends Base
     with M1,
-    /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2 {}
+    /*error:INVALID_OVERRIDE*/M2 {}
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Base
+class /*error:INCONSISTENT_INHERITANCE*/U1 = Base
     with M1,
-    /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2;
+    /*error:INVALID_OVERRIDE*/M2;
 ''');
   }
 
+  @failingTest
   test_invalidOverrides_noDuplicateMixinOverride() async {
     // This is a regression test for a bug in an earlier implementation were
     // names were hiding errors if the first mixin override looked correct,
@@ -2876,11 +2877,11 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
-    with M1, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2, M3 {}
+class /*error:INCONSISTENT_INHERITANCE*/T1 extends Base
+    with M1, /*error:INVALID_OVERRIDE_FROM_MIXIN*/M2, M3 {}
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Base
-    with M1, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2, M3;
+class /*error:INCONSISTENT_INHERITANCE*/U1 = Base
+    with M1, /*error:INVALID_OVERRIDE_FROM_MIXIN*/M2, M3;
 ''');
   }
 
@@ -2899,20 +2900,20 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1
-    /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Base
+class /*error:INCONSISTENT_INHERITANCE*/T1
+    extends Base
     implements I1 {}
 
 class T2 extends Base implements I1 {
     m(a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T3
-    extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/Base
+class /*error:INCONSISTENT_INHERITANCE*/T3
+    extends Object with Base
     implements I1 {}
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U3
-    = Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/Base
+class /*error:INCONSISTENT_INHERITANCE*/U3
+    = Object with Base
     implements I1;
 
 class T4 extends Object with Base implements I1 {
@@ -3050,12 +3051,12 @@
 }
 
 class Child extends Base {
-  /*error:INVALID_METHOD_OVERRIDE*/A m1(A value) => null;
-  /*error:INVALID_METHOD_OVERRIDE*/C m2(C value) => null;
-  /*error:INVALID_METHOD_OVERRIDE*/A m3(C value) => null;
+  /*error:INVALID_OVERRIDE*/A m1(A value) => null;
+  /*error:INVALID_OVERRIDE*/C m2(C value) => null;
+  /*error:INVALID_OVERRIDE*/A m3(C value) => null;
   C m4(A value) => null;
   m5(value) => null;
-  /*error:INVALID_METHOD_OVERRIDE*/dynamic m6(dynamic value) => null;
+  /*error:INVALID_OVERRIDE*/dynamic m6(dynamic value) => null;
 }
 ''');
   }
@@ -3074,12 +3075,12 @@
 }
 
 class G extends F {
-  /*error:INVALID_METHOD_OVERRIDE*/void f(int x) {}
+  /*error:INVALID_OVERRIDE*/void f(int x) {}
   void g(dynamic x) {}
 }
 
 class H implements F {
-  /*error:INVALID_METHOD_OVERRIDE*/void f(int x) {}
+  /*error:INVALID_OVERRIDE*/void f(int x) {}
   void g(dynamic x) {}
 }
 ''');
@@ -3109,7 +3110,7 @@
 
 class C = Object with B;
 
-class D extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/C implements A {}
+class /*error:INVALID_OVERRIDE*/D extends Object with C implements A {}
     ''');
   }
 
@@ -3127,11 +3128,11 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base
-    with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M {}
+class /*error:INCONSISTENT_INHERITANCE*/T1 extends Base
+    with /*error:INVALID_OVERRIDE*/M {}
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Base
-    with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M;
+class /*error:INCONSISTENT_INHERITANCE*/U1 = Base
+    with /*error:INVALID_OVERRIDE*/M;
 ''');
   }
 
@@ -3151,9 +3152,11 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base with M {}
+class /*error:INCONSISTENT_INHERITANCE*/T1 extends Base
+    with /*error:INVALID_OVERRIDE*/M {}
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Base with M;
+class /*error:INCONSISTENT_INHERITANCE*/U1 = Base
+    with /*error:INVALID_OVERRIDE*/M;
 ''');
   }
 
@@ -3171,12 +3174,12 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1
-    extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M
+class /*error:INCONSISTENT_INHERITANCE*/T1
+    extends Object with M
     implements I2 {}
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1
-    = Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M
+class /*error:INCONSISTENT_INHERITANCE*/U1
+    = Object with M
     implements I2;
 ''');
   }
@@ -3195,12 +3198,12 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1
-    extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M
+class /*error:INCONSISTENT_INHERITANCE*/T1
+    extends Object with M
     implements I2 {}
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1
-    = Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M
+class /*error:INCONSISTENT_INHERITANCE*/U1
+    = Object with M
     implements I2;
 ''');
   }
@@ -3219,12 +3222,12 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1
-    extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M
+class /*error:INCONSISTENT_INHERITANCE*/T1
+    extends Object with M
     implements I2 {}
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1
-    = Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M
+class /*error:INCONSISTENT_INHERITANCE*/U1
+    = Object with M
     implements I2;
 ''');
   }
@@ -3249,14 +3252,14 @@
 // TODO(jmesserly): the `INCONSISTENT_METHOD_INHERITANCE` message is from the
 // Dart 1 checking logic (using strong mode type system), it is not produced
 // by the strong mode OverrideChecker.
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1
+class /*error:INCONSISTENT_INHERITANCE*/T1
     extends Base
-    with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M
+    with M
     implements I1 {}
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 =
+class /*error:INCONSISTENT_INHERITANCE*/U1 =
     Base
-    with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M
+    with M
     implements I1;
 ''');
   }
@@ -3280,11 +3283,11 @@
 class Parent2 extends Grandparent {}
 
 // Note: otherwise both errors would be reported on this line
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1
-    /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Parent1
+class /*error:INCONSISTENT_INHERITANCE*/T1
+    extends Parent1
     implements I1 {}
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2
-    /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Parent2
+class /*error:INCONSISTENT_INHERITANCE*/T2
+    extends Parent2
     implements I1 {}
 ''');
   }
@@ -3306,9 +3309,8 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Object
-    with M1,
-    /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2
+class /*error:INCONSISTENT_INHERITANCE*/T1 extends Object
+    with M1, M2
     implements I1 {}
 ''');
   }
@@ -3326,16 +3328,12 @@
     m(B a) {}
 }
 
-// Note: no error reported in `extends Base` to avoid duplicating
-// the error in T1.
 class T1 extends Base implements I1 {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 
-// If there is no error in the class, we do report the error at
-// the base class:
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2
-    /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Base
+class /*error:INCONSISTENT_INHERITANCE*/T2
+    extends Base
     implements I1 {}
 ''');
   }
@@ -3354,19 +3352,20 @@
 }
 
 class T1 extends Object with M implements I1 {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2
-    extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M
+class /*error:INCONSISTENT_INHERITANCE*/T2
+    extends Object with M
     implements I1 {}
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/U2
-    = Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M
+class /*error:INCONSISTENT_INHERITANCE*/U2
+    = Object with M
     implements I1;
 ''');
   }
 
+  @failingTest
   test_noDuplicateReports_typeOverridesSomeMethodInMultipleInterfaces() async {
     await checkFile('''
 class A {}
@@ -3382,7 +3381,7 @@
 class Base {}
 
 class T1 implements I2 {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 ''');
   }
@@ -3439,7 +3438,7 @@
   n(B b);
 }
 abstract class D extends C {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B b);
+  /*error:INVALID_OVERRIDE*/m(B b);
   n(A a);
 }
     ''');
@@ -3464,19 +3463,15 @@
     return checkFile(r'''
 abstract class A { void test(A arg) { } }
 abstract class B extends A {
-  /*error:INVALID_METHOD_OVERRIDE*/void test(B arg) { }
+  /*error:INVALID_OVERRIDE*/void test(B arg) { }
 }
 abstract class X implements A { }
 
 class C extends B {}
 
-// We treat "with X" as asking for another check.
-// This feels inconsistent.
-class D /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends B with X { }
+class /*error:INVALID_OVERRIDE*/D extends B with X { }
 
-// We treat "implements A" as asking for another check.
-// This feels inconsistent.
-class E /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends B implements A { }
+class /*error:INVALID_OVERRIDE*/E extends B implements A { }
     ''');
   }
 
@@ -3498,7 +3493,7 @@
   var _f3;
   var _f4;
 
-  /*error:INVALID_METHOD_OVERRIDE*/String _m1() => null;
+  /*error:INVALID_OVERRIDE*/String _m1() => null;
 }
 ''', name: '/helper.dart');
     await checkFile('''
@@ -3654,15 +3649,15 @@
 
 class G extends F {
   void set f(ToVoid<int> x) {}
-  /*error:INVALID_METHOD_OVERRIDE*/void set g(ToVoid<dynamic> x) {}
-  /*error:INVALID_METHOD_OVERRIDE*/void set h(int x) {}
+  /*error:INVALID_OVERRIDE*/void set g(ToVoid<dynamic> x) {}
+  /*error:INVALID_OVERRIDE*/void set h(int x) {}
   void set i(dynamic x) {}
 }
 
 class H implements F {
   void set f(ToVoid<int> x) {}
-  /*error:INVALID_METHOD_OVERRIDE*/void set g(ToVoid<dynamic> x) {}
-  /*error:INVALID_METHOD_OVERRIDE*/void set h(int x) {}
+  /*error:INVALID_OVERRIDE*/void set g(ToVoid<dynamic> x) {}
+  /*error:INVALID_OVERRIDE*/void set h(int x) {}
   void set i(dynamic x) {}
 }
  ''');
@@ -3702,7 +3697,7 @@
 
 class Child extends Base {
   void set f1(A value) {}
-  /*error:INVALID_METHOD_OVERRIDE*/void set f2(C value) {}
+  /*error:INVALID_OVERRIDE*/void set f2(C value) {}
   void set f3(value) {}
   void set f4(dynamic value) {}
   set f5(B value) {}
@@ -3755,7 +3750,7 @@
 }
 
 abstract class Base implements I1 {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 
 class T1 extends Base {
@@ -3764,7 +3759,7 @@
     // TODO(sigmund): consider tracking overrides in a fine-grain
     // manner, then this and the double-overrides would not be
     // reported.
-    /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+    /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 ''');
   }
@@ -3779,11 +3774,11 @@
 }
 
 class Base implements I1 {
-  /*error:INVALID_METHOD_OVERRIDE*/m(B a) {}
+  /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 
 class T1 extends Base {
-    m(B a) {}
+    /*error:INVALID_OVERRIDE*/m(B a) {}
 }
 ''');
   }
@@ -3802,8 +3797,8 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1
-    /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Base implements I2 {}
+class /*error:INCONSISTENT_INHERITANCE*/T1
+    extends Base implements I2 {}
 ''');
   }
 
@@ -3821,8 +3816,8 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1
-    /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Base
+class /*error:INCONSISTENT_INHERITANCE*/T1
+    extends Base
     implements I2 {}
 ''');
   }
@@ -3841,8 +3836,8 @@
     m(B a) {}
 }
 
-class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1
-    /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Base
+class /*error:INCONSISTENT_INHERITANCE*/T1
+    extends Base
     implements I2 {}
 ''');
   }
@@ -3872,7 +3867,7 @@
 }
 
 // This mixin application doesn't provide a valid superclass for B
-class D extends C with /*error:INCONSISTENT_METHOD_INHERITANCE*/B {}
+class D extends C with /*error:INCONSISTENT_INHERITANCE*/B {}
 }
     ''', superMixins: true);
   }
@@ -4352,7 +4347,7 @@
 }
 
 class B extends A {
-  /*error:INVALID_METHOD_OVERRIDE*/T method<T>(T x) => x;
+  /*error:INVALID_OVERRIDE*/T method<T>(T x) => x;
 }
     ''');
   }
@@ -4385,12 +4380,6 @@
   @override
   bool get enableNewAnalysisDriver => true;
 
-  @failingTest
-  @override
-  test_covariantOverride_fields() async {
-    await super.test_covariantOverride_fields();
-  }
-
   @override // Passes with driver
   test_interfacesFromMixinsUsedTwiceAreChecked() =>
       super.test_interfacesFromMixinsUsedTwiceAreChecked();
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index b2e2a7a..ac628df 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -43,7 +42,6 @@
       {bool declarationCasts: true,
       bool implicitCasts: true,
       bool implicitDynamic: true,
-      List<String> nonnullableTypes: AnalysisOptionsImpl.NONNULLABLE_TYPES,
       bool superMixins: false});
 
   /**
@@ -431,12 +429,12 @@
 }
 
 class C1 implements A, B {
-  /*error:INVALID_METHOD_OVERRIDE*/get a => null;
+  /*error:INVALID_OVERRIDE,error:INVALID_OVERRIDE*/get a => null;
 }
 
 // Still ambiguous
 class C2 implements B, A {
-  /*error:INVALID_METHOD_OVERRIDE*/get a => null;
+  /*error:INVALID_OVERRIDE,error:INVALID_OVERRIDE*/get a => null;
 }
 ''');
   }
@@ -468,7 +466,7 @@
 }
 
 class C2 implements A, B {
-  /*error:INVALID_METHOD_OVERRIDE*/get a => null;
+  /*error:INVALID_OVERRIDE,error:INVALID_OVERRIDE*/get a => null;
 }
 ''');
   }
@@ -486,7 +484,8 @@
   }
 
   test_constructors_inferenceFBounded() async {
-    var errors = 'error:COULD_NOT_INFER,error:COULD_NOT_INFER';
+    var errors = 'error:COULD_NOT_INFER,error:COULD_NOT_INFER,'
+        'error:TYPE_ARGUMENT_NOT_MATCHING_BOUNDS';
 //    if (hasExtraTaskModelPass) errors = '$errors,$errors';
     var unit = await checkFile('''
 class Clonable<T> {}
@@ -550,7 +549,8 @@
 NotA myF() => null;
 
 main() {
-  var x = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:COULD_NOT_INFER*/C(myF);
+  var x = /*info:INFERRED_TYPE_ALLOCATION*/new
+      /*error:COULD_NOT_INFER,error:TYPE_ARGUMENT_NOT_MATCHING_BOUNDS*/C(myF);
 }
 ''');
     var x = findLocalVariable(unit, 'x');
@@ -751,7 +751,7 @@
 }
 
 class B implements A {
-  /*error:INVALID_METHOD_OVERRIDE*/dynamic get x => 3;
+  /*error:INVALID_OVERRIDE*/dynamic get x => 3;
 }
 
 foo() {
@@ -1908,7 +1908,7 @@
 T m<T>(T x) => x;
 }
 class D extends C {
-/*error:INVALID_METHOD_OVERRIDE*/m(x) => x;
+/*error:INVALID_OVERRIDE*/m(x) => x;
 }
 main() {
   int y = /*info:DYNAMIC_CAST*/new D()./*error:WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD*/m<int>(42);
@@ -1955,8 +1955,8 @@
   dynamic g(int x) => x;
 }
 class D extends C {
-  /*error:INVALID_METHOD_OVERRIDE*/T m<T>(T x) => x;
-  /*error:INVALID_METHOD_OVERRIDE*/T g<T>(T x) => x;
+  /*error:INVALID_OVERRIDE*/T m<T>(T x) => x;
+  /*error:INVALID_OVERRIDE*/T g<T>(T x) => x;
 }
 main() {
   int y = /*info:DYNAMIC_CAST*/(/*info:UNNECESSARY_CAST*/new D() as C).m(42);
@@ -3383,7 +3383,7 @@
 }
 
 class B implements A<int> {
-  /*error:INVALID_METHOD_OVERRIDE*/dynamic get x => 3;
+  /*error:INVALID_OVERRIDE*/dynamic get x => 3;
 }
 
 foo() {
diff --git a/pkg/analyzer/test/src/task/strong/non_null_checker_test.dart b/pkg/analyzer/test/src/task/strong/non_null_checker_test.dart
deleted file mode 100644
index 9ae9154..0000000
--- a/pkg/analyzer/test/src/task/strong/non_null_checker_test.dart
+++ /dev/null
@@ -1,323 +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.
-
-// These tests are for an experimental feature that treats Dart primitive types
-// (int, bool, double, etc.) as non-nullable. This file is not evidence for an
-// intention to officially support non-nullable primitives in Dart (or general
-// NNBD, for that matter) so don't get too crazy about it.
-
-library analyzer.test.src.task.non_null_primitives.checker_test;
-
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../strong/strong_test_helper.dart';
-
-void main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(NonNullCheckerTest);
-    defineReflectiveTests(NonNullCheckerTest_Driver);
-  });
-}
-
-String _withError(String file, String error) {
-  return ("" + file).replaceFirst("boom", error);
-}
-
-@reflectiveTest
-class NonNullCheckerTest extends AbstractStrongTest {
-  // Tests simple usage of ints as iterators for a loop. Not directly related to
-  // non-nullability, but if it is implemented this should be more efficient,
-  // since languages.length will not be null-checked on every iteration.
-  final String defaultNnbdExample = '''
-class Point {
-  final int x, y;
-  Point(this.x, this.y);
-  Point operator +(Point other) => new Point(x + other.x, y + other.y);
-  String toString() => "x: \$x, y: \$y";
-}
-
-void main() {
-  Point p1 = new Point(0, 0);
-  Point p2 = new Point(10, 10);
-  print("p1 + p2 = \${p1 + p2}");
-}
-''';
-
-  final String defaultNnbdExampleMod1 = '''
-class Point {
-  final int x, y;
-  Point(this.x, this.y);
-  Point operator +(Point other) => new Point(x + other.x, y + other.y);
-  String toString() => "x: \$x, y: \$y";
-}
-
-void main() {
-  Point p1 = new Point(0, 0);
-  Point p2 = new Point(10, /*boom*/null); // Change here.
-  print("p1 + p2 = \${p1 + p2}");
-}
-''';
-
-  final String defaultNnbdExampleMod2 = '''
-class Point {
-  final int x, y;
-  Point(this.x, this.y);
-  Point operator +(Point other) => new Point(x + other.x, y + other.y);
-  String toString() => "x: \$x, y: \$y";
-}
-
-void main() {
-  bool f = false; // Necessary, because dead code is otherwise detected.
-  Point p1 = new Point(0, 0);
-  Point p2 = new Point(10, /*boom*/f ? 10 : null); // Change here.
-  print("p1 + p2 = \${p1 + p2}");
-}
-''';
-
-  test_assign_null_to_nonnullable() async {
-    addFile('''
-int x = 0;
-
-main() {
-  x = 1;
-  x = /*error:INVALID_ASSIGNMENT*/null;
-}
-''');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  test_compoundAssignment() async {
-    addFile('''
-void main() {
-  int i = 1;
-  i += 2;
-  /*error:INVALID_ASSIGNMENT*/i += null;
-  print(i);
-}
-''');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  test_forEach() async {
-    addFile('''
-void main() {
-  var ints = <num>[1, 2, 3, null];
-  for (int /*error:INVALID_ASSIGNMENT*/i in ints) {
-    print(i);
-  }
-}
-''');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  test_forLoop() async {
-    await checkFile('''
-class MyList {
-  int length;
-  MyList() {
-    length = 6;
-  }
-  String operator [](int i) {
-    return <String>["Dart", "Java", "JS", "C", "C++", "C#"][i];
-  }
-}
-
-main() {
-  var languages = new MyList();
-  for (int i = 0; i < languages.length; ++i) {
-    print(languages[i]);
-  }
-}
-''');
-  }
-
-  test_generics() async {
-    addFile('''
-class Foo<T> {
-  T x;
-
-  Foo(this.x);
-}
-
-void main() {
-  var f = new Foo<String>("hello");
-  var g = new Foo<int>(10);
-  var h = new Foo<String>(null);
-  var i = new Foo<int>(/*error:INVALID_ASSIGNMENT*/null);
-
-  print(f.x);
-  print(g.x);
-  print(h.x);
-  print(i.x);
-}
-''');
-    addFile('''
-class Foo<T> {
-  T x; // Should be annotated for a runtime check: x = (null as T)
-
-  Foo();
-}
-
-void main() {
-  var f = new Foo<String>();
-  var g = new Foo<int>(); // Should fail at runtime.
-}
-''');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  test_initialize_nonnullable_with_null() async {
-    addFile('int x = /*error:INVALID_ASSIGNMENT*/null;');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  test_initialize_nonnullable_with_valid_value() async {
-    addFile('int x = 0;');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  test_map() async {
-    addFile('''
-class Pair<K, V> {
-  K first;
-  V second;
-
-  Pair(this.first, this.second);
-}
-
-class SlowMap<K, V> {
-  List<Pair<K, V>> array;
-  int arrayLength = 0;
-
-  SlowMap() : array = <Pair<K, V>>[];
-
-  void insert(K key, V value) {
-    array.add(new Pair<K, V>(key, value));
-    ++arrayLength;
-  }
-
-  bool has(K key) {
-    for (int i = 0; i < arrayLength; ++i) {
-      if (array[i].first == key) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  V get(K key) {
-    for (int i = 0; i < arrayLength; ++i) {
-      if (array[i].first == key) {
-        return array[i].second;
-      }
-    }
-    return null;
-    // TODO(stanm): generate explicit cast to V which will produce a runtime
-    // error if V is non-nullable. Optionally, generate a static warning too.
-  }
-}
-
-void main() {
-  var legs = new SlowMap<String, int>();
-  legs.insert("spider", 8);
-  legs.insert("goat", 4);
-  legs.insert("chicken", 2);
-
-  int x = legs.get("goat"); // This should not produce an error.
-  int y = legs.get("sheep"); // TODO(stanm): Runtime error here.
-}
-''');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  // Default example from NNBD document.
-  test_method_call() async {
-    addFile('''
-int s(int x) {
-  return x + 1;
-}
-
-void main() {
-  s(10);
-  s(/*error:INVALID_ASSIGNMENT*/null);
-}
-''');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  test_nonnullable_fields() async {
-    addFile(defaultNnbdExample);
-    // `null` can be passed as an argument to `Point` in default mode.
-    addFile(_withError(defaultNnbdExampleMod1, "error:INVALID_ASSIGNMENT"));
-    // A nullable expression can be passed as an argument to `Point` in default
-    // mode.
-    addFile(_withError(defaultNnbdExampleMod2, "error:INVALID_ASSIGNMENT"));
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  test_nullable_fields() async {
-    addFile(defaultNnbdExample);
-    // `null` can be passed as an argument to `Point` in default mode.
-    addFile(defaultNnbdExampleMod1);
-    // A nullable expression can be passed as an argument to `Point` in default
-    // mode.
-    addFile(defaultNnbdExampleMod2);
-    await check();
-  }
-
-  test_nullableTypes() async {
-    // By default x can be set to null.
-    await checkFile('int x = null;');
-  }
-
-  test_prefer_final_to_non_nullable_error() async {
-    addFile('main() { final int /*error:FINAL_NOT_INITIALIZED*/x; }');
-    addFile('final int /*error:FINAL_NOT_INITIALIZED*/x;');
-    addFile('''
-void foo() {}
-
-class A {
-  final int x;
-
-  /*error:FINAL_NOT_INITIALIZED_CONSTRUCTOR_1*/A();
-}
-''');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  test_uninitialized_nonnullable_field_declaration() async {
-    addFile('''
-void foo() {}
-
-class A {
-  // Ideally, we should allow x to be init in the constructor, but that requires
-  // too much complication in the checker, so for now we throw a static error at
-  // the declaration site.
-  int /*error:NON_NULLABLE_FIELD_NOT_INITIALIZED*/x;
-
-  A();
-}
-''');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  test_uninitialized_nonnullable_local_variable() async {
-    // Ideally, we will do flow analysis and throw an error only if a variable
-    // is used before it has been initialized.
-    addFile('main() { int /*error:NON_NULLABLE_FIELD_NOT_INITIALIZED*/x; }');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-
-  test_uninitialized_nonnullable_top_level_variable_declaration() async {
-    // If `int`s are non-nullable, then this code should throw an error.
-    addFile('int /*error:NON_NULLABLE_FIELD_NOT_INITIALIZED*/x;');
-    await check(nonnullableTypes: <String>['dart:core,int']);
-  }
-}
-
-@reflectiveTest
-class NonNullCheckerTest_Driver extends NonNullCheckerTest {
-  @override
-  bool get enableNewAnalysisDriver => 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 283c2ce..86eadb4 100644
--- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
+++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
@@ -20,13 +20,13 @@
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:source_span/source_span.dart';
 import 'package:test/test.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
 
 import '../../context/mock_sdk.dart';
 
@@ -280,7 +280,6 @@
       {bool declarationCasts: true,
       bool implicitCasts: true,
       bool implicitDynamic: true,
-      List<String> nonnullableTypes: AnalysisOptionsImpl.NONNULLABLE_TYPES,
       bool superMixins: false}) async {
     _checkCalled = true;
 
@@ -293,7 +292,6 @@
     analysisOptions.declarationCasts = declarationCasts;
     analysisOptions.implicitCasts = implicitCasts;
     analysisOptions.implicitDynamic = implicitDynamic;
-    analysisOptions.nonnullableTypes = nonnullableTypes;
     analysisOptions.enableSuperMixins = superMixins;
 
     var mockSdk = new MockSdk(resourceProvider: _resourceProvider);
@@ -374,14 +372,12 @@
       {bool declarationCasts: true,
       bool implicitCasts: true,
       bool implicitDynamic: true,
-      List<String> nonnullableTypes: AnalysisOptionsImpl.NONNULLABLE_TYPES,
       bool superMixins: false}) async {
     addFile(content);
     return await check(
         declarationCasts: declarationCasts,
         implicitCasts: implicitCasts,
         implicitDynamic: implicitDynamic,
-        nonnullableTypes: nonnullableTypes,
         superMixins: superMixins);
   }
 
diff --git a/pkg/analyzer/test/src/task/strong/test_all.dart b/pkg/analyzer/test/src/task/strong/test_all.dart
index 982d879..cf07437 100644
--- a/pkg/analyzer/test/src/task/strong/test_all.dart
+++ b/pkg/analyzer/test/src/task/strong/test_all.dart
@@ -7,13 +7,11 @@
 import 'checker_test.dart' as checker_test;
 import 'dart2_inference_test.dart' as dart2_inference_test;
 import 'inferred_type_test.dart' as inferred_type_test;
-import 'non_null_checker_test.dart' as non_null_checker_test;
 
 main() {
   defineReflectiveSuite(() {
     checker_test.main();
     dart2_inference_test.main();
     inferred_type_test.main();
-    non_null_checker_test.main();
   }, name: 'strong');
 }
diff --git a/pkg/analyzer/test/src/task/yaml_test.dart b/pkg/analyzer/test/src/task/yaml_test.dart
index aa3391b..d952887 100644
--- a/pkg/analyzer/test/src/task/yaml_test.dart
+++ b/pkg/analyzer/test/src/task/yaml_test.dart
@@ -58,10 +58,11 @@
   }
 
   void _performParseTask(String content) {
+    var path = resourceProvider.convertPath('/test.yaml');
     if (content == null) {
-      source = resourceProvider.getFile('/test.yaml').createSource();
+      source = resourceProvider.getFile(path).createSource();
     } else {
-      source = newSource('/test.yaml', content);
+      source = newSource(path, content);
     }
     computeResult(source, YAML_DOCUMENT, matcher: isParseYamlTask);
   }
diff --git a/pkg/analyzer/test/utils.dart b/pkg/analyzer/test/utils.dart
index c65881c..03dfee7 100644
--- a/pkg/analyzer/test/utils.dart
+++ b/pkg/analyzer/test/utils.dart
@@ -10,7 +10,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/generated/testing/element_search.dart';
-import 'package:front_end/src/base/source.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:test/test.dart';
 
 /**
diff --git a/pkg/analyzer/tool/messages/generate.dart b/pkg/analyzer/tool/messages/generate.dart
index 3e99766..8083810 100644
--- a/pkg/analyzer/tool/messages/generate.dart
+++ b/pkg/analyzer/tool/messages/generate.dart
@@ -16,7 +16,7 @@
 
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:front_end/src/codegen/tools.dart';
+import 'package:analyzer/src/codegen/tools.dart';
 import 'package:front_end/src/testing/package_root.dart' as pkgRoot;
 import 'package:path/path.dart';
 import 'package:yaml/yaml.dart' show loadYaml;
diff --git a/pkg/analyzer/tool/summary/check_test.dart b/pkg/analyzer/tool/summary/check_test.dart
index bccb46f..5b5ff5f 100644
--- a/pkg/analyzer/tool/summary/check_test.dart
+++ b/pkg/analyzer/tool/summary/check_test.dart
@@ -4,7 +4,7 @@
 
 library analyzer.tool.summary.check_test;
 
-import 'package:front_end/src/codegen/tools.dart';
+import 'package:analyzer/src/codegen/tools.dart';
 import 'package:front_end/src/testing/package_root.dart' as package_root;
 import 'package:path/path.dart';
 
diff --git a/pkg/analyzer/tool/summary/generate.dart b/pkg/analyzer/tool/summary/generate.dart
index 97495b4..04b8fef 100644
--- a/pkg/analyzer/tool/summary/generate.dart
+++ b/pkg/analyzer/tool/summary/generate.dart
@@ -22,7 +22,7 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:front_end/src/codegen/tools.dart';
+import 'package:analyzer/src/codegen/tools.dart';
 import 'package:front_end/src/fasta/scanner/string_scanner.dart';
 import 'package:front_end/src/scanner/token.dart' show Token;
 import 'package:front_end/src/testing/package_root.dart' as package_root;
@@ -1002,16 +1002,21 @@
    */
   String _getNodeDoc(AnnotatedNode node) {
     Comment comment = node.documentationComment;
-    if (comment != null &&
-        comment.isDocumentation &&
-        comment.tokens.length == 1 &&
-        comment.tokens.first.lexeme.startsWith('/*')) {
-      Token token = comment.tokens.first;
-      return token.lexeme.split('\n').map((String line) {
-        line = line.trimLeft();
-        if (line.startsWith('*')) line = ' ' + line;
-        return line;
-      }).join('\n');
+    if (comment != null && comment.isDocumentation) {
+      if (comment.tokens.length == 1 &&
+          comment.tokens.first.lexeme.startsWith('/*')) {
+        Token token = comment.tokens.first;
+        return token.lexeme.split('\n').map((String line) {
+          line = line.trimLeft();
+          if (line.startsWith('*')) line = ' ' + line;
+          return line;
+        }).join('\n');
+      } else if (comment.tokens
+          .every((token) => token.lexeme.startsWith('///'))) {
+        return comment.tokens
+            .map((token) => token.lexeme.trimLeft())
+            .join('\n');
+      }
     }
     return null;
   }
diff --git a/pkg/analyzer/tool/task_dependency_graph/check_test.dart b/pkg/analyzer/tool/task_dependency_graph/check_test.dart
index c1308db..dc34c96 100644
--- a/pkg/analyzer/tool/task_dependency_graph/check_test.dart
+++ b/pkg/analyzer/tool/task_dependency_graph/check_test.dart
@@ -4,7 +4,7 @@
 
 library analyzer.tool.task_dependency_graph.check_test;
 
-import 'package:front_end/src/codegen/tools.dart';
+import 'package:analyzer/src/codegen/tools.dart';
 import 'package:front_end/src/testing/package_root.dart' as package_root;
 import 'package:path/path.dart';
 
diff --git a/pkg/analyzer/tool/task_dependency_graph/generate.dart b/pkg/analyzer/tool/task_dependency_graph/generate.dart
index 13112b8..739ac6c 100644
--- a/pkg/analyzer/tool/task_dependency_graph/generate.dart
+++ b/pkg/analyzer/tool/task_dependency_graph/generate.dart
@@ -35,9 +35,9 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
-import 'package:front_end/src/codegen/tools.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/codegen/tools.dart';
 import 'package:front_end/src/testing/package_root.dart' as package_root;
 import 'package:path/path.dart' as path;
 import 'package:path/path.dart';
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index 051a098..95b79f2 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -34,9 +34,9 @@
 import 'package:bazel_worker/bazel_worker.dart';
 import 'package:collection/collection.dart';
 import 'package:convert/convert.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
-import 'package:front_end/src/byte_store/cache.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/cache.dart';
 
 /**
  * Persistent Bazel worker.
@@ -450,6 +450,8 @@
       }
       Uri uri = Uri.parse(sourceFile.substring(0, pipeIndex));
       String path = sourceFile.substring(pipeIndex + 1);
+      path = resourceProvider.pathContext.absolute(path);
+      path = resourceProvider.pathContext.normalize(path);
       uriToFileMap[uri] = resourceProvider.getFile(path);
     }
     return uriToFileMap;
@@ -556,8 +558,7 @@
     File file = uriToFileMap[uri];
     actualUri ??= uri;
     if (file == null) {
-      return new NonExistingSource(
-          uri.toString(), actualUri, UriKind.fromScheme(actualUri.scheme));
+      return null;
     } else {
       return new FileSource(file, actualUri);
     }
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 4390547..cb36d12 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -31,6 +31,7 @@
 import 'package:analyzer/src/summary/summary_file_builder.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk;
 import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:analyzer_cli/src/analyzer_impl.dart';
 import 'package:analyzer_cli/src/batch_mode.dart';
@@ -42,8 +43,8 @@
 import 'package:analyzer_cli/src/options.dart';
 import 'package:analyzer_cli/src/perf_report.dart';
 import 'package:analyzer_cli/starter.dart' show CommandLineStarter;
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/base/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:linter/src/rules.dart' as linter;
 import 'package:meta/meta.dart';
 import 'package:package_config/discovery.dart' as pkg_discovery;
@@ -689,7 +690,7 @@
       packageMap = _PackageRootPackageMapBuilder.buildPackageMap(
           options.packageRootPath);
     } else {
-      file_system.Resource cwd = resourceProvider.getResource('.');
+      file_system.Resource cwd = resourceProvider.getResource(path.current);
       // Look for .packages.
       packages = _discoverPackagespec(new Uri.directory(cwd.path));
       packageMap = _getPackageMap(packages);
@@ -705,8 +706,10 @@
 
     Map<String, List<file_system.Folder>> folderMap =
         new Map<String, List<file_system.Folder>>();
+    var pathContext = resourceProvider.pathContext;
     packages.asMap().forEach((String packagePath, Uri uri) {
-      folderMap[packagePath] = [resourceProvider.getFolder(path.fromUri(uri))];
+      String path = fileUriToNormalizedPath(pathContext, uri);
+      folderMap[packagePath] = [resourceProvider.getFolder(path)];
     });
     return folderMap;
   }
diff --git a/pkg/analyzer_cli/lib/src/fix/driver.dart b/pkg/analyzer_cli/lib/src/fix/driver.dart
index 5888e26..2285273 100644
--- a/pkg/analyzer_cli/lib/src/fix/driver.dart
+++ b/pkg/analyzer_cli/lib/src/fix/driver.dart
@@ -2,21 +2,28 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 import 'dart:async';
+import 'dart:convert';
+import 'dart:io' show File;
 
+import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analyzer_cli/src/fix/options.dart';
 import 'package:analyzer_cli/src/fix/server.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
-class Driver {
-  static const timeout = const Duration(seconds: 5);
+// For development
+const runAnalysisServerFromSource = false;
 
+class Driver {
   final Server server = new Server();
 
   Completer serverConnected;
   Completer analysisComplete;
+  bool dryRun;
   bool verbose;
+  static const progressThreshold = 10;
+  int progressCount = progressThreshold;
 
   Future start(List<String> args) async {
     final options = Options.parse(args);
@@ -25,151 +32,243 @@
     if (options == null) {
       return null;
     }
+    dryRun = options.dryRun;
     verbose = options.verbose;
 
-    serverConnected = new Completer();
-    analysisComplete = new Completer();
-
+    EditDartfixResult result;
     await startServer(options);
-    outSink.writeln('Analyzing...');
-    await setupAnalysis(options);
-
-    // TODO(danrubel): Request fixes rather than waiting for analysis complete
-    await analysisComplete.future;
-
-    outSink.writeln('Analysis complete.');
-    await stopServer(server);
+    bool normalShutdown = false;
+    try {
+      await setupAnalysis(options);
+      result = await requestFixes(options);
+      normalShutdown = true;
+    } finally {
+      try {
+        await stopServer(server);
+      } catch (_) {
+        if (normalShutdown) {
+          rethrow;
+        }
+      }
+    }
+    if (result != null) {
+      applyFixes(result);
+    }
   }
 
   Future startServer(Options options) async {
+    const connectTimeout = const Duration(seconds: 15);
+    serverConnected = new Completer();
     if (options.verbose) {
       server.debugStdio();
     }
     verboseOut('Starting...');
-    await server.start(sdkPath: options.sdkPath);
+    await server.start(
+        sdkPath: options.sdkPath, useSnapshot: !runAnalysisServerFromSource);
     server.listenToOutput(dispatchNotification);
-    return serverConnected.future.timeout(timeout, onTimeout: () {
+    return serverConnected.future.timeout(connectTimeout, onTimeout: () {
       printAndFail('Failed to connect to server');
     });
   }
 
   Future setupAnalysis(Options options) async {
     verboseOut('Setup analysis');
-
-    await server.send("server.setSubscriptions",
+    await server.send(SERVER_REQUEST_SET_SUBSCRIPTIONS,
         new ServerSetSubscriptionsParams([ServerService.STATUS]).toJson());
-
     await server.send(
-        "analysis.setAnalysisRoots",
+        ANALYSIS_REQUEST_SET_ANALYSIS_ROOTS,
         new AnalysisSetAnalysisRootsParams(
           options.analysisRoots,
           const [],
         ).toJson());
   }
 
+  Future<EditDartfixResult> requestFixes(Options options) async {
+    outSink.write('Calculating fixes...');
+    verboseOut('');
+    analysisComplete = new Completer();
+    Map<String, dynamic> json = await server.send(EDIT_REQUEST_DARTFIX,
+        new EditDartfixParams(options.analysisRoots).toJson());
+    await analysisComplete.future;
+    analysisComplete = null;
+    resetProgress();
+    ResponseDecoder decoder = new ResponseDecoder(null);
+    return EditDartfixResult.fromJson(decoder, 'result', json);
+  }
+
   Future stopServer(Server server) async {
     verboseOut('Stopping...');
-    await server.send("server.shutdown", null);
-    await server.exitCode.timeout(const Duration(seconds: 5), onTimeout: () {
+    const timeout = const Duration(seconds: 5);
+    await server.send(SERVER_REQUEST_SHUTDOWN, null).timeout(timeout,
+        onTimeout: () {
+      // fall through to wait for exit.
+    });
+    await server.exitCode.timeout(timeout, onTimeout: () {
       return server.kill('server failed to exit');
     });
   }
 
-  /**
-   * Dispatch the notification named [event], and containing parameters
-   * [params], to the appropriate stream.
-   */
+  Future applyFixes(EditDartfixResult result) async {
+    showDescriptions(result.descriptionOfFixes, 'Recommended changes');
+    showDescriptions(result.otherRecommendations,
+        'Recommended changes that cannot not be automatically applied');
+    if (result.descriptionOfFixes.isEmpty) {
+      outSink.writeln('');
+      outSink.writeln(result.otherRecommendations.isNotEmpty
+          ? 'No recommended changes that cannot be automatically applied.'
+          : 'No recommended changes.');
+      return;
+    }
+    outSink.writeln('');
+    outSink.writeln('Files to be changed:');
+    for (SourceFileEdit fileEdit in result.fixes) {
+      outSink.writeln(fileEdit.file);
+    }
+    if (dryRun || !(await confirmApplyChanges(result))) {
+      return;
+    }
+    for (SourceFileEdit fileEdit in result.fixes) {
+      final file = new File(fileEdit.file);
+      String code = await file.readAsString();
+      for (SourceEdit edit in fileEdit.edits) {
+        code = edit.apply(code);
+      }
+      await file.writeAsString(code);
+    }
+    outSink.writeln('Changes applied.');
+  }
+
+  void showDescriptions(List<String> descriptions, String title) {
+    if (descriptions.isNotEmpty) {
+      outSink.writeln('');
+      outSink.writeln('$title:');
+      List<String> sorted = new List.from(descriptions)..sort();
+      for (String line in sorted) {
+        outSink.writeln(line);
+      }
+    }
+  }
+
+  Future<bool> confirmApplyChanges(EditDartfixResult result) async {
+    outSink.writeln();
+    if (result.hasErrors) {
+      outSink.writeln('WARNING: The analyzed source contains errors'
+          ' that may affect the accuracy of these changes.');
+    }
+    const prompt = 'Would you like to apply these changes (y/n)? ';
+    outSink.write(prompt);
+    final response = new Completer<bool>();
+    final subscription = inputStream
+        .transform(utf8.decoder)
+        .transform(new LineSplitter())
+        .listen((String line) {
+      line = line.trim().toLowerCase();
+      if (line == 'y' || line == 'yes') {
+        response.complete(true);
+      } else if (line == 'n' || line == 'no') {
+        response.complete(false);
+      } else {
+        outSink.writeln('  Unrecognized response. Please type "yes" or "no".');
+        outSink.write(prompt);
+      }
+    });
+    bool applyChanges = await response.future;
+    await subscription.cancel();
+    return applyChanges;
+  }
+
+  /// Dispatch the notification named [event], and containing parameters
+  /// [params], to the appropriate stream.
   void dispatchNotification(String event, params) {
     ResponseDecoder decoder = new ResponseDecoder(null);
     switch (event) {
-      case "server.connected":
+      case SERVER_NOTIFICATION_CONNECTED:
         onServerConnected(
             new ServerConnectedParams.fromJson(decoder, 'params', params));
         break;
-//      case "server.error":
-//        outOfTestExpect(params, isServerErrorParams);
-//        _onServerError
-//            .add(new ServerErrorParams.fromJson(decoder, 'params', params));
-//        break;
-      case "server.status":
+      case SERVER_NOTIFICATION_ERROR:
+        onServerError(
+            new ServerErrorParams.fromJson(decoder, 'params', params));
+        break;
+      case SERVER_NOTIFICATION_STATUS:
         onServerStatus(
             new ServerStatusParams.fromJson(decoder, 'params', params));
         break;
-//      case "analysis.analyzedFiles":
+//      case ANALYSIS_NOTIFICATION_ANALYZED_FILES:
 //        outOfTestExpect(params, isAnalysisAnalyzedFilesParams);
 //        _onAnalysisAnalyzedFiles.add(new AnalysisAnalyzedFilesParams.fromJson(
 //            decoder, 'params', params));
 //        break;
-//      case "analysis.closingLabels":
+//      case ANALYSIS_NOTIFICATION_CLOSING_LABELS:
 //        outOfTestExpect(params, isAnalysisClosingLabelsParams);
 //        _onAnalysisClosingLabels.add(new AnalysisClosingLabelsParams.fromJson(
 //            decoder, 'params', params));
 //        break;
-      case "analysis.errors":
+      case ANALYSIS_NOTIFICATION_ERRORS:
         onAnalysisErrors(
             new AnalysisErrorsParams.fromJson(decoder, 'params', params));
         break;
-//      case "analysis.flushResults":
+//      case ANALYSIS_NOTIFICATION_FLUSH_RESULTS:
 //        outOfTestExpect(params, isAnalysisFlushResultsParams);
 //        _onAnalysisFlushResults.add(
 //            new AnalysisFlushResultsParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "analysis.folding":
+//      case ANALYSIS_NOTIFICATION_FOLDING:
 //        outOfTestExpect(params, isAnalysisFoldingParams);
 //        _onAnalysisFolding
 //            .add(new AnalysisFoldingParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "analysis.highlights":
+//      case ANALYSIS_NOTIFICATION_HIGHLIGHTS:
 //        outOfTestExpect(params, isAnalysisHighlightsParams);
 //        _onAnalysisHighlights.add(
 //            new AnalysisHighlightsParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "analysis.implemented":
+//      case ANALYSIS_NOTIFICATION_IMPLEMENTED:
 //        outOfTestExpect(params, isAnalysisImplementedParams);
 //        _onAnalysisImplemented.add(
 //            new AnalysisImplementedParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "analysis.invalidate":
+//      case ANALYSIS_NOTIFICATION_INVALIDATE:
 //        outOfTestExpect(params, isAnalysisInvalidateParams);
 //        _onAnalysisInvalidate.add(
 //            new AnalysisInvalidateParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "analysis.navigation":
+//      case ANALYSIS_NOTIFICATION_NAVIGATION:
 //        outOfTestExpect(params, isAnalysisNavigationParams);
 //        _onAnalysisNavigation.add(
 //            new AnalysisNavigationParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "analysis.occurrences":
+//      case ANALYSIS_NOTIFICATION_OCCURRENCES:
 //        outOfTestExpect(params, isAnalysisOccurrencesParams);
 //        _onAnalysisOccurrences.add(
 //            new AnalysisOccurrencesParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "analysis.outline":
+//      case ANALYSIS_NOTIFICATION_OUTLINE:
 //        outOfTestExpect(params, isAnalysisOutlineParams);
 //        _onAnalysisOutline
 //            .add(new AnalysisOutlineParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "analysis.overrides":
+//      case ANALYSIS_NOTIFICATION_OVERRIDES:
 //        outOfTestExpect(params, isAnalysisOverridesParams);
 //        _onAnalysisOverrides.add(
 //            new AnalysisOverridesParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "completion.results":
+//      case COMPLETION_NOTIFICATION_RESULTS:
 //        outOfTestExpect(params, isCompletionResultsParams);
 //        _onCompletionResults.add(
 //            new CompletionResultsParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "search.results":
+//      case SEARCH_NOTIFICATION_RESULTS:
 //        outOfTestExpect(params, isSearchResultsParams);
 //        _onSearchResults
 //            .add(new SearchResultsParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "execution.launchData":
+//      case EXECUTION_NOTIFICATION_LAUNCH_DATA:
 //        outOfTestExpect(params, isExecutionLaunchDataParams);
 //        _onExecutionLaunchData.add(
 //            new ExecutionLaunchDataParams.fromJson(decoder, 'params', params));
 //        break;
-//      case "flutter.outline":
+//      case FLUTTER_NOTIFICATION_OUTLINE:
 //        outOfTestExpect(params, isFlutterOutlineParams);
 //        _onFlutterOutline
 //            .add(new FlutterOutlineParams.fromJson(decoder, 'params', params));
@@ -183,12 +282,15 @@
   void onAnalysisErrors(AnalysisErrorsParams params) {
     List<AnalysisError> errors = params.errors;
     if (errors.isNotEmpty) {
+      resetProgress();
       outSink.writeln(params.file);
       for (AnalysisError error in errors) {
         Location loc = error.location;
         outSink.writeln('  ${error.message}'
             ' at ${loc.startLine}:${loc.startColumn}');
       }
+    } else {
+      showProgress();
     }
   }
 
@@ -197,13 +299,40 @@
     serverConnected.complete();
   }
 
+  void onServerError(ServerErrorParams params) async {
+    try {
+      await stopServer(server);
+    } catch (e) {
+      // ignored
+    }
+    final message = new StringBuffer('Server Error: ')..writeln(params.message);
+    if (params.stackTrace != null) {
+      message.writeln(params.stackTrace);
+    }
+    printAndFail(message.toString());
+  }
+
   void onServerStatus(ServerStatusParams params) {
     if (params.analysis != null && !params.analysis.isAnalyzing) {
       verboseOut('Analysis complete');
-      analysisComplete.complete();
+      analysisComplete?.complete();
     }
   }
 
+  void resetProgress() {
+    if (!verbose && progressCount >= progressThreshold) {
+      outSink.writeln();
+    }
+    progressCount = 0;
+  }
+
+  void showProgress() {
+    if (!verbose && progressCount % progressThreshold == 0) {
+      outSink.write('.');
+    }
+    ++progressCount;
+  }
+
   void verboseOut(String message) {
     if (verbose) {
       outSink.writeln(message);
diff --git a/pkg/analyzer_cli/lib/src/fix/options.dart b/pkg/analyzer_cli/lib/src/fix/options.dart
index 0cb29c0..0dc9cd2 100644
--- a/pkg/analyzer_cli/lib/src/fix/options.dart
+++ b/pkg/analyzer_cli/lib/src/fix/options.dart
@@ -14,6 +14,9 @@
 StringSink outSink = stdout;
 
 @visibleForTesting
+Stream<List<int>> inputStream = stdin;
+
+@visibleForTesting
 ExitHandler exitHandler = exit;
 
 @visibleForTesting
@@ -21,8 +24,9 @@
 
 /// Command line options for `dartfix`.
 class Options {
-  String sdkPath;
   List<String> analysisRoots;
+  bool dryRun;
+  String sdkPath;
   bool verbose;
 
   static Options parse(List<String> args,
@@ -31,6 +35,12 @@
 
     parser
       ..addOption(_sdkPathOption, help: 'The path to the Dart SDK.')
+      ..addFlag(_dryRunOption,
+          abbr: 'n',
+          help: 'Calculate and display the recommended changes,'
+              ' but exit before applying them',
+          defaultsTo: false,
+          negatable: false)
       ..addFlag(_helpOption,
           abbr: 'h',
           help:
@@ -87,6 +97,7 @@
 
   Options._fromArgs(ArgResults results)
       : analysisRoots = results.rest,
+        dryRun = results[_dryRunOption] as bool,
         sdkPath = results[_sdkPathOption] as String,
         verbose = results[_verboseOption] as bool;
 
@@ -99,6 +110,7 @@
 }
 
 const _binaryName = 'dartfix';
+const _dryRunOption = 'dry-run';
 const _helpOption = 'help';
 const _sdkPathOption = 'dart-sdk';
 const _verboseOption = 'verbose';
diff --git a/pkg/analyzer_cli/lib/src/fix/server.dart b/pkg/analyzer_cli/lib/src/fix/server.dart
index 66f031c..bfaee1a 100644
--- a/pkg/analyzer_cli/lib/src/fix/server.dart
+++ b/pkg/analyzer_cli/lib/src/fix/server.dart
@@ -94,14 +94,20 @@
    * upward to the 'test' dir, and then going up one more directory.
    */
   String findRoot(String pathname) {
-    while (!['benchmark', 'test'].contains(basename(pathname))) {
+    while (true) {
       String parent = dirname(pathname);
       if (parent.length >= pathname.length) {
         throw new Exception("Can't find root directory");
       }
+      String name = basename(pathname);
+      if (['benchmark', 'test'].contains(name)) {
+        return parent;
+      }
+      if (name == 'pkg') {
+        return join(pathname, 'analysis_server');
+      }
       pathname = parent;
     }
-    return dirname(pathname);
   }
 
   /**
@@ -223,6 +229,7 @@
     String sdkPath,
     int servicesPort,
     bool useAnalysisHighlight2: false,
+    bool useSnapshot: true,
   }) async {
     if (_process != null) {
       throw new Exception('Process already started');
@@ -230,11 +237,10 @@
     _time.start();
     String dartBinary = Platform.executable;
 
-    // The integration tests run 3x faster when run from snapshots (you need to
-    // run test.py with --use-sdk).
-    final bool useSnapshot = true;
     String serverPath;
 
+    // The integration tests run 3x faster when run from snapshots (you need to
+    // run test.py with --use-sdk).
     if (useSnapshot) {
       // Look for snapshots/analysis_server.dart.snapshot.
       serverPath = normalize(join(dirname(Platform.resolvedExecutable),
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 1f57ac0..706f3cb 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -99,6 +99,8 @@
     String options: emptyOptionsFile,
     List<String> args: const <String>[],
   }) async {
+    options = _p(options);
+
     driver = new Driver(isTesting: true);
     var cmd = <String>[];
     if (options != null) {
@@ -142,6 +144,23 @@
     String relativePath = fileSpec.substring(uriPrefixLength);
     return '$uriPrefix${path.join(testDirectory, relativePath)}';
   }
+
+  /**
+   * Convert the given posix [filePath] to conform to this provider's path context.
+   *
+   * This is a utility method for testing; paths passed in to other methods in
+   * this class are never converted automatically.
+   */
+  String _p(String filePath) {
+    if (filePath == null) {
+      return null;
+    }
+    if (path.style == path.windows.style) {
+      filePath =
+          filePath.replaceAll(path.posix.separator, path.windows.separator);
+    }
+    return filePath;
+  }
 }
 
 @reflectiveTest
@@ -499,7 +518,10 @@
       {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) {
@@ -517,8 +539,7 @@
     uri ??= 'file:///test_file.dart';
     String source = '$uri|$path';
 
-    await drive(source,
-        args: args, options: 'data/options_tests_project/$optionsFileName');
+    await drive(source, args: args, options: options);
   }
 
   /// Try to find a appropriate directory to pass to "--dart-sdk" that will
@@ -531,17 +552,23 @@
           .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 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 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
@@ -555,7 +582,7 @@
           if (subdir is Directory) {
             String candidateSdkDir = path.join(subdir.path, 'dart-sdk');
             if (isSuitable(candidateSdkDir)) {
-              return candidateSdkDir;
+              return makeAbsoluteAndNormalized(candidateSdkDir);
             }
           }
         }
diff --git a/pkg/analyzer_cli/test/strong_mode_test.dart b/pkg/analyzer_cli/test/strong_mode_test.dart
index 30f7815..85a4928 100644
--- a/pkg/analyzer_cli/test/strong_mode_test.dart
+++ b/pkg/analyzer_cli/test/strong_mode_test.dart
@@ -30,7 +30,7 @@
 
     expect(exitCode, 3);
     var stdout = bulletToDash(outSink);
-    expect(stdout, contains('error - Invalid override'));
+    expect(stdout, contains("isn't a valid override of"));
     expect(stdout, contains('error - The list literal type'));
     expect(stdout, contains('2 errors found'));
   }
diff --git a/pkg/analyzer_fe_comparison/lib/comparison.dart b/pkg/analyzer_fe_comparison/lib/comparison.dart
index 461c11b..8508f492 100644
--- a/pkg/analyzer_fe_comparison/lib/comparison.dart
+++ b/pkg/analyzer_fe_comparison/lib/comparison.dart
@@ -60,11 +60,10 @@
   }
   ComparisonNode analyzerNode =
       await analyzer.analyzeFiles(startingPath, inputs);
-  var diff = ComparisonNode.diff(kernelNode, analyzerNode);
-  if (diff.children.isEmpty && diff.text.startsWith('=')) {
+  if (kernelNode == analyzerNode) {
     print('No differences found!');
   } else {
     print('Differences found:');
-    print(diff);
+    print(ComparisonNode.diff(kernelNode, analyzerNode));
   }
 }
diff --git a/pkg/analyzer_fe_comparison/lib/src/analyzer.dart b/pkg/analyzer_fe_comparison/lib/src/analyzer.dart
index e8a8730..dc75769 100644
--- a/pkg/analyzer_fe_comparison/lib/src/analyzer.dart
+++ b/pkg/analyzer_fe_comparison/lib/src/analyzer.dart
@@ -290,6 +290,7 @@
       var children = <ComparisonNode>[];
       var visitor = _AnalyzerVisitor(_typeProvider, children);
       visitor._visitTypeParameters(type.typeFormals);
+      children.add(_translateType('Return type: ', type.returnType));
       int positionalParameterIndex = 0;
       for (var parameterElement in type.parameters) {
         var kind = parameterElement.isNotOptional
diff --git a/pkg/analyzer_fe_comparison/lib/src/kernel.dart b/pkg/analyzer_fe_comparison/lib/src/kernel.dart
index 561f5e6..d9d4cbb 100644
--- a/pkg/analyzer_fe_comparison/lib/src/kernel.dart
+++ b/pkg/analyzer_fe_comparison/lib/src/kernel.dart
@@ -5,9 +5,13 @@
 import 'dart:async';
 
 import 'package:analyzer_fe_comparison/src/comparison_node.dart';
-import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/compiler_options.dart'
+    show CompilerOptions;
+import 'package:front_end/src/api_prototype/diagnostic_message.dart'
+    show DiagnosticMessage, DiagnosticMessageHandler;
 import 'package:front_end/src/api_prototype/kernel_generator.dart';
 import 'package:front_end/src/api_prototype/standard_file_system.dart';
+import 'package:front_end/src/fasta/messages.dart' show FormattedMessage;
 import 'package:kernel/ast.dart';
 import 'package:kernel/target/targets.dart';
 
@@ -15,14 +19,12 @@
 /// [ComparisonNode] representing them.
 Future<ComparisonNode> analyzePackage(
     List<Uri> inputs, Uri packagesFileUri, Uri platformUri) async {
-  bool errorOccurred = false;
+  var messages = <DiagnosticMessage>[];
   var component = await kernelForComponent(
-      inputs,
-      _makeCompilerOptions(packagesFileUri, platformUri, (_) {
-        errorOccurred = true;
-      }));
-  if (errorOccurred) {
-    return ComparisonNode('Error occurred');
+      inputs, _makeCompilerOptions(packagesFileUri, platformUri, messages.add));
+  if (messages.isNotEmpty) {
+    return ComparisonNode(
+        'Error occurred', messages.map(_diagnosticMessageToNode).toList());
   }
   var libraryNodes = <ComparisonNode>[];
   var visitor = _KernelVisitor(libraryNodes);
@@ -40,14 +42,12 @@
 /// Only libraries whose URI passes the [uriFilter] are included in the results.
 Future<ComparisonNode> analyzeProgram(Uri input, Uri packagesFileUri,
     Uri platformUri, bool uriFilter(Uri uri)) async {
-  var errorOccurred = false;
+  var messages = <DiagnosticMessage>[];
   var component = await kernelForProgram(
-      input,
-      _makeCompilerOptions(packagesFileUri, platformUri, (_) {
-        errorOccurred = true;
-      }));
-  if (errorOccurred) {
-    return ComparisonNode('Error occurred');
+      input, _makeCompilerOptions(packagesFileUri, platformUri, messages.add));
+  if (messages.isNotEmpty) {
+    return ComparisonNode(
+        'Error occurred', messages.map(_diagnosticMessageToNode).toList());
   }
   var libraryNodes = <ComparisonNode>[];
   var visitor = _KernelVisitor(libraryNodes);
@@ -59,8 +59,15 @@
   return ComparisonNode.sorted('Component', libraryNodes);
 }
 
-CompilerOptions _makeCompilerOptions(
-    Uri packagesFileUri, Uri platformUri, ErrorHandler onError) {
+ComparisonNode _diagnosticMessageToNode(DiagnosticMessage message) {
+  // TODO(ahe): Temporarily using FormattedMessage until DiagnosticMessage
+  // is extended to support this use case.
+  FormattedMessage formatted = message;
+  return ComparisonNode(formatted.message);
+}
+
+CompilerOptions _makeCompilerOptions(Uri packagesFileUri, Uri platformUri,
+    DiagnosticMessageHandler onDiagnostic) {
   var targetFlags = TargetFlags(strongMode: true, syncAsync: true);
   var target = NoneTarget(targetFlags);
   var fileSystem = StandardFileSystem.instance;
@@ -73,7 +80,7 @@
     ..target = target
     ..throwOnErrorsForDebugging = false
     ..embedSourceText = false
-    ..onError = onError;
+    ..onDiagnostic = onDiagnostic;
 }
 
 /// Visitor for serializing a kernel representation of a program into
@@ -285,6 +292,7 @@
     var children = <ComparisonNode>[];
     var visitor = _KernelVisitor(children);
     visitor._visitTypeParameters(node.typeParameters);
+    children.add(translate('Return type: ', node.returnType));
     for (int i = 0; i < node.positionalParameters.length; i++) {
       var kind = i < node.requiredParameterCount ? 'Required' : 'Optional';
       children
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 2e84997..fc2cc88 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
@@ -357,7 +357,8 @@
     SourceEdit edit = builder.sourceEdit;
     fileEdit.add(edit);
     int delta = _editDelta(edit);
-    changeBuilder._updatePositions(edit.offset + math.max(0, delta), delta);
+    changeBuilder._updatePositions(
+        edit.offset + math.max<int>(0, delta), delta);
     changeBuilder._lockedPositions.clear();
     _captureSelection(builder, edit);
   }
diff --git a/pkg/analyzer_plugin/test/support/mock_sdk.dart b/pkg/analyzer_plugin/test/support/mock_sdk.dart
index 1b78cca..0a4c58a 100644
--- a/pkg/analyzer_plugin/test/support/mock_sdk.dart
+++ b/pkg/analyzer_plugin/test/support/mock_sdk.dart
@@ -4,27 +4,131 @@
 
 import 'package:analyzer/file_system/file_system.dart' as resource;
 import 'package:analyzer/file_system/memory_file_system.dart' as resource;
+import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/idl.dart' show PackageBundle;
 import 'package:analyzer/src/summary/summary_file_builder.dart';
 
-/**
- * A utility class that will create a Mock SDK on the virtual disk managed by a
- * memory resource provider.
- */
-class MockSdk implements DartSdk {
-  static const MockSdkLibrary LIB_CORE =
-      const MockSdkLibrary('dart:core', '/lib/core/core.dart', '''
+const String librariesContent = r'''
+const Map<String, LibraryInfo> libraries = const {
+  "async": const LibraryInfo("async/async.dart"),
+  "collection": const LibraryInfo("collection/collection.dart"),
+  "convert": const LibraryInfo("convert/convert.dart"),
+  "core": const LibraryInfo("core/core.dart"),
+  "html": const LibraryInfo(
+    "html/dartium/html_dartium.dart",
+    dart2jsPath: "html/dart2js/html_dart2js.dart"),
+  "math": const LibraryInfo("math/math.dart"),
+  "_foreign_helper": const LibraryInfo("_internal/js_runtime/lib/foreign_helper.dart"),
+};
+''';
+
+const String sdkRoot = '/sdk';
+
+const _MockSdkLibrary _LIB_ASYNC =
+    const _MockSdkLibrary('dart:async', '$sdkRoot/lib/async/async.dart', '''
+library dart.async;
+
+import 'dart:math';
+
+part 'stream.dart';
+
+class Future<T> {
+  factory Future(computation()) => null;
+  factory Future.delayed(Duration duration, [T computation()]) => null;
+  factory Future.microtask(FutureOr<T> computation()) => null;
+  factory Future.value([FutureOr<T> result]) => null;
+
+  static Future<List<T>> wait<T>(
+      Iterable<Future<T>> futures) => null;
+  Future<R> then<R>(FutureOr<R> onValue(T value)) => null;
+
+  Future<T> whenComplete(action());
+}
+
+class FutureOr<T> {}
+
+abstract class Completer<T> {
+  factory Completer() => null;
+  factory Completer.sync() => null;
+  Future<T> get future;
+  void complete([value]);
+  void completeError(Object error, [StackTrace stackTrace]);
+  bool get isCompleted;
+}
+
+class _StreamIterator<T> implements StreamIterator<T> {}
+class _AsyncStarStreamController {}
+Function _asyncThenWrapperHelper(continuation) {}
+Function _asyncErrorWrapperHelper(continuation) {}
+Future _awaitHelper(
+    object, Function thenCallback, Function errorCallback, var awaiter) {}
+''', const <String, String>{
+  '$sdkRoot/lib/async/stream.dart': r'''
+part of dart.async;
+abstract class Stream<T> {
+  Future<T> get first;
+  StreamSubscription<T> listen(void onData(T event),
+                               { Function onError,
+                                 void onDone(),
+                                 bool cancelOnError});
+  Stream();
+  factory Stream.fromIterable(Iterable<T> data) => null;
+}
+
+abstract class StreamIterator<T> {}
+
+abstract class StreamSubscription<T> {
+  Future cancel();
+  void onData(void handleData(T data));
+  void onError(Function handleError);
+  void onDone(void handleDone());
+  void pause([Future resumeSignal]);
+  void resume();
+  bool get isPaused;
+  Future<E> asFuture<E>([E futureValue]);
+}
+
+abstract class StreamTransformer<S, T> {}
+'''
+});
+
+const _MockSdkLibrary _LIB_ASYNC2 =
+    const _MockSdkLibrary('dart:async2', '$sdkRoot/lib/async2/async2.dart', '''
+library dart.async2;
+
+class Future {}
+''');
+
+const _MockSdkLibrary _LIB_COLLECTION = const _MockSdkLibrary(
+    'dart:collection', '$sdkRoot/lib/collection/collection.dart', '''
+library dart.collection;
+
+abstract class HashMap<K, V> implements Map<K, V> {}
+''');
+
+const _MockSdkLibrary _LIB_CONVERT = const _MockSdkLibrary(
+    'dart:convert', '$sdkRoot/lib/convert/convert.dart', '''
+library dart.convert;
+
+import 'dart:async';
+
+abstract class Converter<S, T> implements StreamTransformer {}
+class JsonDecoder extends Converter<String, Object> {}
+''');
+
+const _MockSdkLibrary _LIB_CORE =
+    const _MockSdkLibrary('dart:core', '$sdkRoot/lib/core/core.dart', '''
 library dart.core;
 
 import 'dart:async';
 import 'dart:_internal';
 
 class Object {
-  const Object() {}
+  const Object();
   bool operator ==(other) => identical(this, other);
   String toString() => 'a string';
   int get hashCode => 0;
@@ -34,26 +138,49 @@
 
 class Function {}
 class StackTrace {}
-class Symbol {}
+
+class Symbol {
+  const factory Symbol(String name) = _SymbolImpl;
+}
+
+class _SymbolImpl {
+  const _SymbolImpl(String name);
+}
+
 class Type {}
 
 abstract class Comparable<T> {
   int compareTo(T other);
 }
 
-abstract class String implements Comparable<String> {
+abstract class Pattern {}
+abstract class String implements Comparable<String>, Pattern {
   external factory String.fromCharCodes(Iterable<int> charCodes,
                                         [int start = 0, int end]);
+  String operator +(String other) => null;
+  bool operator ==(Object other);
   bool get isEmpty => false;
   bool get isNotEmpty => false;
   int get length => 0;
+  int codeUnitAt(int index);
+  String substring(int len) => null;
+  String toLowerCase();
   String toUpperCase();
   List<int> get codeUnits;
 }
+abstract class RegExp implements Pattern {
+  external factory RegExp(String source);
+}
 
-class bool extends Object {}
+class bool extends Object {
+  external const factory bool.fromEnvironment(String name,
+                                              {bool defaultValue: false});
+}
+
+abstract class Invocation {}
 
 abstract class num implements Comparable<num> {
+  bool operator ==(Object other);
   bool operator <(num other);
   bool operator <=(num other);
   bool operator >(num other);
@@ -61,27 +188,40 @@
   num operator +(num other);
   num operator -(num other);
   num operator *(num other);
-  num operator /(num other);
+  double operator /(num other);
   int operator ^(int other);
-  int operator &(int other);
   int operator |(int other);
   int operator <<(int other);
   int operator >>(int other);
   int operator ~/(num other);
   num operator %(num other);
   int operator ~();
+  num operator -();
   int toInt();
   double toDouble();
   num abs();
   int round();
 }
-
 abstract class int extends num {
+  external const factory int.fromEnvironment(String name, {int defaultValue});
+
+  bool get isNegative;
   bool get isEven => false;
+
+  int operator &(int other);
+  int operator |(int other);
+  int operator ^(int other);
+  int operator ~();
+  int operator <<(int shiftAmount);
+  int operator >>(int shiftAmount);
+
   int operator -();
+
   external static int parse(String source,
                             { int radix,
                               int onError(String source) });
+
+  String toString();
 }
 
 abstract class double extends num {
@@ -114,7 +254,10 @@
 }
 
 class DateTime extends Object {}
-class Null extends Object {}
+
+class Null extends Object {
+  factory Null._uninstantiable() => null;
+}
 
 class Deprecated extends Object {
   final String expires;
@@ -130,11 +273,26 @@
 abstract class Iterable<E> {
   Iterator<E> get iterator;
   bool get isEmpty;
-  Iterable/*<R>*/ map/*<R>*/(/*=R*/ f(E e));
+  E get first;
+  int get length;
+
+  Iterable<R> map<R>(R f(E e));
+
+  R fold<R>(R initialValue,
+      R combine(R previousValue, E element)) => null;
+
+  Iterable<T> expand<T>(Iterable<T> f(E element));
+
+  Iterable<E> where(bool test(E element));
+
+  void forEach(void f(E element));
+
+  List<E> toList();
 }
 
 class List<E> implements Iterable<E> {
-  List();
+  List([int length]);
+  factory List.from(Iterable elements, {bool growable: true}) => null;
   void add(E value) {}
   void addAll(Iterable<E> iterable) {}
   E operator [](int index) => null;
@@ -146,81 +304,135 @@
   E get first => null;
   E get last => null;
 
-  Iterable/*<R>*/ map/*<R>*/(/*=R*/ f(E e)) => null;
-
-  /*=R*/ fold/*<R>*/(/*=R*/ initialValue,
-      /*=R*/ combine(/*=R*/ previousValue, E element)) => null;
-
 }
 
-abstract class Map<K, V> extends Object {
+class Map<K, V> extends Object {
+  Iterable<K> get keys => null;
+  int get length;
+  Iterable<V> get values;
+  V operator [](K key) => null;
+  void operator []=(K key, V value) {}
+  Map<RK, RV> cast<RK, RV>();
   bool containsKey(Object key);
-  Iterable<K> get keys;
+}
+
+class Duration implements Comparable<Duration> {}
+
+class Exception {
+  factory Exception([var message]) => null;
 }
 
 external bool identical(Object a, Object b);
 
 void print(Object object) {}
 
-class Uri {
-  static List<int> parseIPv6Address(String host, [int start = 0, int end]) {
-    int parseHex(int start, int end) {
-      return 0;
-    }
-    return null;
-  }
+class _Proxy { const _Proxy(); }
+const Object proxy = const _Proxy();
+
+class _Override { const _Override(); }
+const Object override = const _Override();
+
+class _CompileTimeError {
+  final String _errorMsg;
+  _CompileTimeError(this._errorMsg);
+}
+
+class AbstractClassInstantiationError {
+  AbstractClassInstantiationError(String className);
+}
+
+class FallThroughError {
+  FallThroughError();
+  FallThroughError._create(String url, int line);
+}
+
+abstract class _SyncIterable implements Iterable {}
+class _InvocationMirror {
+  _InvocationMirror._withoutType(
+      String _functionName, List<Type> _typeArguments,
+      List _positionalArguments, Map<Symbol, dynamic>_namedArguments,
+      bool _isSuperInvocation);
 }
 ''');
 
-  static const MockSdkLibrary LIB_ASYNC =
-      const MockSdkLibrary('dart:async', '/lib/async/async.dart', '''
-library dart.async;
+const _MockSdkLibrary _LIB_FOREIGN_HELPER = const _MockSdkLibrary(
+    'dart:_foreign_helper',
+    '$sdkRoot/lib/_foreign_helper/_foreign_helper.dart', '''
+library dart._foreign_helper;
 
-import 'dart:math';
+JS(String typeDescription, String codeTemplate,
+  [arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11])
+{}
+''');
 
-class Future<T> {
-  factory Future(computation()) => null;
-  factory Future.delayed(Duration duration, [T computation()]) => null;
-  factory Future.value([value]) => null;
-  static Future wait(List<Future> futures) => null;
+const _MockSdkLibrary _LIB_HTML_DART2JS = const _MockSdkLibrary(
+    'dart:html', '$sdkRoot/lib/html/dart2js/html_dart2js.dart', '''
+library dart.html;
+class HtmlElement {}
+''');
+
+const _MockSdkLibrary _LIB_HTML_DARTIUM = const _MockSdkLibrary(
+    'dart:html', '$sdkRoot/lib/html/dartium/html_dartium.dart', '''
+library dart.dom.html;
+
+final HtmlDocument document;
+
+abstract class Element {}
+
+abstract class HtmlDocument {
+  Element query(String relativeSelectors) => null;
 }
 
-class FutureOr<T> {}
+abstract class HtmlElement extends Element {}
 
-class Stream<T> {}
-abstract class StreamTransformer<S, T> {}
+abstract class AnchorElement extends HtmlElement {}
+abstract class BodyElement extends HtmlElement {}
+abstract class ButtonElement extends HtmlElement {}
+abstract class DivElement extends HtmlElement {}
+abstract class InputElement extends HtmlElement {}
+abstract class SelectElement extends HtmlElement {}
+
+
+abstract class CanvasElement extends HtmlElement {
+  Object getContext(String contextId, [Map attributes]);
+  CanvasRenderingContext2D get context2D;
+}
+
+abstract class CanvasRenderingContext2D {}
+
+Element query(String relativeSelectors) => null;
 ''');
 
-  static const MockSdkLibrary LIB_COLLECTION = const MockSdkLibrary(
-      'dart:collection', '/lib/collection/collection.dart', '''
-library dart.collection;
-
-abstract class HashMap<K, V> implements Map<K, V> {}
-abstract class LinkedHashMap<K, V> implements Map<K, V> {}
+const _MockSdkLibrary _LIB_INTERCEPTORS = const _MockSdkLibrary(
+    'dart:_interceptors',
+    '$sdkRoot/lib/_internal/js_runtime/lib/interceptors.dart', '''
+library dart._interceptors;
 ''');
 
-  static const MockSdkLibrary LIB_CONVERT =
-      const MockSdkLibrary('dart:convert', '/lib/convert/convert.dart', '''
-library dart.convert;
-
-import 'dart:async';
-
-abstract class Converter<S, T> implements StreamTransformer {}
-class JsonDecoder extends Converter<String, Object> {}
+const _MockSdkLibrary _LIB_INTERNAL = const _MockSdkLibrary(
+    'dart:_internal', '$sdkRoot/lib/_internal/internal.dart', '''
+library dart._internal;
+class Symbol {}
+class ExternalName {
+  final String name;
+  const ExternalName(this.name);
+}
 ''');
 
-  static const MockSdkLibrary LIB_MATH =
-      const MockSdkLibrary('dart:math', '/lib/math/math.dart', '''
+const _MockSdkLibrary _LIB_MATH =
+    const _MockSdkLibrary('dart:math', '$sdkRoot/lib/math/math.dart', '''
 library dart.math;
+
 const double E = 2.718281828459045;
 const double PI = 3.1415926535897932;
 const double LN10 =  2.302585092994046;
+
 T min<T extends num>(T a, T b) => null;
 T max<T extends num>(T a, T b) => null;
+
 external double cos(num radians);
-external num pow(num x, num exponent);
 external double sin(num radians);
-external double sqrt(num x);
+external double sqrt(num radians);
 class Random {
   bool nextBool() => true;
   double nextDouble() => 2.0;
@@ -228,46 +440,47 @@
 }
 ''');
 
-  static const MockSdkLibrary LIB_HTML = const MockSdkLibrary(
-      'dart:html', '/lib/html/dartium/html_dartium.dart', '''
-library dart.html;
-class HtmlElement {}
-''');
+const List<SdkLibrary> _LIBRARIES = const [
+  _LIB_CORE,
+  _LIB_ASYNC,
+  _LIB_ASYNC2,
+  _LIB_COLLECTION,
+  _LIB_CONVERT,
+  _LIB_FOREIGN_HELPER,
+  _LIB_MATH,
+  _LIB_HTML_DART2JS,
+  _LIB_HTML_DARTIUM,
+  _LIB_INTERCEPTORS,
+  _LIB_INTERNAL,
+];
 
-  static const MockSdkLibrary LIB_INTERNAL =
-      const MockSdkLibrary('dart:_internal', '/lib/internal/internal.dart', '''
-library dart._internal;
-external void printToConsole(String line);
-''');
-
-  static const List<SdkLibrary> LIBRARIES = const [
-    LIB_CORE,
-    LIB_ASYNC,
-    LIB_COLLECTION,
-    LIB_CONVERT,
-    LIB_MATH,
-    LIB_HTML,
-    LIB_INTERNAL,
-  ];
-
-  static const String librariesContent = r'''
-const Map<String, LibraryInfo> libraries = const {
-  "async": const LibraryInfo("async/async.dart"),
-  "collection": const LibraryInfo("collection/collection.dart"),
-  "convert": const LibraryInfo("convert/convert.dart"),
-  "core": const LibraryInfo("core/core.dart"),
-  "html": const LibraryInfo("html/dartium/html_dartium.dart"),
-  "math": const LibraryInfo("math/math.dart"),
-  "_internal": const LibraryInfo("internal/internal.dart"),
-};
-''';
+class MockSdk implements DartSdk {
+  static const Map<String, String> _URI_MAP = const {
+    "dart:core": "$sdkRoot/lib/core/core.dart",
+    "dart:html": "$sdkRoot/lib/html/dartium/html_dartium.dart",
+    "dart:async": "$sdkRoot/lib/async/async.dart",
+    "dart:async2": "$sdkRoot/lib/async2/async2.dart",
+    "dart:async/stream.dart": "$sdkRoot/lib/async/stream.dart",
+    "dart:collection": "$sdkRoot/lib/collection/collection.dart",
+    "dart:convert": "$sdkRoot/lib/convert/convert.dart",
+    "dart:_foreign_helper": "$sdkRoot/lib/_foreign_helper/_foreign_helper.dart",
+    "dart:_interceptors":
+        "$sdkRoot/lib/_internal/js_runtime/lib/interceptors.dart",
+    "dart:_internal": "$sdkRoot/lib/_internal/internal.dart",
+    "dart:math": "$sdkRoot/lib/math/math.dart"
+  };
 
   final resource.MemoryResourceProvider provider;
 
+  final Map<String, String> uriMap = {};
+
   /**
-   * The [AnalysisContext] which is used for all of the sources.
+   * The [AnalysisContextImpl] which is used for all of the sources.
    */
-  InternalAnalysisContext _analysisContext;
+  AnalysisContextImpl _analysisContext;
+
+  @override
+  final List<SdkLibrary> sdkLibraries = [];
 
   /**
    * The cached linked bundle of the SDK.
@@ -278,12 +491,24 @@
       {bool generateSummaryFiles: false,
       resource.MemoryResourceProvider resourceProvider})
       : provider = resourceProvider ?? new resource.MemoryResourceProvider() {
-    LIBRARIES.forEach((SdkLibrary library) {
-      provider.newFile(library.path, (library as MockSdkLibrary).content);
+    _URI_MAP.forEach((uri, path) {
+      uriMap[uri] = provider.convertPath(path);
     });
+
+    for (_MockSdkLibrary library in _LIBRARIES) {
+      var convertedLibrary = library._toProvider(provider);
+      sdkLibraries.add(convertedLibrary);
+    }
+
+    for (_MockSdkLibrary library in sdkLibraries) {
+      provider.newFile(library.path, library.content);
+      library.parts.forEach((String path, String content) {
+        provider.newFile(path, content);
+      });
+    }
     provider.newFile(
         provider.convertPath(
-            '/lib/_internal/sdk_library_metadata/lib/libraries.dart'),
+            '$sdkRoot/lib/_internal/sdk_library_metadata/lib/libraries.dart'),
         librariesContent);
     if (generateSummaryFiles) {
       List<int> bytes = _computeLinkedBundleBytes();
@@ -293,9 +518,9 @@
   }
 
   @override
-  AnalysisContext get context {
+  AnalysisContextImpl get context {
     if (_analysisContext == null) {
-      _analysisContext = new SdkAnalysisContext(null);
+      _analysisContext = new _SdkAnalysisContext(this);
       SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
       _analysisContext.sourceFactory = factory;
     }
@@ -303,27 +528,20 @@
   }
 
   @override
-  List<SdkLibrary> get sdkLibraries => LIBRARIES;
+  String get sdkVersion => throw new UnimplementedError();
 
   @override
-  String get sdkVersion => throw unimplemented;
-
-  UnimplementedError get unimplemented => new UnimplementedError();
-
-  @override
-  List<String> get uris {
-    List<String> uris = <String>[];
-    for (SdkLibrary library in LIBRARIES) {
-      uris.add(library.shortName);
-    }
-    return uris;
-  }
+  List<String> get uris =>
+      sdkLibraries.map((SdkLibrary library) => library.shortName).toList();
 
   @override
   Source fromFileUri(Uri uri) {
     String filePath = provider.pathContext.fromUri(uri);
+    if (!filePath.startsWith(provider.convertPath('$sdkRoot/lib/'))) {
+      return null;
+    }
     for (SdkLibrary library in sdkLibraries) {
-      String libraryPath = provider.convertPath(library.path);
+      String libraryPath = library.path;
       if (filePath == libraryPath) {
         try {
           resource.File file = provider.getResource(filePath);
@@ -368,31 +586,22 @@
 
   @override
   SdkLibrary getSdkLibrary(String dartUri) {
-    // getSdkLibrary() is only used to determine whether a library is internal
-    // to the SDK.  The mock SDK doesn't have any internals, so it's safe to
-    // return null.
+    for (SdkLibrary library in _LIBRARIES) {
+      if (library.shortName == dartUri) {
+        return library;
+      }
+    }
     return null;
   }
 
   @override
   Source mapDartUri(String dartUri) {
-    const Map<String, String> uriToPath = const {
-      "dart:core": "/lib/core/core.dart",
-      "dart:html": "/lib/html/dartium/html_dartium.dart",
-      "dart:async": "/lib/async/async.dart",
-      "dart:collection": "/lib/collection/collection.dart",
-      "dart:convert": "/lib/convert/convert.dart",
-      "dart:math": "/lib/math/math.dart",
-      "dart:_internal": "/lib/internal/internal.dart",
-    };
-
-    String path = uriToPath[dartUri];
+    String path = uriMap[dartUri];
     if (path != null) {
       resource.File file = provider.getResource(path);
       Uri uri = new Uri(scheme: 'dart', path: dartUri.substring(5));
       return file.createSource(uri);
     }
-
     // If we reach here then we tried to use a dartUri that's not in the
     // table above.
     return null;
@@ -409,7 +618,7 @@
   }
 }
 
-class MockSdkLibrary implements SdkLibrary {
+class _MockSdkLibrary implements SdkLibrary {
   @override
   final String shortName;
 
@@ -418,28 +627,59 @@
 
   final String content;
 
-  const MockSdkLibrary(this.shortName, this.path, this.content);
+  final Map<String, String> parts;
+
+  const _MockSdkLibrary(this.shortName, this.path, this.content,
+      [this.parts = const <String, String>{}]);
 
   @override
-  String get category => throw unimplemented;
+  String get category => throw new UnimplementedError();
 
   @override
-  bool get isDart2JsLibrary => throw unimplemented;
+  bool get isDart2JsLibrary => throw new UnimplementedError();
 
   @override
-  bool get isDocumented => throw unimplemented;
+  bool get isDocumented => throw new UnimplementedError();
 
   @override
-  bool get isImplementation => false;
+  bool get isImplementation => throw new UnimplementedError();
 
   @override
   bool get isInternal => shortName.startsWith('dart:_');
 
   @override
-  bool get isShared => throw unimplemented;
+  bool get isShared => throw new UnimplementedError();
 
   @override
-  bool get isVmLibrary => throw unimplemented;
+  bool get isVmLibrary => throw new UnimplementedError();
 
-  UnimplementedError get unimplemented => new UnimplementedError();
+  _MockSdkLibrary _toProvider(resource.MemoryResourceProvider provider) {
+    return new _MockSdkLibrary(
+      shortName,
+      provider.convertPath(path),
+      content,
+      parts.map((path, content) {
+        var convertedPath = provider.convertPath(path);
+        return new MapEntry(convertedPath, content);
+      }),
+    );
+  }
+}
+
+/**
+ * An [AnalysisContextImpl] that only contains sources for a Dart SDK.
+ */
+class _SdkAnalysisContext extends AnalysisContextImpl {
+  final DartSdk sdk;
+
+  _SdkAnalysisContext(this.sdk);
+
+  @override
+  AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+    if (factory == null) {
+      return super.createCacheFromSourceFactory(factory);
+    }
+    return new AnalysisCache(
+        <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]);
+  }
 }
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 2bbd9c2..c68391d 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -26,6 +26,11 @@
       '--experimental-track-allocations';
   static const String experimentalAllocationsPath =
       '--experimental-allocations-path';
+
+  // Temporary experiment for code generation of locals for frequently used
+  // 'this' and constants.
+  static const String experimentLocalNames = '--experiment-code-1';
+
   static const String fastStartup = '--fast-startup';
   static const String fatalWarnings = '--fatal-warnings';
   static const String generateCodeWithCompileTimeErrors =
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 195fb6d..0a8a1b1 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -502,6 +502,10 @@
 
   ClassEntity get forceInlineClass;
 
+  ClassEntity get pragmaClass;
+  FieldEntity get pragmaClassNameField;
+  FieldEntity get pragmaClassOptionsField;
+
   bool isCreateInvocationMirrorHelper(MemberEntity member);
 
   bool isSymbolValidatedConstructor(ConstructorEntity element);
@@ -1321,6 +1325,18 @@
   ClassEntity get forceInlineClass =>
       _forceInlineClass ??= _findHelperClass('ForceInline');
 
+  ClassEntity _pragmaClass;
+  ClassEntity get pragmaClass =>
+      _pragmaClass ??= _findClass(coreLibrary, 'pragma');
+
+  FieldEntity _pragmaClassNameField;
+  FieldEntity get pragmaClassNameField =>
+      _pragmaClassNameField ??= _findClassMember(pragmaClass, 'name');
+
+  FieldEntity _pragmaClassOptionsField;
+  FieldEntity get pragmaClassOptionsField =>
+      _pragmaClassOptionsField ??= _findClassMember(pragmaClass, 'options');
+
   ClassEntity _jsInvocationMirrorClass;
   ClassEntity get jsInvocationMirrorClass =>
       _jsInvocationMirrorClass ??= _findHelperClass('JSInvocationMirror');
@@ -1933,6 +1949,9 @@
   /// Returns the type of the [local] function.
   FunctionType getLocalFunctionType(Local local);
 
+  /// Returns the type of [field].
+  DartType getFieldType(FieldEntity field);
+
   /// Returns the 'unaliased' type of [type]. For typedefs this is the function
   /// type it is an alias of, for other types it is the type itself.
   ///
@@ -2008,7 +2027,4 @@
   /// This is the type used as the default type argument when no explicit type
   /// argument is passed.
   DartType getTypeVariableDefaultType(TypeVariableEntity typeVariable);
-
-  /// Returns the type of [field].
-  DartType getFieldType(FieldEntity field);
 }
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 0ad98b3..1650e96 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -6,7 +6,8 @@
 
 import 'dart:async' show Future;
 
-import 'package:front_end/src/fasta/scanner.dart' show StringToken;
+import 'package:front_end/src/api_unstable/dart2js.dart'
+    show clearStringTokenCanonicalizer;
 
 import '../compiler_new.dart' as api;
 import 'backend_strategy.dart';
@@ -250,7 +251,7 @@
     // multiple times. Implement a better mechanism where we can store
     // such caches in the compiler and get access to them through a
     // suitably maintained static reference to the current compiler.
-    StringToken.canonicalizer.clear();
+    clearStringTokenCanonicalizer();
     Selector.canonicalizedValues.clear();
 
     // The selector objects held in static fields must remain canonical.
diff --git a/pkg/compiler/lib/src/constants/evaluation.dart b/pkg/compiler/lib/src/constants/evaluation.dart
index fbeddd0..9ed3440 100644
--- a/pkg/compiler/lib/src/constants/evaluation.dart
+++ b/pkg/compiler/lib/src/constants/evaluation.dart
@@ -4,7 +4,7 @@
 
 library dart2js.constants.evaluation;
 
-import 'package:front_end/src/fasta/util/link.dart' show Link;
+import 'package:front_end/src/api_unstable/dart2js.dart' show Link;
 
 import '../common.dart';
 import '../common_elements.dart' show CommonElements;
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 9fbf28a..5555b38 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -9,8 +9,6 @@
 import 'dart:io' show exit, File, FileMode, Platform, stdin, stderr;
 
 import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
-import 'package:front_end/src/compute_platform_binaries_location.dart'
-    show computePlatformBinariesLocation;
 import 'package:package_config/discovery.dart' show findPackages;
 
 import '../compiler_new.dart' as api;
@@ -132,7 +130,7 @@
   bool showHints;
   bool enableColors;
   int optimizationLevel = null;
-  Uri platformBinaries = computePlatformBinariesLocation();
+  Uri platformBinaries = fe.computePlatformBinariesLocation();
   Map<String, String> environment = new Map<String, String>();
 
   void passThrough(String argument) => options.add(argument);
@@ -378,6 +376,8 @@
     new OptionHandler(Flags.experimentalTrackAllocations, passThrough),
     new OptionHandler("${Flags.experimentalAllocationsPath}=.+", passThrough),
 
+    new OptionHandler(Flags.experimentLocalNames, passThrough),
+
     // The following three options must come last.
     new OptionHandler('-D.+=.*', addInEnvironment),
     new OptionHandler('-.*', (String argument) {
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 5da90be..1856372 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -858,9 +858,11 @@
   /// - <prefix> is the `as` prefix used for a given deferred import.
   /// - <list of files> is a list of the filenames the must be loaded when that
   ///   import is loaded.
-  Map<String, Map<String, dynamic>> computeDeferredMap() {
-    Map<String, Map<String, dynamic>> mapping =
-        new Map<String, Map<String, dynamic>>();
+  Map<String, Map<String, dynamic>> computeDeferredMap(
+      {Set<OutputUnit> omittedUnits}) {
+    omittedUnits ??= Set();
+    Map<String, Map<String, dynamic>> mapping = {};
+
     _deferredImportDescriptions.keys.forEach((ImportEntity import) {
       List<OutputUnit> outputUnits = hunksToLoad[_importDeferName[import]];
       ImportDescription description = _deferredImportDescriptions[import];
@@ -876,10 +878,11 @@
                 "imports": <String, List<String>>{}
               });
 
-      libraryMap["imports"][_importDeferName[import]] =
-          outputUnits.map((OutputUnit outputUnit) {
-        return deferredPartFileName(outputUnit.name);
-      }).toList();
+      List<String> partFileNames = outputUnits
+          .where((outputUnit) => !omittedUnits.contains(outputUnit))
+          .map((outputUnit) => deferredPartFileName(outputUnit.name))
+          .toList();
+      libraryMap["imports"][_importDeferName[import]] = partFileNames;
     });
     return mapping;
   }
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 63f77e8..13666dd 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -14,7 +14,8 @@
 /// location of the existing element.
 library dart2js.messages;
 
-import 'package:front_end/src/fasta/scanner.dart' show ErrorToken, Token;
+import 'package:front_end/src/api_unstable/dart2js.dart' show tokenToString;
+
 import 'generated/shared_messages.dart' as shared_messages;
 import '../constants/expressions.dart' show ConstantExpression;
 import '../commandline_options.dart';
@@ -728,13 +729,10 @@
   int get hashCode => throw new UnsupportedError('Message.hashCode');
 
   static String convertToString(value) {
-    if (value is ErrorToken) {
-      // Shouldn't happen.
-      return value.assertionMessage.message;
-    } else if (value is Token) {
-      value = value.lexeme;
-    } else if (value is ConstantExpression) {
+    if (value is ConstantExpression) {
       value = value.toDartText();
+    } else {
+      value = tokenToString(value);
     }
     return '$value';
   }
diff --git a/pkg/compiler/lib/src/elements/entities.dart b/pkg/compiler/lib/src/elements/entities.dart
index d882154..7acd088 100644
--- a/pkg/compiler/lib/src/elements/entities.dart
+++ b/pkg/compiler/lib/src/elements/entities.dart
@@ -4,8 +4,7 @@
 
 library entities;
 
-import 'package:front_end/src/fasta/parser/async_modifier.dart'
-    show AsyncModifier;
+import 'package:front_end/src/api_unstable/dart2js.dart' show AsyncModifier;
 
 import '../common.dart';
 import '../universe/call_structure.dart' show CallStructure;
diff --git a/pkg/compiler/lib/src/elements/entity_utils.dart b/pkg/compiler/lib/src/elements/entity_utils.dart
index 9b11b16..6096e4a 100644
--- a/pkg/compiler/lib/src/elements/entity_utils.dart
+++ b/pkg/compiler/lib/src/elements/entity_utils.dart
@@ -4,7 +4,7 @@
 
 library entity_utils;
 
-import 'package:front_end/src/fasta/scanner.dart'
+import 'package:front_end/src/api_unstable/dart2js.dart'
     show isUserDefinableOperator, isMinusOperator;
 
 import 'entities.dart';
diff --git a/pkg/compiler/lib/src/elements/names.dart b/pkg/compiler/lib/src/elements/names.dart
index cd95ae1..dd60ab4 100644
--- a/pkg/compiler/lib/src/elements/names.dart
+++ b/pkg/compiler/lib/src/elements/names.dart
@@ -4,7 +4,8 @@
 
 library dart2js.elements.names;
 
-import 'package:front_end/src/fasta/scanner/characters.dart' show $_;
+import 'package:front_end/src/api_unstable/dart2js.dart' show $_;
+
 import 'entities.dart' show LibraryEntity;
 
 /// A [Name] represents the abstraction of a Dart identifier which takes privacy
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 23785e3..2a6c146 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -15,7 +15,6 @@
 import '../js_backend/backend.dart';
 import '../js_model/element_map.dart';
 import '../js_model/locals.dart' show JumpVisitor;
-import '../kernel/element_map.dart';
 import '../native/behavior.dart';
 import '../options.dart';
 import '../types/abstract_value_domain.dart';
@@ -1678,8 +1677,8 @@
     // are calling does not expose this.
     _markThisAsExposed();
 
-    MemberEntity member = _elementMap.getSuperMember(
-        _analyzedMember, node.name, node.interfaceTarget);
+    MemberEntity member =
+        _elementMap.getSuperMember(_analyzedMember, node.name);
     AbstractValue mask = _memberData.typeOfSend(node);
     Selector selector = new Selector.getter(_elementMap.getName(node.name));
     if (member == null) {
@@ -1701,9 +1700,8 @@
     _markThisAsExposed();
 
     TypeInformation rhsType = visit(node.value);
-    MemberEntity member = _elementMap.getSuperMember(
-        _analyzedMember, node.name, node.interfaceTarget,
-        setter: true);
+    MemberEntity member =
+        _elementMap.getSuperMember(_analyzedMember, node.name, setter: true);
     AbstractValue mask = _memberData.typeOfSend(node);
     Selector selector = new Selector.setter(_elementMap.getName(node.name));
     ArgumentsTypes arguments = new ArgumentsTypes([rhsType], null);
@@ -1721,8 +1719,8 @@
     // are calling does not expose this.
     _markThisAsExposed();
 
-    MemberEntity member = _elementMap.getSuperMember(
-        _analyzedMember, node.name, node.interfaceTarget);
+    MemberEntity member =
+        _elementMap.getSuperMember(_analyzedMember, node.name);
     ArgumentsTypes arguments = analyzeArguments(node.arguments);
     Selector selector = _elementMap.getSelector(node);
     AbstractValue mask = _memberData.typeOfSend(node);
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 6597fcd..3c2f370 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -19,7 +19,6 @@
 import '../js_emitter/sorter.dart';
 import '../js_model/element_map.dart';
 import '../js_model/locals.dart';
-import '../kernel/element_map.dart';
 import '../native/behavior.dart' as native;
 import '../options.dart';
 import '../types/abstract_value_domain.dart';
diff --git a/pkg/compiler/lib/src/io/kernel_source_information.dart b/pkg/compiler/lib/src/io/kernel_source_information.dart
index 1d7ad8f..eb71af5 100644
--- a/pkg/compiler/lib/src/io/kernel_source_information.dart
+++ b/pkg/compiler/lib/src/io/kernel_source_information.dart
@@ -10,7 +10,6 @@
 import 'package:kernel/ast.dart' as ir;
 import '../elements/entities.dart';
 import '../js_model/element_map.dart';
-import '../kernel/element_map.dart';
 import '../js_model/js_strategy.dart';
 import '../universe/call_structure.dart';
 import 'source_information.dart';
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 0833c83..ce1bd2f 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -134,6 +134,11 @@
     return visitNode(node.value);
   }
 
+  /// Computes the result type of the property access [node] on a receiver of
+  /// type [receiverType].
+  ///
+  /// If the `node.interfaceTarget` is `null` but matches an `Object` member
+  /// it is updated to target this member.
   ir.DartType computePropertyGetType(
       ir.PropertyGet node, ir.DartType receiverType) {
     ir.Member interfaceTarget = node.interfaceTarget;
@@ -209,9 +214,46 @@
         typeEnvironment.isOverloadedArithmeticOperator(interfaceTarget);
   }
 
+  ir.Member _getMember(ir.Class cls, String name) {
+    for (ir.Member member in cls.members) {
+      if (member.name.name == name) return member;
+    }
+    throw fail("Member '$name' not found in $cls");
+  }
+
+  ir.Procedure _objectEquals;
+  ir.Procedure get objectEquals =>
+      _objectEquals ??= _getMember(typeEnvironment.objectType.classNode, '==');
+
+  /// Returns [receiverType] narrowed to enclosing class of [interfaceTarget].
+  ///
+  /// If [interfaceTarget] is `null` or `receiverType` is _not_ `dynamic` no
+  /// narrowing is performed.
+  ir.DartType narrowInstanceReceiver(
+      ir.Member interfaceTarget, ir.DartType receiverType) {
+    if (interfaceTarget != null && receiverType == const ir.DynamicType()) {
+      receiverType = interfaceTarget.enclosingClass.thisType;
+    }
+    return receiverType;
+  }
+
+  /// Computes the result type of the method invocation [node] on a receiver of
+  /// type [receiverType].
+  ///
+  /// If the `node.interfaceTarget` is `null` but matches an `Object` member
+  /// it is updated to target this member.
   ir.DartType computeMethodInvocationType(
       ir.MethodInvocation node, ir.DartType receiverType) {
     ir.Member interfaceTarget = node.interfaceTarget;
+    // TODO(34602): Remove when `interfaceTarget` is set on synthetic calls to
+    // ==.
+    if (interfaceTarget == null &&
+        node.name.name == '==' &&
+        node.arguments.types.isEmpty &&
+        node.arguments.positional.length == 1 &&
+        node.arguments.named.isEmpty) {
+      interfaceTarget = node.interfaceTarget = objectEquals;
+    }
     if (interfaceTarget != null) {
       if (isSpecialCasedBinaryOperator(interfaceTarget)) {
         ir.DartType argumentType = visitNode(node.arguments.positional[0]);
diff --git a/pkg/compiler/lib/src/ir/visitors.dart b/pkg/compiler/lib/src/ir/visitors.dart
index 5cc478d..549ad34 100644
--- a/pkg/compiler/lib/src/ir/visitors.dart
+++ b/pkg/compiler/lib/src/ir/visitors.dart
@@ -94,11 +94,16 @@
   }
 
   ConstructedConstantExpression _computeConstructorInvocation(
-      ir.Constructor target, ir.Arguments arguments) {
+      ir.Constructor target,
+      ir.Arguments arguments,
+      // TODO(johnniwinther): Remove this when correct type arguments are passed
+      // through [arguments]. Current [ir.RedirectingInitializer] doesn't have
+      // any type arguments.
+      List<ir.DartType> types) {
     List<ConstantExpression> expressions = _computeArguments(arguments);
     if (expressions == null) return null;
     return new ConstructedConstantExpression(
-        elementMap.createInterfaceType(target.enclosingClass, arguments.types),
+        elementMap.createInterfaceType(target.enclosingClass, types),
         elementMap.getConstructor(target),
         elementMap.getCallStructure(arguments),
         expressions);
@@ -107,7 +112,8 @@
   @override
   ConstantExpression visitConstructorInvocation(ir.ConstructorInvocation node) {
     if (!node.isConst) return null;
-    return _computeConstructorInvocation(node.target, node.arguments);
+    return _computeConstructorInvocation(
+        node.target, node.arguments, node.arguments.types);
   }
 
   @override
@@ -465,10 +471,14 @@
         registerField(initializer.field, visit(initializer.value));
       } else if (initializer is ir.SuperInitializer) {
         superConstructorInvocation = _computeConstructorInvocation(
-            initializer.target, initializer.arguments);
+            initializer.target,
+            initializer.arguments,
+            initializer.arguments.types);
       } else if (initializer is ir.RedirectingInitializer) {
         superConstructorInvocation = _computeConstructorInvocation(
-            initializer.target, initializer.arguments);
+            initializer.target,
+            initializer.arguments,
+            node.enclosingClass.thisType.typeArguments);
       } else if (initializer is ir.AssertInitializer) {
         ConstantExpression condition = visit(initializer.statement.condition);
         ConstantExpression message = initializer.statement.message != null
diff --git a/pkg/compiler/lib/src/js_backend/allocator_analysis.dart b/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
index bebbf7f..7415322 100644
--- a/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
@@ -41,9 +41,7 @@
   // Register class during resolution. Use simple syntactic analysis to find
   // null-initialized fields.
   void registerInstantiatedClass(KClass class_) {
-    ClassDefinition definition = _elementMap.getClassDefinition(class_);
-    assert(definition.kind == ClassKind.regular);
-    ir.Class classNode = definition.node;
+    ir.Class classNode = _elementMap.getClassNode(class_);
 
     Set<ir.Field> nulls = new Set<ir.Field>();
     for (ir.Field field in classNode.fields) {
diff --git a/pkg/compiler/lib/src/js_backend/annotations.dart b/pkg/compiler/lib/src/js_backend/annotations.dart
index f2e11f2..5f66d8f 100644
--- a/pkg/compiler/lib/src/js_backend/annotations.dart
+++ b/pkg/compiler/lib/src/js_backend/annotations.dart
@@ -11,34 +11,6 @@
 import '../elements/entities.dart';
 import '../native/native.dart' as native;
 
-const VERBOSE_OPTIMIZER_HINTS = false;
-
-/// Returns `true` if inlining is disabled for [element].
-bool _noInline(KElementEnvironment elementEnvironment,
-    KCommonElements commonElements, MemberEntity element) {
-  if (_hasAnnotation(
-      elementEnvironment, element, commonElements.metaNoInlineClass)) {
-    return true;
-  }
-  if (_hasAnnotation(
-      elementEnvironment, element, commonElements.expectNoInlineClass)) {
-    // TODO(floitsch): restrict to elements from the test directory.
-    return true;
-  }
-  return _hasAnnotation(
-      elementEnvironment, element, commonElements.noInlineClass);
-}
-
-/// Returns `true` if inlining is requested for [element].
-bool _tryInline(KElementEnvironment elementEnvironment,
-    KCommonElements commonElements, MemberEntity element) {
-  if (_hasAnnotation(
-      elementEnvironment, element, commonElements.metaTryInlineClass)) {
-    return true;
-  }
-  return false;
-}
-
 /// Returns `true` if parameter and returns types should be trusted for
 /// [element].
 bool _trustTypeAnnotations(KElementEnvironment elementEnvironment,
@@ -80,7 +52,7 @@
 
   void processMemberAnnotations(MemberEntity element) {
     bool hasNoInline = false;
-    bool hasForceInline = false;
+    bool hasTryInline = false;
 
     if (_trustTypeAnnotations(elementEnvironment, commonElements, element)) {
       annotationsDataBuilder.registerTrustTypeAnnotations(element);
@@ -90,93 +62,112 @@
       annotationsDataBuilder.registerAssumeDynamic(element);
     }
 
-    if (element.isFunction || element.isConstructor) {
-      if (_noInline(elementEnvironment, commonElements, element)) {
-        hasNoInline = true;
-        annotationsDataBuilder.markAsNonInlinable(element);
-      }
-      if (_tryInline(elementEnvironment, commonElements, element)) {
-        hasForceInline = true;
-        if (hasNoInline) {
-          reporter.reportErrorMessage(element, MessageKind.GENERIC,
-              {'text': '@tryInline must not be used with @noInline.'});
-        } else {
-          annotationsDataBuilder.markAsTryInline(element);
-        }
-      }
-    }
-
+    // TODO(sra): Check for inappropriate annotations on fields.
     if (element.isField) return;
-    FunctionEntity method = element;
 
-    LibraryEntity library = method.library;
-    if (library.canonicalUri.scheme != 'dart' &&
-        !native.maybeEnableNative(library.canonicalUri)) {
-      return;
-    }
+    FunctionEntity method = element;
+    LibraryEntity library = element.library;
+    bool platformAnnotationsAllowed = library.canonicalUri.scheme == 'dart' ||
+        native.maybeEnableNative(library.canonicalUri);
 
     bool hasNoThrows = false;
     bool hasNoSideEffects = false;
+
     for (ConstantValue constantValue
         in elementEnvironment.getMemberMetadata(method)) {
       if (!constantValue.isConstructedObject) continue;
-      ObjectConstantValue value = constantValue;
+      ConstructedConstantValue value = constantValue;
       ClassEntity cls = value.type.element;
-      if (cls == commonElements.forceInlineClass) {
-        hasForceInline = true;
-        if (VERBOSE_OPTIMIZER_HINTS) {
-          reporter.reportHintMessage(
-              method, MessageKind.GENERIC, {'text': "Must inline"});
+      assert(cls != null); // Unresolved classes null.
+
+      if (platformAnnotationsAllowed) {
+        if (cls == commonElements.forceInlineClass) {
+          hasTryInline = true;
+        } else if (cls == commonElements.noInlineClass) {
+          hasNoInline = true;
+        } else if (cls == commonElements.noThrowsClass) {
+          hasNoThrows = true;
+          bool isValid = true;
+          if (method.isTopLevel) {
+            isValid = true;
+          } else if (method.isStatic) {
+            isValid = true;
+          } else if (method is ConstructorEntity &&
+              method.isFactoryConstructor) {
+            isValid = true;
+          }
+          if (!isValid) {
+            reporter.internalError(
+                method,
+                "@NoThrows() is currently limited to top-level"
+                " or static functions and factory constructors.");
+          }
+          annotationsDataBuilder.registerCannotThrow(method);
+        } else if (cls == commonElements.noSideEffectsClass) {
+          hasNoSideEffects = true;
+          annotationsDataBuilder.registerSideEffectsFree(method);
         }
-        annotationsDataBuilder.markAsTryInline(method);
-      } else if (cls == commonElements.noInlineClass) {
+      }
+
+      if (cls == commonElements.expectNoInlineClass) {
         hasNoInline = true;
-        if (VERBOSE_OPTIMIZER_HINTS) {
-          reporter.reportHintMessage(
-              method, MessageKind.GENERIC, {'text': "Cannot inline"});
+      } else if (cls == commonElements.metaNoInlineClass) {
+        hasNoInline = true;
+      } else if (cls == commonElements.metaTryInlineClass) {
+        hasTryInline = true;
+      } else if (cls == commonElements.pragmaClass) {
+        // Recognize:
+        //
+        //     @pragma('dart2js:noInline')
+        //     @pragma('dart2js:tryInline')
+        //
+        ConstantValue nameValue =
+            value.fields[commonElements.pragmaClassNameField];
+        if (nameValue == null || !nameValue.isString) continue;
+        String name = (nameValue as StringConstantValue).stringValue;
+        if (!name.startsWith('dart2js:')) continue;
+
+        ConstantValue optionsValue =
+            value.fields[commonElements.pragmaClassOptionsField];
+        if (name == 'dart2js:noInline') {
+          if (!optionsValue.isNull) {
+            reporter.reportErrorMessage(element, MessageKind.GENERIC,
+                {'text': "@pragma('$name') annotation does not take options"});
+          }
+          hasNoInline = true;
+        } else if (name == 'dart2js:tryInline') {
+          if (!optionsValue.isNull) {
+            reporter.reportErrorMessage(element, MessageKind.GENERIC,
+                {'text': "@pragma('$name') annotation does not take options"});
+          }
+          hasTryInline = true;
+        } else if (!platformAnnotationsAllowed) {
+          reporter.reportErrorMessage(element, MessageKind.GENERIC,
+              {'text': "Unknown dart2js pragma @pragma('$name')"});
+        } else {
+          // Handle platform-only `@pragma` annotations.
         }
-        annotationsDataBuilder.markAsNonInlinable(method);
-      } else if (cls == commonElements.noThrowsClass) {
-        hasNoThrows = true;
-        bool isValid = true;
-        if (method.isTopLevel) {
-          isValid = true;
-        } else if (method.isStatic) {
-          isValid = true;
-        } else if (method is ConstructorEntity && method.isFactoryConstructor) {
-          isValid = true;
-        }
-        if (!isValid) {
-          reporter.internalError(
-              method,
-              "@NoThrows() is currently limited to top-level"
-              " or static functions and factory constructors.");
-        }
-        if (VERBOSE_OPTIMIZER_HINTS) {
-          reporter.reportHintMessage(
-              method, MessageKind.GENERIC, {'text': "Cannot throw"});
-        }
-        annotationsDataBuilder.registerCannotThrow(method);
-      } else if (cls == commonElements.noSideEffectsClass) {
-        hasNoSideEffects = true;
-        if (VERBOSE_OPTIMIZER_HINTS) {
-          reporter.reportHintMessage(
-              method, MessageKind.GENERIC, {'text': "Has no side effects"});
-        }
-        annotationsDataBuilder.registerSideEffectsFree(method);
       }
     }
-    if (hasForceInline && hasNoInline) {
-      reporter.internalError(
-          method, "@ForceInline() must not be used with @NoInline.");
+
+    if (hasTryInline && hasNoInline) {
+      reporter.reportErrorMessage(element, MessageKind.GENERIC,
+          {'text': '@tryInline must not be used with @noInline.'});
+      hasTryInline = false;
+    }
+    if (hasNoInline) {
+      annotationsDataBuilder.markAsNonInlinable(method);
+    }
+    if (hasTryInline) {
+      annotationsDataBuilder.markAsTryInline(method);
     }
     if (hasNoThrows && !hasNoInline) {
       reporter.internalError(
-          method, "@NoThrows() should always be combined with @NoInline.");
+          method, "@NoThrows() should always be combined with @noInline.");
     }
     if (hasNoSideEffects && !hasNoInline) {
       reporter.internalError(
-          method, "@NoSideEffects() should always be combined with @NoInline.");
+          method, "@NoSideEffects() should always be combined with @noInline.");
     }
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index 44c9b93..7b8589b 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -283,5 +283,6 @@
   Iterable<MemberEntity> get processedEntities => _processedEntities;
 
   @override
-  Iterable<ClassEntity> get processedClasses => _worldBuilder.processedClasses;
+  Iterable<ClassEntity> get processedClasses =>
+      _worldBuilder.instantiatedClasses;
 }
diff --git a/pkg/compiler/lib/src/js_backend/inferred_data.dart b/pkg/compiler/lib/src/js_backend/inferred_data.dart
index 0d62ef1..1f1f272 100644
--- a/pkg/compiler/lib/src/js_backend/inferred_data.dart
+++ b/pkg/compiler/lib/src/js_backend/inferred_data.dart
@@ -205,8 +205,7 @@
   }
 
   static void emptyWorkList(Iterable<SideEffectsBuilder> sideEffectsBuilders) {
-    // TODO(johnniwinther): Optimize this algorithm, possibly by using
-    // `pkg/front_end/lib/src/dependency_walker.dart`.
+    // TODO(johnniwinther): Optimize this algorithm.
     Queue<SideEffectsBuilder> queue = new Queue<SideEffectsBuilder>();
     Set<SideEffectsBuilder> inQueue = new Set<SideEffectsBuilder>();
 
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index b0ac3c1..b5c79d9 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -6,7 +6,9 @@
 
 import 'dart:collection' show HashMap;
 
-import 'package:front_end/src/fasta/scanner/characters.dart';
+import 'package:front_end/src/api_unstable/dart2js.dart'
+    show $0, $9, $A, $Z, $_, $a, $g, $s, $z;
+
 import 'package:js_runtime/shared/embedded_names.dart' show JsGetName;
 
 import '../closure.dart';
@@ -1583,8 +1585,9 @@
   jsAst.Name aliasedSuperMemberPropertyName(MemberEntity member) {
     assert(!member.isField); // Fields do not need super aliases.
     return _disambiguateInternalMember(member, () {
+      String className = member.enclosingClass.name.replaceAll('&', '_');
       String invocationName = operatorNameToIdentifier(member.name);
-      return "super\$${member.enclosingClass.name}\$$invocationName";
+      return "super\$${className}\$$invocationName";
     });
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 0faa130..daa1915 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -245,7 +245,7 @@
         .getClassSet(_closedWorld.commonElements.objectClass)
         .subtypes()) {
       ClassUse classUse = new ClassUse()
-        ..instance = true
+        ..directInstance = true
         ..checkedInstance = true
         ..typeArgument = true
         ..checkedTypeArgument = true
@@ -357,7 +357,10 @@
       ClassEntity other = cls;
       while (other != null) {
         inheritedClasses.add(other);
-        if (_elementEnvironment.isMixinApplication(other)) {
+        if (classUse.instance &&
+            _elementEnvironment.isMixinApplication(other)) {
+          // We don't mixin [other] if [cls] isn't instantiated, directly or
+          // indirectly.
           inheritedClasses
               .add(_elementEnvironment.getEffectiveMixinClass(other));
         }
@@ -494,7 +497,9 @@
 
     for (ClassEntity cls in classUseMap.keys) {
       ClassUse classUse = classUseMap[cls] ?? emptyUse;
-      if (classUse.instance || classUse.typeArgument || classUse.typeLiteral) {
+      if (classUse.directInstance ||
+          classUse.typeArgument ||
+          classUse.typeLiteral) {
         // Add checks only for classes that are live either as instantiated
         // classes or type arguments passed at runtime.
         computeChecks(cls);
@@ -1935,11 +1940,16 @@
       }
     });
 
+    codegenWorldBuilder.instantiatedClasses.forEach((ClassEntity cls) {
+      ClassUse classUse = classUseMap.putIfAbsent(cls, () => new ClassUse());
+      classUse.instance = true;
+    });
+
     codegenWorldBuilder.instantiatedTypes.forEach((InterfaceType type) {
       liveTypeVisitor.visitType(type, TypeVisitorState.direct);
       ClassUse classUse =
           classUseMap.putIfAbsent(type.element, () => new ClassUse());
-      classUse.instance = true;
+      classUse.directInstance = true;
       FunctionType callType = _types.getCallType(type);
       if (callType != null) {
         testedTypeVisitor.visitType(callType, TypeVisitorState.direct);
@@ -2838,15 +2848,26 @@
 
 /// Runtime type usage for a class.
 class ClassUse {
-  /// Whether the class is instantiated.
+  /// Whether the class is directly or indirectly instantiated.
   ///
-  /// For instance `A` in:
+  /// For instance `A` and `B` in:
   ///
   ///     class A {}
-  ///     main() => new A();
+  ///     class B extends A {}
+  ///     main() => new B();
   ///
   bool instance = false;
 
+  /// Whether the class is directly instantiated.
+  ///
+  /// For instance `B` in:
+  ///
+  ///     class A {}
+  ///     class B extends A {}
+  ///     main() => new B();
+  ///
+  bool directInstance = false;
+
   /// Whether objects are checked to be instances of the class.
   ///
   /// For instance `A` in:
@@ -2895,13 +2916,16 @@
 
   /// `true` if the class is 'live' either through instantiation or use in
   /// type arguments.
-  bool get isLive => instance || typeArgument;
+  bool get isLive => directInstance || typeArgument;
 
   String toString() {
     List<String> properties = <String>[];
     if (instance) {
       properties.add('instance');
     }
+    if (directInstance) {
+      properties.add('directInstance');
+    }
     if (checkedInstance) {
       properties.add('checkedInstance');
     }
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart
index 5e15f2a..4f1d533 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart
@@ -9,7 +9,7 @@
 import '../../js/js.dart' show js;
 import '../../js_backend/js_backend.dart' show GetterName, SetterName;
 import '../../universe/selector.dart' show Selector;
-import 'package:front_end/src/fasta/scanner/characters.dart'
+import 'package:front_end/src/api_unstable/dart2js.dart'
     show $$, $A, $HASH, $Z, $a, $z;
 import '../../world.dart' show JClosedWorld;
 import '../js_emitter.dart' hide Emitter, EmitterFactory;
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/deferred_fragment_hash.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/deferred_fragment_hash.dart
deleted file mode 100644
index 4c09dcf..0000000
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/deferred_fragment_hash.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart2js.js_emitter.startup_emitter.model_emitter;
-
-class _DeferredFragmentHash extends js.DeferredString {
-  String _hash;
-  final DeferredFragment _fragment;
-
-  _DeferredFragmentHash(this._fragment);
-
-  void setHash(String hash) {
-    assert(_hash == null);
-    _hash = hash;
-  }
-
-  @override
-  String get value {
-    assert(_hash != null);
-    // Note the additional quotes in the returned value.
-    return '"$_hash"';
-  }
-
-  String toString() => "HashCode for ${_fragment} [$_hash]";
-}
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 46ae073..38bd64e 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
@@ -76,7 +76,7 @@
 
 // Sets the name property of functions, if the JS engine doesn't set the name
 // itself.
-// As of 2015 only IE doesn't set the name.
+// As of 2018 only IE11 doesn't set the name.
 function setFunctionNamesIfNecessary(holders) {
   if (functionsHaveName) return;
   for (var i = 0; i < holders.length; i++) {
@@ -266,7 +266,7 @@
   var types = #embeddedTypes;
   var length = types.length;
   // The tear-off function uses another 'typesOffset' value cached in
-  // [initializeDeferredHunk] so [updateTypes] can be called either before of
+  // [initializeDeferredHunk] so [updateTypes] can be called either before or
   // after the tearoffs have been installed.
   types.push.apply(types, newTypes);
   return length;
@@ -501,8 +501,8 @@
     return js.js('#.#', [cls.holder.name, cls.name]);
   }
 
-  js.Statement emitMainFragment(Program program,
-      Map<DeferredFragment, _DeferredFragmentHash> deferredLoadHashes) {
+  js.Statement emitMainFragment(
+      Program program, DeferredLoadingState deferredLoadingState) {
     MainFragment fragment = program.fragments.first;
 
     Iterable<Holder> nonStaticStateHolders =
@@ -510,6 +510,9 @@
 
     String softDeferredId = "softDeferred${new Random().nextInt(0x7FFFFFFF)}";
 
+    HolderCode holderCode =
+        emitHolders(program.holders, fragment, initializeEmptyHolders: true);
+
     js.Statement mainCode = js.js.statement(mainBoilerplate, {
       'directAccessTestExpression': js.js(directAccessTestExpression),
       'cyclicThrow': backend.emitter
@@ -527,7 +530,7 @@
           allowRename: false),
       'staticState': js.js('#', namer.staticStateHolder),
       'constantHolderReference': buildConstantHolderReference(program),
-      'holders': emitHolders(program.holders, fragment),
+      'holders': holderCode.statements,
       'callName': js.string(namer.callNameField),
       'stubName': js.string(namer.stubNameField),
       'argumentCount': js.string(namer.requiredParameterField),
@@ -543,7 +546,7 @@
       'constants': emitConstants(fragment),
       'staticNonFinalFields': emitStaticNonFinalFields(fragment),
       'lazyStatics': emitLazilyInitializedStatics(fragment),
-      'embeddedGlobals': emitEmbeddedGlobals(program, deferredLoadHashes),
+      'embeddedGlobals': emitEmbeddedGlobals(program, deferredLoadingState),
       'nativeSupport': program.needsNativeSupport
           ? emitNativeSupport(fragment)
           : new js.EmptyStatement(),
@@ -574,7 +577,7 @@
   }
 
   js.Statement emitInstallHoldersAsLocals(Iterable<Holder> holders) {
-    List<js.Statement> holderInits = <js.Statement>[];
+    List<js.Statement> holderInits = [];
     int counter = 0;
     for (Holder holder in holders) {
       holderInits.add(new js.ExpressionStatement(new js.VariableInitialization(
@@ -586,37 +589,85 @@
 
   js.Expression emitDeferredFragment(DeferredFragment fragment,
       js.Expression deferredTypes, List<Holder> holders) {
+    HolderCode holderCode =
+        emitHolders(holders, fragment, initializeEmptyHolders: false);
+
     List<Holder> nonStaticStateHolders = holders
         .where((Holder holder) => !holder.isStaticStateHolder)
         .toList(growable: false);
 
-    List<js.Statement> updateHolderAssignments = <js.Statement>[];
+    List<js.Statement> updateHolderAssignments = [];
     for (int i = 0; i < nonStaticStateHolders.length; i++) {
       Holder holder = nonStaticStateHolders[i];
-      updateHolderAssignments.add(js.js.statement(
-          '#holder = updateHolder(holdersList[#index], #holder)',
-          {'index': js.number(i), 'holder': new js.VariableUse(holder.name)}));
+      if (holderCode.activeHolders.contains(holder)) {
+        updateHolderAssignments.add(js.js.statement(
+            '#holder = updateHolder(holdersList[#index], #holder)', {
+          'index': js.number(i),
+          'holder': new js.VariableUse(holder.name)
+        }));
+      } else {
+        // TODO(sra): Change declaration followed by assignments to declarations
+        // with initialization.
+        updateHolderAssignments.add(js.js.statement(
+            '#holder = holdersList[#index]', {
+          'index': js.number(i),
+          'holder': new js.VariableUse(holder.name)
+        }));
+      }
     }
+
+    var classPrototypes = emitPrototypes(fragment, includeClosures: false);
+    var closurePrototypes = emitPrototypes(fragment, includeClosures: true);
+    var inheritance = emitInheritance(fragment);
+    var methodAliases = emitInstanceMethodAliases(fragment);
+    var tearOffs = emitInstallTearOffs(fragment);
+    var constants = emitConstants(fragment);
+    var staticNonFinalFields = emitStaticNonFinalFields(fragment);
+    var lazyInitializers = emitLazilyInitializedStatics(fragment);
+    // TODO(floitsch): only call emitNativeSupport if we need native.
+    var nativeSupport = emitNativeSupport(fragment);
+
+    // TODO(sra): How do we tell if [deferredTypes] is empty? It is filled-in
+    // later via the program finalizers. So we should defer the decision on the
+    // emptiness of the fragment until the finalizers have run.  For now we seem
+    // to get away with the fact that type indexes are either (1) main unit or
+    // (2) local to the emitted unit, so there is no such thing as a type in a
+    // deferred unit that is referenced from another deferred unit.  If we did
+    // not emit any functions, then we probably did not use the signature types
+    // in the OutputUnit's types, leaving them unused and tree-shaken.
+
+    if (holderCode.activeHolders.isEmpty &&
+        isEmptyStatement(classPrototypes) &&
+        isEmptyStatement(closurePrototypes) &&
+        isEmptyStatement(inheritance) &&
+        isEmptyStatement(methodAliases) &&
+        isEmptyStatement(tearOffs) &&
+        isEmptyStatement(constants) &&
+        isEmptyStatement(staticNonFinalFields) &&
+        isEmptyStatement(lazyInitializers) &&
+        isEmptyStatement(nativeSupport)) {
+      return null;
+    }
+
     // TODO(floitsch): don't just reference 'init'.
     return js.js(deferredBoilerplateDart2, {
       'embeddedGlobalsObject': new js.Parameter('init'),
       'staticState': new js.Parameter(namer.staticStateHolder),
-      'holders': emitHolders(holders, fragment),
-      'deferredHoldersList': new js.ArrayInitializer(nonStaticStateHolders
+      'holders': holderCode.statements,
+      'deferredHoldersList': new js.ArrayInitializer(holderCode.activeHolders
           .map((holder) => js.js("#", holder.name))
           .toList(growable: false)),
       'updateHolders': new js.Block(updateHolderAssignments),
-      'prototypes': emitPrototypes(fragment, includeClosures: false),
-      'closures': emitPrototypes(fragment, includeClosures: true),
-      'inheritance': emitInheritance(fragment),
-      'aliases': emitInstanceMethodAliases(fragment),
-      'tearOffs': emitInstallTearOffs(fragment),
-      'constants': emitConstants(fragment),
-      'staticNonFinalFields': emitStaticNonFinalFields(fragment),
-      'lazyStatics': emitLazilyInitializedStatics(fragment),
+      'prototypes': classPrototypes,
+      'closures': closurePrototypes,
+      'inheritance': inheritance,
+      'aliases': methodAliases,
+      'tearOffs': tearOffs,
+      'constants': constants,
+      'staticNonFinalFields': staticNonFinalFields,
+      'lazyStatics': lazyInitializers,
       'types': deferredTypes,
-      // TODO(floitsch): only call emitNativeSupport if we need native.
-      'nativeSupport': emitNativeSupport(fragment),
+      'nativeSupport': nativeSupport,
       'typesOffset': namer.typesOffsetName,
     });
   }
@@ -625,14 +676,15 @@
   ///
   /// The emitted holders contain classes (only the constructors) and all
   /// static functions.
-  js.Statement emitHolders(List<Holder> holders, Fragment fragment) {
+  HolderCode emitHolders(List<Holder> holders, Fragment fragment,
+      {bool initializeEmptyHolders}) {
+    assert(initializeEmptyHolders != null);
     // Skip the static-state holder in this function.
     holders = holders
         .where((Holder holder) => !holder.isStaticStateHolder)
         .toList(growable: false);
 
-    Map<Holder, Map<js.Name, js.Expression>> holderCode =
-        <Holder, Map<js.Name, js.Expression>>{};
+    Map<Holder, Map<js.Name, js.Expression>> holderCode = {};
 
     for (Holder holder in holders) {
       holderCode[holder] = <js.Name, js.Expression>{};
@@ -659,34 +711,50 @@
       }
     }
 
-    js.VariableInitialization emitHolderInitialization(Holder holder) {
-      List<js.Property> properties = <js.Property>[];
+    List<js.VariableInitialization> holderInitializations = [];
+    List<Holder> activeHolders = [];
+
+    for (Holder holder in holders) {
+      List<js.Property> properties = [];
       holderCode[holder].forEach((js.Name key, js.Expression value) {
         properties.add(new js.Property(js.quoteName(key), value));
       });
-
-      return new js.VariableInitialization(
-          new js.VariableDeclaration(holder.name, allowRename: false),
-          new js.ObjectInitializer(properties));
+      if (properties.isEmpty) {
+        holderInitializations.add(new js.VariableInitialization(
+            new js.VariableDeclaration(holder.name, allowRename: false),
+            initializeEmptyHolders
+                ? new js.ObjectInitializer(properties)
+                : null));
+      } else {
+        activeHolders.add(holder);
+        holderInitializations.add(new js.VariableInitialization(
+            new js.VariableDeclaration(holder.name, allowRename: false),
+            new js.ObjectInitializer(properties)));
+      }
     }
 
     // The generated code looks like this:
     //
     //    {
     //      var H = {...}, ..., G = {...};
-    //      var holders = [ H, ..., G ];
+    //      var holders = [ H, ..., G ]; // Main unit only.
     //    }
 
-    List<js.Statement> statements = [
-      new js.ExpressionStatement(new js.VariableDeclarationList(
-          holders.map(emitHolderInitialization).toList())),
-      js.js.statement(
+    List<js.Statement> statements = [];
+    statements.add(new js.ExpressionStatement(new js.VariableDeclarationList(
+        holderInitializations,
+        indentSplits: false)));
+    if (initializeEmptyHolders) {
+      statements.add(js.js.statement(
           'var holders = #',
           new js.ArrayInitializer(holders
               .map((holder) => new js.VariableUse(holder.name))
-              .toList(growable: false)))
-    ];
-    return new js.Block(statements);
+              .toList(growable: false))));
+    }
+    return new HolderCode(
+      activeHolders: activeHolders,
+      statements: new js.Block(statements),
+    );
   }
 
   /// Returns a reference to the constant holder, or the JS-literal `null`.
@@ -704,7 +772,7 @@
   /// requires stubs. The returned map contains the original method and all
   /// the stubs it needs.
   Map<js.Name, js.Expression> emitStaticMethod(StaticMethod method) {
-    Map<js.Name, js.Expression> jsMethods = <js.Name, js.Expression>{};
+    Map<js.Name, js.Expression> jsMethods = {};
 
     // We don't need to install stub-methods. They can only be used when there
     // are tear-offs, in which case they are emitted there.
@@ -856,7 +924,7 @@
       gettersSetters
     ].expand((x) => x);
 
-    List<js.Property> properties = <js.Property>[];
+    List<js.Property> properties = [];
 
     if (cls.superclass == null) {
       // TODO(sra): What is this doing? Document or remove.
@@ -988,8 +1056,8 @@
   /// In this section prototype chains are updated and mixin functions are
   /// copied.
   js.Statement emitInheritance(Fragment fragment, {bool softDeferred = false}) {
-    List<js.Statement> inheritCalls = <js.Statement>[];
-    List<js.Statement> mixinCalls = <js.Statement>[];
+    List<js.Statement> inheritCalls = [];
+    List<js.Statement> mixinCalls = [];
 
     Set<Class> classesInFragment = new Set<Class>();
     for (Library library in fragment.libraries) {
@@ -1062,7 +1130,7 @@
   /// aliased names so they point to the same function.
   js.Statement emitInstanceMethodAliases(Fragment fragment,
       {bool softDeferred = false}) {
-    List<js.Statement> assignments = <js.Statement>[];
+    List<js.Statement> assignments = [];
 
     for (Library library in fragment.libraries) {
       for (Class cls in library.classes) {
@@ -1098,7 +1166,7 @@
     } else {
       Map<String, ConstantValue> defaultValues =
           method.optionalParameterDefaultValues;
-      List<js.Property> properties = <js.Property>[];
+      List<js.Property> properties = [];
       List<String> names = defaultValues.keys.toList(growable: false);
       // Sort the names the same way we sort them for the named-argument calling
       // convention.
@@ -1121,8 +1189,8 @@
   /// are possible. As such, the tear-off needs enough information to fill in
   /// missing parameters.
   js.Statement emitInstallTearOff(js.Expression container, DartMethod method) {
-    List<js.Name> callNames = <js.Name>[];
-    List<js.Expression> funsOrNames = <js.Expression>[];
+    List<js.Name> callNames = [];
+    List<js.Expression> funsOrNames = [];
 
     /// Adds the stub-method's code or name to the [funsOrNames] array.
     ///
@@ -1192,10 +1260,17 @@
     return js.js.statement('(function #(){#})();', [name, block]);
   }
 
+  bool isEmptyStatement(js.Statement statement) {
+    if (statement is js.Block) {
+      return statement.statements.isEmpty;
+    }
+    return statement is js.EmptyStatement;
+  }
+
   /// Emits the section that installs tear-off getters.
   js.Statement emitInstallTearOffs(Fragment fragment,
       {bool softDeferred = false}) {
-    List<js.Statement> inits = <js.Statement>[];
+    List<js.Statement> inits = [];
     js.Expression temp;
 
     for (Library library in fragment.libraries) {
@@ -1233,7 +1308,7 @@
 
   /// Emits the constants section.
   js.Statement emitConstants(Fragment fragment) {
-    List<js.Statement> assignments = <js.Statement>[];
+    List<js.Statement> assignments = [];
     for (Constant constant in fragment.constants) {
       // TODO(floitsch): instead of just updating the constant holder, we should
       // find the constants that don't have any dependency on other constants
@@ -1296,11 +1371,8 @@
   /// to the list of generated fragments that must be installed when the
   /// deferred library is loaded.
   Iterable<js.Property> emitEmbeddedGlobalsForDeferredLoading(
-      Map<String, List<Fragment>> loadMap,
-      Map<DeferredFragment, _DeferredFragmentHash> deferredLoadHashes) {
-    if (loadMap.isEmpty) return [];
-
-    List<js.Property> globals = <js.Property>[];
+      DeferredLoadingState deferredLoadingState) {
+    List<js.Property> globals = [];
 
     globals.add(new js.Property(
         js.string(DEFERRED_INITIALIZED), js.js("Object.create(null)")));
@@ -1318,8 +1390,7 @@
     globals.add(new js.Property(
         js.string(IS_HUNK_INITIALIZED), isHunkInitializedFunction));
 
-    /// See [emitEmbeddedGlobalsForDeferredLoading] for the format of the
-    /// deferred hunk.
+    /// See [finalizeDeferredLoadingData] for the format of the deferred hunk.
     js.Expression initializeLoadedHunkFunction = js.js("""
             function(hash) {
               var hunk = $deferredGlobal[hash];
@@ -1336,12 +1407,12 @@
     globals.add(new js.Property(
         js.string(INITIALIZE_LOADED_HUNK), initializeLoadedHunkFunction));
 
-    createDeferredLoadingData(loadMap, deferredLoadHashes,
-        (js.Expression map, js.Expression uris, js.Expression hashes) {
-      globals.add(new js.Property(js.string(DEFERRED_LIBRARY_PARTS), map));
-      globals.add(new js.Property(js.string(DEFERRED_PART_URIS), uris));
-      globals.add(new js.Property(js.string(DEFERRED_PART_HASHES), hashes));
-    });
+    globals.add(new js.Property(js.string(DEFERRED_LIBRARY_PARTS),
+        deferredLoadingState.deferredLibraryParts));
+    globals.add(new js.Property(
+        js.string(DEFERRED_PART_URIS), deferredLoadingState.deferredPartUris));
+    globals.add(new js.Property(js.string(DEFERRED_PART_HASHES),
+        deferredLoadingState.deferredPartHashes));
 
     return globals;
   }
@@ -1350,26 +1421,30 @@
   // import. There are three parts: a map from loadId to list of parts, where
   // parts are represented as an index; an array of uris indexed by part; and an
   // array of hashes indexed by part.
-  static void createDeferredLoadingData(
+  // [deferredLoadHashes] may have missing entries to indicate empty parts.
+  void finalizeDeferredLoadingData(
       Map<String, List<Fragment>> loadMap,
-      Map<DeferredFragment, _DeferredFragmentHash> deferredLoadHashes,
-      void finish(
-          js.Expression map, js.Expression uris, js.Expression hashes)) {
-    Map<Fragment, int> fragmentIndexes = <Fragment, int>{};
-    List<String> fragmentUris = <String>[];
-    List<js.Expression> fragmentHashes = <js.Expression>[];
+      Map<DeferredFragment, String> deferredLoadHashes,
+      DeferredLoadingState deferredLoadingState) {
+    if (loadMap.isEmpty) return;
 
-    List<js.Property> libraryPartsMapEntries = <js.Property>[];
+    Map<Fragment, int> fragmentIndexes = {};
+    List<String> fragmentUris = [];
+    List<String> fragmentHashes = [];
+
+    List<js.Property> libraryPartsMapEntries = [];
 
     loadMap.forEach((String loadId, List<Fragment> fragmentList) {
-      List<js.Expression> indexes = <js.Expression>[];
+      List<js.Expression> indexes = [];
       for (Fragment fragment in fragmentList) {
+        String fragmentHash = deferredLoadHashes[fragment];
+        if (fragmentHash == null) continue;
         int index = fragmentIndexes[fragment];
         if (index == null) {
           index = fragmentIndexes[fragment] = fragmentIndexes.length;
           fragmentUris.add(
               "${fragment.outputFileName}.${ModelEmitter.deferredExtension}");
-          fragmentHashes.add(deferredLoadHashes[fragment]);
+          fragmentHashes.add(fragmentHash);
         }
         indexes.add(js.number(index));
       }
@@ -1377,8 +1452,12 @@
           new js.Property(js.string(loadId), new js.ArrayInitializer(indexes)));
     });
 
-    finish(new js.ObjectInitializer(libraryPartsMapEntries),
-        js.stringArray(fragmentUris), new js.ArrayInitializer(fragmentHashes));
+    deferredLoadingState.deferredLibraryParts
+        .setValue(new js.ObjectInitializer(libraryPartsMapEntries));
+    deferredLoadingState.deferredPartUris
+        .setValue(js.stringArray(fragmentUris));
+    deferredLoadingState.deferredPartHashes
+        .setValue(js.stringArray(fragmentHashes));
   }
 
   /// Emits the [MANGLED_GLOBAL_NAMES] embedded global.
@@ -1386,7 +1465,7 @@
   /// This global maps minified names for selected classes (some important
   /// core classes, and some native classes) to their unminified names.
   js.Property emitMangledGlobalNames() {
-    List<js.Property> names = <js.Property>[];
+    List<js.Property> names = [];
 
     CommonElements commonElements = _closedWorld.commonElements;
     // We want to keep the original names for the most common core classes when
@@ -1424,7 +1503,7 @@
   /// The metadata itself has already been computed earlier and is stored in
   /// the [program].
   List<js.Property> emitMetadata(Program program) {
-    List<js.Property> metadataGlobals = <js.Property>[];
+    List<js.Property> metadataGlobals = [];
 
     js.Property createGlobal(js.Expression metadata, String global) {
       return new js.Property(js.string(global), metadata);
@@ -1440,13 +1519,13 @@
   }
 
   /// Emits all embedded globals.
-  js.Statement emitEmbeddedGlobals(Program program,
-      Map<DeferredFragment, _DeferredFragmentHash> deferredLoadHashes) {
-    List<js.Property> globals = <js.Property>[];
+  js.Statement emitEmbeddedGlobals(
+      Program program, DeferredLoadingState deferredLoadingState) {
+    List<js.Property> globals = [];
 
     if (program.loadMap.isNotEmpty) {
-      globals.addAll(emitEmbeddedGlobalsForDeferredLoading(
-          program.loadMap, deferredLoadHashes));
+      globals
+          .addAll(emitEmbeddedGlobalsForDeferredLoading(deferredLoadingState));
     }
 
     if (program.typeToInterceptorMap != null) {
@@ -1488,7 +1567,7 @@
   /// This function is the static equivalent of
   /// [NativeGenerator.buildNativeInfoHandler].
   js.Statement emitNativeSupport(Fragment fragment) {
-    List<js.Statement> statements = <js.Statement>[];
+    List<js.Statement> statements = [];
 
     // The isolate-affinity tag must only be initialized once per program.
     if (fragment.isMainFragment &&
@@ -1505,9 +1584,9 @@
         }""", [])));
     }
 
-    Map<String, js.Expression> interceptorsByTag = <String, js.Expression>{};
-    Map<String, js.Expression> leafTags = <String, js.Expression>{};
-    List<js.Statement> subclassAssignments = <js.Statement>[];
+    Map<String, js.Expression> interceptorsByTag = {};
+    Map<String, js.Expression> leafTags = {};
+    List<js.Statement> subclassAssignments = [];
 
     for (Library library in fragment.libraries) {
       for (Class cls in library.classes) {
@@ -1537,12 +1616,47 @@
         }
       }
     }
-    statements.add(js.js.statement("setOrUpdateInterceptorsByTag(#);",
-        js.objectLiteral(interceptorsByTag)));
-    statements.add(
-        js.js.statement("setOrUpdateLeafTags(#);", js.objectLiteral(leafTags)));
+
+    if (interceptorsByTag.isNotEmpty) {
+      statements.add(js.js.statement("setOrUpdateInterceptorsByTag(#);",
+          js.objectLiteral(interceptorsByTag)));
+    }
+    if (leafTags.isNotEmpty) {
+      statements.add(js.js
+          .statement("setOrUpdateLeafTags(#);", js.objectLiteral(leafTags)));
+    }
     statements.addAll(subclassAssignments);
 
     return wrapPhase('nativeSupport', statements);
   }
 }
+
+/// Code to initialize holder with ancillary information.
+class HolderCode {
+  final List<Holder> activeHolders;
+  js.Statement statements;
+  HolderCode({this.activeHolders, this.statements});
+}
+
+class DeferredLoadingState {
+  final deferredLibraryParts = new DeferredPrimaryExpression();
+  final deferredPartUris = new DeferredPrimaryExpression();
+  final deferredPartHashes = new DeferredPrimaryExpression();
+}
+
+class DeferredPrimaryExpression extends js.DeferredExpression {
+  js.Expression _value;
+
+  void setValue(js.Expression value) {
+    assert(_value == null);
+    assert(value.precedenceLevel == this.precedenceLevel);
+    _value = value;
+  }
+
+  js.Expression get value {
+    assert(_value != null);
+    return _value;
+  }
+
+  int get precedenceLevel => js_precedence.PRIMARY;
+}
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 624d640..1ba4a80 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
@@ -26,6 +26,8 @@
         TYPE_TO_INTERCEPTOR_MAP,
         TYPES;
 
+import 'package:js_ast/src/precedence.dart' as js_precedence;
+
 import '../../../compiler_new.dart';
 import '../../common.dart';
 import '../../compiler.dart' show Compiler;
@@ -48,7 +50,6 @@
 import '../model.dart';
 import '../sorter.dart' show Sorter;
 
-part 'deferred_fragment_hash.dart';
 part 'fragment_emitter.dart';
 
 class ModelEmitter {
@@ -61,7 +62,9 @@
   final ConstantOrdering _constantOrdering;
 
   // The full code that is written to each hunk part-file.
-  final Map<Fragment, CodeOutput> outputBuffers = <Fragment, CodeOutput>{};
+  final Map<Fragment, CodeOutput> outputBuffers = {};
+
+  Set<Fragment> omittedFragments = Set();
 
   JavaScriptBackend get backend => compiler.backend;
 
@@ -165,23 +168,22 @@
     FragmentEmitter fragmentEmitter = new FragmentEmitter(
         compiler, namer, backend, constantEmitter, this, _closedWorld);
 
-    Map<DeferredFragment, _DeferredFragmentHash> deferredHashTokens =
-        new Map<DeferredFragment, _DeferredFragmentHash>();
-    for (DeferredFragment fragment in deferredFragments) {
-      deferredHashTokens[fragment] = new _DeferredFragmentHash(fragment);
-    }
-
+    var deferredLoadingState = new DeferredLoadingState();
     js.Statement mainCode =
-        fragmentEmitter.emitMainFragment(program, deferredHashTokens);
+        fragmentEmitter.emitMainFragment(program, deferredLoadingState);
 
-    Map<DeferredFragment, js.Expression> deferredFragmentsCode =
-        <DeferredFragment, js.Expression>{};
+    Map<DeferredFragment, js.Expression> deferredFragmentsCode = {};
 
     for (DeferredFragment fragment in deferredFragments) {
       js.Expression types =
           program.metadataTypesForOutputUnit(fragment.outputUnit);
-      deferredFragmentsCode[fragment] = fragmentEmitter.emitDeferredFragment(
+      js.Expression fragmentCode = fragmentEmitter.emitDeferredFragment(
           fragment, types, program.holders);
+      if (fragmentCode != null) {
+        deferredFragmentsCode[fragment] = fragmentCode;
+      } else {
+        omittedFragments.add(fragment);
+      }
     }
 
     js.TokenCounter counter = new js.TokenCounter();
@@ -190,15 +192,17 @@
 
     program.finalizers.forEach((js.TokenFinalizer f) => f.finalizeTokens());
 
+    // TODO(sra): This is where we know if the types (and potentially other
+    // deferred ASTs inside the parts) have any contents. We shoudl wait until
+    // this point to decide if a part is empty.
+
     Map<DeferredFragment, String> hunkHashes =
         writeDeferredFragments(deferredFragmentsCode);
 
-    // Now that we have written the deferred hunks, we can update the hash
-    // tokens in the main-fragment.
-    deferredHashTokens
-        .forEach((DeferredFragment key, _DeferredFragmentHash token) {
-      token.setHash(hunkHashes[key]);
-    });
+    // Now that we have written the deferred hunks, we can create the deferred
+    // loading data.
+    fragmentEmitter.finalizeDeferredLoadingData(
+        program.loadMap, hunkHashes, deferredLoadingState);
 
     writeMainFragment(mainFragment, mainCode,
         isSplit: program.deferredFragments.isNotEmpty ||
@@ -241,7 +245,7 @@
   /// Updates the shared [outputBuffers] field with the output.
   Map<DeferredFragment, String> writeDeferredFragments(
       Map<DeferredFragment, js.Expression> fragmentsCode) {
-    Map<DeferredFragment, String> hunkHashes = <DeferredFragment, String>{};
+    Map<DeferredFragment, String> hunkHashes = {};
 
     fragmentsCode.forEach((DeferredFragment fragment, js.Expression code) {
       hunkHashes[fragment] = writeDeferredFragment(fragment, code);
@@ -311,7 +315,7 @@
   //
   // Updates the shared [outputBuffers] field with the output.
   String writeDeferredFragment(DeferredFragment fragment, js.Expression code) {
-    List<CodeOutputListener> outputListeners = <CodeOutputListener>[];
+    List<CodeOutputListener> outputListeners = [];
     Hasher hasher = new Hasher();
     outputListeners.add(hasher);
 
@@ -396,12 +400,14 @@
   /// The output is written into a separate file that can be used by outside
   /// tools.
   void writeDeferredMap() {
-    Map<String, dynamic> mapping = new Map<String, dynamic>();
+    Map<String, dynamic> mapping = {};
     // Json does not support comments, so we embed the explanation in the
     // data.
     mapping["_comment"] = "This mapping shows which compiled `.js` files are "
         "needed for a given deferred library import.";
-    mapping.addAll(compiler.deferredLoadTask.computeDeferredMap());
+    mapping.addAll(compiler.deferredLoadTask.computeDeferredMap(
+        omittedUnits:
+            omittedFragments.map((fragemnt) => fragemnt.outputUnit).toSet()));
     compiler.outputProvider.createOutputSink(
         compiler.options.deferredMapUri.path, '', OutputType.info)
       ..add(const JsonEncoder.withIndent("  ").convert(mapping))
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index 78d6a94..240672a 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -15,8 +15,7 @@
 import '../ir/element_map.dart';
 import '../ir/util.dart';
 import '../js_model/element_map.dart';
-import '../kernel/element_map.dart';
-import '../kernel/env.dart';
+import '../js_model/env.dart';
 import '../ordered_typeset.dart';
 import '../options.dart';
 import '../ssa/type_builder.dart';
@@ -877,7 +876,7 @@
   Entity get rootOfScope => enclosingClass;
 }
 
-class RecordClassData implements ClassData {
+class RecordClassData implements JClassData {
   @override
   final ClassDefinition definition;
 
@@ -894,13 +893,6 @@
       this.definition, this.thisType, this.supertype, this.orderedTypeSet);
 
   @override
-  ClassData copy() => this;
-
-  @override
-  Iterable<ConstantValue> getMetadata(IrToElementMap elementMap) =>
-      const <ConstantValue>[];
-
-  @override
   bool get isMixinApplication => false;
 
   @override
@@ -972,18 +964,13 @@
       'ClosureClassDefinition(kind:$kind,cls:$cls,location:$location)';
 }
 
-abstract class ClosureMemberData implements MemberData {
+abstract class ClosureMemberData implements JMemberData {
   final MemberDefinition definition;
   final InterfaceType memberThisType;
 
   ClosureMemberData(this.definition, this.memberThisType);
 
   @override
-  Iterable<ConstantValue> getMetadata(IrToElementMap elementMap) {
-    return const <ConstantValue>[];
-  }
-
-  @override
   InterfaceType getMemberThisType(JsToElementMap elementMap) {
     return memberThisType;
   }
@@ -1035,7 +1022,7 @@
   }
 }
 
-class ClosureFieldData extends ClosureMemberData implements FieldData {
+class ClosureFieldData extends ClosureMemberData implements JFieldData {
   DartType _type;
   ClosureFieldData(MemberDefinition definition, InterfaceType memberThisType)
       : super(definition, memberThisType);
diff --git a/pkg/compiler/lib/src/js_model/element_map.dart b/pkg/compiler/lib/src/js_model/element_map.dart
index 2195bc8..940d001 100644
--- a/pkg/compiler/lib/src/js_model/element_map.dart
+++ b/pkg/compiler/lib/src/js_model/element_map.dart
@@ -11,12 +11,12 @@
 import '../elements/jumps.dart';
 import '../elements/names.dart';
 import '../elements/types.dart';
+import '../ir/util.dart';
 import '../js/js.dart' as js;
 import '../js_backend/namer.dart';
 import '../js_emitter/code_emitter_task.dart';
 import '../js_model/closure.dart' show JRecordField, KernelScopeInfo;
 import '../js_model/elements.dart' show JGeneratorBody;
-import '../kernel/element_map.dart';
 import '../native/native.dart' as native;
 import '../ssa/type_builder.dart';
 import '../types/abstract_value_domain.dart';
@@ -78,12 +78,7 @@
 
   /// Returns the super [MemberEntity] for a super invocation, get or set of
   /// [name] from the member [context].
-  ///
-  /// The IR doesn't always resolve super accesses to the corresponding
-  /// [target]. If not, the target is computed using [name] and [setter] from
-  /// the enclosing class of [context].
-  MemberEntity getSuperMember(
-      MemberEntity context, ir.Name name, ir.Member target,
+  MemberEntity getSuperMember(MemberEntity context, ir.Name name,
       {bool setter: false});
 
   /// Returns the `noSuchMethod` [FunctionEntity] call from a
@@ -314,6 +309,116 @@
   return null;
 }
 
+// TODO(johnniwinther,efortuna): Add more when needed.
+// TODO(johnniwinther): Should we split regular into method, field, etc.?
+enum MemberKind {
+  // A regular member defined by an [ir.Node].
+  regular,
+  // A constructor whose initializer is defined by an [ir.Constructor] node.
+  constructor,
+  // A constructor whose body is defined by an [ir.Constructor] node.
+  constructorBody,
+  // A closure class `call` method whose body is defined by an
+  // [ir.FunctionExpression] or [ir.FunctionDeclaration].
+  closureCall,
+  // A field corresponding to a captured variable in the closure. It does not
+  // have a corresponding ir.Node.
+  closureField,
+  // A method that describes the type of a function (in this case the type of
+  // the closure class. It does not have a corresponding ir.Node or a method
+  // body.
+  signature,
+  // A separated body of a generator (sync*/async/async*) function.
+  generatorBody,
+}
+
+/// Definition information for a [MemberEntity].
+abstract class MemberDefinition {
+  /// The defined member.
+  MemberEntity get member;
+
+  /// The kind of the defined member. This determines the semantics of [node].
+  MemberKind get kind;
+
+  /// The defining [ir.Node] for this member, if supported by its [kind].
+  ///
+  /// For a regular class this is the [ir.Class] node. For closure classes this
+  /// might be an [ir.FunctionExpression] node if needed.
+  ir.Node get node;
+
+  /// The canonical location of [member]. This is used for sorting the members
+  /// in the emitted code.
+  SourceSpan get location;
+}
+
+enum ClassKind {
+  regular,
+  closure,
+  // TODO(efortuna, johnniwinther): Record is not a class, but is
+  // masquerading as one currently for consistency with the old element model.
+  record,
+}
+
+/// A member directly defined by its [ir.Member] node.
+class RegularMemberDefinition implements MemberDefinition {
+  final MemberEntity member;
+  final ir.Member node;
+
+  RegularMemberDefinition(this.member, this.node);
+
+  SourceSpan get location => computeSourceSpanFromTreeNode(node);
+
+  MemberKind get kind => MemberKind.regular;
+
+  String toString() => 'RegularMemberDefinition(kind:$kind,member:$member,'
+      'node:$node,location:$location)';
+}
+
+/// The definition of a special kind of member
+class SpecialMemberDefinition implements MemberDefinition {
+  final MemberEntity member;
+  final ir.TreeNode node;
+  final MemberKind kind;
+
+  SpecialMemberDefinition(this.member, this.node, this.kind);
+
+  SourceSpan get location => computeSourceSpanFromTreeNode(node);
+
+  String toString() => 'SpecialMemberDefinition(kind:$kind,member:$member,'
+      'node:$node,location:$location)';
+}
+
+/// Definition information for a [ClassEntity].
+abstract class ClassDefinition {
+  /// The defined class.
+  ClassEntity get cls;
+
+  /// The kind of the defined class. This determines the semantics of [node].
+  ClassKind get kind;
+
+  /// The defining [ir.Node] for this class, if supported by its [kind].
+  ir.Node get node;
+
+  /// The canonical location of [cls]. This is used for sorting the classes
+  /// in the emitted code.
+  SourceSpan get location;
+}
+
+/// A class directly defined by its [ir.Class] node.
+class RegularClassDefinition implements ClassDefinition {
+  final ClassEntity cls;
+  final ir.Class node;
+
+  RegularClassDefinition(this.cls, this.node);
+
+  SourceSpan get location => computeSourceSpanFromTreeNode(node);
+
+  ClassKind get kind => ClassKind.regular;
+
+  String toString() => 'RegularClassDefinition(kind:$kind,cls:$cls,'
+      'node:$node,location:$location)';
+}
+
 /// Returns the initializer for [field].
 ///
 /// If [field] is an instance field with a null literal initializer `null` is
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 296d67c..34433cd 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -2,37 +2,60 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:front_end/src/api_unstable/dart2js.dart' show Link, LinkBuilder;
+
 import 'package:js_runtime/shared/embedded_names.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 '../closure.dart' show BoxLocal, ThisLocal;
 import '../common.dart';
+import '../common/names.dart';
+import '../common_elements.dart';
+import '../compile_time_constants.dart';
+import '../constants/constant_system.dart';
+import '../constants/constructors.dart';
+import '../constants/evaluation.dart';
+import '../constants/expressions.dart';
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/entity_utils.dart' as utils;
 import '../elements/indexed.dart';
+import '../elements/names.dart';
 import '../elements/types.dart';
 import '../environment.dart';
+import '../ir/debug.dart';
+import '../ir/element_map.dart';
+import '../ir/types.dart';
+import '../ir/visitors.dart';
 import '../ir/util.dart';
 import '../js/js.dart' as js;
+import '../js_backend/constant_system_javascript.dart';
+import '../js_backend/namer.dart';
 import '../js_backend/native_data.dart';
 import '../js_emitter/code_emitter_task.dart';
-import '../js_model/closure.dart';
-import '../js_model/elements.dart';
-import '../js_model/element_map.dart';
-import '../js_model/locals.dart';
-import '../kernel/element_map.dart';
 import '../kernel/element_map_impl.dart';
 import '../kernel/env.dart';
+import '../kernel/kelements.dart';
+import '../native/native.dart' as native;
+import '../options.dart';
+import '../ordered_typeset.dart';
 import '../ssa/type_builder.dart';
+import '../universe/call_structure.dart';
+import '../universe/selector.dart';
+import '../universe/world_builder.dart';
 
+import 'closure.dart';
+import 'elements.dart';
 import 'element_map.dart';
+import 'env.dart';
+import 'locals.dart';
 
 /// Interface for kernel queries needed to implement the [CodegenWorldBuilder].
-abstract class KernelToWorldBuilder implements JsToElementMap {
+abstract class JsToWorldBuilder implements JsToElementMap {
   /// Returns `true` if [field] has a constant initializer.
   bool hasConstantFieldInitializer(FieldEntity field);
 
@@ -45,9 +68,1378 @@
       void f(DartType type, String name, ConstantValue defaultValue));
 }
 
-class JsKernelToElementMap extends KernelToElementMapBase
+abstract class JsToElementMapBase implements IrToElementMap, JsToElementMap {
+  final CompilerOptions options;
+  final DiagnosticReporter reporter;
+  CommonElementsImpl _commonElements;
+  JsElementEnvironment _elementEnvironment;
+  DartTypeConverter _typeConverter;
+  JsConstantEnvironment _constantEnvironment;
+  KernelDartTypes _types;
+  ir.TypeEnvironment _typeEnvironment;
+
+  /// Library environment. Used for fast lookup.
+  JProgramEnv env;
+
+  final EntityDataEnvMap<IndexedLibrary, JLibraryData, JLibraryEnv> libraries =
+      new EntityDataEnvMap<IndexedLibrary, JLibraryData, JLibraryEnv>();
+  final EntityDataEnvMap<IndexedClass, JClassData, JClassEnv> classes =
+      new EntityDataEnvMap<IndexedClass, JClassData, JClassEnv>();
+  final EntityDataMap<IndexedMember, JMemberData> members =
+      new EntityDataMap<IndexedMember, JMemberData>();
+  final EntityDataMap<IndexedTypeVariable, JTypeVariableData> typeVariables =
+      new EntityDataMap<IndexedTypeVariable, JTypeVariableData>();
+  final EntityDataMap<IndexedTypedef, JTypedefData> typedefs =
+      new EntityDataMap<IndexedTypedef, JTypedefData>();
+
+  JsToElementMapBase(this.options, this.reporter, Environment environment) {
+    _elementEnvironment = new JsElementEnvironment(this);
+    _commonElements = new CommonElementsImpl(_elementEnvironment);
+    _constantEnvironment = new JsConstantEnvironment(this, environment);
+    _typeConverter = new DartTypeConverter(this);
+    _types = new KernelDartTypes(this);
+  }
+
+  bool checkFamily(Entity entity);
+
+  DartTypes get types => _types;
+
+  JsElementEnvironment get elementEnvironment => _elementEnvironment;
+
+  @override
+  CommonElementsImpl get commonElements => _commonElements;
+
+  /// NativeBasicData is need for computation of the default super class.
+  NativeBasicData get nativeBasicData;
+
+  FunctionEntity get _mainFunction {
+    return env.mainMethod != null ? getMethodInternal(env.mainMethod) : null;
+  }
+
+  LibraryEntity get _mainLibrary {
+    return env.mainMethod != null
+        ? getLibraryInternal(env.mainMethod.enclosingLibrary)
+        : null;
+  }
+
+  Iterable<LibraryEntity> get libraryListInternal;
+
+  SourceSpan getSourceSpan(Spannable spannable, Entity currentElement) {
+    SourceSpan fromSpannable(Spannable spannable) {
+      if (spannable is IndexedLibrary &&
+          spannable.libraryIndex < libraries.length) {
+        JLibraryEnv env = libraries.getEnv(spannable);
+        return computeSourceSpanFromTreeNode(env.library);
+      } else if (spannable is IndexedClass &&
+          spannable.classIndex < classes.length) {
+        JClassData data = classes.getData(spannable);
+        assert(data != null, "No data for $spannable in $this");
+        return data.definition.location;
+      } else if (spannable is IndexedMember &&
+          spannable.memberIndex < members.length) {
+        JMemberData data = members.getData(spannable);
+        assert(data != null, "No data for $spannable in $this");
+        return data.definition.location;
+      } else if (spannable is JLocal) {
+        return getSourceSpan(spannable.memberContext, currentElement);
+      }
+      return null;
+    }
+
+    SourceSpan sourceSpan = fromSpannable(spannable);
+    sourceSpan ??= fromSpannable(currentElement);
+    return sourceSpan;
+  }
+
+  LibraryEntity lookupLibrary(Uri uri) {
+    JLibraryEnv libraryEnv = env.lookupLibrary(uri);
+    if (libraryEnv == null) return null;
+    return getLibraryInternal(libraryEnv.library, libraryEnv);
+  }
+
+  String _getLibraryName(IndexedLibrary library) {
+    assert(checkFamily(library));
+    JLibraryEnv libraryEnv = libraries.getEnv(library);
+    return libraryEnv.library.name ?? '';
+  }
+
+  MemberEntity lookupLibraryMember(IndexedLibrary library, String name,
+      {bool setter: false}) {
+    assert(checkFamily(library));
+    JLibraryEnv libraryEnv = libraries.getEnv(library);
+    ir.Member member = libraryEnv.lookupMember(name, setter: setter);
+    return member != null ? getMember(member) : null;
+  }
+
+  void _forEachLibraryMember(
+      IndexedLibrary library, void f(MemberEntity member)) {
+    assert(checkFamily(library));
+    JLibraryEnv libraryEnv = libraries.getEnv(library);
+    libraryEnv.forEachMember((ir.Member node) {
+      f(getMember(node));
+    });
+  }
+
+  ClassEntity lookupClass(IndexedLibrary library, String name) {
+    assert(checkFamily(library));
+    JLibraryEnv libraryEnv = libraries.getEnv(library);
+    JClassEnv classEnv = libraryEnv.lookupClass(name);
+    if (classEnv != null) {
+      return getClassInternal(classEnv.cls, classEnv);
+    }
+    return null;
+  }
+
+  void _forEachClass(IndexedLibrary library, void f(ClassEntity cls)) {
+    assert(checkFamily(library));
+    JLibraryEnv libraryEnv = libraries.getEnv(library);
+    libraryEnv.forEachClass((JClassEnv classEnv) {
+      if (!classEnv.isUnnamedMixinApplication) {
+        f(getClassInternal(classEnv.cls, classEnv));
+      }
+    });
+  }
+
+  MemberEntity lookupClassMember(IndexedClass cls, String name,
+      {bool setter: false}) {
+    assert(checkFamily(cls));
+    JClassEnv classEnv = classes.getEnv(cls);
+    return classEnv.lookupMember(this, name, setter: setter);
+  }
+
+  ConstructorEntity lookupConstructor(IndexedClass cls, String name) {
+    assert(checkFamily(cls));
+    JClassEnv classEnv = classes.getEnv(cls);
+    return classEnv.lookupConstructor(this, name);
+  }
+
+  @override
+  InterfaceType createInterfaceType(
+      ir.Class cls, List<ir.DartType> typeArguments) {
+    return new InterfaceType(getClass(cls), getDartTypes(typeArguments));
+  }
+
+  LibraryEntity getLibrary(ir.Library node) => getLibraryInternal(node);
+
+  LibraryEntity getLibraryInternal(ir.Library node, [JLibraryEnv libraryEnv]);
+
+  @override
+  ClassEntity getClass(ir.Class node) => getClassInternal(node);
+
+  ClassEntity getClassInternal(ir.Class node, [JClassEnv classEnv]);
+
+  InterfaceType getSuperType(IndexedClass cls) {
+    assert(checkFamily(cls));
+    JClassData data = classes.getData(cls);
+    _ensureSupertypes(cls, data);
+    return data.supertype;
+  }
+
+  void _ensureThisAndRawType(ClassEntity cls, JClassData data) {
+    assert(checkFamily(cls));
+    if (data is JClassDataImpl && data.thisType == null) {
+      ir.Class node = data.cls;
+      if (node.typeParameters.isEmpty) {
+        data.thisType =
+            data.rawType = new InterfaceType(cls, const <DartType>[]);
+      } else {
+        data.thisType = new InterfaceType(
+            cls,
+            new List<DartType>.generate(node.typeParameters.length,
+                (int index) {
+              return new TypeVariableType(
+                  getTypeVariableInternal(node.typeParameters[index]));
+            }));
+        data.rawType = new InterfaceType(
+            cls,
+            new List<DartType>.filled(
+                node.typeParameters.length, const DynamicType()));
+      }
+    }
+  }
+
+  TypeVariableEntity getTypeVariable(ir.TypeParameter node) =>
+      getTypeVariableInternal(node);
+
+  TypeVariableEntity getTypeVariableInternal(ir.TypeParameter node);
+
+  void _ensureSupertypes(ClassEntity cls, JClassData data) {
+    assert(checkFamily(cls));
+    if (data is JClassDataImpl && data.orderedTypeSet == null) {
+      _ensureThisAndRawType(cls, data);
+
+      ir.Class node = data.cls;
+
+      if (node.supertype == null) {
+        data.orderedTypeSet = new OrderedTypeSet.singleton(data.thisType);
+        data.isMixinApplication = false;
+        data.interfaces = const <InterfaceType>[];
+      } else {
+        InterfaceType processSupertype(ir.Supertype node) {
+          InterfaceType supertype = _typeConverter.visitSupertype(node);
+          IndexedClass superclass = supertype.element;
+          JClassData superdata = classes.getData(superclass);
+          _ensureSupertypes(superclass, superdata);
+          return supertype;
+        }
+
+        InterfaceType supertype;
+        LinkBuilder<InterfaceType> linkBuilder =
+            new LinkBuilder<InterfaceType>();
+        if (node.isMixinDeclaration) {
+          // A mixin declaration
+          //
+          //   mixin M on A, B, C {}
+          //
+          // is encoded by CFE as
+          //
+          //   abstract class M extends A implements B, C {}
+          //   abstract class M extends A&B&C {}
+          //
+          // but we encode it as
+          //
+          //   abstract class M extends Object implements A, B, C {}
+          //
+          // so we need get the superclasses from the on-clause, A, B, and C,
+          // through [superclassConstraints].
+          for (ir.Supertype constraint in node.superclassConstraints()) {
+            linkBuilder.addLast(processSupertype(constraint));
+          }
+          // Set superclass to `Object`.
+          supertype = _commonElements.objectType;
+        } else {
+          supertype = processSupertype(node.supertype);
+        }
+        if (supertype == _commonElements.objectType) {
+          ClassEntity defaultSuperclass =
+              _commonElements.getDefaultSuperclass(cls, nativeBasicData);
+          data.supertype = _elementEnvironment.getRawType(defaultSuperclass);
+        } else {
+          data.supertype = supertype;
+        }
+        if (node.mixedInType != null) {
+          data.isMixinApplication = true;
+          linkBuilder
+              .addLast(data.mixedInType = processSupertype(node.mixedInType));
+        } else {
+          data.isMixinApplication = false;
+        }
+        node.implementedTypes.forEach((ir.Supertype supertype) {
+          linkBuilder.addLast(processSupertype(supertype));
+        });
+        Link<InterfaceType> interfaces =
+            linkBuilder.toLink(const Link<InterfaceType>());
+        OrderedTypeSetBuilder setBuilder =
+            new KernelOrderedTypeSetBuilder(this, cls);
+        data.orderedTypeSet = setBuilder.createOrderedTypeSet(
+            data.supertype, interfaces.reverse(const Link<InterfaceType>()));
+        data.interfaces = new List<InterfaceType>.from(interfaces.toList());
+      }
+    }
+  }
+
+  @override
+  TypedefType getTypedefType(ir.Typedef node) {
+    IndexedTypedef typedef = getTypedefInternal(node);
+    return typedefs.getData(typedef).rawType;
+  }
+
+  TypedefEntity getTypedefInternal(ir.Typedef node);
+
+  @override
+  MemberEntity getMember(ir.Member node) {
+    if (node is ir.Field) {
+      return getFieldInternal(node);
+    } else if (node is ir.Constructor) {
+      return getConstructorInternal(node);
+    } else if (node is ir.Procedure) {
+      if (node.kind == ir.ProcedureKind.Factory) {
+        return getConstructorInternal(node);
+      } else {
+        return getMethodInternal(node);
+      }
+    }
+    throw new UnsupportedError("Unexpected member: $node");
+  }
+
+  MemberEntity getSuperMember(MemberEntity context, ir.Name name,
+      {bool setter: false}) {
+    // We can no longer trust the interface target of the super access since it
+    // might be a member that we have cloned.
+    ClassEntity cls = getMemberThisType(context).element;
+    assert(
+        cls != null,
+        failedAt(context,
+            "No enclosing class for super member access in $context."));
+    IndexedClass superclass = getSuperType(cls)?.element;
+    while (superclass != null) {
+      JClassEnv env = classes.getEnv(superclass);
+      MemberEntity superMember =
+          env.lookupMember(this, name.name, setter: setter);
+      if (superMember != null) {
+        if (!superMember.isInstanceMember) return null;
+        if (!superMember.isAbstract) {
+          return superMember;
+        }
+      }
+      superclass = getSuperType(superclass)?.element;
+    }
+    return null;
+  }
+
+  @override
+  ConstructorEntity getConstructor(ir.Member node) =>
+      getConstructorInternal(node);
+
+  ConstructorEntity getConstructorInternal(ir.Member node);
+
+  ConstructorEntity getSuperConstructor(
+      ir.Constructor sourceNode, ir.Member targetNode) {
+    ConstructorEntity source = getConstructor(sourceNode);
+    ClassEntity sourceClass = source.enclosingClass;
+    ConstructorEntity target = getConstructor(targetNode);
+    ClassEntity targetClass = target.enclosingClass;
+    IndexedClass superClass = getSuperType(sourceClass)?.element;
+    if (superClass == targetClass) {
+      return target;
+    }
+    JClassEnv env = classes.getEnv(superClass);
+    ConstructorEntity constructor = env.lookupConstructor(this, target.name);
+    if (constructor != null) {
+      return constructor;
+    }
+    throw failedAt(source, "Super constructor for $source not found.");
+  }
+
+  @override
+  FunctionEntity getMethod(ir.Procedure node) => getMethodInternal(node);
+
+  FunctionEntity getMethodInternal(ir.Procedure node);
+
+  @override
+  FieldEntity getField(ir.Field node) => getFieldInternal(node);
+
+  FieldEntity getFieldInternal(ir.Field node);
+
+  @override
+  DartType getDartType(ir.DartType type) => _typeConverter.convert(type);
+
+  TypeVariableType getTypeVariableType(ir.TypeParameterType type) =>
+      getDartType(type);
+
+  List<DartType> getDartTypes(List<ir.DartType> types) {
+    List<DartType> list = <DartType>[];
+    types.forEach((ir.DartType type) {
+      list.add(getDartType(type));
+    });
+    return list;
+  }
+
+  InterfaceType getInterfaceType(ir.InterfaceType type) =>
+      _typeConverter.convert(type);
+
+  @override
+  FunctionType getFunctionType(ir.FunctionNode node) {
+    DartType returnType;
+    if (node.parent is ir.Constructor) {
+      // The return type on generative constructors is `void`, but we need
+      // `dynamic` type to match the element model.
+      returnType = const DynamicType();
+    } else {
+      returnType = getDartType(node.returnType);
+    }
+    List<DartType> parameterTypes = <DartType>[];
+    List<DartType> optionalParameterTypes = <DartType>[];
+
+    DartType getParameterType(ir.VariableDeclaration variable) {
+      if (variable.isCovariant || variable.isGenericCovariantImpl) {
+        // A covariant parameter has type `Object` in the method signature.
+        return commonElements.objectType;
+      }
+      return getDartType(variable.type);
+    }
+
+    for (ir.VariableDeclaration variable in node.positionalParameters) {
+      if (parameterTypes.length == node.requiredParameterCount) {
+        optionalParameterTypes.add(getParameterType(variable));
+      } else {
+        parameterTypes.add(getParameterType(variable));
+      }
+    }
+    List<String> namedParameters = <String>[];
+    List<DartType> namedParameterTypes = <DartType>[];
+    List<ir.VariableDeclaration> sortedNamedParameters =
+        node.namedParameters.toList()..sort((a, b) => a.name.compareTo(b.name));
+    for (ir.VariableDeclaration variable in sortedNamedParameters) {
+      namedParameters.add(variable.name);
+      namedParameterTypes.add(getParameterType(variable));
+    }
+    List<FunctionTypeVariable> typeVariables;
+    if (node.typeParameters.isNotEmpty) {
+      List<DartType> typeParameters = <DartType>[];
+      for (ir.TypeParameter typeParameter in node.typeParameters) {
+        typeParameters
+            .add(getDartType(new ir.TypeParameterType(typeParameter)));
+      }
+      typeVariables = new List<FunctionTypeVariable>.generate(
+          node.typeParameters.length,
+          (int index) => new FunctionTypeVariable(index));
+
+      DartType subst(DartType type) {
+        return type.subst(typeVariables, typeParameters);
+      }
+
+      returnType = subst(returnType);
+      parameterTypes = parameterTypes.map(subst).toList();
+      optionalParameterTypes = optionalParameterTypes.map(subst).toList();
+      namedParameterTypes = namedParameterTypes.map(subst).toList();
+      for (int index = 0; index < typeVariables.length; index++) {
+        typeVariables[index].bound =
+            subst(getDartType(node.typeParameters[index].bound));
+      }
+    } else {
+      typeVariables = const <FunctionTypeVariable>[];
+    }
+
+    return new FunctionType(returnType, parameterTypes, optionalParameterTypes,
+        namedParameters, namedParameterTypes, typeVariables);
+  }
+
+  ConstantValue computeConstantValue(
+      Spannable spannable, ConstantExpression constant,
+      {bool requireConstant: true}) {
+    return _constantEnvironment._getConstantValue(spannable, constant,
+        constantRequired: requireConstant);
+  }
+
+  DartType substByContext(DartType type, InterfaceType context) {
+    return type.subst(
+        context.typeArguments, getThisType(context.element).typeArguments);
+  }
+
+  /// Returns the type of the `call` method on 'type'.
+  ///
+  /// If [type] doesn't have a `call` member `null` is returned. If [type] has
+  /// an invalid `call` member (non-method or a synthesized method with both
+  /// optional and named parameters) a [DynamicType] is returned.
+  DartType getCallType(InterfaceType type) {
+    IndexedClass cls = type.element;
+    assert(checkFamily(cls));
+    JClassData data = classes.getData(cls);
+    if (data.callType != null) {
+      return substByContext(data.callType, type);
+    }
+    return null;
+  }
+
+  InterfaceType getThisType(IndexedClass cls) {
+    assert(checkFamily(cls));
+    JClassData data = classes.getData(cls);
+    _ensureThisAndRawType(cls, data);
+    return data.thisType;
+  }
+
+  InterfaceType _getRawType(IndexedClass cls) {
+    assert(checkFamily(cls));
+    JClassData data = classes.getData(cls);
+    _ensureThisAndRawType(cls, data);
+    return data.rawType;
+  }
+
+  FunctionType _getFunctionType(IndexedFunction function) {
+    assert(checkFamily(function));
+    FunctionData data = members.getData(function);
+    return data.getFunctionType(this);
+  }
+
+  List<TypeVariableType> _getFunctionTypeVariables(IndexedFunction function) {
+    assert(checkFamily(function));
+    FunctionData data = members.getData(function);
+    return data.getFunctionTypeVariables(this);
+  }
+
+  DartType _getFieldType(IndexedField field) {
+    assert(checkFamily(field));
+    JFieldData data = members.getData(field);
+    return data.getFieldType(this);
+  }
+
+  DartType getTypeVariableBound(IndexedTypeVariable typeVariable) {
+    assert(checkFamily(typeVariable));
+    JTypeVariableData data = typeVariables.getData(typeVariable);
+    return data.getBound(this);
+  }
+
+  DartType _getTypeVariableDefaultType(IndexedTypeVariable typeVariable) {
+    assert(checkFamily(typeVariable));
+    JTypeVariableData data = typeVariables.getData(typeVariable);
+    return data.getDefaultType(this);
+  }
+
+  ClassEntity getAppliedMixin(IndexedClass cls) {
+    assert(checkFamily(cls));
+    JClassData data = classes.getData(cls);
+    _ensureSupertypes(cls, data);
+    return data.mixedInType?.element;
+  }
+
+  bool _isMixinApplication(IndexedClass cls) {
+    assert(checkFamily(cls));
+    JClassData data = classes.getData(cls);
+    _ensureSupertypes(cls, data);
+    return data.isMixinApplication;
+  }
+
+  bool _isUnnamedMixinApplication(IndexedClass cls) {
+    assert(checkFamily(cls));
+    JClassEnv env = classes.getEnv(cls);
+    return env.isUnnamedMixinApplication;
+  }
+
+  bool _isSuperMixinApplication(IndexedClass cls) {
+    assert(checkFamily(cls));
+    JClassEnv env = classes.getEnv(cls);
+    return env.isSuperMixinApplication;
+  }
+
+  void _forEachSupertype(IndexedClass cls, void f(InterfaceType supertype)) {
+    assert(checkFamily(cls));
+    JClassData data = classes.getData(cls);
+    _ensureSupertypes(cls, data);
+    data.orderedTypeSet.supertypes.forEach(f);
+  }
+
+  void _forEachConstructor(IndexedClass cls, void f(ConstructorEntity member)) {
+    assert(checkFamily(cls));
+    JClassEnv env = classes.getEnv(cls);
+    env.forEachConstructor(this, f);
+  }
+
+  void forEachConstructorBody(
+      IndexedClass cls, void f(ConstructorBodyEntity member)) {
+    throw new UnsupportedError(
+        'KernelToElementMapBase._forEachConstructorBody');
+  }
+
+  void forEachNestedClosure(
+      MemberEntity member, void f(FunctionEntity closure));
+
+  void _forEachLocalClassMember(IndexedClass cls, void f(MemberEntity member)) {
+    assert(checkFamily(cls));
+    JClassEnv env = classes.getEnv(cls);
+    env.forEachMember(this, (MemberEntity member) {
+      f(member);
+    });
+  }
+
+  void forEachInjectedClassMember(
+      IndexedClass cls, void f(MemberEntity member)) {
+    assert(checkFamily(cls));
+    throw new UnsupportedError(
+        'KernelToElementMapBase._forEachInjectedClassMember');
+  }
+
+  void _forEachClassMember(
+      IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) {
+    assert(checkFamily(cls));
+    JClassEnv env = classes.getEnv(cls);
+    env.forEachMember(this, (MemberEntity member) {
+      f(cls, member);
+    });
+    JClassData data = classes.getData(cls);
+    _ensureSupertypes(cls, data);
+    if (data.supertype != null) {
+      _forEachClassMember(data.supertype.element, f);
+    }
+  }
+
+  ConstantConstructor _getConstructorConstant(IndexedConstructor constructor) {
+    assert(checkFamily(constructor));
+    JConstructorData data = members.getData(constructor);
+    return data.getConstructorConstant(this, constructor);
+  }
+
+  ConstantExpression _getFieldConstantExpression(IndexedField field) {
+    assert(checkFamily(field));
+    JFieldData data = members.getData(field);
+    return data.getFieldConstantExpression(this);
+  }
+
+  InterfaceType asInstanceOf(InterfaceType type, ClassEntity cls) {
+    assert(checkFamily(cls));
+    OrderedTypeSet orderedTypeSet = getOrderedTypeSet(type.element);
+    InterfaceType supertype =
+        orderedTypeSet.asInstanceOf(cls, getHierarchyDepth(cls));
+    if (supertype != null) {
+      supertype = substByContext(supertype, type);
+    }
+    return supertype;
+  }
+
+  OrderedTypeSet getOrderedTypeSet(IndexedClass cls) {
+    assert(checkFamily(cls));
+    JClassData data = classes.getData(cls);
+    _ensureSupertypes(cls, data);
+    return data.orderedTypeSet;
+  }
+
+  int getHierarchyDepth(IndexedClass cls) {
+    assert(checkFamily(cls));
+    JClassData data = classes.getData(cls);
+    _ensureSupertypes(cls, data);
+    return data.orderedTypeSet.maxDepth;
+  }
+
+  Iterable<InterfaceType> getInterfaces(IndexedClass cls) {
+    assert(checkFamily(cls));
+    JClassData data = classes.getData(cls);
+    _ensureSupertypes(cls, data);
+    return data.interfaces;
+  }
+
+  MemberDefinition getMemberDefinitionInternal(covariant IndexedMember member) {
+    assert(checkFamily(member));
+    return members.getData(member).definition;
+  }
+
+  ClassDefinition getClassDefinitionInternal(covariant IndexedClass cls) {
+    assert(checkFamily(cls));
+    return classes.getData(cls).definition;
+  }
+
+  ImportEntity getImport(ir.LibraryDependency node) {
+    ir.Library library = node.parent;
+    JLibraryData data = libraries.getData(getLibraryInternal(library));
+    return data.imports[node];
+  }
+
+  ir.TypeEnvironment get typeEnvironment {
+    if (_typeEnvironment == null) {
+      _typeEnvironment ??= new ir.TypeEnvironment(
+          new ir.CoreTypes(env.mainComponent),
+          new ir.ClassHierarchy(env.mainComponent));
+    }
+    return _typeEnvironment;
+  }
+
+  DartType getStaticType(ir.Expression node) {
+    ir.TreeNode enclosingClass = node;
+    while (enclosingClass != null && enclosingClass is! ir.Class) {
+      enclosingClass = enclosingClass.parent;
+    }
+    try {
+      typeEnvironment.thisType =
+          enclosingClass is ir.Class ? enclosingClass.thisType : null;
+      return getDartType(node.getStaticType(typeEnvironment));
+    } catch (e) {
+      // The static type computation crashes on type errors. Use `dynamic`
+      // as static type.
+      return commonElements.dynamicType;
+    }
+  }
+
+  Name getName(ir.Name name) {
+    return new Name(
+        name.name, name.isPrivate ? getLibrary(name.library) : null);
+  }
+
+  CallStructure getCallStructure(ir.Arguments arguments) {
+    int argumentCount = arguments.positional.length + arguments.named.length;
+    List<String> namedArguments = arguments.named.map((e) => e.name).toList();
+    return new CallStructure(
+        argumentCount, namedArguments, arguments.types.length);
+  }
+
+  ParameterStructure getParameterStructure(ir.FunctionNode node,
+      // TODO(johnniwinther): Remove this when type arguments are passed to
+      // constructors like calling a generic method.
+      {bool includeTypeParameters: true}) {
+    // TODO(johnniwinther): Cache the computed function type.
+    int requiredParameters = node.requiredParameterCount;
+    int positionalParameters = node.positionalParameters.length;
+    int typeParameters = node.typeParameters.length;
+    List<String> namedParameters =
+        node.namedParameters.map((p) => p.name).toList()..sort();
+    return new ParameterStructure(requiredParameters, positionalParameters,
+        namedParameters, includeTypeParameters ? typeParameters : 0);
+  }
+
+  Selector getSelector(ir.Expression node) {
+    // TODO(efortuna): This is screaming for a common interface between
+    // PropertyGet and SuperPropertyGet (and same for *Get). Talk to kernel
+    // folks.
+    if (node is ir.PropertyGet) {
+      return getGetterSelector(node.name);
+    }
+    if (node is ir.SuperPropertyGet) {
+      return getGetterSelector(node.name);
+    }
+    if (node is ir.PropertySet) {
+      return getSetterSelector(node.name);
+    }
+    if (node is ir.SuperPropertySet) {
+      return getSetterSelector(node.name);
+    }
+    if (node is ir.InvocationExpression) {
+      return getInvocationSelector(node);
+    }
+    throw failedAt(
+        CURRENT_ELEMENT_SPANNABLE,
+        "Can only get the selector for a property get or an invocation: "
+        "${node}");
+  }
+
+  Selector getInvocationSelector(ir.InvocationExpression invocation) {
+    Name name = getName(invocation.name);
+    SelectorKind kind;
+    if (Selector.isOperatorName(name.text)) {
+      if (name == Names.INDEX_NAME || name == Names.INDEX_SET_NAME) {
+        kind = SelectorKind.INDEX;
+      } else {
+        kind = SelectorKind.OPERATOR;
+      }
+    } else {
+      kind = SelectorKind.CALL;
+    }
+
+    CallStructure callStructure = getCallStructure(invocation.arguments);
+    return new Selector(kind, name, callStructure);
+  }
+
+  Selector getGetterSelector(ir.Name irName) {
+    Name name = new Name(
+        irName.name, irName.isPrivate ? getLibrary(irName.library) : null);
+    return new Selector.getter(name);
+  }
+
+  Selector getSetterSelector(ir.Name irName) {
+    Name name = new Name(
+        irName.name, irName.isPrivate ? getLibrary(irName.library) : null);
+    return new Selector.setter(name);
+  }
+
+  /// Looks up [typeName] for use in the spec-string of a `JS` call.
+  // TODO(johnniwinther): Use this in [native.NativeBehavior] instead of calling
+  // the `ForeignResolver`.
+  native.TypeLookup typeLookup({bool resolveAsRaw: true}) {
+    return resolveAsRaw
+        ? (_cachedTypeLookupRaw ??= _typeLookup(resolveAsRaw: true))
+        : (_cachedTypeLookupFull ??= _typeLookup(resolveAsRaw: false));
+  }
+
+  native.TypeLookup _cachedTypeLookupRaw;
+  native.TypeLookup _cachedTypeLookupFull;
+
+  native.TypeLookup _typeLookup({bool resolveAsRaw: true}) {
+    bool cachedMayLookupInMain;
+    bool mayLookupInMain() {
+      var mainUri = elementEnvironment.mainLibrary.canonicalUri;
+      // Tests permit lookup outside of dart: libraries.
+      return mainUri.path.contains('tests/compiler/dart2js_native') ||
+          mainUri.path.contains('tests/compiler/dart2js_extra');
+    }
+
+    DartType lookup(String typeName, {bool required}) {
+      DartType findInLibrary(LibraryEntity library) {
+        if (library != null) {
+          ClassEntity cls = elementEnvironment.lookupClass(library, typeName);
+          if (cls != null) {
+            // TODO(johnniwinther): Align semantics.
+            return resolveAsRaw
+                ? elementEnvironment.getRawType(cls)
+                : elementEnvironment.getThisType(cls);
+          }
+        }
+        return null;
+      }
+
+      DartType findIn(Uri uri) {
+        return findInLibrary(elementEnvironment.lookupLibrary(uri));
+      }
+
+      // TODO(johnniwinther): Narrow the set of lookups based on the depending
+      // library.
+      // TODO(johnniwinther): Cache more results to avoid redundant lookups?
+      DartType type;
+      if (cachedMayLookupInMain ??= mayLookupInMain()) {
+        type ??= findInLibrary(elementEnvironment.mainLibrary);
+      }
+      type ??= findIn(Uris.dart_core);
+      type ??= findIn(Uris.dart__js_helper);
+      type ??= findIn(Uris.dart__interceptors);
+      type ??= findIn(Uris.dart__native_typed_data);
+      type ??= findIn(Uris.dart_collection);
+      type ??= findIn(Uris.dart_math);
+      type ??= findIn(Uris.dart_html);
+      type ??= findIn(Uris.dart_html_common);
+      type ??= findIn(Uris.dart_svg);
+      type ??= findIn(Uris.dart_web_audio);
+      type ??= findIn(Uris.dart_web_gl);
+      type ??= findIn(Uris.dart_web_sql);
+      type ??= findIn(Uris.dart_indexed_db);
+      type ??= findIn(Uris.dart_typed_data);
+      type ??= findIn(Uris.dart_mirrors);
+      if (type == null && required) {
+        reporter.reportErrorMessage(CURRENT_ELEMENT_SPANNABLE,
+            MessageKind.GENERIC, {'text': "Type '$typeName' not found."});
+      }
+      return type;
+    }
+
+    return lookup;
+  }
+
+  String _getStringArgument(ir.StaticInvocation node, int index) {
+    return node.arguments.positional[index].accept(new Stringifier());
+  }
+
+  /// Computes the [native.NativeBehavior] for a call to the [JS] function.
+  // TODO(johnniwinther): Cache this for later use.
+  native.NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node) {
+    if (node.arguments.positional.length < 2 ||
+        node.arguments.named.isNotEmpty) {
+      reporter.reportErrorMessage(
+          CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS);
+      return new native.NativeBehavior();
+    }
+    String specString = _getStringArgument(node, 0);
+    if (specString == null) {
+      reporter.reportErrorMessage(
+          CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS_FIRST);
+      return new native.NativeBehavior();
+    }
+
+    String codeString = _getStringArgument(node, 1);
+    if (codeString == null) {
+      reporter.reportErrorMessage(
+          CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS_SECOND);
+      return new native.NativeBehavior();
+    }
+
+    return native.NativeBehavior.ofJsCall(
+        specString,
+        codeString,
+        typeLookup(resolveAsRaw: true),
+        CURRENT_ELEMENT_SPANNABLE,
+        reporter,
+        commonElements);
+  }
+
+  /// Computes the [native.NativeBehavior] for a call to the [JS_BUILTIN]
+  /// function.
+  // TODO(johnniwinther): Cache this for later use.
+  native.NativeBehavior getNativeBehaviorForJsBuiltinCall(
+      ir.StaticInvocation node) {
+    if (node.arguments.positional.length < 1) {
+      reporter.internalError(
+          CURRENT_ELEMENT_SPANNABLE, "JS builtin expression has no type.");
+      return new native.NativeBehavior();
+    }
+    if (node.arguments.positional.length < 2) {
+      reporter.internalError(
+          CURRENT_ELEMENT_SPANNABLE, "JS builtin is missing name.");
+      return new native.NativeBehavior();
+    }
+    String specString = _getStringArgument(node, 0);
+    if (specString == null) {
+      reporter.internalError(
+          CURRENT_ELEMENT_SPANNABLE, "Unexpected first argument.");
+      return new native.NativeBehavior();
+    }
+    return native.NativeBehavior.ofJsBuiltinCall(
+        specString,
+        typeLookup(resolveAsRaw: true),
+        CURRENT_ELEMENT_SPANNABLE,
+        reporter,
+        commonElements);
+  }
+
+  /// Computes the [native.NativeBehavior] for a call to the
+  /// [JS_EMBEDDED_GLOBAL] function.
+  // TODO(johnniwinther): Cache this for later use.
+  native.NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
+      ir.StaticInvocation node) {
+    if (node.arguments.positional.length < 1) {
+      reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
+          "JS embedded global expression has no type.");
+      return new native.NativeBehavior();
+    }
+    if (node.arguments.positional.length < 2) {
+      reporter.internalError(
+          CURRENT_ELEMENT_SPANNABLE, "JS embedded global is missing name.");
+      return new native.NativeBehavior();
+    }
+    if (node.arguments.positional.length > 2 ||
+        node.arguments.named.isNotEmpty) {
+      reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
+          "JS embedded global has more than 2 arguments.");
+      return new native.NativeBehavior();
+    }
+    String specString = _getStringArgument(node, 0);
+    if (specString == null) {
+      reporter.internalError(
+          CURRENT_ELEMENT_SPANNABLE, "Unexpected first argument.");
+      return new native.NativeBehavior();
+    }
+    return native.NativeBehavior.ofJsEmbeddedGlobalCall(
+        specString,
+        typeLookup(resolveAsRaw: true),
+        CURRENT_ELEMENT_SPANNABLE,
+        reporter,
+        commonElements);
+  }
+
+  js.Name getNameForJsGetName(ConstantValue constant, Namer namer) {
+    int index = extractEnumIndexFromConstantValue(
+        constant, commonElements.jsGetNameEnum);
+    if (index == null) return null;
+    return namer.getNameForJsGetName(
+        CURRENT_ELEMENT_SPANNABLE, JsGetName.values[index]);
+  }
+
+  int extractEnumIndexFromConstantValue(
+      ConstantValue constant, ClassEntity classElement) {
+    if (constant is ConstructedConstantValue) {
+      if (constant.type.element == classElement) {
+        assert(constant.fields.length == 1 || constant.fields.length == 2);
+        ConstantValue indexConstant = constant.fields.values.first;
+        if (indexConstant is IntConstantValue) {
+          return indexConstant.intValue.toInt();
+        }
+      }
+    }
+    return null;
+  }
+
+  ConstantValue getConstantValue(ir.Expression node,
+      {bool requireConstant: true, bool implicitNull: false}) {
+    ConstantExpression constant;
+    if (node == null) {
+      if (!implicitNull) {
+        throw failedAt(
+            CURRENT_ELEMENT_SPANNABLE, 'No expression for constant.');
+      }
+      constant = new NullConstantExpression();
+    } else {
+      constant =
+          new Constantifier(this, requireConstant: requireConstant).visit(node);
+    }
+    if (constant == null) {
+      if (requireConstant) {
+        throw new UnsupportedError(
+            'No constant for ${DebugPrinter.prettyPrint(node)}');
+      }
+      return null;
+    }
+    ConstantValue value = computeConstantValue(
+        computeSourceSpanFromTreeNode(node), constant,
+        requireConstant: requireConstant);
+    if (!value.isConstant && !requireConstant) {
+      return null;
+    }
+    return value;
+  }
+
+  /// Converts [annotations] into a list of [ConstantValue]s.
+  List<ConstantValue> getMetadata(List<ir.Expression> annotations) {
+    if (annotations.isEmpty) return const <ConstantValue>[];
+    List<ConstantValue> metadata = <ConstantValue>[];
+    annotations.forEach((ir.Expression node) {
+      metadata.add(getConstantValue(node));
+    });
+    return metadata;
+  }
+
+  FunctionEntity getSuperNoSuchMethod(ClassEntity cls) {
+    while (cls != null) {
+      cls = elementEnvironment.getSuperClass(cls);
+      MemberEntity member = elementEnvironment.lookupLocalClassMember(
+          cls, Identifiers.noSuchMethod_);
+      if (member != null && !member.isAbstract) {
+        if (member.isFunction) {
+          FunctionEntity function = member;
+          if (function.parameterStructure.positionalParameters >= 1) {
+            return function;
+          }
+        }
+        // If [member] is not a valid `noSuchMethod` the target is
+        // `Object.superNoSuchMethod`.
+        break;
+      }
+    }
+    FunctionEntity function = elementEnvironment.lookupLocalClassMember(
+        commonElements.objectClass, Identifiers.noSuchMethod_);
+    assert(function != null,
+        failedAt(cls, "No super noSuchMethod found for class $cls."));
+    return function;
+  }
+}
+
+class JsElementEnvironment extends ElementEnvironment
+    implements JElementEnvironment {
+  final JsToElementMapBase elementMap;
+
+  JsElementEnvironment(this.elementMap);
+
+  @override
+  DartType get dynamicType => const DynamicType();
+
+  @override
+  LibraryEntity get mainLibrary => elementMap._mainLibrary;
+
+  @override
+  FunctionEntity get mainFunction => elementMap._mainFunction;
+
+  @override
+  Iterable<LibraryEntity> get libraries => elementMap.libraryListInternal;
+
+  @override
+  String getLibraryName(LibraryEntity library) {
+    return elementMap._getLibraryName(library);
+  }
+
+  @override
+  InterfaceType getThisType(ClassEntity cls) {
+    return elementMap.getThisType(cls);
+  }
+
+  @override
+  InterfaceType getRawType(ClassEntity cls) {
+    return elementMap._getRawType(cls);
+  }
+
+  @override
+  bool isGenericClass(ClassEntity cls) {
+    return getThisType(cls).typeArguments.isNotEmpty;
+  }
+
+  @override
+  bool isMixinApplication(ClassEntity cls) {
+    return elementMap._isMixinApplication(cls);
+  }
+
+  @override
+  bool isUnnamedMixinApplication(ClassEntity cls) {
+    return elementMap._isUnnamedMixinApplication(cls);
+  }
+
+  @override
+  bool isSuperMixinApplication(ClassEntity cls) {
+    return elementMap._isSuperMixinApplication(cls);
+  }
+
+  @override
+  ClassEntity getEffectiveMixinClass(ClassEntity cls) {
+    if (!isMixinApplication(cls)) return null;
+    do {
+      cls = elementMap.getAppliedMixin(cls);
+    } while (isMixinApplication(cls));
+    return cls;
+  }
+
+  @override
+  DartType getTypeVariableBound(TypeVariableEntity typeVariable) {
+    return elementMap.getTypeVariableBound(typeVariable);
+  }
+
+  @override
+  DartType getTypeVariableDefaultType(TypeVariableEntity typeVariable) {
+    return elementMap._getTypeVariableDefaultType(typeVariable);
+  }
+
+  @override
+  InterfaceType createInterfaceType(
+      ClassEntity cls, List<DartType> typeArguments) {
+    return new InterfaceType(cls, typeArguments);
+  }
+
+  @override
+  FunctionType getFunctionType(FunctionEntity function) {
+    return elementMap._getFunctionType(function);
+  }
+
+  @override
+  List<TypeVariableType> getFunctionTypeVariables(FunctionEntity function) {
+    return elementMap._getFunctionTypeVariables(function);
+  }
+
+  @override
+  DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function) {
+    // TODO(sra): Should be getting the DartType from the node.
+    DartType returnType = getFunctionType(function).returnType;
+    return getAsyncOrSyncStarElementType(function.asyncMarker, returnType);
+  }
+
+  @override
+  DartType getAsyncOrSyncStarElementType(
+      AsyncMarker asyncMarker, DartType returnType) {
+    switch (asyncMarker) {
+      case AsyncMarker.SYNC:
+        return returnType;
+      case AsyncMarker.SYNC_STAR:
+        if (returnType is InterfaceType) {
+          if (returnType.element == elementMap.commonElements.iterableClass) {
+            return returnType.typeArguments.first;
+          }
+        }
+        return dynamicType;
+      case AsyncMarker.ASYNC:
+        if (returnType is FutureOrType) return returnType.typeArgument;
+        if (returnType is InterfaceType) {
+          if (returnType.element == elementMap.commonElements.futureClass) {
+            return returnType.typeArguments.first;
+          }
+        }
+        return dynamicType;
+      case AsyncMarker.ASYNC_STAR:
+        if (returnType is InterfaceType) {
+          if (returnType.element == elementMap.commonElements.streamClass) {
+            return returnType.typeArguments.first;
+          }
+        }
+        return dynamicType;
+    }
+    assert(false, 'Unexpected marker ${asyncMarker}');
+    return null;
+  }
+
+  @override
+  DartType getFieldType(FieldEntity field) {
+    return elementMap._getFieldType(field);
+  }
+
+  @override
+  FunctionType getLocalFunctionType(covariant KLocalFunction function) {
+    return function.functionType;
+  }
+
+  @override
+  DartType getUnaliasedType(DartType type) => type;
+
+  @override
+  ConstructorEntity lookupConstructor(ClassEntity cls, String name,
+      {bool required: false}) {
+    ConstructorEntity constructor = elementMap.lookupConstructor(cls, name);
+    if (constructor == null && required) {
+      throw failedAt(
+          CURRENT_ELEMENT_SPANNABLE,
+          "The constructor '$name' was not found in class '${cls.name}' "
+          "in library ${cls.library.canonicalUri}.");
+    }
+    return constructor;
+  }
+
+  @override
+  MemberEntity lookupLocalClassMember(ClassEntity cls, String name,
+      {bool setter: false, bool required: false}) {
+    MemberEntity member =
+        elementMap.lookupClassMember(cls, name, setter: setter);
+    if (member == null && required) {
+      throw failedAt(CURRENT_ELEMENT_SPANNABLE,
+          "The member '$name' was not found in ${cls.name}.");
+    }
+    return member;
+  }
+
+  @override
+  ClassEntity getSuperClass(ClassEntity cls,
+      {bool skipUnnamedMixinApplications: false}) {
+    assert(elementMap.checkFamily(cls));
+    ClassEntity superclass = elementMap.getSuperType(cls)?.element;
+    if (skipUnnamedMixinApplications) {
+      while (superclass != null &&
+          elementMap._isUnnamedMixinApplication(superclass)) {
+        superclass = elementMap.getSuperType(superclass)?.element;
+      }
+    }
+    return superclass;
+  }
+
+  @override
+  void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype)) {
+    elementMap._forEachSupertype(cls, f);
+  }
+
+  @override
+  void forEachLocalClassMember(ClassEntity cls, void f(MemberEntity member)) {
+    elementMap._forEachLocalClassMember(cls, f);
+  }
+
+  @override
+  void forEachInjectedClassMember(
+      ClassEntity cls, void f(MemberEntity member)) {
+    elementMap.forEachInjectedClassMember(cls, f);
+  }
+
+  @override
+  void forEachClassMember(
+      ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) {
+    elementMap._forEachClassMember(cls, f);
+  }
+
+  @override
+  void forEachConstructor(
+      ClassEntity cls, void f(ConstructorEntity constructor)) {
+    elementMap._forEachConstructor(cls, f);
+  }
+
+  @override
+  void forEachConstructorBody(
+      ClassEntity cls, void f(ConstructorBodyEntity constructor)) {
+    elementMap.forEachConstructorBody(cls, f);
+  }
+
+  @override
+  void forEachNestedClosure(
+      MemberEntity member, void f(FunctionEntity closure)) {
+    elementMap.forEachNestedClosure(member, f);
+  }
+
+  @override
+  void forEachLibraryMember(
+      LibraryEntity library, void f(MemberEntity member)) {
+    elementMap._forEachLibraryMember(library, f);
+  }
+
+  @override
+  MemberEntity lookupLibraryMember(LibraryEntity library, String name,
+      {bool setter: false, bool required: false}) {
+    MemberEntity member =
+        elementMap.lookupLibraryMember(library, name, setter: setter);
+    if (member == null && required) {
+      failedAt(CURRENT_ELEMENT_SPANNABLE,
+          "The member '${name}' was not found in library '${library.name}'.");
+    }
+    return member;
+  }
+
+  @override
+  ClassEntity lookupClass(LibraryEntity library, String name,
+      {bool required: false}) {
+    ClassEntity cls = elementMap.lookupClass(library, name);
+    if (cls == null && required) {
+      failedAt(CURRENT_ELEMENT_SPANNABLE,
+          "The class '$name'  was not found in library '${library.name}'.");
+    }
+    return cls;
+  }
+
+  @override
+  void forEachClass(LibraryEntity library, void f(ClassEntity cls)) {
+    elementMap._forEachClass(library, f);
+  }
+
+  @override
+  LibraryEntity lookupLibrary(Uri uri, {bool required: false}) {
+    LibraryEntity library = elementMap.lookupLibrary(uri);
+    if (library == null && required) {
+      failedAt(CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found.");
+    }
+    return library;
+  }
+
+  @override
+  bool isEnumClass(ClassEntity cls) {
+    assert(elementMap.checkFamily(cls));
+    JClassData classData = elementMap.classes.getData(cls);
+    return classData.isEnumClass;
+  }
+}
+
+/// [native.BehaviorBuilder] for kernel based elements.
+class JsBehaviorBuilder extends native.BehaviorBuilder {
+  final ElementEnvironment elementEnvironment;
+  final CommonElements commonElements;
+  final DiagnosticReporter reporter;
+  final NativeBasicData nativeBasicData;
+  final CompilerOptions _options;
+
+  JsBehaviorBuilder(this.elementEnvironment, this.commonElements,
+      this.nativeBasicData, this.reporter, this._options);
+
+  @override
+  bool get trustJSInteropTypeAnnotations =>
+      _options.trustJSInteropTypeAnnotations;
+}
+
+/// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using
+/// [_EvaluationEnvironment] for the evaluation.
+class JsConstantEnvironment implements ConstantEnvironment {
+  final JsToElementMapBase _elementMap;
+  final Environment _environment;
+
+  Map<ConstantExpression, ConstantValue> _valueMap =
+      <ConstantExpression, ConstantValue>{};
+
+  JsConstantEnvironment(this._elementMap, this._environment);
+
+  @override
+  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
+
+  ConstantValue _getConstantValue(
+      Spannable spannable, ConstantExpression expression,
+      {bool constantRequired}) {
+    return _valueMap.putIfAbsent(expression, () {
+      return expression.evaluate(
+          new JsEvaluationEnvironment(_elementMap, _environment, spannable,
+              constantRequired: constantRequired),
+          constantSystem);
+    });
+  }
+}
+
+/// Evaluation environment used for computing [ConstantValue]s for
+/// kernel based [ConstantExpression]s.
+class JsEvaluationEnvironment extends EvaluationEnvironmentBase {
+  final JsToElementMapBase _elementMap;
+  final Environment _environment;
+
+  JsEvaluationEnvironment(
+      this._elementMap, this._environment, Spannable spannable,
+      {bool constantRequired})
+      : super(spannable, constantRequired: constantRequired);
+
+  @override
+  CommonElements get commonElements => _elementMap.commonElements;
+
+  @override
+  DartTypes get types => _elementMap.types;
+
+  @override
+  DartType substByContext(DartType base, InterfaceType target) {
+    return _elementMap.substByContext(base, target);
+  }
+
+  @override
+  ConstantConstructor getConstructorConstant(ConstructorEntity constructor) {
+    return _elementMap._getConstructorConstant(constructor);
+  }
+
+  @override
+  ConstantExpression getFieldConstant(FieldEntity field) {
+    return _elementMap._getFieldConstantExpression(field);
+  }
+
+  @override
+  ConstantExpression getLocalConstant(Local local) {
+    throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant");
+  }
+
+  @override
+  String readFromEnvironment(String name) {
+    return _environment.valueOf(name);
+  }
+
+  @override
+  DiagnosticReporter get reporter => _elementMap.reporter;
+
+  @override
+  bool get enableAssertions => _elementMap.options.enableUserAssertions;
+}
+
+class JsKernelToElementMap extends JsToElementMapBase
     with JsElementCreatorMixin
-    implements KernelToWorldBuilder, JsToElementMap {
+    implements JsToWorldBuilder, JsToElementMap {
   final Map<ir.Library, IndexedLibrary> libraryMap = {};
   final Map<ir.Class, IndexedClass> classMap = {};
   final Map<ir.Typedef, IndexedTypedef> typedefMap = {};
@@ -79,44 +1471,48 @@
   JsKernelToElementMap(DiagnosticReporter reporter, Environment environment,
       KernelToElementMapImpl _elementMap, Iterable<MemberEntity> liveMembers)
       : super(_elementMap.options, reporter, environment) {
-    env = _elementMap.env;
+    env = _elementMap.env.convert();
     for (int libraryIndex = 0;
         libraryIndex < _elementMap.libraries.length;
         libraryIndex++) {
       IndexedLibrary oldLibrary = _elementMap.libraries.getEntity(libraryIndex);
-      LibraryEnv env = _elementMap.libraries.getEnv(oldLibrary);
-      LibraryData data = _elementMap.libraries.getData(oldLibrary);
+      KLibraryEnv oldEnv = _elementMap.libraries.getEnv(oldLibrary);
+      KLibraryData data = _elementMap.libraries.getData(oldLibrary);
       IndexedLibrary newLibrary = convertLibrary(oldLibrary);
-      libraryMap[env.library] =
-          libraries.register<IndexedLibrary, LibraryData, LibraryEnv>(
-              newLibrary, data.copy(), env.copyLive(_elementMap, liveMembers));
+      JLibraryEnv newEnv = oldEnv.convert(_elementMap, liveMembers);
+      libraryMap[oldEnv.library] =
+          libraries.register<IndexedLibrary, JLibraryData, JLibraryEnv>(
+              newLibrary, data.convert(), newEnv);
       assert(newLibrary.libraryIndex == oldLibrary.libraryIndex);
+      env.registerLibrary(newEnv);
     }
+    // TODO(johnniwinther): Filter unused classes.
     for (int classIndex = 0;
         classIndex < _elementMap.classes.length;
         classIndex++) {
       IndexedClass oldClass = _elementMap.classes.getEntity(classIndex);
-      ClassEnv env = _elementMap.classes.getEnv(oldClass);
-      ClassData data = _elementMap.classes.getData(oldClass);
+      KClassEnv env = _elementMap.classes.getEnv(oldClass);
+      KClassData data = _elementMap.classes.getData(oldClass);
       IndexedLibrary oldLibrary = oldClass.library;
       LibraryEntity newLibrary = libraries.getEntity(oldLibrary.libraryIndex);
       IndexedClass newClass = convertClass(newLibrary, oldClass);
-      classMap[env.cls] = classes.register(
-          newClass, data.copy(), env.copyLive(_elementMap, liveMembers));
+      JClassEnv newEnv = env.convert(_elementMap, liveMembers);
+      classMap[env.cls] =
+          classes.register(newClass, data.convert(newClass), newEnv);
       assert(newClass.classIndex == oldClass.classIndex);
+      libraries.getEnv(newClass.library).registerClass(newClass.name, newEnv);
     }
     for (int typedefIndex = 0;
         typedefIndex < _elementMap.typedefs.length;
         typedefIndex++) {
       IndexedTypedef oldTypedef = _elementMap.typedefs.getEntity(typedefIndex);
-      TypedefData data = _elementMap.typedefs.getData(oldTypedef);
+      KTypedefData data = _elementMap.typedefs.getData(oldTypedef);
       IndexedLibrary oldLibrary = oldTypedef.library;
       LibraryEntity newLibrary = libraries.getEntity(oldLibrary.libraryIndex);
       IndexedTypedef newTypedef = convertTypedef(newLibrary, oldTypedef);
       typedefMap[data.node] = typedefs.register(
           newTypedef,
-          new TypedefData(
-              data.node,
+          new JTypedefData(
               newTypedef,
               new TypedefType(
                   newTypedef,
@@ -133,14 +1529,14 @@
         members.skipIndex(oldMember.memberIndex);
         continue;
       }
-      MemberDataImpl data = _elementMap.members.getData(oldMember);
+      KMemberData data = _elementMap.members.getData(oldMember);
       IndexedLibrary oldLibrary = oldMember.library;
       IndexedClass oldClass = oldMember.enclosingClass;
       LibraryEntity newLibrary = libraries.getEntity(oldLibrary.libraryIndex);
       ClassEntity newClass =
           oldClass != null ? classes.getEntity(oldClass.classIndex) : null;
       IndexedMember newMember = convertMember(newLibrary, newClass, oldMember);
-      members.register(newMember, data.copy());
+      members.register(newMember, data.convert(newMember));
       assert(newMember.memberIndex == oldMember.memberIndex);
       if (newMember.isField) {
         fieldMap[data.node] = newMember;
@@ -155,7 +1551,7 @@
         typeVariableIndex++) {
       IndexedTypeVariable oldTypeVariable =
           _elementMap.typeVariables.getEntity(typeVariableIndex);
-      TypeVariableData oldTypeVariableData =
+      KTypeVariableData oldTypeVariableData =
           _elementMap.typeVariables.getData(oldTypeVariable);
       Entity newTypeDeclaration;
       if (oldTypeVariable.typeDeclaration is ClassEntity) {
@@ -170,7 +1566,7 @@
       IndexedTypeVariable newTypeVariable = createTypeVariable(
           newTypeDeclaration, oldTypeVariable.name, oldTypeVariable.index);
       typeVariableMap[oldTypeVariableData.node] =
-          typeVariables.register<IndexedTypeVariable, TypeVariableData>(
+          typeVariables.register<IndexedTypeVariable, JTypeVariableData>(
               newTypeVariable, oldTypeVariableData.copy());
       assert(newTypeVariable.typeVariableIndex ==
           oldTypeVariable.typeVariableIndex);
@@ -226,14 +1622,14 @@
   }
 
   @override
-  LibraryEntity getLibraryInternal(ir.Library node, [LibraryEnv env]) {
+  LibraryEntity getLibraryInternal(ir.Library node, [JLibraryEnv env]) {
     LibraryEntity library = libraryMap[node];
     assert(library != null, "No library entity for $node");
     return library;
   }
 
   @override
-  ClassEntity getClassInternal(ir.Class node, [ClassEnv env]) {
+  ClassEntity getClassInternal(ir.Class node, [JClassEnv env]) {
     ClassEntity cls = classMap[node];
     assert(cls != null, "No class entity for $node");
     return cls;
@@ -304,7 +1700,7 @@
 
   FunctionEntity _getConstructorBody(
       ir.Constructor node, covariant IndexedConstructor constructor) {
-    ConstructorDataImpl data = members.getData(constructor);
+    JConstructorDataImpl data = members.getData(constructor);
     if (data.constructorBody == null) {
       JConstructorBody constructorBody = createConstructorBody(constructor);
       members.register<IndexedFunction, FunctionData>(
@@ -315,7 +1711,7 @@
               new SpecialMemberDefinition(
                   constructorBody, node, MemberKind.constructorBody)));
       IndexedClass cls = constructor.enclosingClass;
-      ClassEnvImpl classEnv = classes.getEnv(cls);
+      JClassEnvImpl classEnv = classes.getEnv(cls);
       // TODO(johnniwinther): Avoid this by only including live members in the
       // js-model.
       classEnv.addConstructorBody(constructorBody);
@@ -340,19 +1736,19 @@
   @override
   ConstantValue getFieldConstantValue(covariant IndexedField field) {
     assert(checkFamily(field));
-    FieldData data = members.getData(field);
+    JFieldData data = members.getData(field);
     return data.getFieldConstantValue(this);
   }
 
   @override
   bool hasConstantFieldInitializer(covariant IndexedField field) {
-    FieldData data = members.getData(field);
+    JFieldData data = members.getData(field);
     return data.hasConstantFieldInitializer(this);
   }
 
   @override
   ConstantValue getConstantFieldInitializer(covariant IndexedField field) {
-    FieldData data = members.getData(field);
+    JFieldData data = members.getData(field);
     return data.getConstantFieldInitializer(this);
   }
 
@@ -366,7 +1762,7 @@
   @override
   void forEachConstructorBody(
       IndexedClass cls, void f(ConstructorBodyEntity member)) {
-    ClassEnv env = classes.getEnv(cls);
+    JClassEnv env = classes.getEnv(cls);
     env.forEachConstructorBody(f);
   }
 
@@ -414,7 +1810,7 @@
       JRecord container = new JRecord(member.library, box.name);
       InterfaceType thisType = new InterfaceType(container, const <DartType>[]);
       InterfaceType supertype = commonElements.objectType;
-      ClassData containerData = new RecordClassData(
+      JClassData containerData = new RecordClassData(
           new ClosureClassDefinition(container,
               computeSourceSpanFromTreeNode(getMemberDefinition(member).node)),
           thisType,
@@ -494,7 +1890,7 @@
     for (ir.TypeParameter typeParameter in node.typeParameters) {
       typeVariableMap[typeParameter] = typeVariables.register(
           createTypeVariable(callMethod, typeParameter.name, index),
-          new TypeVariableData(typeParameter));
+          new JTypeVariableData(typeParameter));
       index++;
     }
 
@@ -641,7 +2037,7 @@
     FieldEntity closureField = new JClosureField(
         '_box_$fieldNumber', closureClassInfo, true, false, recordField.box);
 
-    members.register<IndexedField, FieldData>(
+    members.register<IndexedField, JFieldData>(
         closureField,
         new ClosureFieldData(
             new ClosureMemberDefinition(
@@ -698,7 +2094,7 @@
         isAssignable,
         capturedLocal);
 
-    members.register<IndexedField, FieldData>(
+    members.register<IndexedField, JFieldData>(
         closureField,
         new ClosureFieldData(
             new ClosureMemberDefinition(
@@ -805,3 +2201,36 @@
     return emitter.builtinTemplateFor(JsBuiltin.values[index]);
   }
 }
+
+class JsToFrontendMapImpl extends JsToFrontendMapBase
+    implements JsToFrontendMap {
+  final JsToElementMapBase _backend;
+
+  JsToFrontendMapImpl(this._backend);
+
+  LibraryEntity toBackendLibrary(covariant IndexedLibrary library) {
+    return _backend.libraries.getEntity(library.libraryIndex);
+  }
+
+  ClassEntity toBackendClass(covariant IndexedClass cls) {
+    return _backend.classes.getEntity(cls.classIndex);
+  }
+
+  MemberEntity toBackendMember(covariant IndexedMember member) {
+    return _backend.members.getEntity(member.memberIndex);
+  }
+
+  TypedefEntity toBackendTypedef(covariant IndexedTypedef typedef) {
+    return _backend.typedefs.getEntity(typedef.typedefIndex);
+  }
+
+  TypeVariableEntity toBackendTypeVariable(TypeVariableEntity typeVariable) {
+    if (typeVariable is KLocalTypeVariable) {
+      failedAt(
+          typeVariable, "Local function type variables are not supported.");
+    }
+    IndexedTypeVariable indexedTypeVariable = typeVariable;
+    return _backend.typeVariables
+        .getEntity(indexedTypeVariable.typeVariableIndex);
+  }
+}
diff --git a/pkg/compiler/lib/src/js_model/env.dart b/pkg/compiler/lib/src/js_model/env.dart
new file mode 100644
index 0000000..69ff3ca
--- /dev/null
+++ b/pkg/compiler/lib/src/js_model/env.dart
@@ -0,0 +1,609 @@
+// 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 dart2js.js_model.env;
+
+import 'package:kernel/ast.dart' as ir;
+
+import '../common.dart';
+import '../constants/constructors.dart';
+import '../constants/expressions.dart';
+import '../constants/values.dart';
+import '../elements/entities.dart';
+import '../elements/types.dart';
+import '../ir/element_map.dart';
+import '../ir/visitors.dart';
+import '../ir/util.dart';
+import '../js_model/element_map.dart';
+import '../ordered_typeset.dart';
+import '../ssa/type_builder.dart';
+import 'element_map.dart';
+import 'element_map_impl.dart';
+
+/// Environment for fast lookup of component libraries.
+class JProgramEnv {
+  final Set<ir.Component> _components;
+  final Map<Uri, JLibraryEnv> _libraryMap = {};
+
+  JProgramEnv(this._components);
+
+  /// TODO(johnniwinther): Handle arbitrary load order if needed.
+  ir.Member get mainMethod => _components.first?.mainMethod;
+
+  ir.Component get mainComponent => _components.first;
+
+  void registerLibrary(JLibraryEnv env) {
+    _libraryMap[env.library.importUri] = env;
+  }
+
+  /// Return the [JLibraryEnv] for the library with the canonical [uri].
+  JLibraryEnv lookupLibrary(Uri uri) {
+    return _libraryMap[uri];
+  }
+
+  /// Calls [f] for each library in this environment.
+  void forEachLibrary(void f(JLibraryEnv library)) {
+    _libraryMap.values.forEach(f);
+  }
+
+  /// Returns the number of libraries in this environment.
+  int get length {
+    return _libraryMap.length;
+  }
+}
+
+/// Environment for fast lookup of library classes and members.
+class JLibraryEnv {
+  final ir.Library library;
+  final Map<String, JClassEnv> _classMap = {};
+  final Map<String, ir.Member> _memberMap;
+  final Map<String, ir.Member> _setterMap;
+
+  JLibraryEnv(this.library, this._memberMap, this._setterMap);
+
+  void registerClass(String name, JClassEnv classEnv) {
+    _classMap[name] = classEnv;
+  }
+
+  /// Return the [JClassEnv] for the class [name] in [library].
+  JClassEnv lookupClass(String name) {
+    return _classMap[name];
+  }
+
+  /// Calls [f] for each class in this library.
+  void forEachClass(void f(JClassEnv cls)) {
+    _classMap.values.forEach(f);
+  }
+
+  /// Return the [ir.Member] for the member [name] in [library].
+  ir.Member lookupMember(String name, {bool setter: false}) {
+    return setter ? _setterMap[name] : _memberMap[name];
+  }
+
+  void forEachMember(void f(ir.Member member)) {
+    _memberMap.values.forEach(f);
+    for (ir.Member member in _setterMap.values) {
+      if (member is ir.Procedure) {
+        f(member);
+      } else {
+        // Skip fields; these are also in _memberMap.
+      }
+    }
+  }
+}
+
+class JLibraryData {
+  final ir.Library library;
+  // TODO(johnniwinther): Avoid direct access to [imports]. It might be null if
+  // it hasn't been computed for the corresponding [KLibraryData].
+  final Map<ir.LibraryDependency, ImportEntity> imports;
+
+  JLibraryData(this.library, this.imports);
+}
+
+/// Member data for a class.
+abstract class JClassEnv {
+  /// The [ir.Class] that defined the class, if any.
+  ir.Class get cls;
+
+  /// Whether the class is an unnamed mixin application.
+  bool get isUnnamedMixinApplication;
+
+  /// Whether the class is a mixin application that mixes in methods with super
+  /// calls.
+  bool get isSuperMixinApplication;
+
+  /// Return the [MemberEntity] for the member [name] in the class. If [setter]
+  /// is `true`, the setter or assignable field corresponding to [name] is
+  /// returned.
+  MemberEntity lookupMember(IrToElementMap elementMap, String name,
+      {bool setter: false});
+
+  /// Calls [f] for each member of the class.
+  void forEachMember(IrToElementMap elementMap, void f(MemberEntity member));
+
+  /// Return the [ConstructorEntity] for the constructor [name] in the class.
+  ConstructorEntity lookupConstructor(IrToElementMap elementMap, String name);
+
+  /// Calls [f] for each constructor of the class.
+  void forEachConstructor(
+      IrToElementMap elementMap, void f(ConstructorEntity constructor));
+
+  /// Calls [f] for each constructor body for the live constructors in the
+  /// class.
+  void forEachConstructorBody(void f(ConstructorBodyEntity constructor));
+}
+
+/// Environment for fast lookup of class members.
+class JClassEnvImpl implements JClassEnv {
+  final ir.Class cls;
+  final Map<String, ir.Member> _constructorMap;
+  final Map<String, ir.Member> _memberMap;
+  final Map<String, ir.Member> _setterMap;
+  final List<ir.Member> _members; // in declaration order.
+  final bool _isSuperMixinApplication;
+
+  /// Constructor bodies created for this class.
+  List<ConstructorBodyEntity> _constructorBodyList;
+
+  JClassEnvImpl(this.cls, this._constructorMap, this._memberMap,
+      this._setterMap, this._members, this._isSuperMixinApplication);
+
+  bool get isUnnamedMixinApplication => cls.isAnonymousMixin;
+
+  bool get isSuperMixinApplication {
+    assert(_isSuperMixinApplication != null);
+    return _isSuperMixinApplication;
+  }
+
+  /// Return the [MemberEntity] for the member [name] in [cls]. If [setter] is
+  /// `true`, the setter or assignable field corresponding to [name] is
+  /// returned.
+  MemberEntity lookupMember(IrToElementMap elementMap, String name,
+      {bool setter: false}) {
+    ir.Member member = setter ? _setterMap[name] : _memberMap[name];
+    return member != null ? elementMap.getMember(member) : null;
+  }
+
+  /// Calls [f] for each member of [cls].
+  void forEachMember(IrToElementMap elementMap, void f(MemberEntity member)) {
+    _members.forEach((ir.Member member) {
+      f(elementMap.getMember(member));
+    });
+  }
+
+  /// Return the [ConstructorEntity] for the constructor [name] in [cls].
+  ConstructorEntity lookupConstructor(IrToElementMap elementMap, String name) {
+    ir.Member constructor = _constructorMap[name];
+    return constructor != null ? elementMap.getConstructor(constructor) : null;
+  }
+
+  /// Calls [f] for each constructor of [cls].
+  void forEachConstructor(
+      IrToElementMap elementMap, void f(ConstructorEntity constructor)) {
+    _constructorMap.values.forEach((ir.Member constructor) {
+      f(elementMap.getConstructor(constructor));
+    });
+  }
+
+  void addConstructorBody(ConstructorBodyEntity constructorBody) {
+    _constructorBodyList ??= <ConstructorBodyEntity>[];
+    _constructorBodyList.add(constructorBody);
+  }
+
+  void forEachConstructorBody(void f(ConstructorBodyEntity constructor)) {
+    _constructorBodyList?.forEach(f);
+  }
+}
+
+class RecordEnv implements JClassEnv {
+  final Map<String, MemberEntity> _memberMap;
+
+  RecordEnv(this._memberMap);
+
+  @override
+  void forEachConstructorBody(void f(ConstructorBodyEntity constructor)) {
+    // We do not create constructor bodies for containers.
+  }
+
+  @override
+  void forEachConstructor(
+      IrToElementMap elementMap, void f(ConstructorEntity constructor)) {
+    // We do not create constructors for containers.
+  }
+
+  @override
+  ConstructorEntity lookupConstructor(IrToElementMap elementMap, String name) {
+    // We do not create constructors for containers.
+    return null;
+  }
+
+  @override
+  void forEachMember(IrToElementMap elementMap, void f(MemberEntity member)) {
+    _memberMap.values.forEach(f);
+  }
+
+  @override
+  MemberEntity lookupMember(IrToElementMap elementMap, String name,
+      {bool setter: false}) {
+    return _memberMap[name];
+  }
+
+  @override
+  bool get isUnnamedMixinApplication => false;
+
+  @override
+  bool get isSuperMixinApplication => false;
+
+  @override
+  ir.Class get cls => null;
+}
+
+class ClosureClassEnv extends RecordEnv {
+  ClosureClassEnv(Map<String, MemberEntity> memberMap) : super(memberMap);
+
+  @override
+  MemberEntity lookupMember(IrToElementMap elementMap, String name,
+      {bool setter: false}) {
+    if (setter) {
+      // All closure fields are final.
+      return null;
+    }
+    return super.lookupMember(elementMap, name, setter: setter);
+  }
+}
+
+abstract class JClassData {
+  ClassDefinition get definition;
+
+  InterfaceType get thisType;
+  InterfaceType get rawType;
+  InterfaceType get supertype;
+  InterfaceType get mixedInType;
+  List<InterfaceType> get interfaces;
+  OrderedTypeSet get orderedTypeSet;
+  DartType get callType;
+
+  bool get isEnumClass;
+  bool get isMixinApplication;
+}
+
+class JClassDataImpl implements JClassData {
+  final ir.Class cls;
+  final ClassDefinition definition;
+  bool isMixinApplication;
+  bool isCallTypeComputed = false;
+
+  InterfaceType thisType;
+  InterfaceType rawType;
+  InterfaceType supertype;
+  InterfaceType mixedInType;
+  List<InterfaceType> interfaces;
+  OrderedTypeSet orderedTypeSet;
+
+  JClassDataImpl(this.cls, this.definition);
+
+  bool get isEnumClass => cls != null && cls.isEnum;
+
+  DartType get callType => null;
+}
+
+abstract class JMemberData {
+  MemberDefinition get definition;
+
+  InterfaceType getMemberThisType(JsToElementMap elementMap);
+
+  ClassTypeVariableAccess get classTypeVariableAccess;
+}
+
+abstract class JMemberDataImpl implements JMemberData {
+  final ir.Member node;
+
+  final MemberDefinition definition;
+
+  JMemberDataImpl(this.node, this.definition);
+
+  InterfaceType getMemberThisType(JsToElementMap elementMap) {
+    MemberEntity member = elementMap.getMember(node);
+    ClassEntity cls = member.enclosingClass;
+    if (cls != null) {
+      return elementMap.elementEnvironment.getThisType(cls);
+    }
+    return null;
+  }
+}
+
+abstract class FunctionData implements JMemberData {
+  FunctionType getFunctionType(IrToElementMap elementMap);
+
+  List<TypeVariableType> getFunctionTypeVariables(IrToElementMap elementMap);
+
+  void forEachParameter(JsToElementMap elementMap,
+      void f(DartType type, String name, ConstantValue defaultValue));
+}
+
+abstract class FunctionDataMixin implements FunctionData {
+  ir.FunctionNode get functionNode;
+  List<TypeVariableType> _typeVariables;
+
+  List<TypeVariableType> getFunctionTypeVariables(
+      covariant JsToElementMapBase elementMap) {
+    if (_typeVariables == null) {
+      if (functionNode.typeParameters.isEmpty) {
+        _typeVariables = const <TypeVariableType>[];
+      } else {
+        ir.TreeNode parent = functionNode.parent;
+        if (parent is ir.Constructor ||
+            (parent is ir.Procedure &&
+                parent.kind == ir.ProcedureKind.Factory)) {
+          _typeVariables = const <TypeVariableType>[];
+        } else {
+          _typeVariables = functionNode.typeParameters
+              .map<TypeVariableType>((ir.TypeParameter typeParameter) {
+            return elementMap
+                .getDartType(new ir.TypeParameterType(typeParameter));
+          }).toList();
+        }
+      }
+    }
+    return _typeVariables;
+  }
+}
+
+class FunctionDataImpl extends JMemberDataImpl
+    with FunctionDataMixin
+    implements FunctionData {
+  final ir.FunctionNode functionNode;
+  FunctionType _type;
+
+  FunctionDataImpl(
+      ir.Member node, this.functionNode, MemberDefinition definition)
+      : super(node, definition);
+
+  FunctionType getFunctionType(covariant JsToElementMapBase elementMap) {
+    return _type ??= elementMap.getFunctionType(functionNode);
+  }
+
+  void forEachParameter(JsToElementMap elementMap,
+      void f(DartType type, String name, ConstantValue defaultValue)) {
+    void handleParameter(ir.VariableDeclaration node, {bool isOptional: true}) {
+      DartType type = elementMap.getDartType(node.type);
+      String name = node.name;
+      ConstantValue defaultValue;
+      if (isOptional) {
+        if (node.initializer != null) {
+          defaultValue = elementMap.getConstantValue(node.initializer);
+        } else {
+          defaultValue = new NullConstantValue();
+        }
+      }
+      f(type, name, defaultValue);
+    }
+
+    for (int i = 0; i < functionNode.positionalParameters.length; i++) {
+      handleParameter(functionNode.positionalParameters[i],
+          isOptional: i >= functionNode.requiredParameterCount);
+    }
+    functionNode.namedParameters.toList()
+      ..sort(namedOrdering)
+      ..forEach(handleParameter);
+  }
+
+  @override
+  ClassTypeVariableAccess get classTypeVariableAccess {
+    if (node.isInstanceMember) return ClassTypeVariableAccess.property;
+    return ClassTypeVariableAccess.none;
+  }
+}
+
+class SignatureFunctionData implements FunctionData {
+  final FunctionType functionType;
+  final MemberDefinition definition;
+  final InterfaceType memberThisType;
+  final ClassTypeVariableAccess classTypeVariableAccess;
+  final List<ir.TypeParameter> typeParameters;
+
+  SignatureFunctionData(this.definition, this.memberThisType, this.functionType,
+      this.typeParameters, this.classTypeVariableAccess);
+
+  FunctionType getFunctionType(covariant JsToElementMapBase elementMap) {
+    return functionType;
+  }
+
+  List<TypeVariableType> getFunctionTypeVariables(IrToElementMap elementMap) {
+    return typeParameters
+        .map<TypeVariableType>((ir.TypeParameter typeParameter) {
+      return elementMap.getDartType(new ir.TypeParameterType(typeParameter));
+    }).toList();
+  }
+
+  void forEachParameter(JsToElementMap elementMap,
+      void f(DartType type, String name, ConstantValue defaultValue)) {
+    throw new UnimplementedError('SignatureData.forEachParameter');
+  }
+
+  InterfaceType getMemberThisType(JsToElementMap elementMap) {
+    return memberThisType;
+  }
+}
+
+abstract class DelegatedFunctionData implements FunctionData {
+  final FunctionData baseData;
+
+  DelegatedFunctionData(this.baseData);
+
+  FunctionType getFunctionType(covariant JsToElementMapBase elementMap) {
+    return baseData.getFunctionType(elementMap);
+  }
+
+  List<TypeVariableType> getFunctionTypeVariables(IrToElementMap elementMap) {
+    return baseData.getFunctionTypeVariables(elementMap);
+  }
+
+  void forEachParameter(JsToElementMap elementMap,
+      void f(DartType type, String name, ConstantValue defaultValue)) {
+    return baseData.forEachParameter(elementMap, f);
+  }
+
+  InterfaceType getMemberThisType(JsToElementMap elementMap) {
+    return baseData.getMemberThisType(elementMap);
+  }
+
+  ClassTypeVariableAccess get classTypeVariableAccess =>
+      baseData.classTypeVariableAccess;
+}
+
+class GeneratorBodyFunctionData extends DelegatedFunctionData {
+  final MemberDefinition definition;
+  GeneratorBodyFunctionData(FunctionData baseData, this.definition)
+      : super(baseData);
+}
+
+abstract class JConstructorData extends FunctionData {
+  ConstantConstructor getConstructorConstant(
+      JsToElementMapBase elementMap, ConstructorEntity constructor);
+}
+
+class JConstructorDataImpl extends FunctionDataImpl
+    implements JConstructorData {
+  ConstantConstructor _constantConstructor;
+  ConstructorBodyEntity constructorBody;
+
+  JConstructorDataImpl(
+      ir.Member node, ir.FunctionNode functionNode, MemberDefinition definition)
+      : super(node, functionNode, definition);
+
+  ConstantConstructor getConstructorConstant(
+      JsToElementMapBase elementMap, ConstructorEntity constructor) {
+    if (_constantConstructor == null) {
+      if (node is ir.Constructor && constructor.isConst) {
+        _constantConstructor =
+            new Constantifier(elementMap).computeConstantConstructor(node);
+      } else {
+        failedAt(
+            constructor,
+            "Unexpected constructor $constructor in "
+            "ConstructorDataImpl._getConstructorConstant");
+      }
+    }
+    return _constantConstructor;
+  }
+
+  @override
+  ClassTypeVariableAccess get classTypeVariableAccess =>
+      ClassTypeVariableAccess.parameter;
+}
+
+class ConstructorBodyDataImpl extends FunctionDataImpl {
+  ConstructorBodyDataImpl(
+      ir.Member node, ir.FunctionNode functionNode, MemberDefinition definition)
+      : super(node, functionNode, definition);
+
+  // TODO(johnniwinther,sra): Constructor bodies should access type variables
+  // through `this`.
+  @override
+  ClassTypeVariableAccess get classTypeVariableAccess =>
+      ClassTypeVariableAccess.parameter;
+}
+
+abstract class JFieldData extends JMemberData {
+  DartType getFieldType(IrToElementMap elementMap);
+
+  ConstantExpression getFieldConstantExpression(JsToElementMapBase elementMap);
+
+  /// Return the [ConstantValue] the initial value of [field] or `null` if
+  /// the initializer is not a constant expression.
+  ConstantValue getFieldConstantValue(JsToElementMapBase elementMap);
+
+  bool hasConstantFieldInitializer(JsToElementMapBase elementMap);
+
+  ConstantValue getConstantFieldInitializer(JsToElementMapBase elementMap);
+}
+
+class JFieldDataImpl extends JMemberDataImpl implements JFieldData {
+  DartType _type;
+  bool _isConstantComputed = false;
+  ConstantValue _constantValue;
+  ConstantExpression _constantExpression;
+
+  JFieldDataImpl(ir.Field node, MemberDefinition definition)
+      : super(node, definition);
+
+  ir.Field get node => super.node;
+
+  DartType getFieldType(covariant JsToElementMapBase elementMap) {
+    return _type ??= elementMap.getDartType(node.type);
+  }
+
+  ConstantExpression getFieldConstantExpression(JsToElementMapBase elementMap) {
+    if (_constantExpression == null) {
+      if (node.isConst) {
+        _constantExpression =
+            new Constantifier(elementMap).visit(node.initializer);
+      } else {
+        failedAt(
+            definition.member,
+            "Unexpected field ${definition.member} in "
+            "FieldDataImpl.getFieldConstant");
+      }
+    }
+    return _constantExpression;
+  }
+
+  @override
+  ConstantValue getFieldConstantValue(JsToElementMapBase elementMap) {
+    if (!_isConstantComputed) {
+      _constantValue = elementMap.getConstantValue(node.initializer,
+          requireConstant: node.isConst, implicitNull: !node.isConst);
+      _isConstantComputed = true;
+    }
+    return _constantValue;
+  }
+
+  @override
+  bool hasConstantFieldInitializer(JsToElementMapBase elementMap) {
+    return getFieldConstantValue(elementMap) != null;
+  }
+
+  @override
+  ConstantValue getConstantFieldInitializer(JsToElementMapBase elementMap) {
+    ConstantValue value = getFieldConstantValue(elementMap);
+    assert(
+        value != null,
+        failedAt(
+            definition.member,
+            "Field ${definition.member} doesn't have a "
+            "constant initial value."));
+    return value;
+  }
+
+  @override
+  ClassTypeVariableAccess get classTypeVariableAccess {
+    if (node.isInstanceMember) return ClassTypeVariableAccess.instanceField;
+    return ClassTypeVariableAccess.none;
+  }
+}
+
+class JTypedefData {
+  final TypedefEntity element;
+  final TypedefType rawType;
+
+  JTypedefData(this.element, this.rawType);
+}
+
+class JTypeVariableData {
+  final ir.TypeParameter node;
+  DartType _bound;
+  DartType _defaultType;
+
+  JTypeVariableData(this.node);
+
+  DartType getBound(IrToElementMap elementMap) {
+    return _bound ??= elementMap.getDartType(node.bound);
+  }
+
+  DartType getDefaultType(IrToElementMap elementMap) {
+    return _defaultType ??= elementMap.getDartType(node.defaultType);
+  }
+}
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 3bcbcd7..0f32e6b 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -37,8 +37,6 @@
 import '../js_backend/native_data.dart';
 import '../js_backend/no_such_method_registry.dart';
 import '../js_backend/runtime_types.dart';
-import '../kernel/element_map.dart';
-import '../kernel/element_map_impl.dart';
 import '../kernel/kernel_strategy.dart';
 import '../kernel/kelements.dart';
 import '../native/behavior.dart';
diff --git a/pkg/compiler/lib/src/js_model/locals.dart b/pkg/compiler/lib/src/js_model/locals.dart
index a949a55..2d29821 100644
--- a/pkg/compiler/lib/src/js_model/locals.dart
+++ b/pkg/compiler/lib/src/js_model/locals.dart
@@ -12,7 +12,6 @@
 import '../elements/indexed.dart';
 import '../elements/jumps.dart';
 import '../elements/types.dart';
-import '../kernel/element_map.dart';
 import '../ir/util.dart';
 
 import 'element_map.dart';
diff --git a/pkg/compiler/lib/src/kernel/deferred_load.dart b/pkg/compiler/lib/src/kernel/deferred_load.dart
index db947c7..4310396 100644
--- a/pkg/compiler/lib/src/kernel/deferred_load.dart
+++ b/pkg/compiler/lib/src/kernel/deferred_load.dart
@@ -38,12 +38,7 @@
   @override
   Iterable<ImportEntity> classImportsTo(
       ClassEntity element, LibraryEntity library) {
-    ClassDefinition definition = _elementMap.getClassDefinition(element);
-    if (definition.kind != ClassKind.regular) {
-      // You can't import closures.
-      return const <ImportEntity>[];
-    }
-    ir.Class node = definition.node;
+    ir.Class node = _elementMap.getClassNode(element);
     return _findImportsTo(node, node.name, node.enclosingLibrary, library);
   }
 
@@ -57,7 +52,7 @@
   @override
   Iterable<ImportEntity> memberImportsTo(
       Entity element, LibraryEntity library) {
-    ir.Member node = _elementMap.getMemberDefinition(element).node;
+    ir.Member node = _elementMap.getMemberNode(element);
     return _findImportsTo(node, node.name.name, node.enclosingLibrary, library);
   }
 
@@ -75,7 +70,7 @@
 
   @override
   void collectConstantsInBody(MemberEntity element, Dependencies dependencies) {
-    ir.Member node = _elementMap.getMemberDefinition(element).node;
+    ir.Member node = _elementMap.getMemberNode(element);
 
     // Fetch the internal node in order to skip annotations on the member.
     // TODO(sigmund): replace this pattern when the kernel-ast provides a better
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 5d2fb0c..5edfd7d 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -5,13 +5,11 @@
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 
-import '../common.dart';
 import '../constants/values.dart';
 import '../common_elements.dart' show KCommonElements, KElementEnvironment;
 import '../elements/entities.dart';
 import '../elements/names.dart';
 import '../elements/types.dart';
-import '../ir/util.dart';
 import '../js/js.dart' as js;
 import '../js_backend/namer.dart';
 import '../js_backend/native_data.dart';
@@ -78,12 +76,7 @@
 
   /// Returns the super [MemberEntity] for a super invocation, get or set of
   /// [name] from the member [context].
-  ///
-  /// The IR doesn't always resolve super accesses to the corresponding
-  /// [target]. If not, the target is computed using [name] and [setter] from
-  /// the enclosing class of [context].
-  MemberEntity getSuperMember(
-      MemberEntity context, ir.Name name, ir.Member target,
+  MemberEntity getSuperMember(MemberEntity context, ir.Name name,
       {bool setter: false});
 
   /// Returns the `noSuchMethod` [FunctionEntity] call from a
@@ -118,8 +111,8 @@
   /// Return the [ImportEntity] corresponding to [node].
   ImportEntity getImport(ir.LibraryDependency node);
 
-  /// Returns the definition information for [cls].
-  ClassDefinition getClassDefinition(covariant ClassEntity cls);
+  /// Returns the defining node for [cls].
+  ir.Class getClassNode(covariant ClassEntity cls);
 
   /// Returns the static type of [node].
   // TODO(johnniwinther): This should be provided directly from kernel.
@@ -182,123 +175,13 @@
   /// Returns the node that defines [typedef].
   ir.Typedef getTypedefNode(covariant TypedefEntity typedef);
 
-  /// Returns the definition information for [member].
-  MemberDefinition getMemberDefinition(covariant MemberEntity member);
+  /// Returns the defining node for [member].
+  ir.Member getMemberNode(covariant MemberEntity member);
 
   /// Returns the element type of a async/sync*/async* function.
   DartType getFunctionAsyncOrSyncStarElementType(ir.FunctionNode functionNode);
 }
 
-// TODO(johnniwinther,efortuna): Add more when needed.
-// TODO(johnniwinther): Should we split regular into method, field, etc.?
-enum MemberKind {
-  // A regular member defined by an [ir.Node].
-  regular,
-  // A constructor whose initializer is defined by an [ir.Constructor] node.
-  constructor,
-  // A constructor whose body is defined by an [ir.Constructor] node.
-  constructorBody,
-  // A closure class `call` method whose body is defined by an
-  // [ir.FunctionExpression] or [ir.FunctionDeclaration].
-  closureCall,
-  // A field corresponding to a captured variable in the closure. It does not
-  // have a corresponding ir.Node.
-  closureField,
-  // A method that describes the type of a function (in this case the type of
-  // the closure class. It does not have a corresponding ir.Node or a method
-  // body.
-  signature,
-  // A separated body of a generator (sync*/async/async*) function.
-  generatorBody,
-}
-
-/// Definition information for a [MemberEntity].
-abstract class MemberDefinition {
-  /// The defined member.
-  MemberEntity get member;
-
-  /// The kind of the defined member. This determines the semantics of [node].
-  MemberKind get kind;
-
-  /// The defining [ir.Node] for this member, if supported by its [kind].
-  ///
-  /// For a regular class this is the [ir.Class] node. For closure classes this
-  /// might be an [ir.FunctionExpression] node if needed.
-  ir.Node get node;
-
-  /// The canonical location of [member]. This is used for sorting the members
-  /// in the emitted code.
-  SourceSpan get location;
-}
-
-enum ClassKind {
-  regular,
-  closure,
-  // TODO(efortuna, johnniwinther): Record is not a class, but is
-  // masquerading as one currently for consistency with the old element model.
-  record,
-}
-
-/// A member directly defined by its [ir.Member] node.
-class RegularMemberDefinition implements MemberDefinition {
-  final MemberEntity member;
-  final ir.Member node;
-
-  RegularMemberDefinition(this.member, this.node);
-
-  SourceSpan get location => computeSourceSpanFromTreeNode(node);
-
-  MemberKind get kind => MemberKind.regular;
-
-  String toString() => 'RegularMemberDefinition(kind:$kind,member:$member,'
-      'node:$node,location:$location)';
-}
-
-/// The definition of a special kind of member
-class SpecialMemberDefinition implements MemberDefinition {
-  final MemberEntity member;
-  final ir.TreeNode node;
-  final MemberKind kind;
-
-  SpecialMemberDefinition(this.member, this.node, this.kind);
-
-  SourceSpan get location => computeSourceSpanFromTreeNode(node);
-
-  String toString() => 'SpecialMemberDefinition(kind:$kind,member:$member,'
-      'node:$node,location:$location)';
-}
-
-/// Definition information for a [ClassEntity].
-abstract class ClassDefinition {
-  /// The defined class.
-  ClassEntity get cls;
-
-  /// The kind of the defined class. This determines the semantics of [node].
-  ClassKind get kind;
-
-  /// The defining [ir.Node] for this class, if supported by its [kind].
-  ir.Node get node;
-
-  /// The canonical location of [cls]. This is used for sorting the classes
-  /// in the emitted code.
-  SourceSpan get location;
-}
-
-/// A class directly defined by its [ir.Class] node.
-class RegularClassDefinition implements ClassDefinition {
-  final ClassEntity cls;
-  final ir.Class node;
-
-  RegularClassDefinition(this.cls, this.node);
-
-  SourceSpan get location => computeSourceSpanFromTreeNode(node);
-
-  ClassKind get kind => ClassKind.regular;
-
-  String toString() => 'RegularClassDefinition(kind:$kind,cls:$cls,'
-      'node:$node,location:$location)';
-}
-
 /// Kinds of foreign functions.
 enum ForeignKind {
   JS,
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 5fd5bfb..aeee682 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -4,7 +4,7 @@
 
 library dart2js.kernel.element_map;
 
-import 'package:front_end/src/fasta/util/link.dart' show Link, LinkBuilder;
+import 'package:front_end/src/api_unstable/dart2js.dart' show Link, LinkBuilder;
 import 'package:js_runtime/shared/embedded_names.dart';
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
@@ -45,13 +45,11 @@
 import '../js_backend/no_such_method_registry.dart';
 import '../js_backend/runtime_types.dart';
 import '../js_model/closure.dart';
-import '../js_model/elements.dart';
 import '../js_model/locals.dart';
 import '../native/native.dart' as native;
 import '../native/resolver.dart';
 import '../options.dart';
 import '../ordered_typeset.dart';
-import '../ssa/kernel_impact.dart';
 import '../universe/call_structure.dart';
 import '../universe/class_hierarchy.dart';
 import '../universe/class_set.dart';
@@ -62,6 +60,7 @@
 import 'element_map.dart';
 import 'env.dart';
 import 'kelements.dart';
+import 'kernel_impact.dart';
 
 part 'native_basic_data.dart';
 part 'no_such_method_resolver.dart';
@@ -77,18 +76,18 @@
   ir.TypeEnvironment _typeEnvironment;
 
   /// Library environment. Used for fast lookup.
-  ProgramEnv env = new ProgramEnv();
+  KProgramEnv env = new KProgramEnv();
 
-  final EntityDataEnvMap<IndexedLibrary, LibraryData, LibraryEnv> libraries =
-      new EntityDataEnvMap<IndexedLibrary, LibraryData, LibraryEnv>();
-  final EntityDataEnvMap<IndexedClass, ClassData, ClassEnv> classes =
-      new EntityDataEnvMap<IndexedClass, ClassData, ClassEnv>();
-  final EntityDataMap<IndexedMember, MemberData> members =
-      new EntityDataMap<IndexedMember, MemberData>();
-  final EntityDataMap<IndexedTypeVariable, TypeVariableData> typeVariables =
-      new EntityDataMap<IndexedTypeVariable, TypeVariableData>();
-  final EntityDataMap<IndexedTypedef, TypedefData> typedefs =
-      new EntityDataMap<IndexedTypedef, TypedefData>();
+  final EntityDataEnvMap<IndexedLibrary, KLibraryData, KLibraryEnv> libraries =
+      new EntityDataEnvMap<IndexedLibrary, KLibraryData, KLibraryEnv>();
+  final EntityDataEnvMap<IndexedClass, KClassData, KClassEnv> classes =
+      new EntityDataEnvMap<IndexedClass, KClassData, KClassEnv>();
+  final EntityDataMap<IndexedMember, KMemberData> members =
+      new EntityDataMap<IndexedMember, KMemberData>();
+  final EntityDataMap<IndexedTypeVariable, KTypeVariableData> typeVariables =
+      new EntityDataMap<IndexedTypeVariable, KTypeVariableData>();
+  final EntityDataMap<IndexedTypedef, KTypedefData> typedefs =
+      new EntityDataMap<IndexedTypedef, KTypedefData>();
 
   KernelToElementMapBase(this.options, this.reporter, Environment environment) {
     _elementEnvironment = new KernelElementEnvironment(this);
@@ -126,18 +125,18 @@
     SourceSpan fromSpannable(Spannable spannable) {
       if (spannable is IndexedLibrary &&
           spannable.libraryIndex < libraries.length) {
-        LibraryEnv env = libraries.getEnv(spannable);
+        KLibraryEnv env = libraries.getEnv(spannable);
         return computeSourceSpanFromTreeNode(env.library);
       } else if (spannable is IndexedClass &&
           spannable.classIndex < classes.length) {
-        ClassData data = classes.getData(spannable);
+        KClassData data = classes.getData(spannable);
         assert(data != null, "No data for $spannable in $this");
-        return data.definition.location;
+        return computeSourceSpanFromTreeNode(data.node);
       } else if (spannable is IndexedMember &&
           spannable.memberIndex < members.length) {
-        MemberData data = members.getData(spannable);
+        KMemberData data = members.getData(spannable);
         assert(data != null, "No data for $spannable in $this");
-        return data.definition.location;
+        return computeSourceSpanFromTreeNode(data.node);
       } else if (spannable is KLocalFunction) {
         return getSourceSpan(spannable.memberContext, currentElement);
       } else if (spannable is JLocal) {
@@ -152,21 +151,21 @@
   }
 
   LibraryEntity lookupLibrary(Uri uri) {
-    LibraryEnv libraryEnv = env.lookupLibrary(uri);
+    KLibraryEnv libraryEnv = env.lookupLibrary(uri);
     if (libraryEnv == null) return null;
     return getLibraryInternal(libraryEnv.library, libraryEnv);
   }
 
   String _getLibraryName(IndexedLibrary library) {
     assert(checkFamily(library));
-    LibraryEnv libraryEnv = libraries.getEnv(library);
+    KLibraryEnv libraryEnv = libraries.getEnv(library);
     return libraryEnv.library.name ?? '';
   }
 
   MemberEntity lookupLibraryMember(IndexedLibrary library, String name,
       {bool setter: false}) {
     assert(checkFamily(library));
-    LibraryEnv libraryEnv = libraries.getEnv(library);
+    KLibraryEnv libraryEnv = libraries.getEnv(library);
     ir.Member member = libraryEnv.lookupMember(name, setter: setter);
     return member != null ? getMember(member) : null;
   }
@@ -174,7 +173,7 @@
   void _forEachLibraryMember(
       IndexedLibrary library, void f(MemberEntity member)) {
     assert(checkFamily(library));
-    LibraryEnv libraryEnv = libraries.getEnv(library);
+    KLibraryEnv libraryEnv = libraries.getEnv(library);
     libraryEnv.forEachMember((ir.Member node) {
       f(getMember(node));
     });
@@ -182,8 +181,8 @@
 
   ClassEntity lookupClass(IndexedLibrary library, String name) {
     assert(checkFamily(library));
-    LibraryEnv libraryEnv = libraries.getEnv(library);
-    ClassEnv classEnv = libraryEnv.lookupClass(name);
+    KLibraryEnv libraryEnv = libraries.getEnv(library);
+    KClassEnv classEnv = libraryEnv.lookupClass(name);
     if (classEnv != null) {
       return getClassInternal(classEnv.cls, classEnv);
     }
@@ -192,8 +191,8 @@
 
   void _forEachClass(IndexedLibrary library, void f(ClassEntity cls)) {
     assert(checkFamily(library));
-    LibraryEnv libraryEnv = libraries.getEnv(library);
-    libraryEnv.forEachClass((ClassEnv classEnv) {
+    KLibraryEnv libraryEnv = libraries.getEnv(library);
+    libraryEnv.forEachClass((KClassEnv classEnv) {
       if (!classEnv.isUnnamedMixinApplication) {
         f(getClassInternal(classEnv.cls, classEnv));
       }
@@ -207,13 +206,13 @@
   MemberEntity lookupClassMember(IndexedClass cls, String name,
       {bool setter: false}) {
     assert(checkFamily(cls));
-    ClassEnv classEnv = classes.getEnv(cls);
+    KClassEnv classEnv = classes.getEnv(cls);
     return classEnv.lookupMember(this, name, setter: setter);
   }
 
   ConstructorEntity lookupConstructor(IndexedClass cls, String name) {
     assert(checkFamily(cls));
-    ClassEnv classEnv = classes.getEnv(cls);
+    KClassEnv classEnv = classes.getEnv(cls);
     return classEnv.lookupConstructor(this, name);
   }
 
@@ -225,24 +224,24 @@
 
   LibraryEntity getLibrary(ir.Library node) => getLibraryInternal(node);
 
-  LibraryEntity getLibraryInternal(ir.Library node, [LibraryEnv libraryEnv]);
+  LibraryEntity getLibraryInternal(ir.Library node, [KLibraryEnv libraryEnv]);
 
   @override
   ClassEntity getClass(ir.Class node) => getClassInternal(node);
 
-  ClassEntity getClassInternal(ir.Class node, [ClassEnv classEnv]);
+  ClassEntity getClassInternal(ir.Class node, [KClassEnv classEnv]);
 
   InterfaceType getSuperType(IndexedClass cls) {
     assert(checkFamily(cls));
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     _ensureSupertypes(cls, data);
     return data.supertype;
   }
 
-  void _ensureThisAndRawType(ClassEntity cls, ClassData data) {
+  void _ensureThisAndRawType(ClassEntity cls, KClassData data) {
     assert(checkFamily(cls));
-    if (data is ClassDataImpl && data.thisType == null) {
-      ir.Class node = data.cls;
+    if (data is KClassDataImpl && data.thisType == null) {
+      ir.Class node = data.node;
       if (node.typeParameters.isEmpty) {
         data.thisType =
             data.rawType = new InterfaceType(cls, const <DartType>[]);
@@ -267,12 +266,12 @@
 
   TypeVariableEntity getTypeVariableInternal(ir.TypeParameter node);
 
-  void _ensureSupertypes(ClassEntity cls, ClassData data) {
+  void _ensureSupertypes(ClassEntity cls, KClassData data) {
     assert(checkFamily(cls));
-    if (data is ClassDataImpl && data.orderedTypeSet == null) {
+    if (data is KClassDataImpl && data.orderedTypeSet == null) {
       _ensureThisAndRawType(cls, data);
 
-      ir.Class node = data.cls;
+      ir.Class node = data.node;
 
       if (node.supertype == null) {
         data.orderedTypeSet = new OrderedTypeSet.singleton(data.thisType);
@@ -282,7 +281,7 @@
         InterfaceType processSupertype(ir.Supertype node) {
           InterfaceType supertype = _typeConverter.visitSupertype(node);
           IndexedClass superclass = supertype.element;
-          ClassData superdata = classes.getData(superclass);
+          KClassData superdata = classes.getData(superclass);
           _ensureSupertypes(superclass, superdata);
           return supertype;
         }
@@ -297,31 +296,17 @@
           //
           // is encoded by CFE as
           //
-          //   abstract class M extends A with B, C {}
+          //   abstract class M extends A implements B, C {}
+          //   abstract class M extends A&B&C {}
           //
           // but we encode it as
           //
           //   abstract class M extends Object implements A, B, C {}
           //
-          // so we need to collect the non-Object superclasses and add them
-          // to the interfaces of M.
-
-          ir.Class superclass = node.superclass;
-          while (superclass != null) {
-            if (superclass.isAnonymousMixin) {
-              // Add second to last mixed in superclasses. `B` and `C` in the
-              // example above.
-              ir.DartType mixinType = typeEnvironment.hierarchy
-                  .getTypeAsInstanceOf(node.thisType, superclass.mixedInClass);
-              linkBuilder.addLast(getDartType(mixinType));
-            } else {
-              // Add first mixed in superclass. `A` in the example above.
-              ir.DartType mixinType = typeEnvironment.hierarchy
-                  .getTypeAsInstanceOf(node.thisType, superclass);
-              linkBuilder.addLast(getDartType(mixinType));
-              break;
-            }
-            superclass = superclass.superclass;
+          // so we need get the superclasses from the on-clause, A, B, and C,
+          // through [superclassConstraints].
+          for (ir.Supertype constraint in node.superclassConstraints()) {
+            linkBuilder.addLast(processSupertype(constraint));
           }
           // Set superclass to `Object`.
           supertype = _commonElements.objectType;
@@ -380,12 +365,10 @@
     throw new UnsupportedError("Unexpected member: $node");
   }
 
-  MemberEntity getSuperMember(
-      MemberEntity context, ir.Name name, ir.Member target,
+  MemberEntity getSuperMember(MemberEntity context, ir.Name name,
       {bool setter: false}) {
-    if (target != null && !target.isAbstract && target.isInstanceMember) {
-      return getMember(target);
-    }
+    // We can no longer trust the interface target of the super access since it
+    // might be a member that we have cloned.
     ClassEntity cls = context.enclosingClass;
     assert(
         cls != null,
@@ -393,7 +376,7 @@
             "No enclosing class for super member access in $context."));
     IndexedClass superclass = getSuperType(cls)?.element;
     while (superclass != null) {
-      ClassEnv env = classes.getEnv(superclass);
+      KClassEnv env = classes.getEnv(superclass);
       MemberEntity superMember =
           env.lookupMember(this, name.name, setter: setter);
       if (superMember != null) {
@@ -423,7 +406,7 @@
     if (superClass == targetClass) {
       return target;
     }
-    ClassEnv env = classes.getEnv(superClass);
+    KClassEnv env = classes.getEnv(superClass);
     ConstructorEntity constructor = env.lookupConstructor(this, target.name);
     if (constructor != null) {
       return constructor;
@@ -545,7 +528,7 @@
   DartType getCallType(InterfaceType type) {
     IndexedClass cls = type.element;
     assert(checkFamily(cls));
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     if (data.callType != null) {
       return substByContext(data.callType, type);
     }
@@ -554,78 +537,71 @@
 
   InterfaceType getThisType(IndexedClass cls) {
     assert(checkFamily(cls));
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     _ensureThisAndRawType(cls, data);
     return data.thisType;
   }
 
   InterfaceType _getRawType(IndexedClass cls) {
     assert(checkFamily(cls));
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     _ensureThisAndRawType(cls, data);
     return data.rawType;
   }
 
+  DartType _getFieldType(IndexedField field) {
+    assert(checkFamily(field));
+    KFieldData data = members.getData(field);
+    return data.getFieldType(this);
+  }
+
   FunctionType _getFunctionType(IndexedFunction function) {
     assert(checkFamily(function));
-    FunctionData data = members.getData(function);
+    KFunctionData data = members.getData(function);
     return data.getFunctionType(this);
   }
 
   List<TypeVariableType> _getFunctionTypeVariables(IndexedFunction function) {
     assert(checkFamily(function));
-    FunctionData data = members.getData(function);
+    KFunctionData data = members.getData(function);
     return data.getFunctionTypeVariables(this);
   }
 
-  DartType _getFieldType(IndexedField field) {
-    assert(checkFamily(field));
-    FieldData data = members.getData(field);
-    return data.getFieldType(this);
-  }
-
   DartType getTypeVariableBound(IndexedTypeVariable typeVariable) {
     assert(checkFamily(typeVariable));
-    TypeVariableData data = typeVariables.getData(typeVariable);
+    KTypeVariableData data = typeVariables.getData(typeVariable);
     return data.getBound(this);
   }
 
   DartType _getTypeVariableDefaultType(IndexedTypeVariable typeVariable) {
     assert(checkFamily(typeVariable));
-    TypeVariableData data = typeVariables.getData(typeVariable);
+    KTypeVariableData data = typeVariables.getData(typeVariable);
     return data.getDefaultType(this);
   }
 
   ClassEntity getAppliedMixin(IndexedClass cls) {
     assert(checkFamily(cls));
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     _ensureSupertypes(cls, data);
     return data.mixedInType?.element;
   }
 
   bool _isMixinApplication(IndexedClass cls) {
     assert(checkFamily(cls));
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     _ensureSupertypes(cls, data);
     return data.isMixinApplication;
   }
 
   bool _isUnnamedMixinApplication(IndexedClass cls) {
     assert(checkFamily(cls));
-    ClassEnv env = classes.getEnv(cls);
+    KClassEnv env = classes.getEnv(cls);
     return env.isUnnamedMixinApplication;
   }
 
-  bool _isSuperMixinApplication(IndexedClass cls) {
-    assert(checkFamily(cls));
-    ClassEnv env = classes.getEnv(cls);
-    env.ensureMembers(this);
-    return env.isSuperMixinApplication;
-  }
-
   void _forEachSupertype(IndexedClass cls, void f(InterfaceType supertype)) {
     assert(checkFamily(cls));
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     _ensureSupertypes(cls, data);
     data.orderedTypeSet.supertypes.forEach(f);
   }
@@ -633,7 +609,7 @@
   void _forEachMixin(IndexedClass cls, void f(ClassEntity mixin)) {
     assert(checkFamily(cls));
     while (cls != null) {
-      ClassData data = classes.getData(cls);
+      KClassData data = classes.getData(cls);
       _ensureSupertypes(cls, data);
       if (data.mixedInType != null) {
         f(data.mixedInType.element);
@@ -644,7 +620,7 @@
 
   void _forEachConstructor(IndexedClass cls, void f(ConstructorEntity member)) {
     assert(checkFamily(cls));
-    ClassEnv env = classes.getEnv(cls);
+    KClassEnv env = classes.getEnv(cls);
     env.forEachConstructor(this, f);
   }
 
@@ -659,7 +635,7 @@
 
   void _forEachLocalClassMember(IndexedClass cls, void f(MemberEntity member)) {
     assert(checkFamily(cls));
-    ClassEnv env = classes.getEnv(cls);
+    KClassEnv env = classes.getEnv(cls);
     env.forEachMember(this, (MemberEntity member) {
       f(member);
     });
@@ -675,11 +651,11 @@
   void _forEachClassMember(
       IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) {
     assert(checkFamily(cls));
-    ClassEnv env = classes.getEnv(cls);
+    KClassEnv env = classes.getEnv(cls);
     env.forEachMember(this, (MemberEntity member) {
       f(cls, member);
     });
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     _ensureSupertypes(cls, data);
     if (data.supertype != null) {
       _forEachClassMember(data.supertype.element, f);
@@ -688,13 +664,13 @@
 
   ConstantConstructor _getConstructorConstant(IndexedConstructor constructor) {
     assert(checkFamily(constructor));
-    ConstructorData data = members.getData(constructor);
+    KConstructorData data = members.getData(constructor);
     return data.getConstructorConstant(this, constructor);
   }
 
   ConstantExpression _getFieldConstantExpression(IndexedField field) {
     assert(checkFamily(field));
-    FieldData data = members.getData(field);
+    KFieldData data = members.getData(field);
     return data.getFieldConstantExpression(this);
   }
 
@@ -711,33 +687,33 @@
 
   OrderedTypeSet getOrderedTypeSet(IndexedClass cls) {
     assert(checkFamily(cls));
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     _ensureSupertypes(cls, data);
     return data.orderedTypeSet;
   }
 
   int getHierarchyDepth(IndexedClass cls) {
     assert(checkFamily(cls));
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     _ensureSupertypes(cls, data);
     return data.orderedTypeSet.maxDepth;
   }
 
   Iterable<InterfaceType> getInterfaces(IndexedClass cls) {
     assert(checkFamily(cls));
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     _ensureSupertypes(cls, data);
     return data.interfaces;
   }
 
-  MemberDefinition getMemberDefinitionInternal(covariant IndexedMember member) {
+  ir.Member getMemberNode(covariant IndexedMember member) {
     assert(checkFamily(member));
-    return members.getData(member).definition;
+    return members.getData(member).node;
   }
 
-  ClassDefinition getClassDefinitionInternal(covariant IndexedClass cls) {
+  ir.Class getClassNode(covariant IndexedClass cls) {
     assert(checkFamily(cls));
-    return classes.getData(cls).definition;
+    return classes.getData(cls).node;
   }
 
   ir.Typedef _getTypedefNode(covariant IndexedTypedef typedef) {
@@ -746,7 +722,7 @@
 
   ImportEntity getImport(ir.LibraryDependency node) {
     ir.Library library = node.parent;
-    LibraryData data = libraries.getData(getLibraryInternal(library));
+    KLibraryData data = libraries.getData(getLibraryInternal(library));
     return data.imports[node];
   }
 
@@ -1117,12 +1093,12 @@
   /// Set to `true` before creating the J-World from the K-World to assert that
   /// no entities are created late.
   bool envIsClosed = false;
-  ProgramEnv get env;
-  EntityDataEnvMap<IndexedLibrary, LibraryData, LibraryEnv> get libraries;
-  EntityDataEnvMap<IndexedClass, ClassData, ClassEnv> get classes;
-  EntityDataMap<IndexedMember, MemberData> get members;
-  EntityDataMap<IndexedTypeVariable, TypeVariableData> get typeVariables;
-  EntityDataMap<IndexedTypedef, TypedefData> get typedefs;
+  KProgramEnv get env;
+  EntityDataEnvMap<IndexedLibrary, KLibraryData, KLibraryEnv> get libraries;
+  EntityDataEnvMap<IndexedClass, KClassData, KClassEnv> get classes;
+  EntityDataMap<IndexedMember, KMemberData> get members;
+  EntityDataMap<IndexedTypeVariable, KTypeVariableData> get typeVariables;
+  EntityDataMap<IndexedTypedef, KTypedefData> get typedefs;
 
   final Map<ir.Library, IndexedLibrary> libraryMap = {};
   final Map<ir.Class, IndexedClass> classMap = {};
@@ -1149,18 +1125,18 @@
   Iterable<LibraryEntity> get libraryListInternal {
     if (env.length != libraryMap.length) {
       // Create a [KLibrary] for each library.
-      env.forEachLibrary((LibraryEnv env) {
+      env.forEachLibrary((KLibraryEnv env) {
         getLibraryInternal(env.library, env);
       });
     }
     return libraryMap.values;
   }
 
-  LibraryEntity getLibraryInternal(ir.Library node, [LibraryEnv libraryEnv]) {
+  LibraryEntity getLibraryInternal(ir.Library node, [KLibraryEnv libraryEnv]) {
     return libraryMap[node] ??= _getLibraryCreate(node, libraryEnv);
   }
 
-  LibraryEntity _getLibraryCreate(ir.Library node, LibraryEnv libraryEnv) {
+  LibraryEntity _getLibraryCreate(ir.Library node, KLibraryEnv libraryEnv) {
     assert(
         !envIsClosed,
         "Environment of $this is closed. Trying to create "
@@ -1173,15 +1149,15 @@
       name = path.substring(path.lastIndexOf('/') + 1);
     }
     IndexedLibrary library = createLibrary(name, canonicalUri);
-    return libraries.register(library, new LibraryData(node),
+    return libraries.register(library, new KLibraryData(node),
         libraryEnv ?? env.lookupLibrary(canonicalUri));
   }
 
-  ClassEntity getClassInternal(ir.Class node, [ClassEnv classEnv]) {
+  ClassEntity getClassInternal(ir.Class node, [KClassEnv classEnv]) {
     return classMap[node] ??= _getClassCreate(node, classEnv);
   }
 
-  ClassEntity _getClassCreate(ir.Class node, ClassEnv classEnv) {
+  ClassEntity _getClassCreate(ir.Class node, KClassEnv classEnv) {
     assert(
         !envIsClosed,
         "Environment of $this is closed. Trying to create "
@@ -1192,10 +1168,7 @@
     }
     IndexedClass cls =
         createClass(library, node.name, isAbstract: node.isAbstract);
-    return classes.register(
-        cls,
-        new ClassDataImpl(node, new RegularClassDefinition(cls, node)),
-        classEnv);
+    return classes.register(cls, new KClassDataImpl(node), classEnv);
   }
 
   TypedefEntity getTypedefInternal(ir.Typedef node) {
@@ -1215,7 +1188,7 @@
             node.typeParameters.length, const DynamicType()),
         getDartType(node.type));
     return typedefs.register(
-        typedef, new TypedefData(node, typedef, typedefType));
+        typedef, new KTypedefData(node, typedef, typedefType));
   }
 
   TypeVariableEntity getTypeVariableInternal(ir.TypeParameter node) {
@@ -1232,7 +1205,7 @@
       int index = cls.typeParameters.indexOf(node);
       return typeVariables.register(
           createTypeVariable(getClassInternal(cls), node.name, index),
-          new TypeVariableData(node));
+          new KTypeVariableData(node));
     }
     if (node.parent is ir.FunctionNode) {
       ir.FunctionNode func = node.parent;
@@ -1250,7 +1223,7 @@
           return typeVariables.register(
               createTypeVariable(
                   getMethodInternal(procedure), node.name, index),
-              new TypeVariableData(node));
+              new KTypeVariableData(node));
         }
       } else {
         throw new UnsupportedError('Unsupported function type parameter parent '
@@ -1269,7 +1242,6 @@
         !envIsClosed,
         "Environment of $this is closed. Trying to create "
         "constructor for $node.");
-    MemberDefinition definition;
     ir.FunctionNode functionNode;
     ClassEntity enclosingClass = getClassInternal(node.enclosingClass);
     Name name = getName(node.name);
@@ -1281,8 +1253,6 @@
       constructor = createGenerativeConstructor(enclosingClass, name,
           getParameterStructure(functionNode, includeTypeParameters: false),
           isExternal: isExternal, isConst: node.isConst);
-      definition = new SpecialMemberDefinition(
-          constructor, node, MemberKind.constructor);
     } else if (node is ir.Procedure) {
       functionNode = node.function;
       bool isFromEnvironment = isExternal &&
@@ -1293,14 +1263,13 @@
           isExternal: isExternal,
           isConst: node.isConst,
           isFromEnvironmentConstructor: isFromEnvironment);
-      definition = new RegularMemberDefinition(constructor, node);
     } else {
       // TODO(johnniwinther): Convert `node.location` to a [SourceSpan].
       throw failedAt(
           NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}.");
     }
-    return members.register<IndexedConstructor, ConstructorData>(
-        constructor, new ConstructorDataImpl(node, functionNode, definition));
+    return members.register<IndexedConstructor, KConstructorData>(
+        constructor, new KConstructorDataImpl(node, functionNode));
   }
 
   FunctionEntity getMethodInternal(ir.Procedure node) {
@@ -1348,10 +1317,8 @@
             isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
         break;
     }
-    members.register<IndexedFunction, FunctionData>(
-        function,
-        new FunctionDataImpl(
-            node, node.function, new RegularMemberDefinition(function, node)));
+    members.register<IndexedFunction, KFunctionData>(
+        function, new KFunctionDataImpl(node, node.function));
     // We need to register the function before creating the type variables.
     methodMap[node] = function;
     for (ir.TypeParameter typeParameter in node.function.typeParameters) {
@@ -1383,8 +1350,8 @@
         isStatic: isStatic,
         isAssignable: node.isMutable,
         isConst: node.isConst);
-    return members.register<IndexedField, FieldData>(field,
-        new FieldDataImpl(node, new RegularMemberDefinition(field, node)));
+    return members.register<IndexedField, KFieldData>(
+        field, new KFieldDataImpl(node));
   }
 
   IndexedLibrary createLibrary(String name, Uri canonicalUri);
@@ -1483,17 +1450,17 @@
 
   ResolutionImpact computeWorldImpact(KMember member) {
     return buildKernelImpact(
-        members.getData(member).definition.node, this, reporter, options);
+        members.getData(member).node, this, reporter, options);
   }
 
   ScopeModel computeScopeModel(KMember member) {
-    ir.Member node = members.getData(member).definition.node;
+    ir.Member node = members.getData(member).node;
     return KernelClosureAnalysis.computeScopeModel(member, node);
   }
 
   /// Returns the kernel [ir.Procedure] node for the [method].
   ir.Procedure _lookupProcedure(KFunction method) {
-    return members.getData(method).definition.node;
+    return members.getData(method).node;
   }
 
   @override
@@ -1562,7 +1529,7 @@
 
   bool _implementsFunction(IndexedClass cls) {
     assert(checkFamily(cls));
-    ClassData data = classes.getData(cls);
+    KClassData data = classes.getData(cls);
     OrderedTypeSet orderedTypeSet = data.orderedTypeSet;
     InterfaceType supertype = orderedTypeSet.asInstanceOf(
         commonElements.functionClass,
@@ -1574,16 +1541,6 @@
   }
 
   @override
-  MemberDefinition getMemberDefinition(MemberEntity member) {
-    return getMemberDefinitionInternal(member);
-  }
-
-  @override
-  ClassDefinition getClassDefinition(ClassEntity cls) {
-    return getClassDefinitionInternal(cls);
-  }
-
-  @override
   ir.Typedef getTypedefNode(TypedefEntity typedef) {
     return _getTypedefNode(typedef);
   }
@@ -1763,7 +1720,7 @@
 }
 
 class KernelElementEnvironment extends ElementEnvironment
-    implements KElementEnvironment, JElementEnvironment {
+    implements KElementEnvironment {
   final KernelToElementMapBase elementMap;
 
   KernelElementEnvironment(this.elementMap);
@@ -1811,30 +1768,11 @@
   }
 
   @override
-  bool isSuperMixinApplication(ClassEntity cls) {
-    return elementMap._isSuperMixinApplication(cls);
-  }
-
-  @override
-  ClassEntity getEffectiveMixinClass(ClassEntity cls) {
-    if (!isMixinApplication(cls)) return null;
-    do {
-      cls = elementMap.getAppliedMixin(cls);
-    } while (isMixinApplication(cls));
-    return cls;
-  }
-
-  @override
   DartType getTypeVariableBound(TypeVariableEntity typeVariable) {
     return elementMap.getTypeVariableBound(typeVariable);
   }
 
   @override
-  DartType getTypeVariableDefaultType(TypeVariableEntity typeVariable) {
-    return elementMap._getTypeVariableDefaultType(typeVariable);
-  }
-
-  @override
   InterfaceType createInterfaceType(
       ClassEntity cls, List<DartType> typeArguments) {
     return new InterfaceType(cls, typeArguments);
@@ -1963,12 +1901,6 @@
   }
 
   @override
-  void forEachInjectedClassMember(
-      ClassEntity cls, void f(MemberEntity member)) {
-    elementMap.forEachInjectedClassMember(cls, f);
-  }
-
-  @override
   void forEachClassMember(
       ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) {
     elementMap._forEachClassMember(cls, f);
@@ -1981,18 +1913,6 @@
   }
 
   @override
-  void forEachConstructorBody(
-      ClassEntity cls, void f(ConstructorBodyEntity constructor)) {
-    elementMap.forEachConstructorBody(cls, f);
-  }
-
-  @override
-  void forEachNestedClosure(
-      MemberEntity member, void f(FunctionEntity closure)) {
-    elementMap.forEachNestedClosure(member, f);
-  }
-
-  @override
   void forEachLibraryMember(
       LibraryEntity library, void f(MemberEntity member)) {
     elementMap._forEachLibraryMember(library, f);
@@ -2045,21 +1965,21 @@
   @override
   Iterable<ConstantValue> getLibraryMetadata(covariant IndexedLibrary library) {
     assert(elementMap.checkFamily(library));
-    LibraryData libraryData = elementMap.libraries.getData(library);
+    KLibraryData libraryData = elementMap.libraries.getData(library);
     return libraryData.getMetadata(elementMap);
   }
 
   @override
   Iterable<ImportEntity> getImports(covariant IndexedLibrary library) {
     assert(elementMap.checkFamily(library));
-    LibraryData libraryData = elementMap.libraries.getData(library);
+    KLibraryData libraryData = elementMap.libraries.getData(library);
     return libraryData.getImports(elementMap);
   }
 
   @override
   Iterable<ConstantValue> getClassMetadata(covariant IndexedClass cls) {
     assert(elementMap.checkFamily(cls));
-    ClassData classData = elementMap.classes.getData(cls);
+    KClassData classData = elementMap.classes.getData(cls);
     return classData.getMetadata(elementMap);
   }
 
@@ -2068,14 +1988,14 @@
       {bool includeParameterMetadata: false}) {
     // TODO(redemption): Support includeParameterMetadata.
     assert(elementMap.checkFamily(member));
-    MemberData memberData = elementMap.members.getData(member);
+    KMemberData memberData = elementMap.members.getData(member);
     return memberData.getMetadata(elementMap);
   }
 
   @override
   bool isEnumClass(ClassEntity cls) {
     assert(elementMap.checkFamily(cls));
-    ClassData classData = elementMap.classes.getData(cls);
+    KClassData classData = elementMap.classes.getData(cls);
     return classData.isEnumClass;
   }
 }
@@ -2237,7 +2157,7 @@
 }
 
 class KernelNativeMemberResolver extends NativeMemberResolverBase {
-  final KernelToElementMapImpl elementMap;
+  final KernelToElementMap elementMap;
   final NativeBasicData nativeBasicData;
   final NativeDataBuilder nativeDataBuilder;
 
@@ -2253,14 +2173,14 @@
   @override
   native.NativeBehavior computeNativeFieldStoreBehavior(
       covariant KField field) {
-    ir.Field node = elementMap.members.getData(field).definition.node;
+    ir.Field node = elementMap.getMemberNode(field);
     return elementMap.getNativeBehaviorForFieldStore(node);
   }
 
   @override
   native.NativeBehavior computeNativeFieldLoadBehavior(covariant KField field,
       {bool isJsInterop}) {
-    ir.Field node = elementMap.members.getData(field).definition.node;
+    ir.Field node = elementMap.getMemberNode(field);
     return elementMap.getNativeBehaviorForFieldLoad(node,
         isJsInterop: isJsInterop);
   }
@@ -2269,7 +2189,7 @@
   native.NativeBehavior computeNativeMethodBehavior(
       covariant KFunction function,
       {bool isJsInterop}) {
-    ir.Member node = elementMap.members.getData(function).definition.node;
+    ir.Member node = elementMap.getMemberNode(function);
     return elementMap.getNativeBehaviorForMethod(node,
         isJsInterop: isJsInterop);
   }
@@ -2277,7 +2197,7 @@
   @override
   bool isNativeMethod(covariant KFunction function) {
     if (!native.maybeEnableNative(function.library.canonicalUri)) return false;
-    ir.Member node = elementMap.members.getData(function).definition.node;
+    ir.Member node = elementMap.getMemberNode(function);
     return node.annotations.any((ir.Expression expression) {
       return expression is ir.ConstructorInvocation &&
           elementMap.getInterfaceType(expression.constructedType) ==
@@ -2291,39 +2211,6 @@
   }
 }
 
-class JsToFrontendMapImpl extends JsToFrontendMapBase
-    implements JsToFrontendMap {
-  final KernelToElementMapBase _backend;
-
-  JsToFrontendMapImpl(this._backend);
-
-  LibraryEntity toBackendLibrary(covariant IndexedLibrary library) {
-    return _backend.libraries.getEntity(library.libraryIndex);
-  }
-
-  ClassEntity toBackendClass(covariant IndexedClass cls) {
-    return _backend.classes.getEntity(cls.classIndex);
-  }
-
-  MemberEntity toBackendMember(covariant IndexedMember member) {
-    return _backend.members.getEntity(member.memberIndex);
-  }
-
-  TypedefEntity toBackendTypedef(covariant IndexedTypedef typedef) {
-    return _backend.typedefs.getEntity(typedef.typedefIndex);
-  }
-
-  TypeVariableEntity toBackendTypeVariable(TypeVariableEntity typeVariable) {
-    if (typeVariable is KLocalTypeVariable) {
-      failedAt(
-          typeVariable, "Local function type variables are not supported.");
-    }
-    IndexedTypeVariable indexedTypeVariable = typeVariable;
-    return _backend.typeVariables
-        .getEntity(indexedTypeVariable.typeVariableIndex);
-  }
-}
-
 class KernelClassQueries extends ClassQueries {
   final KernelToElementMapImpl elementMap;
 
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 3e895e4..382bea2 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -4,7 +4,9 @@
 
 library dart2js.kernel.env;
 
-import 'package:front_end/src/fasta/kernel/redirecting_factory_body.dart' as ir;
+import 'package:front_end/src/api_unstable/dart2js.dart' as ir
+    show RedirectingFactoryBody;
+
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/clone.dart';
 import 'package:kernel/type_algebra.dart';
@@ -20,17 +22,17 @@
 import '../ir/visitors.dart';
 import '../ir/util.dart';
 import '../js_model/element_map.dart';
+import '../js_model/env.dart';
 import '../ordered_typeset.dart';
 import '../ssa/type_builder.dart';
-import 'element_map.dart';
 import 'element_map_impl.dart';
 import 'kelements.dart' show KImport;
 
 /// Environment for fast lookup of component libraries.
-class ProgramEnv {
+class KProgramEnv {
   final Set<ir.Component> _components = new Set<ir.Component>();
 
-  Map<Uri, LibraryEnv> _libraryMap;
+  Map<Uri, KLibraryEnv> _libraryMap;
 
   /// TODO(johnniwinther): Handle arbitrary load order if needed.
   ir.Member get mainMethod => _components.first?.mainMethod;
@@ -47,27 +49,27 @@
 
   void _addLibraries(ir.Component component) {
     for (ir.Library library in component.libraries) {
-      _libraryMap[library.importUri] = new LibraryEnv(library);
+      _libraryMap[library.importUri] = new KLibraryEnv(library);
     }
   }
 
   void _ensureLibraryMap() {
     if (_libraryMap == null) {
-      _libraryMap = <Uri, LibraryEnv>{};
+      _libraryMap = <Uri, KLibraryEnv>{};
       for (ir.Component component in _components) {
         _addLibraries(component);
       }
     }
   }
 
-  /// Return the [LibraryEnv] for the library with the canonical [uri].
-  LibraryEnv lookupLibrary(Uri uri) {
+  /// Return the [KLibraryEnv] for the library with the canonical [uri].
+  KLibraryEnv lookupLibrary(Uri uri) {
     _ensureLibraryMap();
     return _libraryMap[uri];
   }
 
   /// Calls [f] for each library in this environment.
-  void forEachLibrary(void f(LibraryEnv library)) {
+  void forEachLibrary(void f(KLibraryEnv library)) {
     _ensureLibraryMap();
     _libraryMap.values.forEach(f);
   }
@@ -77,38 +79,38 @@
     _ensureLibraryMap();
     return _libraryMap.length;
   }
+
+  /// Convert this [KProgramEnv] to the corresponding [JProgramEnv].
+  JProgramEnv convert() => new JProgramEnv(_components);
 }
 
 /// Environment for fast lookup of library classes and members.
-class LibraryEnv {
+class KLibraryEnv {
   final ir.Library library;
 
-  Map<String, ClassEnv> _classMap;
+  Map<String, KClassEnv> _classMap;
   Map<String, ir.Member> _memberMap;
   Map<String, ir.Member> _setterMap;
 
-  LibraryEnv(this.library);
-
-  LibraryEnv.internal(
-      this.library, this._classMap, this._memberMap, this._setterMap);
+  KLibraryEnv(this.library);
 
   void _ensureClassMap() {
     if (_classMap == null) {
-      _classMap = <String, ClassEnv>{};
+      _classMap = <String, KClassEnv>{};
       for (ir.Class cls in library.classes) {
-        _classMap[cls.name] = new ClassEnvImpl(cls);
+        _classMap[cls.name] = new KClassEnvImpl(cls);
       }
     }
   }
 
-  /// Return the [ClassEnv] for the class [name] in [library].
-  ClassEnv lookupClass(String name) {
+  /// Return the [KClassEnv] for the class [name] in [library].
+  KClassEnv lookupClass(String name) {
     _ensureClassMap();
     return _classMap[name];
   }
 
   /// Calls [f] for each class in this library.
-  void forEachClass(void f(ClassEnv cls)) {
+  void forEachClass(void f(KClassEnv cls)) {
     _ensureClassMap();
     _classMap.values.forEach(f);
   }
@@ -159,20 +161,12 @@
     }
   }
 
-  /// Creates a new [LibraryEnv] containing only the members in [liveMembers].
-  ///
-  /// Currently all classes are copied.
-  // TODO(johnniwinther): Filter unused classes.
-  LibraryEnv copyLive(
+  /// Convert this [KLibraryEnv] to a corresponding [JLibraryEnv] containing
+  /// only the members in [liveMembers].
+  JLibraryEnv convert(
       IrToElementMap elementMap, Iterable<MemberEntity> liveMembers) {
-    Map<String, ClassEnv> classMap;
     Map<String, ir.Member> memberMap;
     Map<String, ir.Member> setterMap;
-    if (_classMap == null) {
-      classMap = const <String, ClassEnv>{};
-    } else {
-      classMap = _classMap;
-    }
     if (_memberMap == null) {
       memberMap = const <String, ir.Member>{};
     } else {
@@ -195,16 +189,17 @@
         }
       });
     }
-    return new LibraryEnv.internal(library, classMap, memberMap, setterMap);
+    return new JLibraryEnv(library, memberMap, setterMap);
   }
 }
 
-class LibraryData {
+class KLibraryData {
   final ir.Library library;
   Iterable<ConstantValue> _metadata;
+  // TODO(johnniwinther): Avoid direct access to [imports].
   Map<ir.LibraryDependency, ImportEntity> imports;
 
-  LibraryData(this.library, [this.imports]);
+  KLibraryData(this.library);
 
   Iterable<ConstantValue> getMetadata(KernelToElementMapBase elementMap) {
     return _metadata ??= elementMap.getMetadata(library.annotations);
@@ -230,13 +225,15 @@
     return imports.values;
   }
 
-  LibraryData copy() {
-    return new LibraryData(library, imports);
+  /// Convert this [KLibraryData] to the corresponding [JLibraryData].
+  // TODO(johnniwinther): Why isn't [imports] ensured to be non-null here?
+  JLibraryData convert() {
+    return new JLibraryData(library, imports);
   }
 }
 
 /// Member data for a class.
-abstract class ClassEnv {
+abstract class KClassEnv {
   /// The [ir.Class] that defined the class, if any.
   ir.Class get cls;
 
@@ -270,8 +267,9 @@
   /// class.
   void forEachConstructorBody(void f(ConstructorBodyEntity constructor));
 
-  /// Creates a new [ClassEnv] containing only the members in [liveMembers].
-  ClassEnv copyLive(
+  /// Convert this [KClassEnv] to the corresponding [JClassEnv] containing only
+  /// the members in [liveMembers].
+  JClassEnv convert(
       IrToElementMap elementMap, Iterable<MemberEntity> liveMembers);
 }
 
@@ -286,7 +284,7 @@
 }
 
 /// Environment for fast lookup of class members.
-class ClassEnvImpl implements ClassEnv {
+class KClassEnvImpl implements KClassEnv {
   final ir.Class cls;
 
   Map<String, ir.Member> _constructorMap;
@@ -298,9 +296,9 @@
   /// Constructor bodies created for this class.
   List<ConstructorBodyEntity> _constructorBodyList;
 
-  ClassEnvImpl(this.cls);
+  KClassEnvImpl(this.cls);
 
-  ClassEnvImpl.internal(this.cls, this._constructorMap, this._memberMap,
+  KClassEnvImpl.internal(this.cls, this._constructorMap, this._memberMap,
       this._setterMap, this._members, this._isSuperMixinApplication);
 
   bool get isUnnamedMixinApplication => cls.isAnonymousMixin;
@@ -444,7 +442,8 @@
       for (ir.Field field in cls.mixedInClass.mixin.fields) {
         if (field.containsSuperCalls) {
           _isSuperMixinApplication = true;
-          cloneVisitor ??= new SuperCloner(getSubstitutionMap(cls.mixedInType));
+          cloneVisitor ??= new CloneVisitor(
+              typeSubstitution: getSubstitutionMap(cls.mixedInType));
           cls.addMember(cloneVisitor.clone(field));
           continue;
         }
@@ -453,7 +452,8 @@
       for (ir.Procedure procedure in cls.mixedInClass.mixin.procedures) {
         if (procedure.containsSuperCalls) {
           _isSuperMixinApplication = true;
-          cloneVisitor ??= new SuperCloner(getSubstitutionMap(cls.mixedInType));
+          cloneVisitor ??= new CloneVisitor(
+              typeSubstitution: getSubstitutionMap(cls.mixedInType));
           cls.addMember(cloneVisitor.clone(procedure));
           continue;
         }
@@ -545,7 +545,7 @@
     _constructorBodyList?.forEach(f);
   }
 
-  ClassEnv copyLive(
+  JClassEnv convert(
       IrToElementMap elementMap, Iterable<MemberEntity> liveMembers) {
     Map<String, ir.Member> constructorMap;
     Map<String, ir.Member> memberMap;
@@ -595,87 +595,13 @@
         }
       });
     }
-    return new ClassEnvImpl.internal(cls, constructorMap, memberMap, setterMap,
-        members, _isSuperMixinApplication);
+    return new JClassEnvImpl(cls, constructorMap, memberMap, setterMap, members,
+        _isSuperMixinApplication);
   }
 }
 
-class ClosureClassEnv extends RecordEnv {
-  ClosureClassEnv(Map<String, MemberEntity> memberMap) : super(memberMap);
-
-  @override
-  MemberEntity lookupMember(IrToElementMap elementMap, String name,
-      {bool setter: false}) {
-    if (setter) {
-      // All closure fields are final.
-      return null;
-    }
-    return super.lookupMember(elementMap, name, setter: setter);
-  }
-
-  @override
-  ClassEnv copyLive(
-          IrToElementMap elementMap, Iterable<MemberEntity> liveMembers) =>
-      this;
-}
-
-class RecordEnv implements ClassEnv {
-  final Map<String, MemberEntity> _memberMap;
-
-  RecordEnv(this._memberMap);
-
-  @override
-  List<ir.Member> ensureMembers(KernelToElementMapBase elementMap) {
-    // All members have been computed at creation.
-    return const <ir.Member>[];
-  }
-
-  @override
-  void forEachConstructorBody(void f(ConstructorBodyEntity constructor)) {
-    // We do not create constructor bodies for containers.
-  }
-
-  @override
-  void forEachConstructor(
-      IrToElementMap elementMap, void f(ConstructorEntity constructor)) {
-    // We do not create constructors for containers.
-  }
-
-  @override
-  ConstructorEntity lookupConstructor(IrToElementMap elementMap, String name) {
-    // We do not create constructors for containers.
-    return null;
-  }
-
-  @override
-  void forEachMember(IrToElementMap elementMap, void f(MemberEntity member)) {
-    _memberMap.values.forEach(f);
-  }
-
-  @override
-  MemberEntity lookupMember(IrToElementMap elementMap, String name,
-      {bool setter: false}) {
-    return _memberMap[name];
-  }
-
-  @override
-  bool get isUnnamedMixinApplication => false;
-
-  @override
-  bool get isSuperMixinApplication => false;
-
-  @override
-  ir.Class get cls => null;
-
-  @override
-  ClassEnv copyLive(
-      IrToElementMap elementMap, Iterable<MemberEntity> liveMembers) {
-    return this;
-  }
-}
-
-abstract class ClassData {
-  ClassDefinition get definition;
+abstract class KClassData {
+  ir.Class get node;
 
   InterfaceType get thisType;
   InterfaceType get rawType;
@@ -690,12 +616,12 @@
 
   Iterable<ConstantValue> getMetadata(IrToElementMap elementMap);
 
-  ClassData copy();
+  /// Convert this [KClassData] to the corresponding [JClassData].
+  JClassData convert(ClassEntity cls);
 }
 
-class ClassDataImpl implements ClassData {
-  final ir.Class cls;
-  final ClassDefinition definition;
+class KClassDataImpl implements KClassData {
+  final ir.Class node;
   bool isMixinApplication;
   bool isCallTypeComputed = false;
 
@@ -708,42 +634,41 @@
 
   Iterable<ConstantValue> _metadata;
 
-  ClassDataImpl(this.cls, this.definition);
+  KClassDataImpl(this.node);
 
-  bool get isEnumClass => cls != null && cls.isEnum;
+  bool get isEnumClass => node.isEnum;
 
   DartType get callType => null;
 
   Iterable<ConstantValue> getMetadata(
       covariant KernelToElementMapBase elementMap) {
-    return _metadata ??= elementMap.getMetadata(cls.annotations);
+    return _metadata ??= elementMap.getMetadata(node.annotations);
   }
 
-  ClassData copy() {
-    return new ClassDataImpl(cls, definition);
+  JClassData convert(ClassEntity cls) {
+    return new JClassDataImpl(node, new RegularClassDefinition(cls, node));
   }
 }
 
-abstract class MemberData {
-  MemberDefinition get definition;
+abstract class KMemberData {
+  ir.Member get node;
 
   Iterable<ConstantValue> getMetadata(IrToElementMap elementMap);
 
   InterfaceType getMemberThisType(JsToElementMap elementMap);
 
   ClassTypeVariableAccess get classTypeVariableAccess;
+
+  /// Convert this [KMemberData] to the corresponding [JMemberData].
+  JMemberData convert(MemberEntity member);
 }
 
-abstract class MemberDataImpl implements MemberData {
-  /// TODO(johnniwinther): Remove this from the [MemberData] interface. Use
-  /// `definition.node` instead.
+abstract class KMemberDataImpl implements KMemberData {
   final ir.Member node;
 
-  final MemberDefinition definition;
-
   Iterable<ConstantValue> _metadata;
 
-  MemberDataImpl(this.node, this.definition);
+  KMemberDataImpl(this.node);
 
   Iterable<ConstantValue> getMetadata(
       covariant KernelToElementMapBase elementMap) {
@@ -758,11 +683,9 @@
     }
     return null;
   }
-
-  MemberData copy();
 }
 
-abstract class FunctionData implements MemberData {
+abstract class KFunctionData implements KMemberData {
   FunctionType getFunctionType(IrToElementMap elementMap);
 
   List<TypeVariableType> getFunctionTypeVariables(IrToElementMap elementMap);
@@ -771,7 +694,7 @@
       void f(DartType type, String name, ConstantValue defaultValue));
 }
 
-abstract class FunctionDataMixin implements FunctionData {
+abstract class KFunctionDataMixin implements KFunctionData {
   ir.FunctionNode get functionNode;
   List<TypeVariableType> _typeVariables;
 
@@ -799,15 +722,13 @@
   }
 }
 
-class FunctionDataImpl extends MemberDataImpl
-    with FunctionDataMixin
-    implements FunctionData {
+class KFunctionDataImpl extends KMemberDataImpl
+    with KFunctionDataMixin
+    implements KFunctionData {
   final ir.FunctionNode functionNode;
   FunctionType _type;
 
-  FunctionDataImpl(
-      ir.Member node, this.functionNode, MemberDefinition definition)
-      : super(node, definition);
+  KFunctionDataImpl(ir.Member node, this.functionNode) : super(node);
 
   FunctionType getFunctionType(covariant KernelToElementMapBase elementMap) {
     return _type ??= elementMap.getFunctionType(functionNode);
@@ -839,8 +760,9 @@
   }
 
   @override
-  FunctionData copy() {
-    return new FunctionDataImpl(node, functionNode, definition);
+  FunctionData convert(covariant FunctionEntity function) {
+    return new FunctionDataImpl(
+        node, functionNode, new RegularMemberDefinition(function, node));
   }
 
   @override
@@ -850,91 +772,18 @@
   }
 }
 
-class SignatureFunctionData implements FunctionData {
-  final FunctionType functionType;
-  final MemberDefinition definition;
-  final InterfaceType memberThisType;
-  final ClassTypeVariableAccess classTypeVariableAccess;
-  final List<ir.TypeParameter> typeParameters;
-
-  SignatureFunctionData(this.definition, this.memberThisType, this.functionType,
-      this.typeParameters, this.classTypeVariableAccess);
-
-  FunctionType getFunctionType(covariant KernelToElementMapBase elementMap) {
-    return functionType;
-  }
-
-  List<TypeVariableType> getFunctionTypeVariables(IrToElementMap elementMap) {
-    return typeParameters
-        .map<TypeVariableType>((ir.TypeParameter typeParameter) {
-      return elementMap.getDartType(new ir.TypeParameterType(typeParameter));
-    }).toList();
-  }
-
-  void forEachParameter(JsToElementMap elementMap,
-      void f(DartType type, String name, ConstantValue defaultValue)) {
-    throw new UnimplementedError('SignatureData.forEachParameter');
-  }
-
-  @override
-  Iterable<ConstantValue> getMetadata(IrToElementMap elementMap) {
-    return const <ConstantValue>[];
-  }
-
-  InterfaceType getMemberThisType(JsToElementMap elementMap) {
-    return memberThisType;
-  }
-}
-
-abstract class DelegatedFunctionData implements FunctionData {
-  final FunctionData baseData;
-
-  DelegatedFunctionData(this.baseData);
-
-  FunctionType getFunctionType(covariant KernelToElementMapBase elementMap) {
-    return baseData.getFunctionType(elementMap);
-  }
-
-  List<TypeVariableType> getFunctionTypeVariables(IrToElementMap elementMap) {
-    return baseData.getFunctionTypeVariables(elementMap);
-  }
-
-  void forEachParameter(JsToElementMap elementMap,
-      void f(DartType type, String name, ConstantValue defaultValue)) {
-    return baseData.forEachParameter(elementMap, f);
-  }
-
-  @override
-  Iterable<ConstantValue> getMetadata(IrToElementMap elementMap) {
-    return const <ConstantValue>[];
-  }
-
-  InterfaceType getMemberThisType(JsToElementMap elementMap) {
-    return baseData.getMemberThisType(elementMap);
-  }
-
-  ClassTypeVariableAccess get classTypeVariableAccess =>
-      baseData.classTypeVariableAccess;
-}
-
-class GeneratorBodyFunctionData extends DelegatedFunctionData {
-  final MemberDefinition definition;
-  GeneratorBodyFunctionData(FunctionData baseData, this.definition)
-      : super(baseData);
-}
-
-abstract class ConstructorData extends FunctionData {
+abstract class KConstructorData extends KFunctionData {
   ConstantConstructor getConstructorConstant(
       KernelToElementMapBase elementMap, ConstructorEntity constructor);
 }
 
-class ConstructorDataImpl extends FunctionDataImpl implements ConstructorData {
+class KConstructorDataImpl extends KFunctionDataImpl
+    implements KConstructorData {
   ConstantConstructor _constantConstructor;
   ConstructorBodyEntity constructorBody;
 
-  ConstructorDataImpl(
-      ir.Member node, ir.FunctionNode functionNode, MemberDefinition definition)
-      : super(node, functionNode, definition);
+  KConstructorDataImpl(ir.Member node, ir.FunctionNode functionNode)
+      : super(node, functionNode);
 
   ConstantConstructor getConstructorConstant(
       KernelToElementMapBase elementMap, ConstructorEntity constructor) {
@@ -953,8 +802,15 @@
   }
 
   @override
-  ConstructorData copy() {
-    return new ConstructorDataImpl(node, functionNode, definition);
+  JConstructorData convert(covariant ConstructorEntity constructor) {
+    MemberDefinition definition;
+    if (node is ir.Constructor) {
+      definition = new SpecialMemberDefinition(
+          constructor, node, MemberKind.constructor);
+    } else {
+      definition = new RegularMemberDefinition(constructor, node);
+    }
+    return new JConstructorDataImpl(node, functionNode, definition);
   }
 
   @override
@@ -962,19 +818,7 @@
       ClassTypeVariableAccess.parameter;
 }
 
-class ConstructorBodyDataImpl extends FunctionDataImpl {
-  ConstructorBodyDataImpl(
-      ir.Member node, ir.FunctionNode functionNode, MemberDefinition definition)
-      : super(node, functionNode, definition);
-
-  // TODO(johnniwinther,sra): Constructor bodies should access type variables
-  // through `this`.
-  @override
-  ClassTypeVariableAccess get classTypeVariableAccess =>
-      ClassTypeVariableAccess.parameter;
-}
-
-abstract class FieldData extends MemberData {
+abstract class KFieldData extends KMemberData {
   DartType getFieldType(IrToElementMap elementMap);
 
   ConstantExpression getFieldConstantExpression(
@@ -989,14 +833,13 @@
   ConstantValue getConstantFieldInitializer(KernelToElementMapBase elementMap);
 }
 
-class FieldDataImpl extends MemberDataImpl implements FieldData {
+class KFieldDataImpl extends KMemberDataImpl implements KFieldData {
   DartType _type;
   bool _isConstantComputed = false;
   ConstantValue _constantValue;
   ConstantExpression _constantExpression;
 
-  FieldDataImpl(ir.Field node, MemberDefinition definition)
-      : super(node, definition);
+  KFieldDataImpl(ir.Field node) : super(node);
 
   ir.Field get node => super.node;
 
@@ -1012,8 +855,8 @@
             new Constantifier(elementMap).visit(node.initializer);
       } else {
         failedAt(
-            definition.member,
-            "Unexpected field ${definition.member} in "
+            computeSourceSpanFromTreeNode(node),
+            "Unexpected field ${node} in "
             "FieldDataImpl.getFieldConstant");
       }
     }
@@ -1041,8 +884,8 @@
     assert(
         value != null,
         failedAt(
-            definition.member,
-            "Field ${definition.member} doesn't have a "
+            computeSourceSpanFromTreeNode(node),
+            "Field ${node} doesn't have a "
             "constant initial value."));
     return value;
   }
@@ -1054,25 +897,25 @@
   }
 
   @override
-  FieldData copy() {
-    return new FieldDataImpl(node, definition);
+  JFieldData convert(covariant FieldEntity field) {
+    return new JFieldDataImpl(node, new RegularMemberDefinition(field, node));
   }
 }
 
-class TypedefData {
+class KTypedefData {
   final ir.Typedef node;
   final TypedefEntity element;
   final TypedefType rawType;
 
-  TypedefData(this.node, this.element, this.rawType);
+  KTypedefData(this.node, this.element, this.rawType);
 }
 
-class TypeVariableData {
+class KTypeVariableData {
   final ir.TypeParameter node;
   DartType _bound;
   DartType _defaultType;
 
-  TypeVariableData(this.node);
+  KTypeVariableData(this.node);
 
   DartType getBound(IrToElementMap elementMap) {
     return _bound ??= elementMap.getDartType(node.bound);
@@ -1082,33 +925,7 @@
     return _defaultType ??= elementMap.getDartType(node.defaultType);
   }
 
-  TypeVariableData copy() {
-    return new TypeVariableData(node);
-  }
-}
-
-class SuperCloner extends CloneVisitor {
-  SuperCloner(Map<ir.TypeParameter, ir.DartType> typeSubstitution)
-      : super(typeSubstitution: typeSubstitution, cloneAnnotations: true);
-
-  @override
-  visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
-    // We ensure that we re-resolve the target by setting the interface target
-    // to `null`.
-    return new ir.SuperMethodInvocation(node.name, clone(node.arguments));
-  }
-
-  @override
-  visitSuperPropertyGet(ir.SuperPropertyGet node) {
-    // We ensure that we re-resolve the target by setting the interface target
-    // to `null`.
-    return new ir.SuperPropertyGet(node.name);
-  }
-
-  @override
-  visitSuperPropertySet(ir.SuperPropertySet node) {
-    // We ensure that we re-resolve the target by setting the interface target
-    // to `null`.
-    return new ir.SuperPropertySet(node.name, clone(node.value), null);
+  JTypeVariableData copy() {
+    return new JTypeVariableData(node);
   }
 }
diff --git a/pkg/compiler/lib/src/kernel/front_end_adapter.dart b/pkg/compiler/lib/src/kernel/front_end_adapter.dart
index 9d0b6a9..17b3b15c 100644
--- a/pkg/compiler/lib/src/kernel/front_end_adapter.dart
+++ b/pkg/compiler/lib/src/kernel/front_end_adapter.dart
@@ -8,7 +8,7 @@
 
 import 'dart:async';
 
-import 'package:front_end/src/api_prototype/front_end.dart' as fe;
+import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
 
 import '../../compiler_new.dart' as api;
 
@@ -22,8 +22,13 @@
   CompilerFileSystem(this.inputProvider);
 
   @override
-  fe.FileSystemEntity entityForUri(Uri uri) =>
-      new _CompilerFileSystemEntity(uri, this);
+  fe.FileSystemEntity entityForUri(Uri uri) {
+    if (uri.scheme == 'data') {
+      return new fe.DataFileSystemEntity(Uri.base.resolveUri(uri));
+    } else {
+      return new _CompilerFileSystemEntity(uri, this);
+    }
+  }
 }
 
 class _CompilerFileSystemEntity implements fe.FileSystemEntity {
@@ -77,26 +82,33 @@
 /// Report a [message] received from the front-end, using dart2js's
 /// [DiagnosticReporter].
 void reportFrontEndMessage(
-    DiagnosticReporter reporter, fe.CompilationMessage message) {
+    DiagnosticReporter reporter, fe.DiagnosticMessage message) {
   MessageKind kind = MessageKind.GENERIC;
   Spannable span;
-  if (message.span != null) {
-    span = new SourceSpan(message.span.start.sourceUrl,
-        message.span.start.offset, message.span.end.offset);
+  String text;
+  if (message is fe.FormattedMessage) {
+    if (message.uri != null && message.charOffset != -1) {
+      int offset = message.charOffset;
+      span = new SourceSpan(message.uri, offset, offset + message.length);
+    } else {
+      span = NO_LOCATION_SPANNABLE;
+    }
+    text = message.message;
   } else {
-    span = NO_LOCATION_SPANNABLE;
+    throw new UnimplementedError(
+        "Unhandled diagnostic message: ${message.runtimeType}");
   }
   switch (message.severity) {
     case fe.Severity.internalProblem:
-      throw message.message;
+      throw text;
     case fe.Severity.error:
-      reporter.reportErrorMessage(span, kind, {'text': message.message});
+      reporter.reportErrorMessage(span, kind, {'text': text});
       break;
     case fe.Severity.warning:
-      reporter.reportWarningMessage(span, kind, {'text': message.message});
+      reporter.reportWarningMessage(span, kind, {'text': text});
       break;
     case fe.Severity.context:
-      reporter.reportInfo(span, kind, {'text': message.message});
+      reporter.reportInfo(span, kind, {'text': text});
       break;
     default:
       throw new UnimplementedError('unhandled severity ${message.severity}');
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
similarity index 95%
rename from pkg/compiler/lib/src/ssa/kernel_impact.dart
rename to pkg/compiler/lib/src/kernel/kernel_impact.dart
index 3b4b976..fa881c1 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.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:front_end/src/fasta/operator.dart';
+import 'package:front_end/src/api_unstable/dart2js.dart'
+    show operatorFromString;
+
 import 'package:kernel/ast.dart' as ir;
 
 import '../common.dart';
@@ -16,8 +18,6 @@
 import '../ir/static_type.dart';
 import '../ir/util.dart';
 import '../js_backend/native_data.dart';
-import '../kernel/element_map.dart';
-import '../kernel/runtime_type_analysis.dart';
 import '../options.dart';
 import '../resolution/registry.dart' show ResolutionWorldImpactBuilder;
 import '../universe/call_structure.dart';
@@ -25,6 +25,8 @@
 import '../universe/selector.dart';
 import '../universe/use.dart';
 import '../universe/world_builder.dart';
+import 'element_map.dart';
+import 'runtime_type_analysis.dart';
 
 ResolutionImpact buildKernelImpact(
     ir.Member member,
@@ -470,13 +472,13 @@
     return super.visitStaticSet(node);
   }
 
-  void handleSuperInvocation(ir.Name name, ir.Node target, ir.Node arguments) {
+  void handleSuperInvocation(ir.Name name, ir.Node arguments) {
     FunctionEntity method =
-        elementMap.getSuperMember(currentMember, name, target, setter: false);
-    _visitArguments(arguments);
+        elementMap.getSuperMember(currentMember, name, setter: false);
+    List<DartType> typeArguments = _visitArguments(arguments);
     if (method != null) {
       impactBuilder.registerStaticUse(new StaticUse.superInvoke(
-          method, elementMap.getCallStructure(arguments)));
+          method, elementMap.getCallStructure(arguments), typeArguments));
     } else {
       impactBuilder.registerStaticUse(new StaticUse.superInvoke(
           elementMap.getSuperNoSuchMethod(currentMember.enclosingClass),
@@ -506,13 +508,13 @@
   ir.DartType visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
     // TODO(johnniwinther): Should we support this or always use the
     // [MixinFullResolution] transformer?
-    handleSuperInvocation(node.name, node.interfaceTarget, node.arguments);
+    handleSuperInvocation(node.name, node.arguments);
     return super.visitSuperMethodInvocation(node);
   }
 
   void handleSuperGet(ir.Name name, ir.Member target) {
     MemberEntity member =
-        elementMap.getSuperMember(currentMember, name, target, setter: false);
+        elementMap.getSuperMember(currentMember, name, setter: false);
     if (member != null) {
       if (member.isFunction) {
         impactBuilder.registerStaticUse(new StaticUse.superTearOff(member));
@@ -544,7 +546,7 @@
 
   void handleSuperSet(ir.Name name, ir.Node target, ir.Node value) {
     MemberEntity member =
-        elementMap.getSuperMember(currentMember, name, target, setter: true);
+        elementMap.getSuperMember(currentMember, name, setter: true);
     if (member != null) {
       if (member.isField) {
         impactBuilder.registerStaticUse(new StaticUse.superFieldSet(member));
@@ -584,6 +586,8 @@
       typeArguments = _visitArguments(node.arguments);
     }
     ir.DartType receiverType = visitNode(node.receiver);
+    ir.DartType returnType = computeMethodInvocationType(node, receiverType);
+    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
     var receiver = node.receiver;
     if (receiver is ir.VariableGet &&
         receiver.variable.isFinal &&
@@ -644,13 +648,16 @@
         }
       }
     }
-    return computeMethodInvocationType(node, receiverType);
+    return returnType;
   }
 
   @override
   ir.DartType visitPropertyGet(ir.PropertyGet node) {
     Object constraint;
     ir.DartType receiverType = visitNode(node.receiver);
+    ir.DartType resultType = computePropertyGetType(node, receiverType);
+    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
+
     DartType receiverDartType = elementMap.getDartType(receiverType);
     if (receiverDartType is InterfaceType) {
       constraint = new StrongModeConstraint(
@@ -684,16 +691,18 @@
       }
       impactBuilder.registerRuntimeTypeUse(runtimeTypeUse);
     }
-    return computePropertyGetType(node, receiverType);
+    return resultType;
   }
 
   @override
   ir.DartType visitPropertySet(ir.PropertySet node) {
     Object constraint;
-    DartType receiverType = elementMap.getDartType(visitNode(node.receiver));
-    if (receiverType is InterfaceType) {
+    ir.DartType receiverType = visitNode(node.receiver);
+    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
+    DartType receiverDartType = elementMap.getDartType(receiverType);
+    if (receiverDartType is InterfaceType) {
       constraint = new StrongModeConstraint(
-          commonElements, _nativeBasicData, receiverType.element);
+          commonElements, _nativeBasicData, receiverDartType.element);
     }
     impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
         new Selector.setter(elementMap.getName(node.name)),
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 9dbf70e..586171e 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -232,6 +232,9 @@
   /// This is an experimental feature.
   bool experimentalTrackAllocations = false;
 
+  /// Expermental optimization.
+  bool experimentLocalNames = false;
+
   /// The path to the file that contains the profiled allocations.
   ///
   /// The file must contain the Map that was produced by using
@@ -286,6 +289,7 @@
           _hasOption(options, Flags.experimentalTrackAllocations)
       ..experimentalAllocationsPath = _extractStringOption(
           options, "${Flags.experimentalAllocationsPath}=", null)
+      ..experimentLocalNames = _hasOption(options, Flags.experimentLocalNames)
       ..generateCodeWithCompileTimeErrors =
           _hasOption(options, Flags.generateCodeWithCompileTimeErrors)
       ..generateSourceMap = !_hasOption(options, Flags.noSourceMaps)
diff --git a/pkg/compiler/lib/src/ordered_typeset.dart b/pkg/compiler/lib/src/ordered_typeset.dart
index e8d365b..4b587b6 100644
--- a/pkg/compiler/lib/src/ordered_typeset.dart
+++ b/pkg/compiler/lib/src/ordered_typeset.dart
@@ -4,9 +4,8 @@
 
 library ordered_typeset;
 
-import 'package:front_end/src/fasta/util/link.dart' show Link, LinkBuilder;
-import 'package:front_end/src/fasta/util/link_implementation.dart'
-    show LinkEntry;
+import 'package:front_end/src/api_unstable/dart2js.dart'
+    show Link, LinkBuilder, LinkEntry;
 
 import 'common.dart';
 import 'diagnostics/diagnostic_listener.dart' show DiagnosticReporter;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 185ea5b..61ed394 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -33,7 +33,6 @@
 import '../js_model/elements.dart' show JGeneratorBody;
 import '../js_model/element_map.dart';
 import '../js_model/js_strategy.dart';
-import '../kernel/element_map.dart';
 import '../native/native.dart' as native;
 import '../types/abstract_value_domain.dart';
 import '../types/types.dart';
@@ -1396,7 +1395,7 @@
     // TODO(efortuna): Source information!
     push(new HInvokeStatic(
         commonElements.loadDeferredLibrary,
-        [graph.addConstantString(loadId, closedWorld)],
+        <HInstruction>[graph.addConstantString(loadId, closedWorld)],
         abstractValueDomain.nonNullType,
         const <DartType>[],
         targetCanThrow: false));
@@ -3021,9 +3020,8 @@
     node.value.accept(this);
     HInstruction value = pop();
 
-    MemberEntity member = _elementMap.getSuperMember(
-        _currentFrame.member, node.name, node.interfaceTarget,
-        setter: true);
+    MemberEntity member = _elementMap
+        .getSuperMember(_currentFrame.member, node.name, setter: true);
     if (member == null) {
       _generateSuperNoSuchMethod(node, _elementMap.getSelector(node).name + "=",
           <HInstruction>[value], const <DartType>[], sourceInformation);
@@ -3377,7 +3375,7 @@
       MemberEntity element = sourceElement is ConstructorBodyEntity
           ? (sourceElement as ConstructorBodyEntity).constructor
           : sourceElement;
-      ;
+
       return globalInferenceResults
               .resultOfMember(element)
               .typeOfNewList(node) ??
@@ -4546,8 +4544,8 @@
   void visitSuperPropertyGet(ir.SuperPropertyGet node) {
     SourceInformation sourceInformation =
         _sourceInformationBuilder.buildGet(node);
-    MemberEntity member = _elementMap.getSuperMember(
-        _currentFrame.member, node.name, node.interfaceTarget);
+    MemberEntity member =
+        _elementMap.getSuperMember(_currentFrame.member, node.name);
     if (member == null) {
       _generateSuperNoSuchMethod(node, _elementMap.getSelector(node).name,
           const <HInstruction>[], const <DartType>[], sourceInformation);
@@ -4566,8 +4564,8 @@
   void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
     SourceInformation sourceInformation =
         _sourceInformationBuilder.buildCall(node, node);
-    MemberEntity member = _elementMap.getSuperMember(
-        _currentFrame.member, node.name, node.interfaceTarget);
+    MemberEntity member =
+        _elementMap.getSuperMember(_currentFrame.member, node.name);
     if (member == null) {
       Selector selector = _elementMap.getSelector(node);
       List<DartType> typeArguments = <DartType>[];
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index c01289d..52cd6c9 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -5,7 +5,7 @@
 import 'dart:math' as math;
 import 'dart:collection' show Queue;
 
-import 'package:front_end/src/fasta/util/link.dart' show Link;
+import 'package:front_end/src/api_unstable/dart2js.dart' show Link;
 
 import '../common.dart';
 import '../common/names.dart';
@@ -184,6 +184,10 @@
    * copies to perform on block transitioning.
    */
   VariableNames variableNames;
+
+  /// `true` when we need to generate a `var` declaration at function entry,
+  /// `false` if we can generate a `var` declaration at first assignment in the
+  /// middle of the function.
   bool shouldGroupVarDeclarations = false;
 
   /**
@@ -370,6 +374,7 @@
         .visitGraph(graph);
     new SsaConditionMerger(generateAtUseSite, controlFlowOperators)
         .visitGraph(graph);
+    new SsaShareRegionConstants(_options).visitGraph(graph);
     SsaLiveIntervalBuilder intervalBuilder =
         new SsaLiveIntervalBuilder(generateAtUseSite, controlFlowOperators);
     intervalBuilder.visitGraph(graph);
@@ -384,6 +389,11 @@
   }
 
   void handleDelayedVariableDeclarations(SourceInformation sourceInformation) {
+    if (_options.experimentLocalNames) {
+      handleDelayedVariableDeclarations2(sourceInformation);
+      return;
+    }
+
     // If we have only one variable declaration and the first statement is an
     // assignment to that variable then we can merge the two.  We count the
     // number of variables in the variable allocator to try to avoid this issue,
@@ -422,11 +432,61 @@
       });
       var declarationList = new js.VariableDeclarationList(declarations)
           .withSourceInformation(sourceInformation);
-      ;
       insertStatementAtStart(new js.ExpressionStatement(declarationList));
     }
   }
 
+  void handleDelayedVariableDeclarations2(SourceInformation sourceInformation) {
+    // Create 'var' list at the start of function.  Move assignment statements
+    // from the top of the body into the variable initializers.
+    if (collectedVariableDeclarations.isEmpty) return;
+
+    List<js.VariableInitialization> declarations = [];
+    List<js.Statement> statements = currentContainer.statements;
+    int nextStatement = 0;
+
+    while (nextStatement < statements.length) {
+      if (collectedVariableDeclarations.isEmpty) break;
+      js.Statement statement = statements[nextStatement];
+      if (statement is js.ExpressionStatement) {
+        js.Expression expression = statement.expression;
+        if (expression is js.Assignment && !expression.isCompound) {
+          js.Expression left = expression.leftHandSide;
+          if (left is js.VariableReference) {
+            String name = left.name;
+            js.Expression value = expression.value;
+            if (_safeInInitializer(value) &&
+                collectedVariableDeclarations.remove(name)) {
+              var initialization = new js.VariableInitialization(
+                      new js.VariableDeclaration(name), value)
+                  .withSourceInformation(expression.sourceInformation);
+              declarations.add(initialization);
+              ++nextStatement;
+              continue;
+            }
+          }
+        }
+      }
+      break;
+    }
+
+    List<js.VariableInitialization> uninitialized = [];
+    for (String name in collectedVariableDeclarations) {
+      uninitialized.add(new js.VariableInitialization(
+          new js.VariableDeclaration(name), null));
+    }
+    var declarationList =
+        new js.VariableDeclarationList(uninitialized + declarations)
+            .withSourceInformation(sourceInformation);
+    statements.replaceRange(
+        0, nextStatement, [new js.ExpressionStatement(declarationList)]);
+  }
+
+  // An expression is safe to be pulled into a 'var' initializer if it does not
+  // contain assignments to locals. We don't generate assignments to locals
+  // inside expressions.
+  bool _safeInInitializer(js.Expression node) => true;
+
   visitGraph(HGraph graph) {
     preGenerateMethod(graph);
     currentGraph = graph;
@@ -1401,6 +1461,10 @@
         .withSourceInformation(sourceInformation));
   }
 
+  visitLateValue(HLateValue node) {
+    use(node.target);
+  }
+
   visitInvokeBinary(HInvokeBinary node, String op) {
     handleInvokeBinary(node, op, node.sourceInformation);
   }
diff --git a/pkg/compiler/lib/src/ssa/codegen_helpers.dart b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
index 6608085..1a9ab2f 100644
--- a/pkg/compiler/lib/src/ssa/codegen_helpers.dart
+++ b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
@@ -832,3 +832,188 @@
     }
   }
 }
+
+/// Insert 'caches' for whole-function region-constants when the local minified
+/// name would be shorter than repeated references.  These are caches for 'this'
+/// and constant values.
+class SsaShareRegionConstants extends HBaseVisitor {
+  final CompilerOptions _options;
+
+  SsaShareRegionConstants(this._options);
+
+  visitGraph(HGraph graph) {
+    if (!_options.experimentLocalNames) return;
+    // We need the async rewrite to be smarter about hoisting region constants
+    // before it is worth-while.
+    if (graph.needsAsyncRewrite) return;
+
+    // 'HThis' and constants are in the entry block. No need to walk the rest of
+    // the graph.
+    visitBasicBlock(graph.entry);
+  }
+
+  visitBasicBlock(HBasicBlock block) {
+    HInstruction instruction = block.first;
+    while (instruction != null) {
+      HInstruction next = instruction.next;
+      instruction.accept(this);
+      instruction = next;
+    }
+  }
+
+  // Not all occurences should be replaced with a local variable cache, so we
+  // filter the uses.
+  int _countCacheableUses(
+      HInstruction node, bool Function(HInstruction) cacheable) {
+    return node.usedBy.where(cacheable).length;
+  }
+
+  // Replace cacheable uses with a reference to a HLateValue node.
+  _cache(
+      HInstruction node, bool Function(HInstruction) cacheable, String name) {
+    var users = node.usedBy.toList();
+    var reference = new HLateValue(node);
+    // TODO(sra): The sourceInformation should really be from the function
+    // entry, not the use of `this`.
+    reference.sourceInformation = node.sourceInformation;
+    reference.sourceElement = _ExpressionName(name);
+    node.block.addAfter(node, reference);
+    for (HInstruction user in users) {
+      if (cacheable(user)) {
+        user.changeUse(node, reference);
+      }
+    }
+  }
+
+  void visitThis(HThis node) {
+    int size = 4;
+    // Compare the size of the unchanged minified with the size of the minified
+    // code where 'this' is assigned to a variable. We assume the variable has
+    // minified size 1.
+    //
+    // The size overhead of introducing a variable in the worst case includes
+    // 'var ':
+    //
+    //           1234   // size
+    //     var x=this;  // (minified ';' can be end-of-line)
+    //     123456    7  // additional overhead
+    //
+    // TODO(sra): If there are multiple values that can potentially be cached,
+    // they can share the 'var ' cost, even if none of them are beneficial
+    // individually.
+    int useCount = node.usedBy.length;
+    if (useCount * size <= 7 + size + useCount * 1) return;
+    _cache(node, (_) => true, '_this');
+  }
+
+  void visitConstant(HConstant node) {
+    if (node.usedBy.length <= 1) return;
+    ConstantValue constant = node.constant;
+
+    if (constant.isNull) {
+      _handleNull(node);
+      return;
+    }
+
+    if (constant.isInt) {
+      _handleInt(node, constant);
+      return;
+    }
+
+    if (constant.isString) {
+      _handleString(node, constant);
+      return;
+    }
+  }
+
+  void _handleNull(HConstant node) {
+    int size = 4;
+
+    bool _isCacheableUse(HInstruction instruction) {
+      // One-shot interceptors have `null` as a dummy interceptor.
+      if (instruction is HOneShotInterceptor) return false;
+
+      if (instruction is HInvoke) return true;
+      if (instruction is HCreate) return true;
+      if (instruction is HPhi) return true;
+
+      // We return `null` by removing the return expression or statement.
+      if (instruction is HReturn) return false;
+
+      // JavaScript `x == null` is more efficient than `x == _null`.
+      if (instruction is HIdentity) return false;
+
+      // TODO(sra): Deterimine if other uses result in faster JavaScript code.
+      return false;
+    }
+
+    int useCount = _countCacheableUses(node, _isCacheableUse);
+    if (useCount * size <= 7 + size + useCount * 1) return;
+    _cache(node, _isCacheableUse, '_null');
+    return;
+  }
+
+  void _handleInt(HConstant node, IntConstantValue intConstant) {
+    BigInt value = intConstant.intValue;
+    String text = value.toString();
+    int size = text.length;
+    if (size <= 3) return;
+
+    bool _isCacheableUse(HInstruction instruction) {
+      if (instruction is HInvoke) return true;
+      if (instruction is HCreate) return true;
+      if (instruction is HReturn) return true;
+      if (instruction is HPhi) return true;
+
+      // JavaScript `x === 5` is more efficient than `x === _5`.
+      if (instruction is HIdentity) return false;
+
+      // Foreign code templates may use literals in ways that are beneficial.
+      if (instruction is HForeignCode) return false;
+
+      // TODO(sra): Deterimine if other uses result in faster JavaScript code.
+      return false;
+    }
+
+    int useCount = _countCacheableUses(node, _isCacheableUse);
+    if (useCount * size <= 7 + size + useCount * 1) return;
+    _cache(node, _isCacheableUse, '_${text.replaceFirst("-", "_")}');
+  }
+
+  void _handleString(HConstant node, StringConstantValue stringConstant) {
+    String value = stringConstant.stringValue;
+    int length = value.length;
+    int size = length + 2; // Include quotes.
+    if (size <= 2) return;
+
+    bool _isCacheableUse(HInstruction instruction) {
+      // Foreign code templates may use literals in ways that are beneficial.
+      if (instruction is HForeignCode) return false;
+
+      // Cache larger strings even if unfortunate.
+      if (length >= 16) return true;
+
+      if (instruction is HInvoke) return true;
+      if (instruction is HCreate) return true;
+      if (instruction is HReturn) return true;
+      if (instruction is HPhi) return true;
+
+      // TODO(sra): Check if a.x="s" can avoid or specialize a write barrier.
+      if (instruction is HFieldSet) return true;
+
+      // TODO(sra): Deterimine if other uses result in faster JavaScript code.
+      return false;
+    }
+
+    int useCount = _countCacheableUses(node, _isCacheableUse);
+    if (useCount * size <= 7 + size + useCount * 1) return;
+    _cache(node, _isCacheableUse, '_s${length}_');
+  }
+}
+
+/// A simple Entity to give intermediate values nice names when not generating
+/// minified code.
+class _ExpressionName implements Entity {
+  final String name;
+  _ExpressionName(this.name);
+}
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 9488821..f815b64 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.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 'package:front_end/src/fasta/util/link.dart' show Link;
+import 'package:front_end/src/api_unstable/dart2js.dart' show Link;
 
 import '../closure.dart';
 import '../common.dart';
@@ -65,6 +65,7 @@
   R visitInvokeGeneratorBody(HInvokeGeneratorBody node);
   R visitIs(HIs node);
   R visitIsViaInterceptor(HIsViaInterceptor node);
+  R visitLateValue(HLateValue node);
   R visitLazyStatic(HLazyStatic node);
   R visitLess(HLess node);
   R visitLessEqual(HLessEqual node);
@@ -478,6 +479,7 @@
   visitTruncatingDivide(HTruncatingDivide node) => visitBinaryArithmetic(node);
   visitTry(HTry node) => visitControlFlow(node);
   visitIs(HIs node) => visitInstruction(node);
+  visitLateValue(HLateValue node) => visitInstruction(node);
   visitIsViaInterceptor(HIsViaInterceptor node) => visitInstruction(node);
   visitTypeConversion(HTypeConversion node) => visitCheck(node);
   visitTypeKnown(HTypeKnown node) => visitCheck(node);
@@ -3077,6 +3079,22 @@
   }
 }
 
+/// HLateValue is a late-stage instruction that can be used to force a value
+/// into a temporary.
+///
+/// HLateValue is useful for naming values that would otherwise be generated at
+/// use site, for example, if 'this' is used many times, replacing uses of
+/// 'this' with HLateValhe(HThis) will have the effect of copying 'this' to a
+/// temporary will reduce the size of minified code.
+class HLateValue extends HLateInstruction {
+  HLateValue(HInstruction target) : super([target], target.instructionType);
+
+  HInstruction get target => inputs.single;
+
+  accept(HVisitor visitor) => visitor.visitLateValue(this);
+  toString() => 'HLateValue($target)';
+}
+
 class HTypeConversion extends HCheck {
   // Values for [kind].
   static const int CHECKED_MODE_CHECK = 0;
diff --git a/pkg/compiler/lib/src/ssa/ssa_tracer.dart b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
index f72cc6b..61a56cd 100644
--- a/pkg/compiler/lib/src/ssa/ssa_tracer.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
@@ -158,6 +158,10 @@
     return "$prefix${instruction.id}";
   }
 
+  String visitLateValue(HLateValue node) {
+    return "LateValue: ${temporaryId(node.inputs[0])}";
+  }
+
   String visitBoolify(HBoolify node) {
     return "Boolify: ${temporaryId(node.inputs[0])}";
   }
diff --git a/pkg/compiler/lib/src/universe/class_set.dart b/pkg/compiler/lib/src/universe/class_set.dart
index 3d17859..cddb446 100644
--- a/pkg/compiler/lib/src/universe/class_set.dart
+++ b/pkg/compiler/lib/src/universe/class_set.dart
@@ -6,7 +6,7 @@
 
 import 'dart:collection' show IterableBase, MapBase;
 
-import 'package:front_end/src/fasta/util/link.dart' show Link;
+import 'package:front_end/src/api_unstable/dart2js.dart' show Link;
 
 import '../elements/entities.dart' show ClassEntity;
 import '../util/enumset.dart' show EnumSet;
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index 14a3f0a..10de2ff 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -8,6 +8,9 @@
 ///
 /// This adds additional access to liveness of selectors and elements.
 abstract class CodegenWorldBuilder implements WorldBuilder {
+  /// All directly or indirectly instantiated classes.
+  Iterable<ClassEntity> get instantiatedClasses;
+
   /// Calls [f] with every instance field, together with its declarer, in an
   /// instance of [cls]. All fields inherited from superclasses and mixins are
   /// included.
@@ -165,7 +168,7 @@
 
   final Set<ConstantValue> _constantValues = new Set<ConstantValue>();
 
-  final KernelToWorldBuilder _elementMap;
+  final JsToWorldBuilder _elementMap;
   final GlobalLocalsMap _globalLocalsMap;
 
   final Set<DartType> _constTypeLiterals = new Set<DartType>();
@@ -179,7 +182,7 @@
       this._world,
       this.selectorConstraintsStrategy);
 
-  Iterable<ClassEntity> get processedClasses => _processedClasses.keys
+  Iterable<ClassEntity> get instantiatedClasses => _processedClasses.keys
       .where((cls) => _processedClasses[cls].isInstantiated);
 
   /// All directly instantiated classes, that is, classes with a generative
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index 3b2239c..5e7b719 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -295,13 +295,14 @@
 
   /// Invocation of a super method [element] with the given [callStructure].
   factory StaticUse.superInvoke(
-      FunctionEntity element, CallStructure callStructure) {
+      FunctionEntity element, CallStructure callStructure,
+      [List<DartType> typeArguments]) {
     assert(
         element.isInstanceMember,
         failedAt(element,
             "Super invoke element $element must be an instance method."));
-    return new StaticUse.internal(element, StaticUseKind.INVOKE,
-        callStructure: callStructure);
+    return new GenericStaticUse(
+        element, StaticUseKind.INVOKE, callStructure, typeArguments);
   }
 
   /// Read access of a super field or getter [element].
diff --git a/pkg/compiler/lib/src/util/setlet.dart b/pkg/compiler/lib/src/util/setlet.dart
index 7335c77..ab1911b 100644
--- a/pkg/compiler/lib/src/util/setlet.dart
+++ b/pkg/compiler/lib/src/util/setlet.dart
@@ -239,7 +239,6 @@
     for (E e in other) {
       if (!this.contains(e)) return false;
     }
-    ;
     return true;
   }
 
diff --git a/pkg/compiler/lib/src/util/util.dart b/pkg/compiler/lib/src/util/util.dart
index 32944bb..df4cfa4 100644
--- a/pkg/compiler/lib/src/util/util.dart
+++ b/pkg/compiler/lib/src/util/util.dart
@@ -4,8 +4,8 @@
 
 library dart2js.util;
 
-import 'package:front_end/src/fasta/scanner/characters.dart';
-import 'package:front_end/src/fasta/util/link.dart';
+import 'package:front_end/src/api_unstable/dart2js.dart'
+    show $BACKSLASH, $CR, $DEL, $DQ, $LF, $LS, $PS, $TAB, Link, LinkBuilder;
 
 export 'emptyset.dart';
 export 'maplet.dart';
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index dcafd11..391e227 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -4,7 +4,7 @@
 
 library dart2js.world;
 
-import 'package:front_end/src/fasta/util/link.dart' show Link;
+import 'package:front_end/src/api_unstable/dart2js.dart' show Link;
 
 import 'common.dart';
 import 'common/names.dart';
diff --git a/pkg/compiler/tool/generate_kernel.dart b/pkg/compiler/tool/generate_kernel.dart
index 1ccdd8b..38ca58a 100644
--- a/pkg/compiler/tool/generate_kernel.dart
+++ b/pkg/compiler/tool/generate_kernel.dart
@@ -13,10 +13,12 @@
 import 'package:args/args.dart';
 import 'package:compiler/src/kernel/dart2js_target.dart';
 import 'package:compiler/src/filenames.dart';
-import 'package:front_end/src/api_prototype/front_end.dart';
-import 'package:front_end/src/compute_platform_binaries_location.dart'
-    show computePlatformBinariesLocation;
-import 'package:front_end/src/fasta/util/relativize.dart';
+import 'package:front_end/src/api_unstable/dart2js.dart'
+    show
+        CompilerOptions,
+        computePlatformBinariesLocation,
+        kernelForProgram,
+        relativizeUri;
 import 'package:kernel/kernel.dart';
 import 'package:kernel/target/targets.dart';
 
diff --git a/pkg/compiler/tool/generate_kernel_test.dart b/pkg/compiler/tool/generate_kernel_test.dart
index 46162b1..b0c5f9d 100644
--- a/pkg/compiler/tool/generate_kernel_test.dart
+++ b/pkg/compiler/tool/generate_kernel_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:io';
 import 'generate_kernel.dart' as m;
-import 'package:front_end/src/compute_platform_binaries_location.dart'
+import 'package:front_end/src/api_unstable/dart2js.dart'
     show computePlatformBinariesLocation;
 
 main() async {
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
index 4dd9996..5e8b8b6 100755
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -9,65 +9,78 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/command_line/arguments.dart';
-import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
 import 'package:bazel_worker/bazel_worker.dart';
-import 'package:dev_compiler/src/analyzer/command.dart';
+import 'package:dev_compiler/src/compiler/shared_command.dart';
 
 Future main(List<String> args) async {
   // Always returns a new modifiable list.
-  args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args);
+  var parsedArgs = ParsedArguments.from(args);
 
-  if (args.contains('--persistent_worker')) {
-    await _CompilerWorker(args..remove('--persistent_worker')).run();
-  } else if (args.isNotEmpty && args.last == "--batch") {
-    await runBatch(args.sublist(0, args.length - 1));
+  if (parsedArgs.isWorker) {
+    await _CompilerWorker(parsedArgs).run();
+  } else if (parsedArgs.isBatch) {
+    await runBatch(parsedArgs);
   } else {
-    exitCode = compile(args);
+    var result = await compile(parsedArgs);
+    exitCode = result.exitCode;
   }
 }
 
 /// Runs the compiler worker loop.
 class _CompilerWorker extends AsyncWorkerLoop {
   /// The original args supplied to the executable.
-  final List<String> _startupArgs;
+  final ParsedArguments _startupArgs;
+  InitializedCompilerState _compilerState;
 
   _CompilerWorker(this._startupArgs) : super();
 
   /// Performs each individual work request.
   Future<WorkResponse> performRequest(WorkRequest request) async {
-    var args = _startupArgs.toList()..addAll(request.arguments);
-
+    var args = _startupArgs.merge(request.arguments);
     var output = StringBuffer();
-    var exitCode = compile(args, printFn: output.writeln);
-    AnalysisEngine.instance.clearCaches();
+    var result = await runZoned(
+        () => compile(args, compilerState: _compilerState), zoneSpecification:
+            ZoneSpecification(print: (self, parent, zone, message) {
+      output.writeln(message.toString());
+    }));
+    _compilerState = result.compilerState;
     return WorkResponse()
-      ..exitCode = exitCode
+      ..exitCode = result.success ? 0 : 1
       ..output = output.toString();
   }
 }
 
-runBatch(List<String> batchArgs) async {
-  int totalTests = 0;
-  int testsFailed = 0;
+/// Runs dartdevk in batch mode for test.dart.
+Future runBatch(ParsedArguments batchArgs) async {
+  var totalTests = 0;
+  var failedTests = 0;
   var watch = Stopwatch()..start();
-  print('>>> BATCH START');
-  String line;
-  while ((line = stdin.readLineSync(encoding: utf8)).isNotEmpty) {
-    totalTests++;
-    var args = batchArgs.toList()..addAll(line.split(RegExp(r'\s+')));
 
-    // We don't try/catch here, since `compile` should handle that.
-    var compileExitCode = compile(args);
-    AnalysisEngine.instance.clearCaches();
+  print('>>> BATCH START');
+
+  String line;
+  InitializedCompilerState compilerState;
+
+  while ((line = stdin.readLineSync(encoding: utf8))?.isNotEmpty == true) {
+    totalTests++;
+    var args = batchArgs.merge(line.split(RegExp(r'\s+')));
+
+    String outcome;
+    try {
+      var result = await compile(args, compilerState: compilerState);
+      compilerState = result.compilerState;
+      outcome = result.success ? 'PASS' : (result.crashed ? 'CRASH' : 'FAIL');
+    } catch (e, s) {
+      outcome = 'CRASH';
+      print('Unhandled exception:');
+      print(e);
+      print(s);
+    }
+
     stderr.writeln('>>> EOF STDERR');
-    var outcome = compileExitCode == 0
-        ? 'PASS'
-        : compileExitCode == 70 ? 'CRASH' : 'FAIL';
     print('>>> TEST $outcome ${watch.elapsedMilliseconds}ms');
   }
-  int time = watch.elapsedMilliseconds;
-  print('>>> BATCH END '
-      '(${totalTests - testsFailed})/$totalTests ${time}ms');
+
+  var time = watch.elapsedMilliseconds;
+  print('>>> BATCH END (${totalTests - failedTests})/$totalTests ${time}ms');
 }
diff --git a/pkg/dev_compiler/bin/dartdevk.dart b/pkg/dev_compiler/bin/dartdevk.dart
index 027cfe4..018464ed 100755
--- a/pkg/dev_compiler/bin/dartdevk.dart
+++ b/pkg/dev_compiler/bin/dartdevk.dart
@@ -3,139 +3,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dartdevc.dart' as dartdevc;
+
 /// Experimental command line entry point for Dart Development Compiler.
 /// Unlike `dartdevc` this version uses the shared front end and IR.
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:bazel_worker/bazel_worker.dart';
-import 'package:dev_compiler/src/kernel/command.dart';
-import 'package:front_end/src/api_unstable/ddc.dart' as fe;
-
-Future main(List<String> args) async {
-  var parsedArgs = _preprocessArgs(args);
-  if (parsedArgs.isBatch) {
-    await runBatch(parsedArgs.args);
-  } else if (parsedArgs.isWorker) {
-    await _CompilerWorker(parsedArgs.args).run();
-  } else {
-    var result = await compile(parsedArgs.args);
-    exitCode = result.success ? 0 : 1;
-  }
-}
-
-/// Runs dartdevk in batch mode for test.dart.
-Future runBatch(List<String> batchArgs) async {
-  var tests = 0;
-  var failed = 0;
-  var watch = Stopwatch()..start();
-
-  print('>>> BATCH START');
-
-  String line;
-  fe.InitializedCompilerState compilerState;
-
-  while ((line = stdin.readLineSync(encoding: utf8))?.isNotEmpty == true) {
-    tests++;
-    var args = batchArgs.toList()..addAll(line.split(RegExp(r'\s+')));
-
-    String outcome;
-    try {
-      var result = await compile(args, compilerState: compilerState);
-      compilerState = result.compilerState;
-      outcome = result.success ? 'PASS' : 'FAIL';
-    } catch (e, s) {
-      outcome = 'CRASH';
-      print('Unhandled exception:');
-      print(e);
-      print(s);
-    }
-
-    // TODO(rnystrom): If kernel has any internal static state that needs to
-    // be cleared, do it here.
-
-    stderr.writeln('>>> EOF STDERR');
-    print('>>> TEST $outcome ${watch.elapsedMilliseconds}ms');
-  }
-
-  var time = watch.elapsedMilliseconds;
-  print('>>> BATCH END (${tests - failed})/$tests ${time}ms');
-}
-
-/// Runs the compiler worker loop.
-class _CompilerWorker extends AsyncWorkerLoop {
-  /// The original args supplied to the executable.
-  final List<String> _startupArgs;
-
-  _CompilerWorker(this._startupArgs) : super();
-
-  /// Performs each individual work request.
-  Future<WorkResponse> performRequest(WorkRequest request) async {
-    var args = _startupArgs.toList()..addAll(request.arguments);
-
-    var output = StringBuffer();
-    var result = await runZoned(() => compile(args), zoneSpecification:
-        ZoneSpecification(print: (self, parent, zone, message) {
-      output.writeln(message.toString());
-    }));
-    return WorkResponse()
-      ..exitCode = result.success ? 0 : 1
-      ..output = output.toString();
-  }
-}
-
-/// Preprocess arguments to determine whether DDK is used in batch mode or as a
-/// persistent worker.
-///
-/// When used in batch mode, we expect a `--batch` parameter last.
-///
-/// When used as a persistent bazel worker, the `--persistent_worker` might be
-/// present, and an argument of the form `@path/to/file` might be provided. The
-/// latter needs to be replaced by reading all the contents of the
-/// file and expanding them into the resulting argument list.
-_ParsedArgs _preprocessArgs(List<String> args) {
-  if (args.isEmpty) return _ParsedArgs(false, false, args);
-
-  String lastArg = args.last;
-  if (lastArg == '--batch') {
-    return _ParsedArgs(true, false, args.sublist(0, args.length - 1));
-  }
-
-  var newArgs = <String>[];
-  bool isWorker = false;
-  var len = args.length;
-  for (int i = 0; i < len; i++) {
-    var arg = args[i];
-    if (i == len - 1 && arg.startsWith('@')) {
-      newArgs.addAll(_readLines(arg.substring(1)));
-    } else if (arg == '--persistent_worker') {
-      isWorker = true;
-    } else {
-      newArgs.add(arg);
-    }
-  }
-  return _ParsedArgs(false, isWorker, newArgs);
-}
-
-/// Return all lines in a file found at [path].
-Iterable<String> _readLines(String path) {
-  try {
-    return File(path)
-        .readAsStringSync()
-        .replaceAll('\r\n', '\n')
-        .replaceAll('\r', '\n')
-        .split('\n')
-        .where((String line) => line.isNotEmpty);
-  } on FileSystemException catch (e) {
-    throw Exception('Failed to read $path: $e');
-  }
-}
-
-class _ParsedArgs {
-  final bool isBatch;
-  final bool isWorker;
-  final List<String> args;
-
-  _ParsedArgs(this.isBatch, this.isWorker, this.args);
-}
+main(List<String> args) => dartdevc.main(args.toList()..add('--kernel'));
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index cee5682..6fc4b68 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -803,7 +803,7 @@
 
         // We may still need an implicit coercion as well, if another downcast
         // is involved.
-        return js.call('#._check(#)', [_emitType(to), callTearoff]);
+        return _emitCast(to, callTearoff);
       }
     }
 
@@ -821,8 +821,17 @@
       return jsFrom;
     }
 
-    var code = isImplicit ? '#._check(#)' : '#.as(#)';
-    return js.call(code, [_emitType(to), jsFrom]);
+    return _emitCast(to, jsFrom, implicit: isImplicit);
+  }
+
+  JS.Expression _emitCast(DartType type, JS.Expression expr,
+      {bool implicit = true}) {
+    // If [type] is a top type we can omit the cast.
+    if (rules.isSubtypeOf(types.objectType, type)) {
+      return expr;
+    }
+    var code = implicit ? '#._check(#)' : '#.as(#)';
+    return js.call(code, [_emitType(type), expr]);
   }
 
   @override
@@ -836,9 +845,7 @@
     if (typeofName != null && type != types.intType) {
       result = js.call('typeof # == #', [lhs, js.string(typeofName, "'")]);
     } else {
-      // Always go through a runtime helper, because implicit interfaces.
-      var castType = _emitType(type);
-      result = js.call('#.is(#)', [castType, lhs]);
+      result = js.call('#.is(#)', [_emitType(type), lhs]);
     }
 
     if (node.notOperator != null) {
@@ -847,39 +854,13 @@
     return result;
   }
 
+  /// No-op, typedefs are emitted as their corresponding function type.
   @override
-  visitFunctionTypeAlias(FunctionTypeAlias node) => _emitTypedef(node);
+  visitFunctionTypeAlias(FunctionTypeAlias node) => null;
 
+  /// No-op, typedefs are emitted as their corresponding function type.
   @override
-  visitGenericTypeAlias(GenericTypeAlias node) => _emitTypedef(node);
-
-  JS.Statement _emitTypedef(TypeAlias node) {
-    var element = node.declaredElement as FunctionTypeAliasElement;
-    FunctionType type;
-    var typeFormals = element.typeParameters;
-    if (element is GenericTypeAliasElement) {
-      type = element.function.type;
-    } else {
-      type = element.type;
-      if (typeFormals.isNotEmpty) {
-        // Skip past the type formals, we'll add them back below, so these
-        // type parameter names will end up in scope in the generated JS.
-        type = type.instantiate(typeFormals.map((f) => f.type).toList());
-      }
-    }
-
-    JS.Expression body = runtimeCall('typedef(#, () => #)', [
-      js.string(element.name, "'"),
-      _emitFunctionType(type, nameType: false)
-    ]);
-
-    if (typeFormals.isNotEmpty) {
-      return _defineClassTypeArguments(element, typeFormals,
-          js.statement('const # = #;', [element.name, body]));
-    } else {
-      return js.statement('# = #;', [_emitTopLevelName(element), body]);
-    }
-  }
+  visitGenericTypeAlias(GenericTypeAlias node) => null;
 
   @override
   JS.Expression visitTypeName(node) => _emitTypeAnnotation(node);
@@ -1358,7 +1339,7 @@
         return _emitGenericClassType(
             t, t.typeArguments.map(emitDeferredType).toList());
       }
-      return _emitType(t, nameType: false);
+      return _emitType(t, cacheType: false);
     }
 
     bool shouldDefer(DartType t) {
@@ -1385,7 +1366,7 @@
     emitClassRef(InterfaceType t) {
       // TODO(jmesserly): investigate this. It seems like `lazyJSType` is
       // invalid for use in an `extends` clause, hence this workaround.
-      return _emitJSInterop(t.element) ?? _emitType(t, nameType: false);
+      return _emitJSInterop(t.element) ?? _emitType(t, cacheType: false);
     }
 
     getBaseClass(int count) {
@@ -1434,7 +1415,7 @@
         getBaseClass(isMixinAliasClass(classElem) ? 0 : mixinLength),
         emitDeferredType(supertype),
       ]));
-      supertype = fillDynamicTypeArgs(supertype);
+      supertype = fillDynamicTypeArgsForClass(supertype);
     }
     var baseClass = emitClassRef(supertype);
 
@@ -1651,8 +1632,8 @@
             covariantParams.lookup(member.parameters[0]) as ParameterElement;
         methods.add(JS.Method(
             name,
-            js.fun('function(x) { return super.# = #._check(x); }',
-                [name, _emitType(param.type)]),
+            js.fun('function(x) { return super.# = #; }',
+                [name, _emitCast(param.type, JS.Identifier('x'))]),
             isSetter: true));
         methods.add(JS.Method(
             name, js.fun('function() { return super.#; }', [name]),
@@ -1674,23 +1655,20 @@
             foundNamedParams = true;
 
             var name = _propertyName(param.name);
-            body.add(js.statement('if (# in #) #._check(#.#);', [
+            body.add(js.statement('if (# in #) #;', [
               name,
               namedArgumentTemp,
-              _emitType(param.type),
-              namedArgumentTemp,
-              name
+              _emitCast(param.type, JS.PropertyAccess(namedArgumentTemp, name))
             ]));
           } else {
             var jsParam = _emitParameter(param);
             jsParams.add(jsParam);
 
             if (param.kind == ParameterKind.POSITIONAL) {
-              body.add(js.statement('if (# !== void 0) #._check(#);',
-                  [jsParam, _emitType(param.type), jsParam]));
+              body.add(js.statement('if (# !== void 0) #;',
+                  [jsParam, _emitCast(param.type, jsParam)]));
             } else {
-              body.add(js
-                  .statement('#._check(#);', [_emitType(param.type), jsParam]));
+              body.add(_emitCast(param.type, jsParam).toStatement());
             }
           }
         }
@@ -1822,9 +1800,7 @@
       JS.ObjectInitializer(invocationProps)
     ]);
 
-    if (!method.returnType.isDynamic) {
-      fnBody = js.call('#._check(#)', [_emitType(method.returnType), fnBody]);
-    }
+    fnBody = _emitCast(method.returnType, fnBody);
 
     var fnBlock = argInit != null
         ? JS.Block([argInit, fnBody.toReturn()])
@@ -1862,19 +1838,18 @@
     if (!mocks.containsKey(element.name + '=')) {
       var args = field.isFinal ? [JS.Super(), name] : [JS.This(), virtualField];
 
-      String jsCode;
       var setter = element.setter;
       var covariantParams = _classProperties.covariantParameters;
+      JS.Expression value = JS.Identifier('value');
       if (setter != null &&
           covariantParams != null &&
           covariantParams.contains(setter.parameters[0])) {
-        args.add(_emitType(setter.parameters[0].type));
-        jsCode = 'function(value) { #[#] = #._check(value); }';
-      } else {
-        jsCode = 'function(value) { #[#] = value; }';
+        value = _emitCast(setter.parameters[0].type, value);
       }
+      args.add(value);
 
-      result.add(JS.Method(name, js.fun(jsCode, args), isSetter: true)
+      result.add(JS.Method(name, js.fun('function(value) { #[#] = #; }', args),
+          isSetter: true)
         ..sourceInformation = _functionSpan(field.name));
     }
 
@@ -2262,7 +2237,7 @@
                   isGetter
                       ? reifiedType.returnType
                       : reifiedType.parameters[0].type,
-                  nameType: false),
+                  cacheType: false),
               annotationNode?.metadata);
 
           var property = JS.Property(_declareMemberName(accessor), type);
@@ -2618,8 +2593,7 @@
       }
 
       if (_isCovariant(param)) {
-        var castType = _emitType(param.type);
-        body.add(js.statement('#._check(#);', [castType, jsParam]));
+        body.add(_emitCast(param.type, jsParam).toStatement());
       }
       if (_annotatedNullCheck(param)) {
         body.add(_nullParameterCheck(jsParam));
@@ -2771,15 +2745,31 @@
     return ancestor == null;
   }
 
-  bool _typeIsLoaded(DartType type) {
-    if (type is FunctionType && (type.name == '' || type.name == null)) {
-      return (_typeIsLoaded(type.returnType) &&
-          type.optionalParameterTypes.every(_typeIsLoaded) &&
-          type.namedParameterTypes.values.every(_typeIsLoaded) &&
-          type.normalParameterTypes.every(_typeIsLoaded));
+  /// Whether the expression for [type] can be evaluated at this point in the JS
+  /// module.
+  ///
+  /// Types cannot be evaluated if they depend on something that hasn't been
+  /// defined yet. For example:
+  ///
+  ///     C foo() => null;
+  ///     class C {}
+  ///
+  /// If we're emitting the type information for `foo`, we cannot refer to `C`
+  /// yet, so we must evaluate foo's type lazily.
+  bool _canEmitTypeAtTopLevel(DartType type) {
+    if (type is FunctionType) {
+      // Generic functions are always safe to emit, because they're lazy until
+      // type arguments are applied.
+      if (type.typeFormals.isNotEmpty) return true;
+
+      return _canEmitTypeAtTopLevel(type.returnType) &&
+          type.optionalParameterTypes.every(_canEmitTypeAtTopLevel) &&
+          type.namedParameterTypes.values.every(_canEmitTypeAtTopLevel) &&
+          type.normalParameterTypes.every(_canEmitTypeAtTopLevel);
     }
     if (type.isDynamic || type.isVoid || type.isBottom) return true;
-    if (type is ParameterizedType && !type.typeArguments.every(_typeIsLoaded)) {
+    if (type is ParameterizedType &&
+        !type.typeArguments.every(_canEmitTypeAtTopLevel)) {
       return false;
     }
     return !_declarationNodes.containsKey(type.element);
@@ -2787,7 +2777,7 @@
 
   JS.Expression _emitFunctionTagged(JS.Expression fn, FunctionType type,
       {bool topLevel = false}) {
-    var lazy = topLevel && !_typeIsLoaded(type);
+    var lazy = topLevel && !_canEmitTypeAtTopLevel(type);
     var typeRep = _emitFunctionType(type, lazy: lazy);
     return runtimeCall(lazy ? 'lazyFn(#, #)' : 'fn(#, #)', [fn, typeRep]);
   }
@@ -3102,7 +3092,7 @@
     // type literal
     if (element is TypeDefiningElement) {
       _declareBeforeUse(element);
-      var typeName = _emitType(fillDynamicTypeArgs(element.type));
+      var typeName = _emitTypeDefiningElement(element);
 
       // If the type is a type literal expression in Dart code, wrap the raw
       // runtime type in a "Type" instance.
@@ -3255,22 +3245,23 @@
 
   JS.ArrayInitializer _emitTypeNames(
       List<DartType> types, List<FormalParameter> parameters,
-      {bool nameType = true}) {
+      {bool cacheType = true}) {
     var result = <JS.Expression>[];
     for (int i = 0; i < types.length; ++i) {
       var metadata =
           parameters != null ? _parameterMetadata(parameters[i]) : null;
-      var typeName = _emitType(types[i], nameType: nameType);
+      var typeName = _emitType(types[i], cacheType: cacheType);
       result.add(_emitAnnotatedResult(typeName, metadata));
     }
     return JS.ArrayInitializer(result);
   }
 
-  JS.ObjectInitializer _emitTypeProperties(Map<String, DartType> types) {
+  JS.ObjectInitializer _emitTypeProperties(Map<String, DartType> types,
+      {bool cacheType = true}) {
     var properties = <JS.Property>[];
     types.forEach((name, type) {
       var key = _propertyName(name);
-      var value = _emitType(type);
+      var value = _emitType(type, cacheType: cacheType);
       properties.add(JS.Property(key, value));
     });
     return JS.ObjectInitializer(properties);
@@ -3280,34 +3271,34 @@
   /// regular args, and optional/named args.
   JS.Expression _emitFunctionType(FunctionType type,
       {List<FormalParameter> parameters,
-      bool nameType = true,
+      bool cacheType = true,
       bool lazy = false}) {
     var parameterTypes = type.normalParameterTypes;
     var optionalTypes = type.optionalParameterTypes;
     var namedTypes = type.namedParameterTypes;
-    var rt = _emitType(type.returnType, nameType: nameType);
+    var rt = _emitType(type.returnType, cacheType: cacheType);
 
-    var ra = _emitTypeNames(parameterTypes, parameters, nameType: nameType);
+    var ra = _emitTypeNames(parameterTypes, parameters, cacheType: cacheType);
 
     List<JS.Expression> typeParts;
     if (namedTypes.isNotEmpty) {
       assert(optionalTypes.isEmpty);
       // TODO(vsm): Pass in annotations here as well.
-      var na = _emitTypeProperties(namedTypes);
+      var na = _emitTypeProperties(namedTypes, cacheType: cacheType);
       typeParts = [rt, ra, na];
     } else if (optionalTypes.isNotEmpty) {
       assert(namedTypes.isEmpty);
       var oa = _emitTypeNames(
           optionalTypes, parameters?.sublist(parameterTypes.length),
-          nameType: nameType);
+          cacheType: cacheType);
       typeParts = [rt, ra, oa];
     } else {
       typeParts = [rt, ra];
     }
 
     JS.Expression fullType;
-    var typeFormals = type.typeFormals;
     String helperCall;
+    var typeFormals = type.typeFormals;
     if (typeFormals.isNotEmpty) {
       var tf = _emitTypeFormals(typeFormals);
 
@@ -3323,14 +3314,16 @@
       helperCall = 'gFnType(#)';
       // If any explicit bounds were passed, emit them.
       if (typeFormals.any((t) => t.bound != null)) {
-        var bounds = typeFormals.map((t) => _emitType(t.type.bound)).toList();
+        var bounds = typeFormals
+            .map((t) => _emitType(t.type.bound, cacheType: cacheType))
+            .toList();
         typeParts.add(addTypeFormalsAsParameters(bounds));
       }
     } else {
       helperCall = 'fnType(#)';
     }
     fullType = runtimeCall(helperCall, [typeParts]);
-    if (!nameType) return fullType;
+    if (!cacheType) return fullType;
     return _typeTable.nameFunctionType(type, fullType, lazy: lazy);
   }
 
@@ -3338,14 +3331,11 @@
       FunctionType type, List<Annotation> metadata,
       {List<FormalParameter> parameters}) {
     var result =
-        _emitFunctionType(type, parameters: parameters, nameType: false);
+        _emitFunctionType(type, parameters: parameters, cacheType: false);
     return _emitAnnotatedResult(result, metadata);
   }
 
   /// Emits an expression that lets you access statics on a [type] from code.
-  ///
-  /// If [nameType] is true, then the type will be named.  In addition,
-  /// if [hoistType] is true, then the named type will be hoisted.
   JS.Expression _emitConstructorAccess(DartType type) {
     return _emitJSInterop(type.element) ?? _emitType(type);
   }
@@ -3358,8 +3348,8 @@
 
   /// Emits a Dart [type] into code.
   ///
-  /// If [nameType] is true, then the type will be named.
-  JS.Expression _emitType(DartType type, {bool nameType = true}) {
+  /// If [cacheType] is true, then the type will be cached for the module.
+  JS.Expression _emitType(DartType type, {bool cacheType = true}) {
     // The void and dynamic types are not defined in core.
     if (type.isVoid) {
       return runtimeCall('void');
@@ -3396,34 +3386,35 @@
           [_emitJSInteropForGlobal(jsName), js.escapedString(jsName)]);
     }
 
-    // TODO(jmesserly): like constants, should we hoist function types out of
-    // methods? Similar issue with generic types. For all of these, we may want
-    // to canonicalize them too, at least when inside the same library.
     var name = type.name;
-    if (name == '' || name == null) {
-      return _emitFunctionType(type as FunctionType, nameType: nameType);
-    }
-
     if (type is TypeParameterType) {
       _typeParamInConst?.add(type);
       return JS.Identifier(name);
     }
 
     if (type is ParameterizedType) {
+      if (type is FunctionType) {
+        return _emitFunctionType(type, cacheType: cacheType);
+      }
       var args = type.typeArguments;
       List<JS.Expression> jsArgs;
       if (args.any((a) => !a.isDynamic)) {
-        jsArgs = args.map((x) => _emitType(x, nameType: nameType)).toList();
+        jsArgs = args.map((x) => _emitType(x, cacheType: cacheType)).toList();
       }
       if (jsArgs != null) {
         var typeRep = _emitGenericClassType(type, jsArgs);
-        return nameType ? _typeTable.nameType(type, typeRep) : typeRep;
+        return cacheType ? _typeTable.nameType(type, typeRep) : typeRep;
       }
     }
 
     return _emitTopLevelNameNoInterop(element);
   }
 
+  /// Emits the raw type corresponding to the [element].
+  JS.Expression _emitTypeDefiningElement(TypeDefiningElement element) {
+    return _emitType(fillDynamicTypeArgsForElement(element));
+  }
+
   JS.Expression _emitGenericClassType(
       ParameterizedType t, List<JS.Expression> typeArgs) {
     var genericName = _emitTopLevelNameNoInterop(t.element, suffix: '\$');
@@ -3561,6 +3552,7 @@
     // TODO(sra): We should get here only for compiler bugs or weirdness due to
     // --unsafe-force-compile. Once those paths have been addressed, throw at
     // compile time.
+    assert(options.unsafeForceCompile);
     return runtimeCall('throwUnimplementedError((#, #, #))',
         [js.string('$lhs ='), _visitExpression(rhs), js.string(problem)]);
   }
@@ -3706,7 +3698,7 @@
       if (e.name == 'unwrapType' && firstArg is SimpleIdentifier) {
         var typeElem = firstArg.staticElement;
         if (typeElem is TypeDefiningElement) {
-          return _emitType(fillDynamicTypeArgs(typeElem.type));
+          return _emitTypeDefiningElement(typeElem);
         }
       }
       if (e.name == 'extensionSymbol' && firstArg is StringLiteral) {
@@ -3855,7 +3847,7 @@
     }
     var castTo = getImplicitOperationCast(node);
     if (castTo != null) {
-      jsTarget = js.call('#._check(#)', [_emitType(castTo), jsTarget]);
+      jsTarget = _emitCast(castTo, jsTarget);
     }
     if (typeArgs != null) args.insertAll(0, typeArgs);
     return JS.Call(jsTarget, args);
@@ -4866,7 +4858,7 @@
   int _asIntInRange(Expression expr, int low, int high) {
     expr = expr.unParenthesized;
     if (expr is IntegerLiteral) {
-      var value = _intValueForJS(expr);
+      var value = getLiteralBigIntValue(expr);
       if (value != null &&
           value >= BigInt.from(low) &&
           value <= BigInt.from(high)) {
@@ -4895,7 +4887,7 @@
   bool _isDefinitelyNonNegative(Expression expr) {
     expr = expr.unParenthesized;
     if (expr is IntegerLiteral) {
-      var value = _intValueForJS(expr);
+      var value = getLiteralBigIntValue(expr);
       return value != null && value >= BigInt.from(0);
     }
     if (_nodeIsBitwiseOperation(expr)) return true;
@@ -5718,18 +5710,17 @@
 
   @override
   visitIntegerLiteral(IntegerLiteral node) {
-    // TODO(jmesserly): this behaves differently if Analyzer/DDC are run on
-    // dart4web. In that case we may report an error from the analyzer side
-    // (because `int.tryParse` fails). We could harden this by always parsing
-    // from `node.literal.lexeme`, as done below.
-    var value = _intValueForJS(node);
-    if (value == null) {
-      assert(options.unsafeForceCompile);
-      value = BigInt.parse(node.literal.lexeme).toUnsigned(64);
-    }
-    // Report an error if the integer cannot be represented in a JS double.
+    var value = getLiteralBigIntValue(node);
+
+    // Report an error if the integer literal cannot be exactly represented in
+    // JS (because JS only has support for doubles).
+    //
+    // This applies regardless in an int or double context.
     var valueInJS = BigInt.from(value.toDouble());
     if (value != valueInJS) {
+      assert(node.staticType == intClass.type || options.unsafeForceCompile,
+          'int literals in double contexts should be checked by Analyzer.');
+
       var lexeme = node.literal.lexeme;
       var nearest = (lexeme.startsWith("0x") || lexeme.startsWith("0X"))
           ? '0x${valueInJS.toRadixString(16)}'
@@ -5740,28 +5731,6 @@
     return JS.LiteralNumber('$valueInJS');
   }
 
-  /// Returns the integer value for [node].
-  BigInt _intValueForJS(IntegerLiteral node) {
-    // The Dart VM uses signed 64-bit integers, but dart4web supports unsigned
-    // 64-bit integer hex literals if they can be represented in JavaScript.
-    // So we need to reinterpret the value as an unsigned 64-bit integer.
-    //
-    // The current Dart 2.0 rules are:
-    //
-    // - A decimal literal (maybe including a leading minus) is allowed if its
-    //   numerical value is in the signed 64-bit range (-2^63..2^63-1).
-    // - A signed hexadecimal literal is allowed if its numerical value is in
-    //   the signed 64-bit ranged.
-    // - An unsigned hexadecimal literal is allowed if its numerical value is in
-    //   the *unsigned* 64-bit range (0..2^64-1).
-    //
-    // The decimal-vs-hex distinction has already been taken care of by
-    // Analyzer, so we're only concerned with ensuring those unsigned values are
-    // correctly interpreted.
-    var value = node.value;
-    return value != null ? BigInt.from(value).toUnsigned(64) : null;
-  }
-
   @override
   visitDoubleLiteral(DoubleLiteral node) => js.number(node.value);
 
diff --git a/pkg/dev_compiler/lib/src/analyzer/context.dart b/pkg/dev_compiler/lib/src/analyzer/context.dart
index 130a9ed..e787e81 100644
--- a/pkg/dev_compiler/lib/src/analyzer/context.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/context.dart
@@ -16,7 +16,7 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart'
     show InSummaryUriResolver, SummaryDataStore;
 import 'package:args/args.dart' show ArgParser, ArgResults;
-import 'package:cli_util/cli_util.dart' show getSdkDir;
+import 'package:cli_util/cli_util.dart' show getSdkPath;
 import 'package:path/path.dart' as path;
 
 // ignore_for_file: deprecated_member_use
@@ -46,7 +46,7 @@
       {this.contextBuilderOptions,
       String dartSdkPath,
       this.customUrlMappings = const {}})
-      : dartSdkPath = dartSdkPath ?? getSdkDir().path {
+      : dartSdkPath = dartSdkPath ?? getSdkPath() {
     contextBuilderOptions.declaredVariables ??= const {};
   }
 
@@ -65,8 +65,7 @@
         createContextBuilderOptions(args, trackCacheDependencies: false);
     (contextOpts.defaultOptions as AnalysisOptionsImpl).previewDart2 = true;
 
-    var dartSdkPath = args['dart-sdk'] as String ?? getSdkDir().path;
-
+    var dartSdkPath = args['dart-sdk'] as String ?? getSdkPath();
     dartSdkSummaryPath ??= contextOpts.dartSdkSummaryPath ??
         path.join(dartSdkPath, 'lib', '_internal', 'ddc_sdk.sum');
     // For building the SDK, we explicitly set the path to none.
@@ -138,7 +137,7 @@
         ContextBuilder(resourceProvider, null, null, options: builderOptions);
 
     return PackageMapUriResolver(resourceProvider,
-        builder.convertPackagesToMap(builder.createPackageMap('')));
+        builder.convertPackagesToMap(builder.createPackageMap(path.current)));
   }
 
   return [ResourceUriResolver(resourceProvider), packageResolver()];
diff --git a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
index 9e7b9be..0578625 100644
--- a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
@@ -22,15 +22,29 @@
 }
 
 // TODO(jmesserly): replace this with instantiateToBounds
-T fillDynamicTypeArgs<T extends DartType>(T t) {
-  if (t is ParameterizedType && t.typeArguments.isNotEmpty) {
-    var rawT = (t.element as TypeParameterizedElement).type;
+InterfaceType fillDynamicTypeArgsForClass(InterfaceType t) {
+  if (t.typeArguments.isNotEmpty) {
+    var rawT = t.element.type;
     var dyn = List.filled(rawT.typeArguments.length, DynamicTypeImpl.instance);
-    return rawT.substitute2(dyn, rawT.typeArguments) as T;
+    return rawT.substitute2(dyn, rawT.typeArguments);
   }
   return t;
 }
 
+// TODO(jmesserly): replace this with instantiateToBounds
+DartType fillDynamicTypeArgsForElement(TypeDefiningElement element) {
+  Element e = element;
+  if (e is TypeParameterizedElement) {
+    // TODO(jmesserly): GenericTypeAliasElement.type does not return the correct
+    // type (it is missing the type formals), so we workaround that here.
+    var type = e is GenericTypeAliasElement ? e.function.type : e.type;
+    return type.substitute2(
+        List.filled(e.typeParameters.length, DynamicTypeImpl.instance),
+        TypeParameterTypeImpl.getTypes(e.typeParameters));
+  }
+  return element.type;
+}
+
 /// Given an annotated [node] and a [test] function, returns the first matching
 /// constant valued annotation.
 ///
@@ -231,7 +245,9 @@
       if (x.typeFormals.isNotEmpty) {
         var fresh = FunctionTypeImpl.relateTypeFormals(
             x, y, (t, s, _, __) => typesAreEqual(t, s));
-        if (fresh == null) return false;
+        if (fresh == null) {
+          return false;
+        }
         return typesAreEqual(x.instantiate(fresh), y.instantiate(fresh));
       }
 
@@ -273,8 +289,32 @@
 
 /// Returns a valid hashCode for [t] for use with [typesAreEqual].
 int typeHashCode(DartType t) {
+  // TODO(jmesserly): this is from Analyzer; it's not a great hash function.
+  // We should at least fix how this combines hashes.
   if (t is FunctionType) {
-    // TODO(jmesserly): this is from Analyzer; it's not a great hash function.
+    if (t.typeFormals.isNotEmpty) {
+      // Instantiate the generic function type, so we hash equivalent
+      // generic function types to the same value. For example, `<X>(X) -> X`
+      // and `<Y>(Y) -> Y` shouold have the same hash.
+      //
+      // TODO(jmesserly): it would be better to instantiate these with unique
+      // types for each position, so we can distinguish cases like these:
+      //
+      //     <A, B>(A) -> B
+      //     <C, D>(D) -> C      // reversed
+      //     <E, F>(E) -> void   // uses `void`
+      //
+      // Currently all of those will have the same hash code.
+      //
+      // The choice of `void` is rather arbitrary. Of the types we can easily
+      // obtain from Analyzer, it should collide a bit less than something like
+      // `dynamic`.
+      int code = t.typeFormals.length;
+      code = (code << 1) +
+          typeHashCode(t.instantiate(
+              List.filled(t.typeFormals.length, VoidTypeImpl.instance)));
+      return code;
+    }
     int code = typeHashCode(t.returnType);
     for (var p in t.normalParameterTypes) {
       code = (code << 1) + typeHashCode(p);
@@ -344,3 +384,14 @@
 
 ClassElement getClass(AnalysisContext c, String uri, String name) =>
     c.computeLibraryElement(c.sourceFactory.forUri(uri)).getType(name);
+
+/// Returns the integer value for [node] as a [BigInt].
+///
+/// `node.value` should not be used directly as it depends on platform integers
+/// and may be `null` for some valid integer literals (in either an `int` or a
+/// `double` context)
+BigInt getLiteralBigIntValue(IntegerLiteral node) {
+  // TODO(jmesserly): workaround for #34360: Analyzer tree does not store
+  // the BigInt or double value, so we need to re-parse it from the token.
+  return BigInt.parse(node.literal.lexeme);
+}
diff --git a/pkg/dev_compiler/lib/src/analyzer/property_model.dart b/pkg/dev_compiler/lib/src/analyzer/property_model.dart
index a4c1146..1691857 100644
--- a/pkg/dev_compiler/lib/src/analyzer/property_model.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/property_model.dart
@@ -131,8 +131,6 @@
 
   /// Returns true if a field inside this library is virtual.
   bool isVirtual(FieldElement field) {
-    // If the field was marked non-virtual, we know for sure.
-    if (!field.isVirtual) return false;
     if (field.isStatic) return false;
 
     var type = field.enclosingElement;
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_command.dart b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
index 225d6aa..4ba56d8 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_command.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
@@ -2,11 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
 import 'dart:collection';
-import 'dart:io' show Platform;
+import 'dart:io';
+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;
 import 'module_builder.dart';
+import '../analyzer/command.dart' as analyzer_compiler;
+import '../kernel/command.dart' as kernel_compiler;
+
+export 'package:front_end/src/api_unstable/ddc.dart'
+    show InitializedCompilerState;
 
 /// Shared code between Analyzer and Kernel CLI interfaces.
 ///
@@ -211,7 +220,10 @@
 
 /// Convert a [source] string to a Uri, where the source may be a
 /// dart/file/package URI or a local win/mac/linux path.
+///
+/// If [source] is null, this will return null.
 Uri sourcePathToUri(String source, {bool windows}) {
+  if (source == null) return null;
   if (windows == null) {
     // Running on the web the Platform check will fail, and we can't use
     // fromEnvironment because internally it's set to true for dart.library.io.
@@ -287,3 +299,165 @@
   map['file'] = makeRelative(map['file'] as String);
   return map;
 }
+
+/// Invoke the compiler with [args], optionally with the kernel backend if
+/// [isKernel] is set.
+///
+/// Returns a [CompilerResult], with a success flag indicating whether the
+/// program compiled without any fatal errors.
+///
+/// The result may also contain a [compilerState], which can be passed back in
+/// for batch/worker executions to attempt to existing state.
+Future<CompilerResult> compile(ParsedArguments args,
+    {InitializedCompilerState compilerState}) {
+  if (compilerState != null && (!args.isBatchOrWorker || !args.isKernel)) {
+    throw ArgumentError('compilerState requires --batch or --bazel_worker mode,'
+        ' and --kernel to be set.');
+  }
+  if (args.isKernel) {
+    return kernel_compiler.compile(args.rest, compilerState: compilerState);
+  } else {
+    var exitCode = analyzer_compiler.compile(args.rest);
+    if (args.isBatchOrWorker) {
+      AnalysisEngine.instance.clearCaches();
+    }
+    return Future.value(CompilerResult(exitCode));
+  }
+}
+
+/// The result of a single `dartdevc` compilation.
+///
+/// Typically used for exiting the proceess with [exitCode] or checking the
+/// [success] of the compilation.
+///
+/// For batch/worker compilations, the [compilerState] provides an opprotunity
+/// to reuse state from the previous run, if the options/input summaries are
+/// equiavlent. Otherwise it will be discarded.
+class CompilerResult {
+  /// Optionally provides the front_end state from the previous compilation,
+  /// which can be passed to [compile] to potentially speeed up the next
+  /// compilation.
+  ///
+  /// This field is unused when using the Analyzer-backend for DDC.
+  final InitializedCompilerState compilerState;
+
+  /// The process exit code of the compiler.
+  final int exitCode;
+
+  CompilerResult(this.exitCode, [this.compilerState]);
+
+  /// Whether the program compiled without any fatal errors (equivalent to
+  /// [exitCode] == 0).
+  bool get success => exitCode == 0;
+
+  /// Whether the compiler crashed (i.e. threw an unhandled exeception,
+  /// typically indicating an internal error in DDC itself or its front end).
+  bool get crashed => exitCode == 70;
+}
+
+/// Stores the result of preprocessing `dartdevc` command line arguments.
+///
+/// `dartdevc` preprocesses arguments to support some features that
+/// `package:args` does not handle (training `@` to reference arguments in a
+/// file).
+///
+/// [isBatch]/[isWorker] mode are preprocessed because they can combine
+/// argument lists from the initial invocation and from batch/worker jobs.
+///
+/// [isKernel] is also preprocessed because the Kernel backend supports
+/// different options compared to the Analyzer backend.
+class ParsedArguments {
+  /// The user's arguments to the compiler for this compialtion.
+  final List<String> rest;
+
+  /// Whether to run in `--batch` mode, e.g the Dart SDK and Language tests.
+  ///
+  /// Similar to [isWorker] but with a different protocol.
+  /// See also [isBatchOrWorker].
+  final bool isBatch;
+
+  /// Whether to run in `--bazel_worker` mode, e.g. for Bazel builds.
+  ///
+  /// Similar to [isBatch] but with a different protocol.
+  /// See also [isBatchOrWorker].
+  final bool isWorker;
+
+  /// Whether to use the Kernel-based back end for dartdevc.
+  ///
+  /// This is similar to the Analyzer-based back end, but uses Kernel trees
+  /// instead of Analyzer trees for representing the Dart code.
+  final bool isKernel;
+
+  ParsedArguments._(this.rest,
+      {this.isBatch = false, this.isWorker = false, this.isKernel = false});
+
+  /// Preprocess arguments to determine whether DDK is used in batch mode or as a
+  /// persistent worker.
+  ///
+  /// When used in batch mode, we expect a `--batch` parameter last.
+  ///
+  /// When used as a persistent bazel worker, the `--persistent_worker` might be
+  /// present, and an argument of the form `@path/to/file` might be provided. The
+  /// latter needs to be replaced by reading all the contents of the
+  /// file and expanding them into the resulting argument list.
+  factory ParsedArguments.from(List<String> args) {
+    if (args.isEmpty) return ParsedArguments._(args);
+
+    var newArgs = <String>[];
+    bool isWorker = false;
+    bool isBatch = false;
+    bool isKernel = false;
+    var len = args.length;
+    for (int i = 0; i < len; i++) {
+      var arg = args[i];
+      var isLastArg = i == len - 1;
+      if (isLastArg && arg.startsWith('@')) {
+        newArgs.addAll(_readLines(arg.substring(1)));
+      } else if (arg == '--persistent_worker') {
+        isWorker = true;
+      } else if (isLastArg && arg == '--batch') {
+        isBatch = true;
+      } else if (arg == '--kernel' || arg == '-k') {
+        isKernel = true;
+      } else {
+        newArgs.add(arg);
+      }
+    }
+    return ParsedArguments._(newArgs,
+        isWorker: isWorker, isBatch: isBatch, isKernel: isKernel);
+  }
+
+  /// Whether the compiler is running in [isBatch] or [isWorker] mode.
+  ///
+  /// Both modes are generally equivalent from the compiler's perspective,
+  /// the main difference is that they use distinct protocols to communicate
+  /// jobs to the compiler.
+  bool get isBatchOrWorker => isBatch || isWorker;
+
+  /// Merge [args] and return the new parsed arguments.
+  ///
+  /// Typically used when [isBatchOrWorker] is set to merge the compilation's
+  /// arguments with any global ones that were provided when the worker started.
+  ParsedArguments merge(List<String> arguments) {
+    // Parse the arguments again so `--kernel` can be passed. This provides
+    // added safety that we are really compiling in Kernel mode, if somehow the
+    // worker was not initialized correctly.
+    var newArgs = ParsedArguments.from(arguments);
+    if (newArgs.isBatchOrWorker) {
+      throw ArgumentError('cannot change batch or worker mode after startup.');
+    }
+    return ParsedArguments._(rest.toList()..addAll(newArgs.rest),
+        isWorker: isWorker,
+        isBatch: isBatch,
+        isKernel: isKernel || newArgs.isKernel);
+  }
+}
+
+/// Return all lines in a file found at [path].
+Iterable<String> _readLines(String path) {
+  try {
+    return File(path).readAsLinesSync().where((String line) => line.isNotEmpty);
+  } on FileSystemException catch (e) {
+    throw Exception('Failed to read $path: $e');
+  }
+}
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 55e1524..426bce2 100644
--- a/pkg/dev_compiler/lib/src/kernel/analyzer_to_kernel.dart
+++ b/pkg/dev_compiler/lib/src/kernel/analyzer_to_kernel.dart
@@ -79,9 +79,9 @@
   final _typeParams = HashMap<a.TypeParameterElement, TypeParameter>();
   final _namespaceBuilder = a.NamespaceBuilder();
 
-  AnalyzerToKernel._(a.AnalysisContext context, this._summaryData)
-      : _resynth = a.StoreBasedSummaryResynthesizer(
-            context, context.sourceFactory, /*strongMode*/ true, _summaryData),
+  AnalyzerToKernel._(a.AnalysisContextImpl context, this._summaryData)
+      : _resynth = (context.resultProvider as a.InputPackagesResultProvider)
+            .resynthesizer,
         types = context.typeProvider,
         rules = context.typeSystem as a.StrongTypeSystemImpl;
 
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 728ed88..b1876cb 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -8,6 +8,7 @@
 
 import 'package:args/args.dart';
 import 'package:build_integration/file_system/multi_root.dart';
+import 'package:cli_util/cli_util.dart' show getSdkPath;
 import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
 import 'package:kernel/kernel.dart';
@@ -26,13 +27,13 @@
 import 'compiler.dart';
 import 'target.dart';
 
-const _binaryName = 'dartdevk';
+const _binaryName = 'dartdevc -k';
 
 /// Invoke the compiler with [args].
 ///
 /// Returns `true` if the program compiled without any fatal errors.
 Future<CompilerResult> compile(List<String> args,
-    {fe.InitializedCompilerState compilerState}) async {
+    {InitializedCompilerState compilerState}) async {
   try {
     return await _compile(args, compilerState: compilerState);
   } catch (error, stackTrace) {
@@ -59,17 +60,8 @@
     'Usage: $_binaryName [options...] <sources...>\n\n'
     '${ddcArgParser.usage}';
 
-class CompilerResult {
-  final fe.InitializedCompilerState compilerState;
-  final bool success;
-
-  CompilerResult(this.compilerState, this.success);
-
-  CompilerResult.noState(this.success) : compilerState = null;
-}
-
 Future<CompilerResult> _compile(List<String> args,
-    {fe.InitializedCompilerState compilerState}) async {
+    {InitializedCompilerState compilerState}) async {
   // TODO(jmesserly): refactor options to share code with dartdevc CLI.
   var argParser = ArgParser(allowTrailingOptions: true)
     ..addFlag('help',
@@ -97,7 +89,7 @@
 
   if (argResults['help'] as bool || args.isEmpty) {
     print(_usageMessage(argParser));
-    return CompilerResult.noState(true);
+    return CompilerResult(0);
   }
 
   // To make the output .dill agnostic of the current working directory,
@@ -130,7 +122,6 @@
   }
 
   var options = SharedCompilerOptions.fromArguments(argResults);
-  var ddcPath = path.dirname(path.dirname(path.fromUri(Platform.script)));
   var summaryPaths = options.summaryModules.keys.toList();
   var summaryModules = Map.fromIterables(
       summaryPaths.map(sourcePathToUri), options.summaryModules.values);
@@ -139,16 +130,28 @@
       (useAnalyzer ? defaultAnalyzerSdkSummaryPath : defaultSdkSummaryPath);
   useAnalyzer = useAnalyzer || !sdkSummaryPath.endsWith('.dill');
 
-  var packageFile = argResults['packages'] as String ??
-      path.absolute(ddcPath, '..', '..', '.packages');
+  /// The .packages file path provided by the user.
+  //
+  // TODO(jmesserly): the default location is based on the current working
+  // directory, to match the behavior of dartanalyzer/dartdevc. However the
+  // Dart VM, CFE (and dart2js?) use the script file location instead. The
+  // difference may be due to the lack of a single entry point for DDC/Analyzer.
+  // Ultimately this is just the default behavior; in practice users call DDC
+  // through a build tool, which generally passes in `--packages=`.
+  //
+  // TODO(jmesserly): conceptually CFE should not need a .packages file to
+  // resolve package URIs that are in the input summaries, but it seems to.
+  // This needs further investigation.
+  var packageFile = argResults['packages'] as String ?? _findPackagesFilePath();
 
   var inputs = argResults.rest.map(sourcePathToCustomUri).toList();
 
   var succeeded = true;
-  void errorHandler(fe.CompilationMessage error) {
-    if (error.severity == fe.Severity.error) {
+  void diagnosticMessageHandler(fe.DiagnosticMessage message) {
+    if (message.severity == fe.Severity.error) {
       succeeded = false;
     }
+    fe.printDiagnosticMessage(message, print);
   }
 
   var oldCompilerState = compilerState;
@@ -175,14 +178,15 @@
     converter.dispose();
   }
 
-  fe.DdcResult result = await fe.compile(compilerState, inputs, errorHandler);
+  fe.DdcResult result =
+      await fe.compile(compilerState, inputs, diagnosticMessageHandler);
   if (result == null || !succeeded) {
-    return CompilerResult(compilerState, false);
+    return CompilerResult(1, compilerState);
   }
 
   var component = result.component;
   if (!options.emitMetadata && _checkForDartMirrorsImport(component)) {
-    return CompilerResult(compilerState, false);
+    return CompilerResult(1, compilerState);
   }
 
   var file = File(output);
@@ -211,7 +215,9 @@
     kernel.Printer(sink, showExternal: false).writeComponentFile(component);
     outFiles.add(sink.flush().then((_) => sink.close()));
   }
-  var compiler = ProgramCompiler(component, options, declaredVariables);
+  var target = compilerState.options.target as DevCompilerTarget;
+  var compiler =
+      ProgramCompiler(component, target.hierarchy, options, declaredVariables);
   var jsModule =
       compiler.emitModule(component, result.inputSummaries, summaryModules);
 
@@ -229,7 +235,7 @@
   }
 
   await Future.wait(outFiles);
-  return CompilerResult(compilerState, true);
+  return CompilerResult(0, compilerState);
 }
 
 /// The output of compiling a JavaScript module in a particular format.
@@ -318,17 +324,11 @@
 }
 
 /// The default path of the kernel summary for the Dart SDK.
-final defaultSdkSummaryPath = path.join(
-    path.dirname(path.dirname(Platform.resolvedExecutable)),
-    'lib',
-    '_internal',
-    'ddc_sdk.dill');
+final defaultSdkSummaryPath =
+    path.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.dill');
 
-final defaultAnalyzerSdkSummaryPath = path.join(
-    path.dirname(path.dirname(Platform.resolvedExecutable)),
-    'lib',
-    '_internal',
-    'ddc_sdk.sum');
+final defaultAnalyzerSdkSummaryPath =
+    path.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.sum');
 
 bool _checkForDartMirrorsImport(Component component) {
   for (var library in component.libraries) {
@@ -344,3 +344,29 @@
   }
   return false;
 }
+
+/// Returns the absolute path to the default `.packages` file, or `null` if one
+/// could not be found.
+///
+/// Checks for a `.packages` file in the current working directory, or in any
+/// parent directory.
+String _findPackagesFilePath() {
+  // TODO(jmesserly): this was copied from package:package_config/discovery.dart
+  // Unfortunately the relevant function is not public. CFE APIs require a URI
+  // to the .packages file, rather than letting us provide the package map data.
+  var dir = Directory.current;
+  if (!dir.isAbsolute) dir = dir.absolute;
+  if (!dir.existsSync()) return null;
+
+  // Check for $cwd/.packages
+  while (true) {
+    var file = File(path.join(dir.path, ".packages"));
+    if (file.existsSync()) return file.path;
+
+    // If we didn't find it, search the parent directory.
+    // Stop the search if we're already at the root.
+    var parent = dir.parent;
+    if (dir.path == parent.path) return null;
+    dir = parent;
+  }
+}
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 5d1aa99..3f2f995 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -195,11 +195,10 @@
 
   final NullableInference _nullableInference;
 
-  factory ProgramCompiler(Component component, SharedCompilerOptions options,
-      Map<String, String> declaredVariables) {
+  factory ProgramCompiler(Component component, ClassHierarchy hierarchy,
+      SharedCompilerOptions options, Map<String, String> declaredVariables) {
     var coreTypes = CoreTypes(component);
-    var types =
-        TypeSchemaEnvironment(coreTypes, ClassHierarchy(component), true);
+    var types = TypeSchemaEnvironment(coreTypes, hierarchy, true);
     var constants = DevCompilerConstants(types, declaredVariables);
     var nativeTypes = NativeTypeSet(coreTypes, constants);
     var jsTypeRep = JSTypeRep(types);
@@ -433,10 +432,8 @@
       _emitLibraryProcedures(library);
       _emitTopLevelFields(library.fields);
       library.classes.forEach(_emitClass);
-      library.typedefs.forEach(_emitTypedef);
     } else {
       library.classes.forEach(_emitClass);
-      library.typedefs.forEach(_emitTypedef);
       _emitLibraryProcedures(library);
       _emitTopLevelFields(library.fields);
     }
@@ -1786,7 +1783,7 @@
         JS.Method(
             name,
             js.fun('function(x) { return super.# = #; }',
-                [name, _emitImplicitCast(JS.Identifier('x'), setterType)]),
+                [name, _emitCast(JS.Identifier('x'), setterType)]),
             isSetter: true),
         JS.Method(name, js.fun('function() { return super.#; }', [name]),
             isGetter: true)
@@ -1812,8 +1809,7 @@
 
       if (isCovariant(param) &&
           !isCovariant(superMember.function.positionalParameters[i])) {
-        var check =
-            _emitImplicitCast(jsParam, superMethodType.positionalParameters[i]);
+        var check = _emitCast(jsParam, superMethodType.positionalParameters[i]);
         if (i >= function.requiredParameterCount) {
           body.add(js.statement('if (# !== void 0) #;', [jsParam, check]));
         } else {
@@ -1832,8 +1828,7 @@
         body.add(js.statement('if (# in #) #;', [
           name,
           namedArgumentTemp,
-          _emitImplicitCast(
-              JS.PropertyAccess(namedArgumentTemp, name), paramType.type)
+          _emitCast(JS.PropertyAccess(namedArgumentTemp, name), paramType.type)
         ]));
       }
     }
@@ -1880,7 +1875,7 @@
 
     JS.Expression value = JS.Identifier('value');
     if (!field.isFinal && field.isGenericCovariantImpl) {
-      value = _emitImplicitCast(value, field.type);
+      value = _emitCast(value, field.type);
     }
     args.add(value);
 
@@ -2003,24 +1998,6 @@
         'registerExtension(#, #)', [js.string(jsPeerName), className]));
   }
 
-  void _emitTypedef(Typedef t) {
-    var savedUri = _currentUri;
-    _currentUri = t.fileUri;
-    var body = runtimeCall('typedef(#, () => #)',
-        [js.string(t.name, "'"), visitFunctionType(t.type)]);
-
-    JS.Statement result;
-    if (t.typeParameters.isNotEmpty) {
-      result = _defineClassTypeArguments(
-          t, t.typeParameters, js.statement('const # = #;', [t.name, body]));
-    } else {
-      result = js.statement('# = #;', [_emitTopLevelName(t), body]);
-    }
-
-    _currentUri = savedUri;
-    moduleItems.add(result);
-  }
-
   void _emitTopLevelFields(List<Field> fields) {
     if (isSdkInternalRuntime(_currentLibrary)) {
       /// Treat dart:_runtime fields as safe to eagerly evaluate.
@@ -2421,23 +2398,38 @@
 
   JS.Expression _emitFunctionTagged(JS.Expression fn, FunctionType type,
       {bool topLevel = false}) {
-    var lazy = topLevel && !_typeIsLoaded(type);
+    var lazy = topLevel && !_canEmitTypeAtTopLevel(type);
     var typeRep = visitFunctionType(type, lazy: lazy);
     return runtimeCall(lazy ? 'lazyFn(#, #)' : 'fn(#, #)', [fn, typeRep]);
   }
 
-  bool _typeIsLoaded(DartType type) {
+  /// Whether the expression for [type] can be evaluated at this point in the JS
+  /// module.
+  ///
+  /// Types cannot be evaluated if they depend on something that hasn't been
+  /// defined yet. For example:
+  ///
+  ///     C foo() => null;
+  ///     class C {}
+  ///
+  /// If we're emitting the type information for `foo`, we cannot refer to `C`
+  /// yet, so we must evaluate foo's type lazily.
+  bool _canEmitTypeAtTopLevel(DartType type) {
     if (type is InterfaceType) {
       return !_pendingClasses.contains(type.classNode) &&
-          type.typeArguments.every(_typeIsLoaded);
+          type.typeArguments.every(_canEmitTypeAtTopLevel);
     }
     if (type is FunctionType) {
-      return (_typeIsLoaded(type.returnType) &&
-          type.positionalParameters.every(_typeIsLoaded) &&
-          type.namedParameters.every((n) => _typeIsLoaded(n.type)));
+      // Generic functions are always safe to emit, because they're lazy until
+      // type arguments are applied.
+      if (type.typeParameters.isNotEmpty) return true;
+
+      return (_canEmitTypeAtTopLevel(type.returnType) &&
+          type.positionalParameters.every(_canEmitTypeAtTopLevel) &&
+          type.namedParameters.every((n) => _canEmitTypeAtTopLevel(n.type)));
     }
     if (type is TypedefType) {
-      return type.typeArguments.every(_typeIsLoaded);
+      return type.typeArguments.every(_canEmitTypeAtTopLevel);
     }
     return true;
   }
@@ -2467,7 +2459,7 @@
   visitBottomType(type) => runtimeCall('bottom');
 
   @override
-  visitInterfaceType(type, {bool lowerGeneric = false}) {
+  visitInterfaceType(type) {
     var c = type.classNode;
     _declareBeforeUse(c);
 
@@ -2498,8 +2490,6 @@
     Iterable<JS.Expression> jsArgs = null;
     if (args.any((a) => a != const DynamicType())) {
       jsArgs = args.map(_emitType);
-    } else if (lowerGeneric) {
-      jsArgs = [];
     }
     if (jsArgs != null) {
       var typeRep = _emitGenericClassType(type, jsArgs);
@@ -2690,23 +2680,7 @@
   }
 
   @override
-  visitTypedefType(type, {bool lowerGeneric = false}) {
-    var args = type.typeArguments;
-    List<JS.Expression> jsArgs = null;
-    if (args.any((a) => a != const DynamicType())) {
-      jsArgs = args.map(_emitType).toList();
-    } else if (lowerGeneric) {
-      jsArgs = [];
-    }
-    if (jsArgs != null) {
-      var genericName =
-          _emitTopLevelNameNoInterop(type.typedefNode, suffix: '\$');
-      var typeRep = JS.Call(genericName, jsArgs);
-      return _cacheTypes ? _typeTable.nameType(type, typeRep) : typeRep;
-    }
-
-    return _emitTopLevelNameNoInterop(type.typedefNode);
-  }
+  visitTypedefType(type) => visitFunctionType(type.unalias);
 
   JS.Fun _emitFunction(FunctionNode f, String name) {
     // normal function (sync), vs (sync*, async, async*)
@@ -2911,7 +2885,7 @@
 
     initParameter(VariableDeclaration p, JS.Identifier jsParam) {
       if (isCovariant(p)) {
-        var castExpr = _emitImplicitCast(jsParam, p.type);
+        var castExpr = _emitCast(jsParam, p.type);
         if (!identical(castExpr, jsParam)) body.add(castExpr.toStatement());
       }
       if (_annotatedNullCheck(p.annotations)) {
@@ -4785,15 +4759,15 @@
       return jsFrom;
     }
 
-    return isTypeError
-        ? _emitImplicitCast(jsFrom, to)
-        : js.call('#.as(#)', [_emitType(to), jsFrom]);
+    return _emitCast(jsFrom, to, implicit: isTypeError);
   }
 
-  JS.Expression _emitImplicitCast(JS.Expression expr, DartType type) {
-    return types.isTop(type)
-        ? expr
-        : js.call('#._check(#)', [_emitType(type), expr]);
+  JS.Expression _emitCast(JS.Expression expr, DartType type,
+      {bool implicit = true}) {
+    if (types.isTop(type)) return expr;
+
+    var code = implicit ? '#._check(#)' : '#.as(#)';
+    return js.call(code, [_emitType(type), expr]);
   }
 
   @override
diff --git a/pkg/dev_compiler/lib/src/kernel/constants.dart b/pkg/dev_compiler/lib/src/kernel/constants.dart
index 8838cae..b8b52f5 100644
--- a/pkg/dev_compiler/lib/src/kernel/constants.dart
+++ b/pkg/dev_compiler/lib/src/kernel/constants.dart
@@ -181,12 +181,7 @@
 
   _ConstantEvaluator(TypeEnvironment types, this.declaredVariables,
       {bool enableAsserts})
-      : unavailableConstant = InstanceConstant(
-            types.coreTypes.index
-                .getClass('dart:core', '_ConstantExpressionError')
-                .reference,
-            [],
-            {}),
+      : unavailableConstant = InstanceConstant(null, [], {}),
         super(_ConstantsBackend(types.coreTypes), types, types.coreTypes, true,
             enableAsserts, const _ErrorReporter()) {
     env = EvaluationEnvironment();
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index 27b4e85..945e41a 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -230,7 +230,8 @@
 
   var sc = c.superclass;
   for (; sc.isAnonymousMixin; sc = sc.superclass) {
-    mixins.add(sc.mixedInClass);
+    mixedInClass = sc.mixedInClass;
+    if (mixedInClass != null) mixins.add(sc.mixedInClass);
   }
   return sc;
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 170221c..6258cc0 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -10,6 +10,8 @@
 
 /// A kernel [Target] to configure the Dart Front End for dartdevc.
 class DevCompilerTarget extends Target {
+  ClassHierarchy hierarchy;
+
   bool get strongMode => true; // the only correct answer
 
   bool get enableSuperMixins => true;
@@ -68,7 +70,9 @@
   @override
   void performModularTransformationsOnLibraries(Component component,
       CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
-      {void logger(String msg)}) {}
+      {void logger(String msg)}) {
+    this.hierarchy = hierarchy;
+  }
 
   @override
   Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index 4a986e2..651ab0a 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -546,10 +546,11 @@
 
 Future<Component> kernelCompile(String code) async {
   var succeeded = true;
-  void errorHandler(fe.CompilationMessage error) {
-    if (error.severity == fe.Severity.error) {
+  void diagnosticMessageHandler(fe.DiagnosticMessage message) {
+    if (message.severity == fe.Severity.error) {
       succeeded = false;
     }
+    fe.printDiagnosticMessage(message, print);
   }
 
   var sdkUri = Uri.file('/memory/dart_sdk.dill');
@@ -577,7 +578,7 @@
       _compilerState, sdkUri, packagesUri, [], DevCompilerTarget(),
       fileSystem: _fileSystem);
   fe.DdcResult result =
-      await fe.compile(_compilerState, [mainUri], errorHandler);
+      await fe.compile(_compilerState, [mainUri], diagnosticMessageHandler);
   expect(succeeded, true);
   return result.component;
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
index 74f55ac..f506a42 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
@@ -54,7 +54,7 @@
 
   @patch
   String toString() =>
-      "Instance of '${dart.wrapType(dart.getReifiedType(this))}'";
+      "Instance of '${dart.typeName(dart.getReifiedType(this))}'";
 
   @patch
   noSuchMethod(Invocation invocation) {
@@ -198,7 +198,7 @@
 class Error {
   @patch
   static String _objectToString(Object object) {
-    return "Instance of '${dart.wrapType(dart.getReifiedType(object))}'";
+    return "Instance of '${dart.typeName(dart.getReifiedType(object))}'";
   }
 
   @patch
@@ -729,12 +729,6 @@
   }
 }
 
-@patch
-class _ConstantExpressionError {
-  @patch
-  _throw(error) => throw error;
-}
-
 // TODO(jmesserly): this class is supposed to be obsolete in Strong Mode, but
 // the front-end crashes without it
 class _DuplicatedFieldInitializerError {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
index 2ee31f5..3797606 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
@@ -113,23 +113,6 @@
   }
 }
 
-/// Given an internal runtime type object, wraps it in a `WrappedType` object
-/// that implements the dart:core Type interface.
-Type wrapType(type) {
-  // If we've already wrapped this type once, use the previous wrapper. This
-  // way, multiple references to the same type return an identical Type.
-  if (JS('!', '#.hasOwnProperty(#)', type, _typeObject)) {
-    return JS('', '#[#]', type, _typeObject);
-  }
-  return JS('Type', '#[#] = #', type, _typeObject, WrappedType(type));
-}
-
-/// The symbol used to store the cached `Type` object associated with a class.
-final _typeObject = JS('', 'Symbol("typeObject")');
-
-/// Given a WrappedType, return the internal runtime type object.
-unwrapType(WrappedType obj) => obj._wrappedType;
-
 /// Return the module name for a raw library object.
 getModuleName(value) => JS('', '#[#]', value, _moduleName);
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
index 23d25f7..c7ab6d8 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
@@ -17,7 +17,7 @@
 ///     and the type arguments with which it was instantiated.  This
 ///     association can be queried via the "classes" module".
 ///
-///   - All other types are represented as instances of class TypeRep,
+///   - All other types are represented as instances of class [DartType],
 ///     defined in this module.
 ///     - Dynamic, Void, and Bottom are singleton instances of sentinal
 ///       classes.
@@ -52,7 +52,7 @@
 /// types, etc.)
 // TODO(jmesserly): we shouldn't implement Type here. It should be moved down
 // to AbstractFunctionType.
-class TypeRep implements Type {
+class DartType implements Type {
   String get name => this.toString();
 
   // TODO(jmesserly): these should never be reached, can be make them abstract?
@@ -67,7 +67,7 @@
   check_T(object) => cast(object, this, true);
 }
 
-class DynamicType extends TypeRep {
+class DynamicType extends DartType {
   toString() => 'dynamic';
 
   @JSExportName('is')
@@ -89,7 +89,7 @@
 /// because it's not available (such as with mocks). To handle this gracefully,
 /// we disable type checks for in these cases, and allow any JS object to work
 /// as if it were an instance of this JS type.
-class LazyJSType extends TypeRep {
+class LazyJSType extends DartType {
   Function() _getRawJSTypeFn;
   @notNull
   final String _dartName;
@@ -147,7 +147,7 @@
 /// An anonymous JS type
 ///
 /// For the purposes of subtype checks, these match any JS type.
-class AnonymousJSType extends TypeRep {
+class AnonymousJSType extends DartType {
   final String _dartName;
   AnonymousJSType(this._dartName);
   toString() => _dartName;
@@ -190,33 +190,62 @@
 @JSExportName('dynamic')
 final _dynamic = DynamicType();
 
-class VoidType extends TypeRep {
+class VoidType extends DartType {
   toString() => 'void';
 }
 
 @JSExportName('void')
 final void_ = VoidType();
 
-class BottomType extends TypeRep {
+class BottomType extends DartType {
   toString() => 'bottom';
 }
 
 final bottom = BottomType();
 
-class JSObjectType extends TypeRep {
+class JSObjectType extends DartType {
   toString() => 'NativeJavaScriptObject';
 }
 
 final jsobject = JSObjectType();
 
-class WrappedType extends Type {
-  final _wrappedType;
-  WrappedType(this._wrappedType);
-  toString() => typeName(_wrappedType);
+/// Dev Compiler's implementation of Type, wrapping its internal [_type].
+class _Type extends Type {
+  /// The internal type representation, either a [DartType] or class constructor
+  /// function.
+  // TODO(jmesserly): introduce InterfaceType so we don't have to special case
+  // classes
+  @notNull
+  final Object _type;
+
+  _Type(this._type);
+
+  toString() => typeName(_type);
+
+  Type get runtimeType => Type;
 }
 
+/// Given an internal runtime type object, wraps it in a `_Type` object
+/// that implements the dart:core Type interface.
+Type wrapType(type) {
+  // If we've already wrapped this type once, use the previous wrapper. This
+  // way, multiple references to the same type return an identical Type.
+  if (JS('!', '#.hasOwnProperty(#)', type, _typeObject)) {
+    return JS('', '#[#]', type, _typeObject);
+  }
+  var result = _Type(type);
+  JS('', '#[#] = #', type, _typeObject, result);
+  return result;
+}
+
+/// The symbol used to store the cached `Type` object associated with a class.
+final _typeObject = JS('', 'Symbol("typeObject")');
+
+/// Given a WrappedType, return the internal runtime type object.
+Object unwrapType(_Type obj) => obj._type;
+
 // Marker class for generic functions, typedefs, and non-generic functions.
-abstract class AbstractFunctionType extends TypeRep {}
+abstract class AbstractFunctionType extends DartType {}
 
 /// Memo table for named argument groups. A named argument packet
 /// {name1 : type1, ..., namen : typen} corresponds to the path
@@ -472,48 +501,8 @@
   check_T(obj) => as_T(obj, true);
 }
 
-class Typedef extends AbstractFunctionType {
-  dynamic _name;
-  AbstractFunctionType Function() _closure;
-  AbstractFunctionType _functionType;
-
-  Typedef(this._name, this._closure) {}
-
-  toString() {
-    var typeArgs = getGenericArgs(this);
-    if (typeArgs == null) return name;
-
-    var result = name + '<';
-    var allDynamic = true;
-    for (int i = 0, n = JS('!', '#.length', typeArgs); i < n; ++i) {
-      if (i > 0) result += ', ';
-      var typeArg = JS('', '#[#]', typeArgs, i);
-      if (JS('!', '# !== #', typeArg, _dynamic)) allDynamic = false;
-      result += typeName(typeArg);
-    }
-    result += '>';
-    return allDynamic ? name : result;
-  }
-
-  String get name => JS('!', '#', _name);
-
-  AbstractFunctionType get functionType {
-    var ft = _functionType;
-    return ft == null ? _functionType = _closure() : ft;
-  }
-
-  @JSExportName('is')
-  bool is_T(object) => functionType.is_T(object);
-
-  @JSExportName('as')
-  as_T(object) => functionType.as_T(object);
-
-  @JSExportName('_check')
-  check_T(object) => functionType.check_T(object);
-}
-
 /// A type variable, used by [GenericFunctionType] to represent a type formal.
-class TypeVariable extends TypeRep {
+class TypeVariable extends DartType {
   final String name;
 
   TypeVariable(this.name);
@@ -711,9 +700,6 @@
   }
 }
 
-Typedef typedef(name, AbstractFunctionType Function() closure) =>
-    Typedef(name, closure);
-
 /// Create a function type.
 FunctionType fnType(returnType, List args, [extra = undefined]) =>
     FunctionType.create(returnType, args, extra);
@@ -742,6 +728,8 @@
   return type;
 }
 
+/// Whether the given JS constructor [obj] is a Dart class type.
+@notNull
 bool isType(obj) => JS('', '#[#] === #', obj, _runtimeType, Type);
 
 void checkTypeBound(type, bound, name) {
@@ -752,11 +740,12 @@
   throwTypeError('type `$type` does not extend `$bound` of `$name`.');
 }
 
+@notNull
 String typeName(type) => JS('', '''(() => {
   if ($type === void 0) return "undefined type";
   if ($type === null) return "null type";
   // Non-instance types
-  if ($type instanceof $TypeRep) {
+  if ($type instanceof $DartType) {
     return $type.toString();
   }
 
@@ -961,10 +950,6 @@
   // Function subtyping.
   if (!($t1 instanceof $AbstractFunctionType)) return false;
 
-  // Unwrap typedefs.
-  if ($t1 instanceof $Typedef) $t1 = $t1.functionType;
-  if ($t2 instanceof $Typedef) $t2 = $t2.functionType;
-
   // Handle generic functions.
   if ($t1 instanceof $GenericFunctionType) {
     if (!($t2 instanceof $GenericFunctionType)) return false;
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index ab3767f..6e8e5d3 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -54,8 +54,9 @@
   await Directory(outputDir).create(recursive: true);
   await writeComponentToBinary(component, outputPath);
 
-  var jsModule = ProgramCompiler(component, SharedCompilerOptions(), {})
-      .emitModule(component, [], {});
+  var jsModule =
+      ProgramCompiler(component, target.hierarchy, SharedCompilerOptions(), {})
+          .emitModule(component, [], {});
   var moduleFormats = {
     'amd': ModuleFormat.amd,
     'common': ModuleFormat.common,
diff --git a/pkg/diagnostic/CHANGELOG.md b/pkg/diagnostic/CHANGELOG.md
new file mode 100644
index 0000000..cb12c59
--- /dev/null
+++ b/pkg/diagnostic/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 0.1.0
+
+* Initial version
diff --git a/pkg/diagnostic/LICENSE b/pkg/diagnostic/LICENSE
new file mode 100644
index 0000000..c4dc9ba
--- /dev/null
+++ b/pkg/diagnostic/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2018, 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/diagnostic/README.md b/pkg/diagnostic/README.md
new file mode 100644
index 0000000..c71c3a7
--- /dev/null
+++ b/pkg/diagnostic/README.md
@@ -0,0 +1,14 @@
+# Diagnostics for Dart
+
+This package defines the support used by Dart tools to represent diagnostics, and the diagnostic codes that are shared
+by those tools.
+
+## Support
+
+Post issues and feature requests at https://github.com/dart-lang/sdk/issues
+
+## License
+
+See the [LICENSE] file.
+
+[LICENSE]: https://github.com/dart-lang/sdk/blob/master/pkg/diagnostic/LICENSE
diff --git a/pkg/diagnostic/doc/diagnostics.md b/pkg/diagnostic/doc/diagnostics.md
new file mode 100644
index 0000000..b0261a5
--- /dev/null
+++ b/pkg/diagnostic/doc/diagnostics.md
@@ -0,0 +1,4 @@
+# Diagnostics Design
+
+This document discusses the principles used to design the diagnostics used by
+Dart tooling.
diff --git a/pkg/diagnostic/lib/diagnostic.dart b/pkg/diagnostic/lib/diagnostic.dart
new file mode 100644
index 0000000..babf863
--- /dev/null
+++ b/pkg/diagnostic/lib/diagnostic.dart
@@ -0,0 +1,3 @@
+// 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.
diff --git a/pkg/diagnostic/pubspec.yaml b/pkg/diagnostic/pubspec.yaml
new file mode 100644
index 0000000..1ab1973
--- /dev/null
+++ b/pkg/diagnostic/pubspec.yaml
@@ -0,0 +1,7 @@
+name: diagnostic
+version: 0.1.0
+author: Dart Team <misc@dartlang.org>
+description: Diagnostics for Dart
+homepage: https://github.com/dart-lang/sdk/tree/master/pkg/diagnostic
+environment:
+  sdk: '>=2.0.0-dev.48.0 <3.0.0'
diff --git a/pkg/front_end/lib/src/api_prototype/byte_store.dart b/pkg/front_end/lib/src/api_prototype/byte_store.dart
deleted file mode 100644
index b44bb6e..0000000
--- a/pkg/front_end/lib/src/api_prototype/byte_store.dart
+++ /dev/null
@@ -1,10 +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 front_end.byte_store;
-
-export '../byte_store/byte_store.dart'
-    show ByteStore, MemoryByteStore, MemoryCachingByteStore, NullByteStore;
-export '../byte_store/file_byte_store.dart'
-    show EvictingFileByteStore, FileByteStore;
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 5c0624d..076ec72 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -6,16 +6,14 @@
 
 import 'package:kernel/target/targets.dart' show Target;
 
-import '../base/performance_logger.dart' show PerformanceLog;
-
 import '../fasta/fasta_codes.dart' show FormattedMessage;
 
 import '../fasta/severity.dart' show Severity;
 
-import 'byte_store.dart' show ByteStore, NullByteStore;
-
 import 'compilation_message.dart' show CompilationMessage;
 
+import 'diagnostic_message.dart' show DiagnosticMessageHandler;
+
 import 'file_system.dart' show FileSystem;
 
 import 'standard_file_system.dart' show StandardFileSystem;
@@ -24,6 +22,8 @@
 
 export '../fasta/severity.dart' show Severity;
 
+export 'diagnostic_message.dart' show DiagnosticMessage;
+
 /// Callback used to report errors encountered during compilation.
 typedef void ErrorHandler(CompilationMessage error);
 
@@ -60,6 +60,8 @@
 
   ProblemHandler onProblem;
 
+  DiagnosticMessageHandler onDiagnostic;
+
   /// Whether messages should be reported using the compiler's internal
   /// reporting mechanism.
   ///
@@ -126,12 +128,6 @@
   /// file system.  TODO(paulberry): fix this.
   FileSystem fileSystem = StandardFileSystem.instance;
 
-  /// The byte storage to access serialized data.
-  ByteStore byteStore = new NullByteStore();
-
-  /// The logger to report compilation progress.
-  PerformanceLog logger = new PerformanceLog(new StringBuffer());
-
   /// Whether to generate code for the SDK.
   ///
   /// By default the front end resolves components using a prebuilt SDK summary.
diff --git a/pkg/front_end/lib/src/api_prototype/diagnostic_message.dart b/pkg/front_end/lib/src/api_prototype/diagnostic_message.dart
new file mode 100644
index 0000000..b4497d0
--- /dev/null
+++ b/pkg/front_end/lib/src/api_prototype/diagnostic_message.dart
@@ -0,0 +1,38 @@
+// 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 front_end.diagnostic_message;
+
+import '../fasta/severity.dart' show Severity;
+
+/// The type of a diagnostic message callback. For example:
+///
+///    void handler(DiagnosticMessage message) {
+///      if (enableTerminalColors) { // See [terminal_color_support.dart].
+///        message.ansiFormatted.forEach(stderr.writeln);
+///      } else {
+///        message.plainTextFormatted.forEach(stderr.writeln);
+///      }
+///    }
+typedef DiagnosticMessageHandler = void Function(DiagnosticMessage);
+
+/// Represents a diagnostic message that can be reported from a tool, for
+/// example, a compiler.
+///
+/// The word *diagnostic* is used loosely here, as a tool may also use this for
+/// reporting any kind of message, including non-diagnostic messages such as
+/// licensing, informal, or logging information. This allows a well-behaved
+/// tool to never directly write to stdout or stderr.
+abstract class DiagnosticMessage {
+  DiagnosticMessage._(); // Prevent subclassing.
+
+  Iterable<String> get ansiFormatted;
+
+  Iterable<String> get plainTextFormatted;
+
+  Severity get severity;
+
+  // TODO(ahe): Rename this, it's actually an error code.
+  int get index;
+}
diff --git a/pkg/front_end/lib/src/api_prototype/standard_file_system.dart b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
index 6c22bba..5be815e 100644
--- a/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
@@ -28,7 +28,7 @@
       // TODO(askesc): Empty schemes should have been handled elsewhere.
       return new _IoFileSystemEntity(Uri.base.resolveUri(uri));
     } else if (uri.scheme == 'data') {
-      return new _DataFileSystemEntity(Uri.base.resolveUri(uri));
+      return new DataFileSystemEntity(Uri.base.resolveUri(uri));
     } else {
       throw new FileSystemException(
           uri, 'StandardFileSystem only supports file:* and data:* URIs');
@@ -93,18 +93,18 @@
 }
 
 /// Concrete implementation of [FileSystemEntity] for data: URIs.
-class _DataFileSystemEntity implements FileSystemEntity {
+class DataFileSystemEntity implements FileSystemEntity {
   @override
   final Uri uri;
 
-  _DataFileSystemEntity(this.uri);
+  DataFileSystemEntity(this.uri);
 
   @override
   int get hashCode => uri.hashCode;
 
   @override
   bool operator ==(Object other) =>
-      other is _DataFileSystemEntity && other.uri == uri;
+      other is DataFileSystemEntity && other.uri == uri;
 
   @override
   Future<bool> exists() async {
diff --git a/pkg/front_end/lib/src/api_prototype/terminal_color_support.dart b/pkg/front_end/lib/src/api_prototype/terminal_color_support.dart
new file mode 100644
index 0000000..382cdb1
--- /dev/null
+++ b/pkg/front_end/lib/src/api_prototype/terminal_color_support.dart
@@ -0,0 +1,100 @@
+// 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 front_end.terminal_color_support;
+
+import 'dart:convert' show jsonEncode;
+
+import 'dart:io' show Platform, Process, ProcessResult, stderr, stdout;
+
+import '../fasta/colors.dart' show ALL_CODES, TERMINAL_CAPABILITIES;
+
+/// True if we should enable colors in output.
+///
+/// We enable colors only when both [stdout] and [stderr] support ANSI escapes.
+final bool enableTerminalColors = _computeEnableColors();
+
+/// On Windows, colors are enabled if both stdout and stderr supports ANSI
+/// escapes.  On other platforms, we rely on the external programs `tty` and
+/// `tput` to compute if ANSI colors are supported.
+bool _computeEnableColors() {
+  const bool debug =
+      const bool.fromEnvironment("front_end.debug_compute_enable_colors");
+
+  if (Platform.isWindows) {
+    if (!stdout.supportsAnsiEscapes || !stderr.supportsAnsiEscapes) {
+      // In this case, either [stdout] or [stderr] did not support the property
+      // `supportsAnsiEscapes`. Since we do not have another way to determine
+      // support for colors, we disable them.
+      if (debug) {
+        print("Not enabling colors as ANSI is not supported.");
+      }
+      return false;
+    }
+    if (debug) {
+      print("Enabling colors as OS is Windows.");
+    }
+    return true;
+  }
+
+  // We have to check if the terminal actually supports colors. Currently, to
+  // avoid linking the Dart VM with ncurses, ANSI escape support is reduced to
+  // `Platform.environment['TERM'].contains("xterm")`.
+
+  // Check if stdin is a terminal (TTY).
+  ProcessResult result =
+      Process.runSync("/bin/sh", ["-c", "tty > /dev/null 2> /dev/null"]);
+
+  if (result.exitCode != 0) {
+    if (debug) {
+      print("Not enabling colors, stdin isn't a terminal.");
+    }
+    return false;
+  }
+
+  // The `-S` option of `tput` allows us to query multiple capabilities at
+  // once.
+  result = Process.runSync(
+      "/bin/sh", ["-c", "printf '%s' '$TERMINAL_CAPABILITIES' | tput -S"]);
+
+  if (result.exitCode != 0) {
+    if (debug) {
+      print("Not enabling colors, running tput failed.");
+    }
+    return false;
+  }
+
+  List<String> lines = result.stdout.split("\n");
+
+  if (lines.length != 2) {
+    if (debug) {
+      print("Not enabling colors, unexpected output from tput: "
+          "${jsonEncode(result.stdout)}.");
+    }
+    return false;
+  }
+
+  String numberOfColors = lines[0];
+  if (int.parse(numberOfColors, onError: (_) => -1) < 8) {
+    if (debug) {
+      print("Not enabling colors, less than 8 colors supported: "
+          "${jsonEncode(numberOfColors)}.");
+    }
+    return false;
+  }
+
+  String allCodes = lines[1].trim();
+  if (ALL_CODES != allCodes) {
+    if (debug) {
+      print("Not enabling colors, color codes don't match: "
+          "${jsonEncode(ALL_CODES)} != ${jsonEncode(allCodes)}.");
+    }
+    return false;
+  }
+
+  if (debug) {
+    print("Enabling colors.");
+  }
+  return true;
+}
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index f90e4f1..f6a3ce0 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -8,8 +8,9 @@
 
 import 'package:kernel/target/targets.dart' show Target;
 
-import '../api_prototype/compiler_options.dart'
-    show CompilerOptions, ErrorHandler;
+import '../api_prototype/compiler_options.dart' show CompilerOptions;
+
+import '../api_prototype/diagnostic_message.dart' show DiagnosticMessageHandler;
 
 import '../api_prototype/file_system.dart' show FileSystem;
 
@@ -17,16 +18,79 @@
 
 import '../fasta/compiler_context.dart' show CompilerContext;
 
-import '../fasta/fasta_codes.dart' show messageMissingMain, noLength;
+import '../fasta/fasta_codes.dart' show messageMissingMain;
 
 import '../fasta/severity.dart' show Severity;
 
 import '../kernel_generator_impl.dart' show generateKernelInternal;
 
+import '../fasta/scanner.dart' show ErrorToken, StringToken, Token;
+
 import 'compiler_state.dart' show InitializedCompilerState;
 
+export '../api_prototype/compiler_options.dart' show CompilerOptions;
+
+export '../api_prototype/diagnostic_message.dart' show DiagnosticMessage;
+
+export '../api_prototype/file_system.dart'
+    show FileSystem, FileSystemEntity, FileSystemException;
+
+export '../api_prototype/kernel_generator.dart' show kernelForProgram;
+
+export '../api_prototype/standard_file_system.dart' show DataFileSystemEntity;
+
+export '../compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+
+export '../fasta/fasta_codes.dart' show FormattedMessage;
+
+export '../fasta/kernel/redirecting_factory_body.dart'
+    show RedirectingFactoryBody;
+
+export '../fasta/operator.dart' show operatorFromString;
+
+export '../fasta/parser/async_modifier.dart' show AsyncModifier;
+
+export '../fasta/scanner.dart' show isUserDefinableOperator, isMinusOperator;
+
+export '../fasta/scanner/characters.dart'
+    show
+        $$,
+        $0,
+        $9,
+        $A,
+        $BACKSLASH,
+        $CR,
+        $DEL,
+        $DQ,
+        $HASH,
+        $LF,
+        $LS,
+        $PS,
+        $TAB,
+        $Z,
+        $_,
+        $a,
+        $g,
+        $s,
+        $z;
+
+export '../fasta/severity.dart' show Severity;
+
+export '../fasta/util/link.dart' show Link, LinkBuilder;
+
+export '../fasta/util/link_implementation.dart' show LinkEntry;
+
+export '../fasta/util/relativize.dart' show relativizeUri;
+
 export 'compiler_state.dart' show InitializedCompilerState;
 
+void clearStringTokenCanonicalizer() {
+  // TODO(ahe): We should be able to remove this. Fasta should take care of
+  // clearing the cache when.
+  StringToken.canonicalizer.clear();
+}
+
 InitializedCompilerState initializeCompiler(
     InitializedCompilerState oldState,
     Target target,
@@ -52,11 +116,15 @@
   return new InitializedCompilerState(options, processedOpts);
 }
 
-Future<Component> compile(InitializedCompilerState state, bool verbose,
-    FileSystem fileSystem, ErrorHandler onError, Uri input) async {
+Future<Component> compile(
+    InitializedCompilerState state,
+    bool verbose,
+    FileSystem fileSystem,
+    DiagnosticMessageHandler onDiagnostic,
+    Uri input) async {
   CompilerOptions options = state.options;
   options
-    ..onError = onError
+    ..onDiagnostic = onDiagnostic
     ..verbose = verbose
     ..fileSystem = fileSystem;
 
@@ -72,7 +140,7 @@
     if (component == null) return null;
     if (component.mainMethod == null) {
       context.options.report(
-          messageMissingMain.withLocation(input, -1, noLength), Severity.error);
+          messageMissingMain.withLocation(input, -1, 0), Severity.error);
       return null;
     }
     return compilerResult;
@@ -80,7 +148,20 @@
 
   // Remove these parameters from [options] - they are no longer needed and
   // retain state from the previous compile. (http://dartbug.com/33708)
-  options.onError = null;
+  options.onDiagnostic = null;
   options.fileSystem = null;
   return compilerResult?.component;
 }
+
+Object tokenToString(Object value) {
+  // TODO(ahe): This method is most likely unnecessary. Dart2js doesn't see
+  // tokens anymore.
+  if (value is ErrorToken) {
+    // Shouldn't happen.
+    return value.assertionMessage.message;
+  } else if (value is Token) {
+    return value.lexeme;
+  } else {
+    return value;
+  }
+}
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index 6dfcb2b..a0615a3 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -5,19 +5,30 @@
 import 'dart:async' show Future;
 
 import 'package:kernel/kernel.dart' show Component;
+
 import 'package:kernel/target/targets.dart' show Target;
 
-import '../api_prototype/file_system.dart';
-import '../api_prototype/standard_file_system.dart';
-import '../base/processed_options.dart';
-import '../kernel_generator_impl.dart';
+import '../api_prototype/compiler_options.dart' show CompilerOptions;
 
-import '../api_prototype/compiler_options.dart';
-import 'compiler_state.dart';
+import '../api_prototype/diagnostic_message.dart' show DiagnosticMessageHandler;
 
-export 'compiler_state.dart';
+import '../api_prototype/file_system.dart' show FileSystem;
 
-export '../api_prototype/compilation_message.dart';
+import '../api_prototype/standard_file_system.dart' show StandardFileSystem;
+
+import '../base/processed_options.dart' show ProcessedOptions;
+
+import '../kernel_generator_impl.dart' show generateKernel;
+
+import 'compiler_state.dart' show InitializedCompilerState;
+
+export '../api_prototype/diagnostic_message.dart' show DiagnosticMessage;
+
+export '../fasta/severity.dart' show Severity;
+
+export 'compiler_state.dart' show InitializedCompilerState;
+
+export 'vm.dart' show printDiagnosticMessage;
 
 class DdcResult {
   final Component component;
@@ -66,8 +77,7 @@
     ..packagesFileUri = packagesFile
     ..inputSummaries = inputSummaries
     ..target = target
-    ..fileSystem = fileSystem ?? StandardFileSystem.instance
-    ..reportMessages = true;
+    ..fileSystem = fileSystem ?? StandardFileSystem.instance;
 
   ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
@@ -75,9 +85,9 @@
 }
 
 Future<DdcResult> compile(InitializedCompilerState compilerState,
-    List<Uri> inputs, ErrorHandler errorHandler) async {
+    List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler) async {
   CompilerOptions options = compilerState.options;
-  options..onError = errorHandler;
+  options..onDiagnostic = diagnosticMessageHandler;
 
   ProcessedOptions processedOpts = compilerState.processedOpts;
   processedOpts.inputs.clear();
diff --git a/pkg/front_end/lib/src/api_unstable/vm.dart b/pkg/front_end/lib/src/api_unstable/vm.dart
new file mode 100644
index 0000000..a07b57c
--- /dev/null
+++ b/pkg/front_end/lib/src/api_unstable/vm.dart
@@ -0,0 +1,72 @@
+// 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 '../api_prototype/diagnostic_message.dart' show DiagnosticMessage;
+
+import '../api_prototype/terminal_color_support.dart' show enableTerminalColors;
+
+import '../fasta/fasta_codes.dart' show FormattedMessage;
+
+export '../api_prototype/compiler_options.dart'
+    show CompilerOptions, ProblemHandler;
+
+export '../api_prototype/diagnostic_message.dart'
+    show DiagnosticMessage, DiagnosticMessageHandler;
+
+export '../api_prototype/file_system.dart'
+    show FileSystem, FileSystemEntity, FileSystemException;
+
+export '../api_prototype/incremental_kernel_generator.dart'
+    show IncrementalKernelGenerator, isLegalIdentifier;
+
+export '../api_prototype/kernel_generator.dart'
+    show kernelForComponent, kernelForProgram;
+
+export '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
+
+export '../api_prototype/standard_file_system.dart' show StandardFileSystem;
+
+export '../base/processed_options.dart' show ProcessedOptions;
+
+export '../compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+
+export '../fasta/compiler_context.dart' show CompilerContext;
+
+export '../fasta/fasta_codes.dart'
+    show
+        LocatedMessage,
+        Message,
+        messageConstEvalContext,
+        messageConstEvalFailedAssertion,
+        noLength,
+        templateConstEvalDeferredLibrary,
+        templateConstEvalDuplicateKey,
+        templateConstEvalFailedAssertionWithMessage,
+        templateConstEvalInvalidBinaryOperandType,
+        templateConstEvalInvalidMethodInvocation,
+        templateConstEvalInvalidStaticInvocation,
+        templateConstEvalInvalidStringInterpolationOperand,
+        templateConstEvalInvalidType,
+        templateConstEvalNegativeShift,
+        templateConstEvalNonConstantLiteral,
+        templateConstEvalNonConstantVariableGet,
+        templateConstEvalZeroDivisor;
+
+export '../fasta/hybrid_file_system.dart' show HybridFileSystem;
+
+export '../fasta/kernel/utils.dart' show serializeComponent, serializeProcedure;
+
+export '../fasta/severity.dart' show Severity;
+
+Uri getMessageUri(FormattedMessage message) => message.uri;
+
+void printDiagnosticMessage(
+    DiagnosticMessage message, void Function(String) println) {
+  if (enableTerminalColors) {
+    message.ansiFormatted.forEach(println);
+  } else {
+    message.plainTextFormatted.forEach(println);
+  }
+}
diff --git a/pkg/front_end/lib/src/base/analysis_target.dart b/pkg/front_end/lib/src/base/analysis_target.dart
deleted file mode 100644
index 2d2bd07..0000000
--- a/pkg/front_end/lib/src/base/analysis_target.dart
+++ /dev/null
@@ -1,26 +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 'source.dart';
-
-/**
- * An object with which an analysis result can be associated.
- *
- * Clients may implement this class when creating new kinds of targets.
- * Instances of this type are used in hashed data structures, so subtypes are
- * required to correctly implement [==] and [hashCode].
- */
-abstract class AnalysisTarget {
-  /**
-   * If this target is associated with a library, return the source of the
-   * library's defining compilation unit; otherwise return `null`.
-   */
-  Source get librarySource;
-
-  /**
-   * Return the source associated with this target, or `null` if this target is
-   * not associated with a source.
-   */
-  Source get source;
-}
diff --git a/pkg/front_end/lib/src/base/api_signature.dart b/pkg/front_end/lib/src/base/api_signature.dart
deleted file mode 100644
index 80937d6..0000000
--- a/pkg/front_end/lib/src/base/api_signature.dart
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'package:convert/convert.dart';
-import 'package:crypto/crypto.dart';
-
-/**
- * An instance of [ApiSignature] collects data in the form of primitive types
- * (strings, ints, bools, etc.) from a summary "builder" object, and uses them
- * to generate an MD5 signature of a the non-informative parts of the summary
- * (i.e. those parts representing the API of the code being summarized).
- *
- * Note that the data passed to the MD5 signature algorithm is untyped.  So, for
- * instance, an API signature built from a sequence of `false` booleans is
- * likely to match an API signature built from a sequence of zeros.  The caller
- * should take this into account; e.g. if a data structure may be represented
- * either by a boolean or an int, the caller should encode a tag distinguishing
- * the two representations before encoding the data.
- */
-class ApiSignature {
-  /**
-   * Version number of the code in this class.  Any time this class is changed
-   * in a way that affects the data collected in [_data], this version number
-   * should be incremented, so that a summary signed by a newer version of the
-   * signature algorithm won't accidentally have the same signature as a summary
-   * signed by an older version.
-   */
-  static const int _VERSION = 0;
-
-  /**
-   * Data accumulated so far.
-   */
-  ByteData _data = new ByteData(4096);
-
-  /**
-   * Offset into [_data] where the next byte should be written.
-   */
-  int _offset = 0;
-
-  /**
-   * Create an [ApiSignature] which is ready to accept data.
-   */
-  ApiSignature() {
-    addInt(_VERSION);
-  }
-
-  /**
-   * For testing only: create an [ApiSignature] which doesn't include any
-   * version information.  This makes it easier to unit tests, since the data
-   * is stable even if [_VERSION] is changed.
-   */
-  ApiSignature.unversioned();
-
-  /**
-   * Collect a boolean value.
-   */
-  void addBool(bool b) {
-    _makeRoom(1);
-    _data.setUint8(_offset, b ? 1 : 0);
-    _offset++;
-  }
-
-  /**
-   * Collect a sequence of arbitrary bytes.  Note that the length is not
-   * collected, so for example `addBytes([1, 2]);` will have the same effect as
-   * `addBytes([1]); addBytes([2]);`.
-   */
-  void addBytes(List<int> bytes) {
-    int length = bytes.length;
-    _makeRoom(length);
-    for (int i = 0; i < length; i++) {
-      _data.setUint8(_offset + i, bytes[i]);
-    }
-    _offset += length;
-  }
-
-  /**
-   * Collect a double-precision floating point value.
-   */
-  void addDouble(double d) {
-    _makeRoom(8);
-    _data.setFloat64(_offset, d, Endian.little);
-    _offset += 8;
-  }
-
-  /**
-   * Collect a 32-bit unsigned integer value.
-   */
-  void addInt(int i) {
-    _makeRoom(4);
-    _data.setUint32(_offset, i, Endian.little);
-    _offset += 4;
-  }
-
-  /**
-   * Collect a string.
-   */
-  void addString(String s) {
-    List<int> bytes = utf8.encode(s);
-    addInt(bytes.length);
-    addBytes(bytes);
-  }
-
-  /**
-   * Collect the given [Uint32List].
-   */
-  void addUint32List(Uint32List data) {
-    addBytes(data.buffer.asUint8List());
-  }
-
-  /**
-   * For testing only: retrieve the internal representation of the data that
-   * has been collected.
-   */
-  List<int> getBytes_forDebug() {
-    return new Uint8List.view(_data.buffer, 0, _offset).toList();
-  }
-
-  /**
-   * Return the bytes of the MD5 hash of the data collected so far.
-   */
-  List<int> toByteList() {
-    return md5.convert(new Uint8List.view(_data.buffer, 0, _offset)).bytes;
-  }
-
-  /**
-   * Return a hex-encoded MD5 signature of the data collected so far.
-   */
-  String toHex() {
-    return hex.encode(toByteList());
-  }
-
-  /**
-   * Ensure that [spaceNeeded] bytes can be added to [_data] at [_offset]
-   * (copying it to a larger object if necessary).
-   */
-  void _makeRoom(int spaceNeeded) {
-    int oldLength = _data.lengthInBytes;
-    if (_offset + spaceNeeded > oldLength) {
-      int newLength = 2 * (_offset + spaceNeeded);
-      ByteData newData = new ByteData(newLength);
-      new Uint8List.view(newData.buffer)
-          .setRange(0, oldLength, new Uint8List.view(_data.buffer));
-      _data = newData;
-    }
-  }
-}
diff --git a/pkg/front_end/lib/src/base/file_repository.dart b/pkg/front_end/lib/src/base/file_repository.dart
deleted file mode 100644
index cd1fa3d..0000000
--- a/pkg/front_end/lib/src/base/file_repository.dart
+++ /dev/null
@@ -1,100 +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.
-
-/// Data structure storing an association between URI and file contents.
-///
-/// Each URI is also associated with a unique arbitrary path ending in ".dart".
-/// This allows interfacing with analyzer code that expects to manipulate paths
-/// rather than URIs.
-class FileRepository {
-  /// Regular expression matching the arbitrary file paths generated by
-  /// [_pathForIndex].
-  static final _pathRegexp = new RegExp(r'^/[0-9]+\.dart$');
-
-  /// The URIs currently stored in the repository.
-  final _uris = <Uri>[];
-
-  /// Map from a URI to its index in [_uris].
-  final _uriToIndexMap = <Uri, int>{};
-
-  /// The file contents associated with the URIs in [_uris].
-  final _contents = <String>[];
-
-  /// Clear any contents stored in the file repository.  The association between
-  /// URI and arbitrary path is preserved.
-  ///
-  /// Subsequent calls to [contentsForPath] will have undefined results until
-  /// new contents are stored using [store].
-  void clearContents() {
-    for (var i = 0; i < _contents.length; i++) {
-      _contents[i] = null;
-    }
-  }
-
-  /// Return the contents of the file whose arbitrary path is [path].
-  ///
-  /// The path must have been returned by a previous call to [store] or
-  /// [pathForUri].
-  String contentsForPath(String path) {
-    var contents = _contents[_indexForPath(path)];
-    assert(contents != null);
-    return contents;
-  }
-
-  /// For testing purposes, return the contents of all files stored in the file
-  /// repository, as a map from path to contents string.
-  Map<String, String> getContentsForTesting() {
-    var result = <String, String>{};
-    for (var i = 0; i < _contents.length; i++) {
-      if (_contents[i] != null) result[_pathForIndex(i)] = _contents[i];
-    }
-    return result;
-  }
-
-  /// Return the arbitrary path associated with [uri].
-  ///
-  /// If [allocate] is `false` (the default), the uri must have previously been
-  /// allocated a corresponding path, e.g. via a call to [store].  If [allocate]
-  /// is `true`, then a new path will be allocated if necessary.
-  String pathForUri(Uri uri, {bool allocate: false}) {
-    return _pathForIndex(_indexForUri(uri, allocate));
-  }
-
-  /// Associate the given [uri] with file [contents].
-  ///
-  /// The arbitrary path associated with the file is returned.
-  String store(Uri uri, String contents) {
-    int index = _indexForUri(uri, true);
-    _contents[index] = contents;
-    return _pathForIndex(index);
-  }
-
-  /// Return the URI for the file whose arbitrary path is [path].
-  ///
-  /// The path must have been returned by a previous call to [store] or
-  /// [pathForUri].
-  Uri uriForPath(String path) => _uris[_indexForPath(path)];
-
-  /// Return the index into [_uris] and [_contents] matching the arbitrary path
-  /// [path].
-  int _indexForPath(String path) {
-    assert(_pathRegexp.hasMatch(path));
-    return int.parse(path.substring(1, path.length - 5));
-  }
-
-  int _indexForUri(Uri uri, bool allocate) {
-    int index = _uriToIndexMap[uri];
-    assert(allocate || index != null);
-    if (index == null) {
-      index = _uris.length;
-      _uris.add(uri);
-      _uriToIndexMap[uri] = index;
-      _contents.add(null);
-    }
-    return index;
-  }
-
-  /// Return the arbitrary path associated with the given index.
-  String _pathForIndex(int index) => '/$index.dart';
-}
diff --git a/pkg/front_end/lib/src/base/flat_buffers.dart b/pkg/front_end/lib/src/base/flat_buffers.dart
deleted file mode 100644
index 3449a3b..0000000
--- a/pkg/front_end/lib/src/base/flat_buffers.dart
+++ /dev/null
@@ -1,951 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:collection';
-import 'dart:convert';
-import 'dart:math';
-import 'dart:typed_data';
-
-/**
- * Reader of lists of boolean values.
- *
- * The returned unmodifiable lists lazily read values on access.
- */
-class BoolListReader extends Reader<List<bool>> {
-  const BoolListReader();
-
-  @override
-  int get size => 4;
-
-  @override
-  List<bool> read(BufferContext bc, int offset) =>
-      new _FbBoolList(bc, bc.derefObject(offset));
-}
-
-/**
- * The reader of booleans.
- */
-class BoolReader extends Reader<bool> {
-  const BoolReader() : super();
-
-  @override
-  int get size => 1;
-
-  @override
-  bool read(BufferContext bc, int offset) => bc._getInt8(offset) != 0;
-}
-
-/**
- * Buffer with data and some context about it.
- */
-class BufferContext {
-  final ByteData _buffer;
-
-  factory BufferContext.fromBytes(List<int> byteList) {
-    Uint8List uint8List = _asUint8List(byteList);
-    ByteData buf = new ByteData.view(uint8List.buffer, uint8List.offsetInBytes);
-    return new BufferContext._(buf);
-  }
-
-  BufferContext._(this._buffer);
-
-  int derefObject(int offset) {
-    return offset + _getUint32(offset);
-  }
-
-  Uint8List _asUint8LIst(int offset, int length) =>
-      _buffer.buffer.asUint8List(_buffer.offsetInBytes + offset, length);
-
-  double _getFloat64(int offset) => _buffer.getFloat64(offset, Endian.little);
-
-  int _getInt32(int offset) => _buffer.getInt32(offset, Endian.little);
-
-  int _getInt8(int offset) => _buffer.getInt8(offset);
-
-  int _getUint16(int offset) => _buffer.getUint16(offset, Endian.little);
-
-  int _getUint32(int offset) => _buffer.getUint32(offset, Endian.little);
-
-  int _getUint8(int offset) => _buffer.getUint8(offset);
-
-  /**
-   * If the [byteList] is already a [Uint8List] return it.
-   * Otherwise return a [Uint8List] copy of the [byteList].
-   */
-  static Uint8List _asUint8List(List<int> byteList) {
-    if (byteList is Uint8List) {
-      return byteList;
-    } else {
-      return new Uint8List.fromList(byteList);
-    }
-  }
-}
-
-/**
- * Class that helps building flat buffers.
- */
-class Builder {
-  final int initialSize;
-
-  /**
-   * The list of existing VTable(s).
-   */
-  final List<_VTable> _vTables = <_VTable>[];
-
-  ByteData _buf;
-
-  /**
-   * The maximum alignment that has been seen so far.  If [_buf] has to be
-   * reallocated in the future (to insert room at its start for more bytes) the
-   * reallocation will need to be a multiple of this many bytes.
-   */
-  int _maxAlign;
-
-  /**
-   * The number of bytes that have been written to the buffer so far.  The
-   * most recently written byte is this many bytes from the end of [_buf].
-   */
-  int _tail;
-
-  /**
-   * The location of the end of the current table, measured in bytes from the
-   * end of [_buf], or `null` if a table is not currently being built.
-   */
-  int _currentTableEndTail;
-
-  _VTable _currentVTable;
-
-  /**
-   * Map containing all strings that have been written so far.  This allows us
-   * to avoid duplicating strings.
-   */
-  Map<String, Offset<String>> _strings = <String, Offset<String>>{};
-
-  Builder({this.initialSize: 1024}) {
-    reset();
-  }
-
-  /**
-   * Add the [field] with the given boolean [value].  The field is not added if
-   * the [value] is equal to [def].  Booleans are stored as 8-bit fields with
-   * `0` for `false` and `1` for `true`.
-   */
-  void addBool(int field, bool value, [bool def]) {
-    _ensureCurrentVTable();
-    if (value != null && value != def) {
-      int size = 1;
-      _prepare(size, 1);
-      _trackField(field);
-      _buf.setInt8(_buf.lengthInBytes - _tail, value ? 1 : 0);
-    }
-  }
-
-  /**
-   * Add the [field] with the given 32-bit signed integer [value].  The field is
-   * not added if the [value] is equal to [def].
-   */
-  void addInt32(int field, int value, [int def]) {
-    _ensureCurrentVTable();
-    if (value != null && value != def) {
-      int size = 4;
-      _prepare(size, 1);
-      _trackField(field);
-      _setInt32AtTail(_buf, _tail, value);
-    }
-  }
-
-  /**
-   * Add the [field] with the given 8-bit signed integer [value].  The field is
-   * not added if the [value] is equal to [def].
-   */
-  void addInt8(int field, int value, [int def]) {
-    _ensureCurrentVTable();
-    if (value != null && value != def) {
-      int size = 1;
-      _prepare(size, 1);
-      _trackField(field);
-      _buf.setInt8(_buf.lengthInBytes - _tail, value);
-    }
-  }
-
-  /**
-   * Add the [field] referencing an object with the given [offset].
-   */
-  void addOffset(int field, Offset offset) {
-    _ensureCurrentVTable();
-    if (offset != null) {
-      _prepare(4, 1);
-      _trackField(field);
-      _setUint32AtTail(_buf, _tail, _tail - offset._tail);
-    }
-  }
-
-  /**
-   * Add the [field] with the given 32-bit unsigned integer [value].  The field
-   * is not added if the [value] is equal to [def].
-   */
-  void addUint32(int field, int value, [int def]) {
-    _ensureCurrentVTable();
-    if (value != null && value != def) {
-      int size = 4;
-      _prepare(size, 1);
-      _trackField(field);
-      _setUint32AtTail(_buf, _tail, value);
-    }
-  }
-
-  /**
-   * Add the [field] with the given 8-bit unsigned integer [value].  The field
-   * is not added if the [value] is equal to [def].
-   */
-  void addUint8(int field, int value, [int def]) {
-    _ensureCurrentVTable();
-    if (value != null && value != def) {
-      int size = 1;
-      _prepare(size, 1);
-      _trackField(field);
-      _setUint8AtTail(_buf, _tail, value);
-    }
-  }
-
-  /**
-   * End the current table and return its offset.
-   */
-  Offset endTable() {
-    if (_currentVTable == null) {
-      throw new StateError('Start a table before ending it.');
-    }
-    // Prepare for writing the VTable.
-    _prepare(4, 1);
-    int tableTail = _tail;
-    // Prepare the size of the current table.
-    _currentVTable.tableSize = tableTail - _currentTableEndTail;
-    // Prepare the VTable to use for the current table.
-    int vTableTail;
-    {
-      _currentVTable.computeFieldOffsets(tableTail);
-      // Try to find an existing compatible VTable.
-      for (int i = 0; i < _vTables.length; i++) {
-        _VTable vTable = _vTables[i];
-        if (_currentVTable.canUseExistingVTable(vTable)) {
-          vTableTail = vTable.tail;
-          break;
-        }
-      }
-      // Write a new VTable.
-      if (vTableTail == null) {
-        _prepare(2, _currentVTable.numOfUint16);
-        vTableTail = _tail;
-        _currentVTable.tail = vTableTail;
-        _currentVTable.output(_buf, _buf.lengthInBytes - _tail);
-        _vTables.add(_currentVTable);
-      }
-    }
-    // Set the VTable offset.
-    _setInt32AtTail(_buf, tableTail, vTableTail - tableTail);
-    // Done with this table.
-    _currentVTable = null;
-    return new Offset(tableTail);
-  }
-
-  /**
-   * Finish off the creation of the buffer.  The given [offset] is used as the
-   * root object offset, and usually references directly or indirectly every
-   * written object.  If [fileIdentifier] is specified (and not `null`), it is
-   * interpreted as a 4-byte Latin-1 encoded string that should be placed at
-   * bytes 4-7 of the file.
-   */
-  Uint8List finish(Offset offset, [String fileIdentifier]) {
-    _prepare(max(4, _maxAlign), fileIdentifier == null ? 1 : 2);
-    int alignedTail = _tail + ((-_tail) % _maxAlign);
-    _setUint32AtTail(_buf, alignedTail, alignedTail - offset._tail);
-    if (fileIdentifier != null) {
-      for (int i = 0; i < 4; i++) {
-        _setUint8AtTail(
-            _buf, alignedTail - 4 - i, fileIdentifier.codeUnitAt(i));
-      }
-    }
-    return _buf.buffer.asUint8List(_buf.lengthInBytes - alignedTail);
-  }
-
-  /**
-   * This is a low-level method, it should not be invoked by clients.
-   */
-  Uint8List lowFinish() {
-    int alignedTail = _tail + ((-_tail) % _maxAlign);
-    return _buf.buffer.asUint8List(_buf.lengthInBytes - alignedTail);
-  }
-
-  /**
-   * This is a low-level method, it should not be invoked by clients.
-   */
-  void lowReset() {
-    _buf = new ByteData(initialSize);
-    _maxAlign = 1;
-    _tail = 0;
-  }
-
-  /**
-   * This is a low-level method, it should not be invoked by clients.
-   */
-  void lowWriteUint32(int value) {
-    _prepare(4, 1);
-    _setUint32AtTail(_buf, _tail, value);
-  }
-
-  /**
-   * This is a low-level method, it should not be invoked by clients.
-   */
-  void lowWriteUint8(int value) {
-    _prepare(1, 1);
-    _buf.setUint8(_buf.lengthInBytes - _tail, value);
-  }
-
-  /**
-   * Reset the builder and make it ready for filling a new buffer.
-   */
-  void reset() {
-    _buf = new ByteData(initialSize);
-    _maxAlign = 1;
-    _tail = 0;
-    _currentVTable = null;
-  }
-
-  /**
-   * Start a new table.  Must be finished with [endTable] invocation.
-   */
-  void startTable() {
-    if (_currentVTable != null) {
-      throw new StateError('Inline tables are not supported.');
-    }
-    _currentVTable = new _VTable();
-    _currentTableEndTail = _tail;
-  }
-
-  /**
-   * Write the given list of [values].
-   */
-  Offset writeList(List<Offset> values) {
-    _ensureNoVTable();
-    _prepare(4, 1 + values.length);
-    Offset result = new Offset(_tail);
-    int tail = _tail;
-    _setUint32AtTail(_buf, tail, values.length);
-    tail -= 4;
-    for (Offset value in values) {
-      _setUint32AtTail(_buf, tail, tail - value._tail);
-      tail -= 4;
-    }
-    return result;
-  }
-
-  /**
-   * Write the given list of boolean [values].
-   */
-  Offset writeListBool(List<bool> values) {
-    int bitLength = values.length;
-    int padding = (-bitLength) % 8;
-    int byteLength = (bitLength + padding) ~/ 8;
-    // Prepare the backing Uint8List.
-    Uint8List bytes = new Uint8List(byteLength + 1);
-    // Record every bit.
-    int byteIndex = 0;
-    int byte = 0;
-    int mask = 1;
-    for (int bitIndex = 0; bitIndex < bitLength; bitIndex++) {
-      if (bitIndex != 0 && (bitIndex % 8 == 0)) {
-        bytes[byteIndex++] = byte;
-        byte = 0;
-        mask = 1;
-      }
-      if (values[bitIndex]) {
-        byte |= mask;
-      }
-      mask <<= 1;
-    }
-    // Write the last byte, even if it may be on the padding.
-    bytes[byteIndex] = byte;
-    // Write the padding length.
-    bytes[byteLength] = padding;
-    // Write as a Uint8 list.
-    return writeListUint8(bytes);
-  }
-
-  /**
-   * Write the given list of 64-bit float [values].
-   */
-  Offset writeListFloat64(List<double> values) {
-    _ensureNoVTable();
-    _prepare(8, 1 + values.length);
-    Offset result = new Offset(_tail);
-    int tail = _tail;
-    _setUint32AtTail(_buf, tail, values.length);
-    tail -= 8;
-    for (double value in values) {
-      _setFloat64AtTail(_buf, tail, value);
-      tail -= 8;
-    }
-    return result;
-  }
-
-  /**
-   * Write the given list of signed 32-bit integer [values].
-   */
-  Offset writeListInt32(List<int> values) {
-    _ensureNoVTable();
-    _prepare(4, 1 + values.length);
-    Offset result = new Offset(_tail);
-    int tail = _tail;
-    _setUint32AtTail(_buf, tail, values.length);
-    tail -= 4;
-    for (int value in values) {
-      _setInt32AtTail(_buf, tail, value);
-      tail -= 4;
-    }
-    return result;
-  }
-
-  /**
-   * Write the given list of unsigned 32-bit integer [values].
-   */
-  Offset writeListUint32(List<int> values) {
-    _ensureNoVTable();
-    _prepare(4, 1 + values.length);
-    Offset result = new Offset(_tail);
-    int tail = _tail;
-    _setUint32AtTail(_buf, tail, values.length);
-    tail -= 4;
-    for (int value in values) {
-      _setUint32AtTail(_buf, tail, value);
-      tail -= 4;
-    }
-    return result;
-  }
-
-  /**
-   * Write the given list of unsigned 8-bit integer [values].
-   */
-  Offset writeListUint8(List<int> values) {
-    _ensureNoVTable();
-    _prepare(4, 1, additionalBytes: values.length);
-    Offset result = new Offset(_tail);
-    int tail = _tail;
-    _setUint32AtTail(_buf, tail, values.length);
-    tail -= 4;
-    for (int value in values) {
-      _setUint8AtTail(_buf, tail, value);
-      tail -= 1;
-    }
-    return result;
-  }
-
-  /**
-   * Write the given string [value] and return its [Offset], or `null` if
-   * the [value] is equal to [def].
-   */
-  Offset<String> writeString(String value, [String def]) {
-    _ensureNoVTable();
-    if (value != def) {
-      return _strings.putIfAbsent(value, () {
-        // TODO(scheglov) optimize for ASCII strings
-        List<int> bytes = utf8.encode(value);
-        int length = bytes.length;
-        _prepare(4, 1, additionalBytes: length);
-        Offset<String> result = new Offset(_tail);
-        _setUint32AtTail(_buf, _tail, length);
-        int offset = _buf.lengthInBytes - _tail + 4;
-        for (int i = 0; i < length; i++) {
-          _buf.setUint8(offset++, bytes[i]);
-        }
-        return result;
-      });
-    }
-    return null;
-  }
-
-  /**
-   * Throw an exception if there is not currently a vtable.
-   */
-  void _ensureCurrentVTable() {
-    if (_currentVTable == null) {
-      throw new StateError('Start a table before adding values.');
-    }
-  }
-
-  /**
-   * Throw an exception if there is currently a vtable.
-   */
-  void _ensureNoVTable() {
-    if (_currentVTable != null) {
-      throw new StateError(
-          'Cannot write a non-scalar value while writing a table.');
-    }
-  }
-
-  /**
-   * Prepare for writing the given [count] of scalars of the given [size].
-   * Additionally allocate the specified [additionalBytes]. Update the current
-   * tail pointer to point at the allocated space.
-   */
-  void _prepare(int size, int count, {int additionalBytes: 0}) {
-    // Update the alignment.
-    if (_maxAlign < size) {
-      _maxAlign = size;
-    }
-    // Prepare amount of required space.
-    int dataSize = size * count + additionalBytes;
-    int alignDelta = (-(_tail + dataSize)) % size;
-    int bufSize = alignDelta + dataSize;
-    // Ensure that we have the required amount of space.
-    {
-      int oldCapacity = _buf.lengthInBytes;
-      if (_tail + bufSize > oldCapacity) {
-        int desiredNewCapacity = (oldCapacity + bufSize) * 2;
-        int deltaCapacity = desiredNewCapacity - oldCapacity;
-        deltaCapacity += (-deltaCapacity) % _maxAlign;
-        int newCapacity = oldCapacity + deltaCapacity;
-        ByteData newBuf = new ByteData(newCapacity);
-        newBuf.buffer
-            .asUint8List()
-            .setAll(deltaCapacity, _buf.buffer.asUint8List());
-        _buf = newBuf;
-      }
-    }
-    // Update the tail pointer.
-    _tail += bufSize;
-  }
-
-  /**
-   * Record the offset of the given [field].
-   */
-  void _trackField(int field) {
-    _currentVTable.addField(field, _tail);
-  }
-
-  static void _setFloat64AtTail(ByteData _buf, int tail, double x) {
-    _buf.setFloat64(_buf.lengthInBytes - tail, x, Endian.little);
-  }
-
-  static void _setInt32AtTail(ByteData _buf, int tail, int x) {
-    _buf.setInt32(_buf.lengthInBytes - tail, x, Endian.little);
-  }
-
-  static void _setUint32AtTail(ByteData _buf, int tail, int x) {
-    _buf.setUint32(_buf.lengthInBytes - tail, x, Endian.little);
-  }
-
-  static void _setUint8AtTail(ByteData _buf, int tail, int x) {
-    _buf.setUint8(_buf.lengthInBytes - tail, x);
-  }
-}
-
-/**
- * The reader of lists of 64-bit float values.
- *
- * The returned unmodifiable lists lazily read values on access.
- */
-class Float64ListReader extends Reader<List<double>> {
-  const Float64ListReader();
-
-  @override
-  int get size => 4;
-
-  @override
-  List<double> read(BufferContext bc, int offset) =>
-      new _FbFloat64List(bc, bc.derefObject(offset));
-}
-
-/**
- * The reader of signed 32-bit integers.
- */
-class Int32Reader extends Reader<int> {
-  const Int32Reader() : super();
-
-  @override
-  int get size => 4;
-
-  @override
-  int read(BufferContext bc, int offset) => bc._getInt32(offset);
-}
-
-/**
- * The reader of 8-bit signed integers.
- */
-class Int8Reader extends Reader<int> {
-  const Int8Reader() : super();
-
-  @override
-  int get size => 1;
-
-  @override
-  int read(BufferContext bc, int offset) => bc._getInt8(offset);
-}
-
-/**
- * The reader of lists of objects.
- *
- * The returned unmodifiable lists lazily read objects on access.
- */
-class ListReader<E> extends Reader<List<E>> {
-  final Reader<E> _elementReader;
-
-  const ListReader(this._elementReader);
-
-  @override
-  int get size => 4;
-
-  @override
-  List<E> read(BufferContext bc, int offset) =>
-      new _FbGenericList<E>(_elementReader, bc, bc.derefObject(offset));
-}
-
-/**
- * The offset from the end of the buffer to a serialized object of the type [T].
- */
-class Offset<T> {
-  final int _tail;
-
-  Offset(this._tail);
-}
-
-/**
- * Object that can read a value at a [BufferContext].
- */
-abstract class Reader<T> {
-  const Reader();
-
-  /**
-   * The size of the value in bytes.
-   */
-  int get size;
-
-  /**
-   * Read the value at the given [offset] in [bc].
-   */
-  T read(BufferContext bc, int offset);
-
-  /**
-   * Read the value of the given [field] in the given [object].
-   */
-  T vTableGet(BufferContext object, int offset, int field, [T defaultValue]) {
-    int vTableSOffset = object._getInt32(offset);
-    int vTableOffset = offset - vTableSOffset;
-    int vTableSize = object._getUint16(vTableOffset);
-    int vTableFieldOffset = (1 + 1 + field) * 2;
-    if (vTableFieldOffset < vTableSize) {
-      int fieldOffsetInObject =
-          object._getUint16(vTableOffset + vTableFieldOffset);
-      if (fieldOffsetInObject != 0) {
-        return read(object, offset + fieldOffsetInObject);
-      }
-    }
-    return defaultValue;
-  }
-}
-
-/**
- * The reader of string values.
- */
-class StringReader extends Reader<String> {
-  const StringReader() : super();
-
-  @override
-  int get size => 4;
-
-  @override
-  String read(BufferContext bc, int offset) {
-    int strOffset = bc.derefObject(offset);
-    int length = bc._getUint32(strOffset);
-    Uint8List bytes = bc._asUint8LIst(strOffset + 4, length);
-    if (_isLatin(bytes)) {
-      return new String.fromCharCodes(bytes);
-    }
-    return utf8.decode(bytes);
-  }
-
-  static bool _isLatin(Uint8List bytes) {
-    int length = bytes.length;
-    for (int i = 0; i < length; i++) {
-      if (bytes[i] > 127) {
-        return false;
-      }
-    }
-    return true;
-  }
-}
-
-/**
- * An abstract reader for tables.
- */
-abstract class TableReader<T> extends Reader<T> {
-  const TableReader();
-
-  @override
-  int get size => 4;
-
-  /**
-   * Return the object at [offset].
-   */
-  T createObject(BufferContext bc, int offset);
-
-  @override
-  T read(BufferContext bp, int offset) {
-    int objectOffset = bp.derefObject(offset);
-    return createObject(bp, objectOffset);
-  }
-}
-
-/**
- * Reader of lists of unsigned 32-bit integer values.
- *
- * The returned unmodifiable lists lazily read values on access.
- */
-class Uint32ListReader extends Reader<List<int>> {
-  const Uint32ListReader();
-
-  @override
-  int get size => 4;
-
-  @override
-  List<int> read(BufferContext bc, int offset) =>
-      new _FbUint32List(bc, bc.derefObject(offset));
-}
-
-/**
- * The reader of unsigned 32-bit integers.
- */
-class Uint32Reader extends Reader<int> {
-  const Uint32Reader() : super();
-
-  @override
-  int get size => 4;
-
-  @override
-  int read(BufferContext bc, int offset) => bc._getUint32(offset);
-}
-
-/**
- * Reader of lists of unsigned 8-bit integer values.
- *
- * The returned unmodifiable lists lazily read values on access.
- */
-class Uint8ListReader extends Reader<List<int>> {
-  const Uint8ListReader();
-
-  @override
-  int get size => 4;
-
-  @override
-  List<int> read(BufferContext bc, int offset) =>
-      new _FbUint8List(bc, bc.derefObject(offset));
-}
-
-/**
- * The reader of unsigned 8-bit integers.
- */
-class Uint8Reader extends Reader<int> {
-  const Uint8Reader() : super();
-
-  @override
-  int get size => 1;
-
-  @override
-  int read(BufferContext bc, int offset) => bc._getUint8(offset);
-}
-
-/**
- * List of booleans backed by 8-bit unsigned integers.
- */
-class _FbBoolList extends Object with ListMixin<bool> implements List<bool> {
-  final BufferContext bc;
-  final int offset;
-  int _length;
-
-  _FbBoolList(this.bc, this.offset);
-
-  @override
-  int get length {
-    if (_length == null) {
-      int byteLength = bc._getUint32(offset);
-      _length = (byteLength - 1) * 8 - _getByte(byteLength - 1);
-    }
-    return _length;
-  }
-
-  @override
-  void set length(int i) =>
-      throw new StateError('Attempt to modify immutable list');
-
-  @override
-  bool operator [](int i) {
-    int index = i ~/ 8;
-    int mask = 1 << i % 8;
-    return _getByte(index) & mask != 0;
-  }
-
-  @override
-  void operator []=(int i, bool e) =>
-      throw new StateError('Attempt to modify immutable list');
-
-  int _getByte(int index) => bc._getUint8(offset + 4 + index);
-}
-
-/**
- * The list backed by 64-bit values - Uint64 length and Float64.
- */
-class _FbFloat64List extends _FbList<double> {
-  _FbFloat64List(BufferContext bc, int offset) : super(bc, offset);
-
-  @override
-  double operator [](int i) {
-    return bc._getFloat64(offset + 8 + 8 * i);
-  }
-}
-
-/**
- * List backed by a generic object which may have any size.
- */
-class _FbGenericList<E> extends _FbList<E> {
-  final Reader<E> elementReader;
-
-  List<E> _items;
-
-  _FbGenericList(this.elementReader, BufferContext bp, int offset)
-      : super(bp, offset);
-
-  @override
-  E operator [](int i) {
-    _items ??= new List<E>(length);
-    E item = _items[i];
-    if (item == null) {
-      item = elementReader.read(bc, offset + 4 + elementReader.size * i);
-      _items[i] = item;
-    }
-    return item;
-  }
-}
-
-/**
- * The base class for immutable lists read from flat buffers.
- */
-abstract class _FbList<E> extends Object with ListMixin<E> implements List<E> {
-  final BufferContext bc;
-  final int offset;
-  int _length;
-
-  _FbList(this.bc, this.offset);
-
-  @override
-  int get length {
-    _length ??= bc._getUint32(offset);
-    return _length;
-  }
-
-  @override
-  void set length(int i) =>
-      throw new StateError('Attempt to modify immutable list');
-
-  @override
-  void operator []=(int i, E e) =>
-      throw new StateError('Attempt to modify immutable list');
-}
-
-/**
- * List backed by 32-bit unsigned integers.
- */
-class _FbUint32List extends _FbList<int> {
-  _FbUint32List(BufferContext bc, int offset) : super(bc, offset);
-
-  @override
-  int operator [](int i) {
-    return bc._getUint32(offset + 4 + 4 * i);
-  }
-}
-
-/**
- * List backed by 8-bit unsigned integers.
- */
-class _FbUint8List extends _FbList<int> {
-  _FbUint8List(BufferContext bc, int offset) : super(bc, offset);
-
-  @override
-  int operator [](int i) {
-    return bc._getUint8(offset + 4 + i);
-  }
-}
-
-/**
- * Class that describes the structure of a table.
- */
-class _VTable {
-  final List<int> fieldTails = <int>[];
-  final List<int> fieldOffsets = <int>[];
-
-  /**
-   * The size of the table that uses this VTable.
-   */
-  int tableSize;
-
-  /**
-   * The tail of this VTable.  It is used to share the same VTable between
-   * multiple tables of identical structure.
-   */
-  int tail;
-
-  int get numOfUint16 => 1 + 1 + fieldTails.length;
-
-  void addField(int field, int offset) {
-    while (fieldTails.length <= field) {
-      fieldTails.add(null);
-    }
-    fieldTails[field] = offset;
-  }
-
-  /**
-   * Return `true` if the [existing] VTable can be used instead of this.
-   */
-  bool canUseExistingVTable(_VTable existing) {
-    assert(tail == null);
-    assert(existing.tail != null);
-    if (tableSize == existing.tableSize &&
-        fieldOffsets.length == existing.fieldOffsets.length) {
-      for (int i = 0; i < fieldOffsets.length; i++) {
-        if (fieldOffsets[i] != existing.fieldOffsets[i]) {
-          return false;
-        }
-      }
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Fill the [fieldOffsets] field.
-   */
-  void computeFieldOffsets(int tableTail) {
-    assert(fieldOffsets.isEmpty);
-    for (int fieldTail in fieldTails) {
-      int fieldOffset = fieldTail == null ? 0 : tableTail - fieldTail;
-      fieldOffsets.add(fieldOffset);
-    }
-  }
-
-  /**
-   * Outputs this VTable to [buf], which is is expected to be aligned to 16-bit
-   * and have at least [numOfUint16] 16-bit words available.
-   */
-  void output(ByteData buf, int bufOffset) {
-    // VTable size.
-    buf.setUint16(bufOffset, numOfUint16 * 2, Endian.little);
-    bufOffset += 2;
-    // Table size.
-    buf.setUint16(bufOffset, tableSize, Endian.little);
-    bufOffset += 2;
-    // Field offsets.
-    for (int fieldOffset in fieldOffsets) {
-      buf.setUint16(bufOffset, fieldOffset, Endian.little);
-      bufOffset += 2;
-    }
-  }
-}
diff --git a/pkg/front_end/lib/src/base/jenkins_smi_hash.dart b/pkg/front_end/lib/src/base/jenkins_smi_hash.dart
deleted file mode 100644
index 8901ba4..0000000
--- a/pkg/front_end/lib/src/base/jenkins_smi_hash.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Jenkins hash function, optimized for small integers.
-///
-/// Static methods borrowed from sdk/lib/math/jenkins_smi_hash.dart.  Non-static
-/// methods are an enhancement for the "front_end" package.
-///
-/// Where performance is critical, use [hash2], [hash3], or [hash4], or the
-/// pattern `finish(combine(combine(...combine(0, a), b)..., z))`, where a..z
-/// are hash codes to be combined.
-///
-/// For ease of use, you may also use this pattern:
-/// `(new JenkinsSmiHash()..add(a)..add(b)....add(z)).hashCode`, where a..z are
-/// the sub-objects whose hashes should be combined.  This pattern performs the
-/// same operations as the performance critical variant, but allocates an extra
-/// object.
-class JenkinsSmiHash {
-  /// Accumulates the hash code [value] into the running hash [hash].
-  static int combine(int hash, int value) {
-    hash = 0x1fffffff & (hash + value);
-    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
-    return hash ^ (hash >> 6);
-  }
-
-  /// Finalizes a running hash produced by [combine].
-  static int finish(int hash) {
-    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
-    hash = hash ^ (hash >> 11);
-    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
-  }
-
-  /// Combines together two hash codes.
-  static int hash2(a, b) => finish(combine(combine(0, a), b));
-
-  /// Combines together three hash codes.
-  static int hash3(a, b, c) => finish(combine(combine(combine(0, a), b), c));
-
-  /// Combines together four hash codes.
-  static int hash4(a, b, c, d) =>
-      finish(combine(combine(combine(combine(0, a), b), c), d));
-
-  int _hash = 0;
-
-  /// Accumulates the object [o] into the hash.
-  void add(Object o) {
-    _hash = combine(_hash, o.hashCode);
-  }
-
-  /// Finalizes the hash and return the resulting hashcode.
-  int get hashCode => finish(_hash);
-}
diff --git a/pkg/front_end/lib/src/base/performance_logger.dart b/pkg/front_end/lib/src/base/performance_logger.dart
deleted file mode 100644
index 47af4cd..0000000
--- a/pkg/front_end/lib/src/base/performance_logger.dart
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/// This class is used to gather and print performance information.
-class PerformanceLog {
-  final StringSink sink;
-  int _level = 0;
-
-  PerformanceLog(this.sink);
-
-  /// Enter a new execution section, which starts at one point of code, runs
-  /// some time, and then ends at the other point of code.
-  ///
-  /// The client must call [PerformanceLogSection.exit] for every [enter].
-  PerformanceLogSection enter(String msg) {
-    writeln('+++ $msg.');
-    _level++;
-    return new PerformanceLogSection(this, msg);
-  }
-
-  /// Return the result of the function [f] invocation and log the elapsed time.
-  ///
-  /// Each invocation of [run] creates a new enclosed section in the log,
-  /// which begins with printing [msg], then any log output produced during
-  /// [f] invocation, and ends with printing [msg] with the elapsed time.
-  T run<T>(String msg, T f()) {
-    Stopwatch timer = new Stopwatch()..start();
-    try {
-      writeln('+++ $msg.');
-      _level++;
-      return f();
-    } finally {
-      _level--;
-      int ms = timer.elapsedMilliseconds;
-      writeln('--- $msg in $ms ms.');
-    }
-  }
-
-  /// Return the result of the function [f] invocation and log the elapsed time.
-  ///
-  /// Each invocation of [run] creates a new enclosed section in the log,
-  /// which begins with printing [msg], then any log output produced during
-  /// [f] invocation, and ends with printing [msg] with the elapsed time.
-  Future<T> runAsync<T>(String msg, Future<T> f()) async {
-    Stopwatch timer = new Stopwatch()..start();
-    try {
-      writeln('+++ $msg.');
-      _level++;
-      return await f();
-    } finally {
-      _level--;
-      int ms = timer.elapsedMilliseconds;
-      writeln('--- $msg in $ms ms.');
-    }
-  }
-
-  /// Write a new line into the log.
-  void writeln(String msg) {
-    if (sink != null) {
-      String indent = '\t' * _level;
-      sink.writeln('$indent$msg');
-    }
-  }
-}
-
-/**
- * The performance measurement section for operations that start and end
- * at different place in code, so cannot be run using [PerformanceLog.run].
- *
- * The client must call [exit] for every [PerformanceLog.enter].
- */
-class PerformanceLogSection {
-  final PerformanceLog _logger;
-  final String _msg;
-  final Stopwatch _timer = new Stopwatch()..start();
-
-  PerformanceLogSection(this._logger, this._msg);
-
-  /**
-   * Stop the timer, log the time.
-   */
-  void exit() {
-    _timer.stop();
-    _logger._level--;
-    int ms = _timer.elapsedMilliseconds;
-    _logger.writeln('--- $_msg in $ms ms.');
-  }
-}
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index b2d161d..d930494 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -21,8 +21,6 @@
 
 import 'package:source_span/source_span.dart' show SourceSpan, SourceLocation;
 
-import '../api_prototype/byte_store.dart' show ByteStore;
-
 import '../api_prototype/compilation_message.dart' show CompilationMessage;
 
 import '../api_prototype/compiler_options.dart' show CompilerOptions;
@@ -30,8 +28,6 @@
 import '../api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
 
-import '../base/performance_logger.dart' show PerformanceLog;
-
 import '../fasta/command_line_reporting.dart' as command_line_reporting;
 
 import '../fasta/fasta_codes.dart'
@@ -183,41 +179,43 @@
         // collecting time since the start of the VM.
         this.ticker = new Ticker(isVerbose: options?.verbose ?? false);
 
-  /// The logger to report compilation progress.
-  PerformanceLog get logger {
-    return _raw.logger;
-  }
-
-  /// The byte storage to get and put serialized data.
-  ByteStore get byteStore {
-    return _raw.byteStore;
-  }
-
   bool get _reportMessages {
     return _raw.onProblem == null &&
         (_raw.reportMessages ?? (_raw.onError == null));
   }
 
-  FormattedMessage format(LocatedMessage message, Severity severity) {
+  FormattedMessage format(
+      LocatedMessage message, Severity severity, List<LocatedMessage> context) {
     int offset = message.charOffset;
     Uri uri = message.uri;
     Location location = offset == -1 ? null : getLocation(uri, offset);
     String formatted =
         command_line_reporting.format(message, severity, location: location);
-    return message.withFormatting(
-        formatted, location?.line ?? -1, location?.column ?? -1);
+    List<FormattedMessage> formattedContext;
+    if (context != null && context.isNotEmpty) {
+      formattedContext = new List<FormattedMessage>(context.length);
+      for (int i = 0; i < context.length; i++) {
+        formattedContext[i] = format(context[i], Severity.context, null);
+      }
+    }
+    return message.withFormatting(formatted, location?.line ?? -1,
+        location?.column ?? -1, severity, formattedContext);
   }
 
   void report(LocatedMessage message, Severity severity,
       {List<LocatedMessage> context}) {
     context ??= const <LocatedMessage>[];
-    if (_raw.onProblem != null) {
+    if (_raw.onDiagnostic != null) {
+      _raw.onDiagnostic(format(message, severity, context));
+      return;
+    } else if (_raw.onProblem != null) {
       List<FormattedMessage> formattedContext =
           new List<FormattedMessage>(context.length);
       for (int i = 0; i < context.length; i++) {
-        formattedContext[i] = format(context[i], severity);
+        formattedContext[i] = format(context[i], Severity.context, null);
       }
-      _raw.onProblem(format(message, severity), severity, formattedContext);
+      _raw.onProblem(
+          format(message, severity, null), severity, formattedContext);
       if (command_line_reporting.shouldThrowOn(severity)) {
         throw new DebugAbort(
             message.uri, message.charOffset, severity, StackTrace.current);
@@ -318,7 +316,9 @@
     if (_sdkSummaryComponent == null) {
       if (sdkSummary == null) return null;
       var bytes = await loadSdkSummaryBytes();
-      _sdkSummaryComponent = loadComponent(bytes, nameRoot);
+      if (bytes != null && bytes.isNotEmpty) {
+        _sdkSummaryComponent = loadComponent(bytes, nameRoot);
+      }
     }
     return _sdkSummaryComponent;
   }
@@ -688,7 +688,7 @@
 
   String get code => _original.code.name;
 
-  String get analyzerCode => _original.code.analyzerCode;
+  String get analyzerCode => _original.code.analyzerCodes?.first;
 
   SourceSpan get span {
     if (_original.charOffset == -1) {
diff --git a/pkg/front_end/lib/src/base/source.dart b/pkg/front_end/lib/src/base/source.dart
deleted file mode 100644
index 86d6ebf..0000000
--- a/pkg/front_end/lib/src/base/source.dart
+++ /dev/null
@@ -1,184 +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:path/path.dart' as pathos;
-
-import 'analysis_target.dart';
-import 'timestamped_data.dart';
-import 'uri_kind.dart';
-
-/// Base class providing implementations for the methods in [Source] that don't
-/// require filesystem access.
-abstract class BasicSource extends Source {
-  final Uri uri;
-
-  BasicSource(this.uri);
-
-  @override
-  String get encoding => uri.toString();
-
-  @override
-  String get fullName => encoding;
-
-  @override
-  int get hashCode => uri.hashCode;
-
-  @override
-  bool get isInSystemLibrary => uri.scheme == 'dart';
-
-  @override
-  String get shortName => pathos.basename(fullName);
-
-  @override
-  bool operator ==(Object object) => object is Source && object.uri == uri;
-}
-
-/**
- * The interface `Source` defines the behavior of objects representing source
- * code that can be analyzed by the analysis engine.
- *
- * Implementations of this interface need to be aware of some assumptions made
- * by the analysis engine concerning sources:
- *
- * * Sources are not required to be unique. That is, there can be multiple
- * instances representing the same source.
- * * Sources are long lived. That is, the engine is allowed to hold on to a
- * source for an extended period of time and that source must continue to
- * report accurate and up-to-date information.
- *
- * Because of these assumptions, most implementations will not maintain any
- * state but will delegate to an authoritative system of record in order to
- * implement this API. For example, a source that represents files on disk
- * would typically query the file system to determine the state of the file.
- *
- * If the instances that implement this API are the system of record, then they
- * will typically be unique. In that case, sources that are created that
- * represent non-existent files must also be retained so that if those files
- * are created at a later date the long-lived sources representing those files
- * will know that they now exist.
- */
-abstract class Source implements AnalysisTarget {
-  /**
-   * An empty list of sources.
-   */
-  static const List<Source> EMPTY_LIST = const <Source>[];
-
-  /**
-   * Get the contents and timestamp of this source.
-   *
-   * Clients should consider using the method [AnalysisContext.getContents]
-   * because contexts can have local overrides of the content of a source that
-   * the source is not aware of.
-   *
-   * @return the contents and timestamp of the source
-   * @throws Exception if the contents of this source could not be accessed
-   */
-  TimestampedData<String> get contents;
-
-  /**
-   * Return an encoded representation of this source that can be used to create
-   * a source that is equal to this source.
-   *
-   * @return an encoded representation of this source
-   * See [SourceFactory.fromEncoding].
-   */
-  String get encoding;
-
-  /**
-   * Return the full (long) version of the name that can be displayed to the
-   * user to denote this source. For example, for a source representing a file
-   * this would typically be the absolute path of the file.
-   *
-   * @return a name that can be displayed to the user to denote this source
-   */
-  String get fullName;
-
-  /**
-   * Return a hash code for this source.
-   *
-   * @return a hash code for this source
-   * See [Object.hashCode].
-   */
-  @override
-  int get hashCode;
-
-  /**
-   * Return `true` if this source is in one of the system libraries.
-   *
-   * @return `true` if this is in a system library
-   */
-  bool get isInSystemLibrary;
-
-  @override
-  Source get librarySource => null;
-
-  /**
-   * Return the modification stamp for this source, or a negative value if the
-   * source does not exist. A modification stamp is a non-negative integer with
-   * the property that if the contents of the source have not been modified
-   * since the last time the modification stamp was accessed then the same
-   * value will be returned, but if the contents of the source have been
-   * modified one or more times (even if the net change is zero) the stamps
-   * will be different.
-   *
-   * Clients should consider using the method
-   * [AnalysisContext.getModificationStamp] because contexts can have local
-   * overrides of the content of a source that the source is not aware of.
-   */
-  int get modificationStamp;
-
-  /**
-   * Return a short version of the name that can be displayed to the user to
-   * denote this source. For example, for a source representing a file this
-   * would typically be the name of the file.
-   *
-   * @return a name that can be displayed to the user to denote this source
-   */
-  String get shortName;
-
-  @override
-  Source get source => this;
-
-  /**
-   * Return the URI from which this source was originally derived.
-   *
-   * @return the URI from which this source was originally derived
-   */
-  Uri get uri;
-
-  /**
-   * Return the kind of URI from which this source was originally derived. If
-   * this source was created from an absolute URI, then the returned kind will
-   * reflect the scheme of the absolute URI. If it was created from a relative
-   * URI, then the returned kind will be the same as the kind of the source
-   * against which the relative URI was resolved.
-   *
-   * @return the kind of URI from which this source was originally derived
-   */
-  UriKind get uriKind;
-
-  /**
-   * Return `true` if the given object is a source that represents the same
-   * source code as this source.
-   *
-   * @param object the object to be compared with this object
-   * @return `true` if the given object is a source that represents the same
-   *         source code as this source
-   * See [Object.==].
-   */
-  @override
-  bool operator ==(Object object);
-
-  /**
-   * Return `true` if this source exists.
-   *
-   * Clients should consider using the method [AnalysisContext.exists] because
-   * contexts can have local overrides of the content of a source that the
-   * source is not aware of and a source with local content is considered to
-   * exist even if there is no file on disk.
-   *
-   * @return `true` if this source exists
-   */
-  bool exists();
-}
diff --git a/pkg/front_end/lib/src/base/timestamped_data.dart b/pkg/front_end/lib/src/base/timestamped_data.dart
deleted file mode 100644
index 4c76dc5..0000000
--- a/pkg/front_end/lib/src/base/timestamped_data.dart
+++ /dev/null
@@ -1,24 +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.
-
-/**
- * Analysis data for which we have a modification time.
- */
-class TimestampedData<E> {
-  /**
-   * The modification time of the source from which the data was created.
-   */
-  final int modificationTime;
-
-  /**
-   * The data that was created from the source.
-   */
-  final E data;
-
-  /**
-   * Initialize a newly created holder to associate the given [data] with the
-   * given [modificationTime].
-   */
-  TimestampedData(this.modificationTime, this.data);
-}
diff --git a/pkg/front_end/lib/src/base/uri_kind.dart b/pkg/front_end/lib/src/base/uri_kind.dart
deleted file mode 100644
index e098992..0000000
--- a/pkg/front_end/lib/src/base/uri_kind.dart
+++ /dev/null
@@ -1,88 +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.
-
-/**
- * The enumeration `UriKind` defines the different kinds of URI's that are
- * known to the analysis engine. These are used to keep track of the kind of
- * URI associated with a given source.
- */
-class UriKind implements Comparable<UriKind> {
-  /**
-   * A 'dart:' URI.
-   */
-  static const UriKind DART_URI = const UriKind('DART_URI', 0, 0x64);
-
-  /**
-   * A 'file:' URI.
-   */
-  static const UriKind FILE_URI = const UriKind('FILE_URI', 1, 0x66);
-
-  /**
-   * A 'package:' URI.
-   */
-  static const UriKind PACKAGE_URI = const UriKind('PACKAGE_URI', 2, 0x70);
-
-  static const List<UriKind> values = const [DART_URI, FILE_URI, PACKAGE_URI];
-
-  /**
-   * The name of this URI kind.
-   */
-  final String name;
-
-  /**
-   * The ordinal value of the URI kind.
-   */
-  final int ordinal;
-
-  /**
-   * The single character encoding used to identify this kind of URI.
-   */
-  final int encoding;
-
-  /**
-   * Initialize a newly created URI kind to have the given encoding.
-   */
-  const UriKind(this.name, this.ordinal, this.encoding);
-
-  @override
-  int get hashCode => ordinal;
-
-  @override
-  int compareTo(UriKind other) => ordinal - other.ordinal;
-
-  @override
-  String toString() => name;
-
-  /**
-   * Return the URI kind represented by the given [encoding], or `null` if there
-   * is no kind with the given encoding.
-   */
-  static UriKind fromEncoding(int encoding) {
-    while (true) {
-      if (encoding == 0x64) {
-        return DART_URI;
-      } else if (encoding == 0x66) {
-        return FILE_URI;
-      } else if (encoding == 0x70) {
-        return PACKAGE_URI;
-      }
-      break;
-    }
-    return null;
-  }
-
-  /**
-   * Return the URI kind corresponding to the given scheme string.
-   */
-  static UriKind fromScheme(String scheme) {
-    if (scheme == 'package') {
-      return UriKind.PACKAGE_URI;
-    } else if (scheme == 'dart') {
-      return UriKind.DART_URI;
-    } else if (scheme == 'file') {
-      return UriKind.FILE_URI;
-    }
-    return UriKind.FILE_URI;
-  }
-}
diff --git a/pkg/front_end/lib/src/base/uri_resolver.dart b/pkg/front_end/lib/src/base/uri_resolver.dart
deleted file mode 100644
index 0c6a420..0000000
--- a/pkg/front_end/lib/src/base/uri_resolver.dart
+++ /dev/null
@@ -1,68 +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.
-
-/// The class `UriResolver` implements the rules for resolving "dart:" and
-/// "package:" URIs.
-class UriResolver {
-  /// The URI scheme used for "package" URIs.
-  static const PACKAGE_SCHEME = 'package';
-
-  /// The URI scheme used for "dart" URIs.
-  static const DART_SCHEME = 'dart';
-
-  /// A map from package name to the file URI of the "lib" directory of the
-  /// corresponding package.  This is equivalent to the format returned by
-  /// the "package_config" package's parse() function.
-  final Map<String, Uri> packages;
-
-  /// A map from SDK library name (e.g. `core` for `dart:core`) to the file URI
-  /// of the defining compilation unit of the SDK library.
-  final Map<String, Uri> sdkLibraries;
-
-  UriResolver(this.packages, this.sdkLibraries);
-
-  /// Converts "package:" and "dart:" URIs to the locations of the corresponding
-  /// files.
-  ///
-  /// If the given URI is a "package:" or "dart:" URI, is well formed, and names
-  /// a package or dart library that is recognized, returns the URI it resolves
-  /// to.  If the given URI is a "package:" or "dart:" URI, and is ill-formed
-  /// or names a package or dart library that is not recognized, returns `null`.
-  ///
-  /// If the given URI has any scheme other than "package:" or "dart:", it is
-  /// returned unchanged.
-  ///
-  /// It is not necessary for the URI to be absolute (relative URIs will be
-  /// passed through unchanged).
-  ///
-  /// Note that no I/O is performed; the URI that is returned will be
-  /// independent of whether or not any particular file exists on the file
-  /// system.
-  Uri resolve(Uri uri) {
-    if (uri.scheme == DART_SCHEME || uri.scheme == PACKAGE_SCHEME) {
-      var path = uri.path;
-      var slashIndex = path.indexOf('/');
-      String prefix;
-      String rest;
-      if (slashIndex >= 0) {
-        prefix = path.substring(0, slashIndex);
-        rest = path.substring(slashIndex + 1);
-      } else {
-        prefix = path;
-        rest = '';
-      }
-      Uri libUri;
-      if (uri.scheme == PACKAGE_SCHEME) {
-        if (slashIndex < 0) return null;
-        libUri = packages[prefix];
-      } else if (uri.scheme == DART_SCHEME) {
-        libUri = sdkLibraries[prefix];
-      }
-      if (libUri == null) return null;
-      return libUri.resolve(rest);
-    } else {
-      return uri;
-    }
-  }
-}
diff --git a/pkg/front_end/lib/src/byte_store/byte_store.dart b/pkg/front_end/lib/src/byte_store/byte_store.dart
deleted file mode 100644
index 80f7b32..0000000
--- a/pkg/front_end/lib/src/byte_store/byte_store.dart
+++ /dev/null
@@ -1,80 +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 'cache.dart';
-
-/**
- * Store of bytes associated with string keys.
- *
- * Each key must be not longer than 100 characters and consist of only `[a-z]`,
- * `[0-9]`, `.` and `_` characters. The key cannot be an empty string, the
- * literal `.`, or contain the sequence `..`.
- *
- * Note that associations are not guaranteed to be persistent. The value
- * associated with a key can change or become `null` at any point in time.
- *
- * TODO(scheglov) Research using asynchronous API.
- */
-abstract class ByteStore {
-  /**
-   * Return the bytes associated with the given [key].
-   * Return `null` if the association does not exist.
-   */
-  List<int> get(String key);
-
-  /**
-   * Associate the given [bytes] with the [key].
-   */
-  void put(String key, List<int> bytes);
-}
-
-/**
- * [ByteStore] which stores data only in memory.
- */
-class MemoryByteStore implements ByteStore {
-  final Map<String, List<int>> _map = {};
-
-  @override
-  List<int> get(String key) {
-    return _map[key];
-  }
-
-  @override
-  void put(String key, List<int> bytes) {
-    _map[key] = bytes;
-  }
-}
-
-/**
- * A wrapper around [ByteStore] which adds an in-memory LRU cache to it.
- */
-class MemoryCachingByteStore implements ByteStore {
-  final ByteStore _store;
-  final Cache<String, List<int>> _cache;
-
-  MemoryCachingByteStore(this._store, int maxSizeBytes)
-      : _cache = new Cache<String, List<int>>(maxSizeBytes, (v) => v.length);
-
-  @override
-  List<int> get(String key) {
-    return _cache.get(key, () => _store.get(key));
-  }
-
-  @override
-  void put(String key, List<int> bytes) {
-    _store.put(key, bytes);
-    _cache.put(key, bytes);
-  }
-}
-
-/**
- * [ByteStore] which does not store any data.
- */
-class NullByteStore implements ByteStore {
-  @override
-  List<int> get(String key) => null;
-
-  @override
-  void put(String key, List<int> bytes) {}
-}
diff --git a/pkg/front_end/lib/src/byte_store/file_byte_store.dart b/pkg/front_end/lib/src/byte_store/file_byte_store.dart
deleted file mode 100644
index 8b06333..0000000
--- a/pkg/front_end/lib/src/byte_store/file_byte_store.dart
+++ /dev/null
@@ -1,296 +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 'dart:async';
-import 'dart:io';
-import 'dart:isolate';
-import 'dart:typed_data';
-
-import 'package:path/path.dart';
-
-import 'byte_store.dart';
-import 'fletcher16.dart';
-
-/**
- * The request that is sent from the main isolate to the clean-up isolate.
- */
-class CacheCleanUpRequest {
-  final String cachePath;
-  final int maxSizeBytes;
-  final SendPort replyTo;
-
-  CacheCleanUpRequest(this.cachePath, this.maxSizeBytes, this.replyTo);
-}
-
-/**
- * [ByteStore] that stores values as files and performs cache eviction.
- *
- * Only the process that manages the cache, e.g. Analysis Server, should use
- * this class. Other processes, e.g. Analysis Server plugins, should use
- * [FileByteStore] instead and let the main process to perform eviction.
- */
-class EvictingFileByteStore implements ByteStore {
-  static bool _cleanUpSendPortShouldBePrepared = true;
-  static SendPort _cleanUpSendPort;
-
-  final String _cachePath;
-  final int _maxSizeBytes;
-  final FileByteStore _fileByteStore;
-
-  int _bytesWrittenSinceCleanup = 0;
-  bool _evictionIsolateIsRunning = false;
-
-  EvictingFileByteStore(this._cachePath, this._maxSizeBytes)
-      : _fileByteStore = new FileByteStore(_cachePath) {
-    _requestCacheCleanUp();
-  }
-
-  @override
-  List<int> get(String key) => _fileByteStore.get(key);
-
-  @override
-  void put(String key, List<int> bytes) {
-    _fileByteStore.put(key, bytes);
-    // Update the current size.
-    _bytesWrittenSinceCleanup += bytes.length;
-    if (_bytesWrittenSinceCleanup > _maxSizeBytes ~/ 8) {
-      _requestCacheCleanUp();
-    }
-  }
-
-  /**
-   * If the cache clean up process has not been requested yet, request it.
-   */
-  Future<Null> _requestCacheCleanUp() async {
-    if (_cleanUpSendPortShouldBePrepared) {
-      _cleanUpSendPortShouldBePrepared = false;
-      ReceivePort response = new ReceivePort();
-      await Isolate.spawn(_cacheCleanUpFunction, response.sendPort);
-      _cleanUpSendPort = await response.first as SendPort;
-    } else {
-      while (_cleanUpSendPort == null) {
-        await new Future.delayed(new Duration(milliseconds: 100), () {});
-      }
-    }
-
-    if (!_evictionIsolateIsRunning) {
-      _evictionIsolateIsRunning = true;
-      try {
-        ReceivePort response = new ReceivePort();
-        _cleanUpSendPort.send(new CacheCleanUpRequest(
-            _cachePath, _maxSizeBytes, response.sendPort));
-        await response.first;
-      } finally {
-        _evictionIsolateIsRunning = false;
-        _bytesWrittenSinceCleanup = 0;
-      }
-    }
-  }
-
-  /**
-   * This function is started in a new isolate, receives cache folder clean up
-   * requests and evicts older files from the folder.
-   */
-  static void _cacheCleanUpFunction(message) {
-    SendPort initialReplyTo = message;
-    ReceivePort port = new ReceivePort();
-    initialReplyTo.send(port.sendPort);
-    port.listen((request) {
-      if (request is CacheCleanUpRequest) {
-        _cleanUpFolder(request.cachePath, request.maxSizeBytes);
-        // Let the client know that we're done.
-        request.replyTo.send(true);
-      }
-    });
-  }
-
-  static void _cleanUpFolder(String cachePath, int maxSizeBytes) {
-    // Prepare the list of files and their statistics.
-    List<File> files = <File>[];
-    Map<File, FileStat> fileStatMap = {};
-    int currentSizeBytes = 0;
-    List<FileSystemEntity> resources = new Directory(cachePath).listSync();
-    for (FileSystemEntity resource in resources) {
-      if (resource is File) {
-        try {
-          final FileStat fileStat = resource.statSync();
-          // Make sure that the file was not deleted out from under us (a return
-          // value of FileSystemEntityType.notFound).
-          if (fileStat.type == FileSystemEntityType.file) {
-            files.add(resource);
-            fileStatMap[resource] = fileStat;
-            currentSizeBytes += fileStat.size;
-          }
-        } catch (_) {}
-      }
-    }
-    files.sort((a, b) {
-      return fileStatMap[a].accessed.millisecondsSinceEpoch -
-          fileStatMap[b].accessed.millisecondsSinceEpoch;
-    });
-
-    // Delete files until the current size is less than the max.
-    for (File file in files) {
-      if (currentSizeBytes < maxSizeBytes) {
-        break;
-      }
-      try {
-        file.deleteSync();
-      } catch (_) {}
-      currentSizeBytes -= fileStatMap[file].size;
-    }
-  }
-}
-
-/**
- * [ByteStore] that stores values as files.
- */
-class FileByteStore implements ByteStore {
-  static final FileByteStoreValidator _validator = new FileByteStoreValidator();
-
-  final String _cachePath;
-  final String _tempSuffix;
-  final Map<String, List<int>> _writeInProgress = {};
-  final FuturePool _pool = new FuturePool(20);
-
-  /**
-   * If the same cache path is used from more than one isolate of the same
-   * process, then a unique [tempNameSuffix] must be provided for each isolate.
-   */
-  FileByteStore(this._cachePath, {String tempNameSuffix: ''})
-      : _tempSuffix =
-            '-temp-${pid}${tempNameSuffix.isEmpty ? '' : '-$tempNameSuffix'}';
-
-  @override
-  List<int> get(String key) {
-    List<int> bytes = _writeInProgress[key];
-    if (bytes != null) {
-      return bytes;
-    }
-
-    try {
-      final File file = _getFileForKey(key);
-      if (!file.existsSync()) {
-        return null;
-      }
-      return _validator.getData(file.readAsBytesSync());
-    } catch (_) {
-      // ignore exceptions
-      return null;
-    }
-  }
-
-  @override
-  void put(String key, List<int> bytes) {
-    _writeInProgress[key] = bytes;
-
-    final List<int> wrappedBytes = _validator.wrapData(bytes);
-
-    // We don't wait for the write and rename to complete.
-    _pool.execute(() {
-      final File tempFile = _getFileForKey('$key$_tempSuffix');
-      return tempFile.writeAsBytes(wrappedBytes).then((_) {
-        return tempFile.rename(join(_cachePath, key));
-      }).catchError((_) {
-        // ignore exceptions
-      }).whenComplete(() {
-        if (_writeInProgress[key] == bytes) {
-          _writeInProgress.remove(key);
-        }
-      });
-    });
-  }
-
-  File _getFileForKey(String key) => new File(join(_cachePath, key));
-}
-
-/**
- * Generally speaking, we cannot guarantee that any data written into a file
- * will stay the same - there is always a chance of a hardware problem, file
- * system problem, truncated data, etc.
- *
- * So, we need to embed some validation into data itself. This class append the
- * version and the checksum to data.
- */
-class FileByteStoreValidator {
-  static const List<int> _VERSION = const [0x01, 0x00];
-
-  /**
-   * If the [rawBytes] have the valid version and checksum, extract and
-   * return the data from it. Otherwise return `null`.
-   */
-  List<int> getData(List<int> rawBytes) {
-    // There must be at least the version and the checksum in the raw bytes.
-    if (rawBytes.length < 4) {
-      return null;
-    }
-    int len = rawBytes.length - 4;
-
-    // Check the version.
-    if (rawBytes[len + 0] != _VERSION[0] || rawBytes[len + 1] != _VERSION[1]) {
-      return null;
-    }
-
-    // Check the checksum of the data.
-    List<int> data = rawBytes.sublist(0, len);
-    int checksum = fletcher16(data);
-    if (rawBytes[len + 2] != checksum & 0xFF ||
-        rawBytes[len + 3] != (checksum >> 8) & 0xFF) {
-      return null;
-    }
-
-    // OK, the data is probably valid.
-    return data;
-  }
-
-  /**
-   * Return bytes that include the given [data] plus the current version and
-   * the checksum of the [data].
-   */
-  List<int> wrapData(List<int> data) {
-    int len = data.length;
-    var bytes = new Uint8List(len + 4);
-
-    // Put the data.
-    bytes.setRange(0, len, data);
-
-    // Put the version.
-    bytes[len + 0] = _VERSION[0];
-    bytes[len + 1] = _VERSION[1];
-
-    // Put the checksum of the data.
-    int checksum = fletcher16(data);
-    bytes[len + 2] = checksum & 0xFF;
-    bytes[len + 3] = (checksum >> 8) & 0xFF;
-
-    return bytes;
-  }
-}
-
-class FuturePool {
-  int _available;
-  List waiting = [];
-
-  FuturePool(this._available);
-
-  void execute(Future Function() fn) {
-    if (_available > 0) {
-      _run(fn);
-    } else {
-      waiting.add(fn);
-    }
-  }
-
-  void _run(Future Function() fn) {
-    _available--;
-
-    fn().whenComplete(() {
-      _available++;
-
-      if (waiting.isNotEmpty) {
-        _run(waiting.removeAt(0));
-      }
-    });
-  }
-}
diff --git a/pkg/front_end/lib/src/codegen/tools.dart b/pkg/front_end/lib/src/codegen/tools.dart
deleted file mode 100644
index 02a4050..0000000
--- a/pkg/front_end/lib/src/codegen/tools.dart
+++ /dev/null
@@ -1,268 +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 'dart:async';
-import 'dart:io';
-
-import 'package:path/path.dart';
-
-/**
- * Type of functions used to compute the contents of a set of generated files.
- * [pkgPath] is the path to the current package.
- */
-typedef Map<String, FileContentsComputer> DirectoryContentsComputer(
-    String pkgPath);
-
-/**
- * Type of functions used to compute the contents of a generated file.
- * [pkgPath] is the path to the current package.
- */
-typedef Future<String> FileContentsComputer(String pkgPath);
-
-/**
- * Abstract base class representing behaviors common to generated files and
- * generated directories.
- */
-abstract class GeneratedContent {
-  /**
-   * Check whether the [output] has the correct contents, and return true if it
-   * does.  [pkgPath] is the path to the current package.
-   */
-  Future<bool> check(String pkgPath);
-
-  /**
-   * Replace the [output] with the correct contents.  [pkgPath] is the path to
-   * the current package.
-   */
-  Future<Null> generate(String pkgPath);
-
-  /**
-   * Get a [FileSystemEntity] representing the output file or directory.
-   * [pkgPath] is the path to the current package.
-   */
-  FileSystemEntity output(String pkgPath);
-
-  /**
-   * Check that all of the [targets] are up to date.  If they are not, print
-   * out a message instructing the user to regenerate them, and exit with a
-   * nonzero error code.
-   *
-   * [pkgPath] is the path to the current package.  [generatorRelPath] is the
-   * path to a .dart script the user may use to regenerate the targets.
-   *
-   * To avoid mistakes when run on Windows, [generatorRelPath] always uses
-   * POSIX directory separators.
-   */
-  static Future<Null> checkAll(String pkgPath, String generatorRelPath,
-      Iterable<GeneratedContent> targets) async {
-    bool generateNeeded = false;
-    for (GeneratedContent target in targets) {
-      bool ok = await target.check(pkgPath);
-      if (!ok) {
-        print("${target.output(pkgPath).absolute}"
-            " doesn't have expected contents.");
-        generateNeeded = true;
-      }
-    }
-    if (generateNeeded) {
-      print('Please regenerate using:');
-      String executable = Platform.executable;
-      String packageRoot = '';
-      if (Platform.packageRoot != null) {
-        packageRoot = ' --package-root=${Platform.packageRoot}';
-      }
-      String generateScript =
-          join(pkgPath, joinAll(posix.split(generatorRelPath)));
-      print('  $executable$packageRoot $generateScript');
-      exit(1);
-    } else {
-      print('All generated files up to date.');
-    }
-  }
-
-  /**
-   * Regenerate all of the [targets].  [pkgPath] is the path to the current
-   * package.
-   */
-  static Future<Null> generateAll(
-      String pkgPath, Iterable<GeneratedContent> targets) async {
-    print("Generating...");
-    for (GeneratedContent target in targets) {
-      await target.generate(pkgPath);
-    }
-  }
-}
-
-/**
- * Class representing a single output directory (either generated code or
- * generated HTML). No other content should exist in the directory.
- */
-class GeneratedDirectory extends GeneratedContent {
-  /**
-   * The path to the directory that will have the generated content.
-   */
-  final String outputDirPath;
-
-  /**
-   * Callback function that computes the directory contents.
-   */
-  final DirectoryContentsComputer directoryContentsComputer;
-
-  GeneratedDirectory(this.outputDirPath, this.directoryContentsComputer);
-
-  @override
-  Future<bool> check(String pkgPath) async {
-    Directory outputDirectory = output(pkgPath);
-    Map<String, FileContentsComputer> map = directoryContentsComputer(pkgPath);
-    try {
-      for (String file in map.keys) {
-        FileContentsComputer fileContentsComputer = map[file];
-        String expectedContents = await fileContentsComputer(pkgPath);
-        File outputFile = new File(posix.join(outputDirectory.path, file));
-        String actualContents = outputFile.readAsStringSync();
-        // Normalize Windows line endings to Unix line endings so that the
-        // comparison doesn't fail on Windows.
-        actualContents = actualContents.replaceAll('\r\n', '\n');
-        if (expectedContents != actualContents) {
-          return false;
-        }
-      }
-      int nonHiddenFileCount = 0;
-      outputDirectory
-          .listSync(recursive: false, followLinks: false)
-          .forEach((FileSystemEntity fileSystemEntity) {
-        if (fileSystemEntity is File &&
-            !basename(fileSystemEntity.path).startsWith('.')) {
-          nonHiddenFileCount++;
-        }
-      });
-      if (nonHiddenFileCount != map.length) {
-        // The number of files generated doesn't match the number we expected to
-        // generate.
-        return false;
-      }
-    } catch (e) {
-      // There was a problem reading the file (most likely because it didn't
-      // exist).  Treat that the same as if the file doesn't have the expected
-      // contents.
-      return false;
-    }
-    return true;
-  }
-
-  @override
-  Future<Null> generate(String pkgPath) async {
-    Directory outputDirectory = output(pkgPath);
-    try {
-      // delete the contents of the directory (and the directory itself)
-      outputDirectory.deleteSync(recursive: true);
-    } catch (e) {
-      // Error caught while trying to delete the directory, this can happen if
-      // it didn't yet exist.
-    }
-    // re-create the empty directory
-    outputDirectory.createSync(recursive: true);
-
-    // generate all of the files in the directory
-    Map<String, FileContentsComputer> map = directoryContentsComputer(pkgPath);
-    for (String file in map.keys) {
-      FileContentsComputer fileContentsComputer = map[file];
-      File outputFile = new File(posix.join(outputDirectory.path, file));
-      print('  ${outputFile.path}');
-      String contents = await fileContentsComputer(pkgPath);
-      outputFile.writeAsStringSync(contents);
-    }
-  }
-
-  @override
-  Directory output(String pkgPath) =>
-      new Directory(join(pkgPath, joinAll(posix.split(outputDirPath))));
-}
-
-/**
- * Class representing a single output file (either generated code or generated
- * HTML).
- */
-class GeneratedFile extends GeneratedContent {
-  /**
-   * The output file to which generated output should be written, relative to
-   * the "tool/spec" directory.  This filename uses the posix path separator
-   * ('/') regardless of the OS.
-   */
-  final String outputPath;
-
-  /**
-   * Callback function which computes the file.
-   */
-  final FileContentsComputer computeContents;
-
-  GeneratedFile(this.outputPath, this.computeContents);
-
-  bool get isDartFile => outputPath.endsWith('.dart');
-
-  @override
-  Future<bool> check(String pkgPath) async {
-    File outputFile = output(pkgPath);
-    String expectedContents = await computeContents(pkgPath);
-    if (isDartFile) {
-      expectedContents = DartFormat.formatText(expectedContents);
-    }
-    try {
-      String actualContents = outputFile.readAsStringSync();
-      // Normalize Windows line endings to Unix line endings so that the
-      // comparison doesn't fail on Windows.
-      actualContents = actualContents.replaceAll('\r\n', '\n');
-      return expectedContents == actualContents;
-    } catch (e) {
-      // There was a problem reading the file (most likely because it didn't
-      // exist).  Treat that the same as if the file doesn't have the expected
-      // contents.
-      return false;
-    }
-  }
-
-  @override
-  Future<Null> generate(String pkgPath) async {
-    File outputFile = output(pkgPath);
-    print('  ${outputFile.path}');
-    String contents = await computeContents(pkgPath);
-    outputFile.writeAsStringSync(contents);
-    if (isDartFile) {
-      DartFormat.formatFile(outputFile);
-    }
-  }
-
-  @override
-  File output(String pkgPath) =>
-      new File(join(pkgPath, joinAll(posix.split(outputPath))));
-}
-
-/**
- * A utility class for invoking dartfmt.
- */
-class DartFormat {
-  static String get _dartfmtPath {
-    String binName = Platform.isWindows ? 'dartfmt.bat' : 'dartfmt';
-    for (var loc in [binName, join('dart-sdk', 'bin', binName)]) {
-      var candidatePath = join(dirname(Platform.resolvedExecutable), loc);
-      if (new File(candidatePath).existsSync()) {
-        return candidatePath;
-      }
-    }
-    throw new StateError('Could not find dartfmt executable');
-  }
-
-  static void formatFile(File file) {
-    ProcessResult result = Process.runSync(_dartfmtPath, ['-w', file.path]);
-    if (result.exitCode != 0) throw result.stderr;
-  }
-
-  static String formatText(String text) {
-    File file = new File(join(Directory.systemTemp.path, 'gen.dart'));
-    file.writeAsStringSync(text);
-    ProcessResult result = Process.runSync(_dartfmtPath, ['-w', file.path]);
-    if (result.exitCode != 0) throw result.stderr;
-    return file.readAsStringSync();
-  }
-}
diff --git a/pkg/front_end/lib/src/dependency_walker.dart b/pkg/front_end/lib/src/dependency_walker.dart
deleted file mode 100644
index e00066f..0000000
--- a/pkg/front_end/lib/src/dependency_walker.dart
+++ /dev/null
@@ -1,170 +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.
-
-/**
- * Instances of [Node] represent nodes in a dependency graph.  The
- * type parameter, [NodeType], is the derived type (this affords some
- * extra type safety by making it difficult to accidentally construct
- * bridges between unrelated dependency graphs).
- */
-abstract class Node<NodeType> {
-  /**
-   * Index used by Tarjan's strongly connected components algorithm.
-   * Zero means the node has not been visited yet; a nonzero value
-   * counts the order in which the node was visited.
-   */
-  int _index = 0;
-
-  /**
-   * Low link used by Tarjan's strongly connected components
-   * algorithm.  This represents the smallest [_index] of all the nodes
-   * in the strongly connected component to which this node belongs.
-   */
-  int _lowLink = 0;
-
-  List<NodeType> _dependencies;
-
-  /**
-   * Indicates whether this node has been evaluated yet.
-   */
-  bool get isEvaluated;
-
-  /**
-   * Compute the dependencies of this node.
-   */
-  List<NodeType> computeDependencies();
-
-  /**
-   * Gets the dependencies of the given node, computing them if necessary.
-   */
-  static List<NodeType> getDependencies<NodeType>(Node<NodeType> node) {
-    return node._dependencies ??= node.computeDependencies();
-  }
-}
-
-/**
- * An instance of [DependencyWalker] contains the core algorithms for
- * walking a dependency graph and evaluating nodes in a safe order.
- */
-abstract class DependencyWalker<NodeType extends Node<NodeType>> {
-  /**
-   * Called by [walk] to evaluate a single non-cyclical node, after
-   * all that node's dependencies have been evaluated.
-   */
-  void evaluate(NodeType v);
-
-  /**
-   * Called by [walk] to evaluate a strongly connected component
-   * containing one or more nodes.  All dependencies of the strongly
-   * connected component have been evaluated.
-   */
-  void evaluateScc(List<NodeType> scc);
-
-  /**
-   * Walk the dependency graph starting at [startingPoint], finding
-   * strongly connected components and evaluating them in a safe order
-   * by calling [evaluate] and [evaluateScc].
-   *
-   * This is an implementation of Tarjan's strongly connected
-   * components algorithm
-   * (https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm).
-   */
-  void walk(NodeType startingPoint) {
-    // TODO(paulberry): consider rewriting in a non-recursive way so
-    // that long dependency chains don't cause stack overflow.
-
-    // TODO(paulberry): in the event that an exception occurs during
-    // the walk, restore the state of the [Node] data structures so
-    // that further evaluation will be safe.
-
-    // The index which will be assigned to the next node that is
-    // freshly visited.
-    int index = 1;
-
-    // Stack of nodes which have been seen so far and whose strongly
-    // connected component is still being determined.  Nodes are only
-    // popped off the stack when they are evaluated, so sometimes the
-    // stack contains nodes that were visited after the current node.
-    List<NodeType> stack = <NodeType>[];
-
-    void strongConnect(NodeType node) {
-      bool hasTrivialCycle = false;
-
-      // Assign the current node an index and add it to the stack.  We
-      // haven't seen any of its dependencies yet, so set its lowLink
-      // to its index, indicating that so far it is the only node in
-      // its strongly connected component.
-      node._index = node._lowLink = index++;
-      stack.add(node);
-
-      // Consider the node's dependencies one at a time.
-      for (NodeType dependency in Node.getDependencies(node)) {
-        // If the dependency has already been evaluated, it can't be
-        // part of this node's strongly connected component, so we can
-        // skip it.
-        if (dependency.isEvaluated) {
-          continue;
-        }
-        if (identical(node, dependency)) {
-          // If a node includes itself as a dependency, there is no need to
-          // explore the dependency further.
-          hasTrivialCycle = true;
-        } else if (dependency._index == 0) {
-          // The dependency hasn't been seen yet, so recurse on it.
-          strongConnect(dependency);
-          // If the dependency's lowLink refers to a node that was
-          // visited before the current node, that means that the
-          // current node, the dependency, and the node referred to by
-          // the dependency's lowLink are all part of the same
-          // strongly connected component, so we need to update the
-          // current node's lowLink accordingly.
-          if (dependency._lowLink < node._lowLink) {
-            node._lowLink = dependency._lowLink;
-          }
-        } else {
-          // The dependency has already been seen, so it is part of
-          // the current node's strongly connected component.  If it
-          // was visited earlier than the current node's lowLink, then
-          // it is a new addition to the current node's strongly
-          // connected component, so we need to update the current
-          // node's lowLink accordingly.
-          if (dependency._index < node._lowLink) {
-            node._lowLink = dependency._index;
-          }
-        }
-      }
-
-      // If the current node's lowLink is the same as its index, then
-      // we have finished visiting a strongly connected component, so
-      // pop the stack and evaluate it before moving on.
-      if (node._lowLink == node._index) {
-        // The strongly connected component has only one node.  If there is a
-        // cycle, it's a trivial one.
-        if (identical(stack.last, node)) {
-          stack.removeLast();
-          if (hasTrivialCycle) {
-            evaluateScc(<NodeType>[node]);
-          } else {
-            evaluate(node);
-          }
-        } else {
-          // There are multiple nodes in the strongly connected
-          // component.
-          List<NodeType> scc = <NodeType>[];
-          while (true) {
-            NodeType otherNode = stack.removeLast();
-            scc.add(otherNode);
-            if (identical(otherNode, node)) {
-              break;
-            }
-          }
-          evaluateScc(scc);
-        }
-      }
-    }
-
-    // Kick off the algorithm starting with the starting point.
-    strongConnect(startingPoint);
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/colors.dart b/pkg/front_end/lib/src/fasta/colors.dart
index a59fe06..65b2e79 100644
--- a/pkg/front_end/lib/src/fasta/colors.dart
+++ b/pkg/front_end/lib/src/fasta/colors.dart
@@ -113,6 +113,8 @@
 /// Note: do not call this method directly, as it is expensive to
 /// compute. Instead, use [CompilerContext.enableColors].
 bool computeEnableColors(CompilerContext context) {
+  // TODO(ahe): Remove this method.
+
   bool stderrSupportsColors = _supportsAnsiEscapes(stdout);
   bool stdoutSupportsColors = _supportsAnsiEscapes(stderr);
 
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes.dart b/pkg/front_end/lib/src/fasta/fasta_codes.dart
index ce5d18a..5f09a07 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes.dart
@@ -4,10 +4,13 @@
 
 library fasta.codes;
 
-import 'package:kernel/ast.dart' show Constant, DartType;
+import 'package:kernel/ast.dart'
+    show Constant, DartType, demangleMixinApplicationName;
 
 import 'package:kernel/text/ast_to_text.dart' show NameSystem, Printer;
 
+import '../api_prototype/diagnostic_message.dart' show DiagnosticMessage;
+
 import '../scanner/token.dart' show Token;
 
 import 'severity.dart' show Severity;
@@ -28,12 +31,12 @@
 
   final Template<T> template;
 
-  final String analyzerCode;
+  final List<String> analyzerCodes;
 
   final Severity severity;
 
   const Code(this.name, this.template,
-      {int index, this.analyzerCode, this.severity: Severity.error})
+      {int index, this.analyzerCodes, this.severity: Severity.error})
       : this.index = index ?? -1;
 
   String toString() => name;
@@ -66,12 +69,12 @@
 
   const MessageCode(String name,
       {int index,
-      String analyzerCode,
+      List<String> analyzerCodes,
       Severity severity: Severity.error,
       this.message,
       this.tip})
       : super(name, null,
-            index: index, analyzerCode: analyzerCode, severity: severity);
+            index: index, analyzerCodes: analyzerCodes, severity: severity);
 
   Map<String, dynamic> get arguments => const <String, dynamic>{};
 
@@ -125,12 +128,14 @@
     return message.compareTo(message);
   }
 
-  FormattedMessage withFormatting(String formatted, int line, int column) {
-    return new FormattedMessage(this, formatted, line, column);
+  FormattedMessage withFormatting(String formatted, int line, int column,
+      Severity severity, List<FormattedMessage> relatedInformation) {
+    return new FormattedMessage(
+        this, formatted, line, column, severity, relatedInformation);
   }
 }
 
-class FormattedMessage {
+class FormattedMessage implements DiagnosticMessage {
   final LocatedMessage locatedMessage;
 
   final String formatted;
@@ -139,8 +144,13 @@
 
   final int column;
 
-  const FormattedMessage(
-      this.locatedMessage, this.formatted, this.line, this.column);
+  @override
+  final Severity severity;
+
+  final List<FormattedMessage> relatedInformation;
+
+  const FormattedMessage(this.locatedMessage, this.formatted, this.line,
+      this.column, this.severity, this.relatedInformation);
 
   Code get code => locatedMessage.code;
 
@@ -149,6 +159,31 @@
   String get tip => locatedMessage.tip;
 
   Map<String, dynamic> get arguments => locatedMessage.arguments;
+
+  Uri get uri => locatedMessage.uri;
+
+  int get charOffset => locatedMessage.charOffset;
+
+  int get length => locatedMessage.length;
+
+  @override
+  Iterable<String> get ansiFormatted sync* {
+    yield formatted;
+    if (relatedInformation != null) {
+      for (FormattedMessage m in relatedInformation) {
+        yield m.formatted;
+      }
+    }
+  }
+
+  @override
+  Iterable<String> get plainTextFormatted {
+    // TODO(ahe): Implement this correctly.
+    return ansiFormatted;
+  }
+
+  @override
+  int get index => code.index;
 }
 
 String relativizeUri(Uri uri) {
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 2989503..b2f3d1e 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -21,11 +21,13 @@
 const Code<Message Function(String name)> codeAbstractClassInstantiation =
     const Code<Message Function(String name)>(
         "AbstractClassInstantiation", templateAbstractClassInstantiation,
-        analyzerCode: "NEW_WITH_ABSTRACT_CLASS",
+        analyzerCodes: <String>["NEW_WITH_ABSTRACT_CLASS"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsAbstractClassInstantiation(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeAbstractClassInstantiation,
       message: """The class '${name}' is abstract and can't be instantiated.""",
       arguments: {'name': name});
@@ -37,7 +39,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAbstractClassMember = const MessageCode(
     "AbstractClassMember",
-    analyzerCode: "ABSTRACT_CLASS_MEMBER",
+    index: 51,
     message: r"""Members of classes can't be declared to be 'abstract'.""",
     tip:
         r"""Try removing the 'abstract' keyword. You can add the 'abstract' keyword before the class declaration.""");
@@ -47,7 +49,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAbstractNotSync = const MessageCode("AbstractNotSync",
-    analyzerCode: "NON_SYNC_ABSTRACT_METHOD",
+    analyzerCodes: <String>["NON_SYNC_ABSTRACT_METHOD"],
     message: r"""Abstract methods can't use 'async', 'async*', or 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -66,11 +68,13 @@
     const Code<Message Function(String name)>(
         "AbstractRedirectedClassInstantiation",
         templateAbstractRedirectedClassInstantiation,
-        analyzerCode: "FACTORY_REDIRECTS_TO_ABSTRACT_CLASS",
+        analyzerCodes: <String>["FACTORY_REDIRECTS_TO_ABSTRACT_CLASS"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsAbstractRedirectedClassInstantiation(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeAbstractRedirectedClassInstantiation,
       message:
           """Factory redirects to class '${name}', which is abstract and can't be instantiated.""",
@@ -92,6 +96,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsAccessError(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeAccessError,
       message: """Access error: '${name}'.""", arguments: {'name': name});
 }
@@ -109,11 +115,13 @@
     codeAmbiguousSupertypes =
     const Code<Message Function(String name, DartType _type, DartType _type2)>(
         "AmbiguousSupertypes", templateAmbiguousSupertypes,
-        analyzerCode: "AMBIGUOUS_SUPERTYPES");
+        analyzerCodes: <String>["AMBIGUOUS_SUPERTYPES"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsAmbiguousSupertypes(
     String name, DartType _type, DartType _type2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -130,6 +138,26 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeAnonymousBreakTargetOutsideFunction =
+    messageAnonymousBreakTargetOutsideFunction;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageAnonymousBreakTargetOutsideFunction =
+    const MessageCode("AnonymousBreakTargetOutsideFunction",
+        analyzerCodes: <String>["LABEL_IN_OUTER_SCOPE"],
+        message: r"""Can't break to a target in a different function.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeAnonymousContinueTargetOutsideFunction =
+    messageAnonymousContinueTargetOutsideFunction;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageAnonymousContinueTargetOutsideFunction =
+    const MessageCode("AnonymousContinueTargetOutsideFunction",
+        analyzerCodes: <String>["LABEL_IN_OUTER_SCOPE"],
+        message: r"""Can't continue at a target in a different function.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         DartType _type,
@@ -148,7 +176,7 @@
     codeArgumentTypeNotAssignable =
     const Code<Message Function(DartType _type, DartType _type2)>(
         "ArgumentTypeNotAssignable", templateArgumentTypeNotAssignable,
-        analyzerCode: "ARGUMENT_TYPE_NOT_ASSIGNABLE");
+        analyzerCodes: <String>["ARGUMENT_TYPE_NOT_ASSIGNABLE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsArgumentTypeNotAssignable(
@@ -184,7 +212,7 @@
 const Code<Message Function(int codePoint)> codeAsciiControlCharacter =
     const Code<Message Function(int codePoint)>(
         "AsciiControlCharacter", templateAsciiControlCharacter,
-        analyzerCode: "ILLEGAL_CHARACTER");
+        analyzerCodes: <String>["ILLEGAL_CHARACTER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsAsciiControlCharacter(int codePoint) {
@@ -218,7 +246,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAsyncAsIdentifier = const MessageCode(
     "AsyncAsIdentifier",
-    analyzerCode: "ASYNC_KEYWORD_USED_AS_IDENTIFIER",
+    analyzerCodes: <String>["ASYNC_KEYWORD_USED_AS_IDENTIFIER"],
     message:
         r"""'async' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.""");
 
@@ -228,7 +256,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAwaitAsIdentifier = const MessageCode(
     "AwaitAsIdentifier",
-    analyzerCode: "ASYNC_KEYWORD_USED_AS_IDENTIFIER",
+    analyzerCodes: <String>["ASYNC_KEYWORD_USED_AS_IDENTIFIER"],
     message:
         r"""'await' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.""");
 
@@ -238,7 +266,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAwaitForNotAsync = const MessageCode(
     "AwaitForNotAsync",
-    analyzerCode: "ASYNC_FOR_IN_WRONG_CONTEXT",
+    analyzerCodes: <String>["ASYNC_FOR_IN_WRONG_CONTEXT"],
     message:
         r"""The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.""",
     tip:
@@ -249,7 +277,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAwaitNotAsync = const MessageCode("AwaitNotAsync",
-    analyzerCode: "AWAIT_IN_WRONG_CONTEXT",
+    analyzerCodes: <String>["AWAIT_IN_WRONG_CONTEXT"],
     message: r"""'await' can only be used in 'async' or 'async*' methods.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -272,11 +300,15 @@
     const Code<Message Function(String name, String name2)>(
         "BoundIssueViaCycleNonSimplicity",
         templateBoundIssueViaCycleNonSimplicity,
-        analyzerCode: "NOT_INSTANTIATED_BOUND");
+        analyzerCodes: <String>["NOT_INSTANTIATED_BOUND"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsBoundIssueViaCycleNonSimplicity(
     String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   return new Message(codeBoundIssueViaCycleNonSimplicity,
       message:
           """Generic type '${name}' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through '${name2}'.""",
@@ -299,10 +331,12 @@
 const Code<Message Function(String name)> codeBoundIssueViaLoopNonSimplicity =
     const Code<Message Function(String name)>("BoundIssueViaLoopNonSimplicity",
         templateBoundIssueViaLoopNonSimplicity,
-        analyzerCode: "NOT_INSTANTIATED_BOUND");
+        analyzerCodes: <String>["NOT_INSTANTIATED_BOUND"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsBoundIssueViaLoopNonSimplicity(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeBoundIssueViaLoopNonSimplicity,
       message:
           """Generic type '${name}' can't be used without type arguments in the bounds of its own type variables.""",
@@ -325,10 +359,12 @@
     const Code<Message Function(String name)>(
         "BoundIssueViaRawTypeWithNonSimpleBounds",
         templateBoundIssueViaRawTypeWithNonSimpleBounds,
-        analyzerCode: "NOT_INSTANTIATED_BOUND");
+        analyzerCodes: <String>["NOT_INSTANTIATED_BOUND"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsBoundIssueViaRawTypeWithNonSimpleBounds(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeBoundIssueViaRawTypeWithNonSimpleBounds,
       message:
           """Generic type '${name}' can't be used without type arguments in a type variable bound.""",
@@ -342,7 +378,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageBreakOutsideOfLoop = const MessageCode(
     "BreakOutsideOfLoop",
-    analyzerCode: "BREAK_OUTSIDE_OF_LOOP",
+    index: 52,
     message:
         r"""A break statement can't be used outside of a loop or switch statement.""",
     tip: r"""Try removing the break statement.""");
@@ -358,10 +394,12 @@
 const Code<Message Function(String name)> codeBreakTargetOutsideFunction =
     const Code<Message Function(String name)>(
         "BreakTargetOutsideFunction", templateBreakTargetOutsideFunction,
-        analyzerCode: "LABEL_IN_OUTER_SCOPE");
+        analyzerCodes: <String>["LABEL_IN_OUTER_SCOPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsBreakTargetOutsideFunction(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeBreakTargetOutsideFunction,
       message: """Can't break to '${name}' in a different function.""",
       arguments: {'name': name});
@@ -379,7 +417,7 @@
 const Code<Message Function(Token token)> codeBuiltInIdentifierAsType =
     const Code<Message Function(Token token)>(
         "BuiltInIdentifierAsType", templateBuiltInIdentifierAsType,
-        analyzerCode: "BUILT_IN_IDENTIFIER_AS_TYPE");
+        analyzerCodes: <String>["BUILT_IN_IDENTIFIER_AS_TYPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsBuiltInIdentifierAsType(Token token) {
@@ -402,7 +440,7 @@
 const Code<Message Function(Token token)> codeBuiltInIdentifierInDeclaration =
     const Code<Message Function(Token token)>("BuiltInIdentifierInDeclaration",
         templateBuiltInIdentifierInDeclaration,
-        analyzerCode: "BUILT_IN_IDENTIFIER_IN_DECLARATION");
+        analyzerCodes: <String>["BUILT_IN_IDENTIFIER_IN_DECLARATION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsBuiltInIdentifierInDeclaration(Token token) {
@@ -438,6 +476,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCandidateFoundIsDefaultConstructor(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeCandidateFoundIsDefaultConstructor,
       message:
           """The class '${name}' has a constructor that takes no arguments.""",
@@ -451,7 +491,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCannotAssignToParenthesizedExpression =
     const MessageCode("CannotAssignToParenthesizedExpression",
-        analyzerCode: "ASSIGNMENT_TO_PARENTHESIZED_EXPRESSION",
+        analyzerCodes: <String>["ASSIGNMENT_TO_PARENTHESIZED_EXPRESSION"],
         message: r"""Can't assign to a parenthesized expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -460,7 +500,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCannotAssignToSuper = const MessageCode(
     "CannotAssignToSuper",
-    analyzerCode: "NOT_AN_LVALUE",
+    analyzerCodes: <String>["NOT_AN_LVALUE"],
     message: r"""Can't assign to super.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -481,6 +521,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCannotReadSdkSpecification(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeCannotReadSdkSpecification,
       message: """Unable to read the 'libraries.json' specification file:
   ${string}.""", arguments: {'string': string});
@@ -522,10 +563,11 @@
 const Code<Message Function(String string)> codeCantInferTypeDueToCircularity =
     const Code<Message Function(String string)>(
         "CantInferTypeDueToCircularity", templateCantInferTypeDueToCircularity,
-        analyzerCode: "RECURSIVE_COMPILE_TIME_CONSTANT");
+        analyzerCodes: <String>["RECURSIVE_COMPILE_TIME_CONSTANT"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCantInferTypeDueToCircularity(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeCantInferTypeDueToCircularity,
       message:
           """Can't infer the type of '${string}': circularity found during type inference.""",
@@ -548,10 +590,11 @@
     const Code<Message Function(String string)>(
         "CantInferTypeDueToInconsistentOverrides",
         templateCantInferTypeDueToInconsistentOverrides,
-        analyzerCode: "INVALID_METHOD_OVERRIDE");
+        analyzerCodes: <String>["INVALID_METHOD_OVERRIDE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCantInferTypeDueToInconsistentOverrides(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeCantInferTypeDueToInconsistentOverrides,
       message:
           """Can't infer the type of '${string}': overridden members must all have the same type.""",
@@ -569,11 +612,12 @@
 const Code<Message Function(Uri uri_, String string)> codeCantReadFile =
     const Code<Message Function(Uri uri_, String string)>(
         "CantReadFile", templateCantReadFile,
-        analyzerCode: "URI_DOES_NOT_EXIST");
+        analyzerCodes: <String>["URI_DOES_NOT_EXIST"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCantReadFile(Uri uri_, String string) {
   String uri = relativizeUri(uri_);
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeCantReadFile,
       message: """Error when reading '${uri}': ${string}""",
       arguments: {'uri': uri_, 'string': string});
@@ -596,7 +640,7 @@
 const Code<Message Function(Token token)> codeCantUseDeferredPrefixAsConstant =
     const Code<Message Function(Token token)>("CantUseDeferredPrefixAsConstant",
         templateCantUseDeferredPrefixAsConstant,
-        analyzerCode: "CONST_DEFERRED_CLASS");
+        analyzerCodes: <String>["CONST_DEFERRED_CLASS"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCantUseDeferredPrefixAsConstant(Token token) {
@@ -616,7 +660,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCantUsePrefixAsExpression = const MessageCode(
     "CantUsePrefixAsExpression",
-    analyzerCode: "PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT",
+    analyzerCodes: <String>["PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT"],
     message: r"""A prefix can't be used as an expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -626,7 +670,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCantUsePrefixWithNullAware = const MessageCode(
     "CantUsePrefixWithNullAware",
-    analyzerCode: "PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT",
+    analyzerCodes: <String>["PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT"],
     message: r"""A prefix can't be used with null-aware operators.""",
     tip: r"""It should be safe to remove the '?' as a prefix is never null.""");
 
@@ -670,7 +714,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCatchSyntax = const MessageCode("CatchSyntax",
-    analyzerCode: "CATCH_SYNTAX",
+    analyzerCodes: <String>["CATCH_SYNTAX"],
     message:
         r"""'catch' must be followed by '(identifier)' or '(identifier, identifier)'.""",
     tip:
@@ -683,7 +727,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCatchSyntaxExtraParameters = const MessageCode(
     "CatchSyntaxExtraParameters",
-    analyzerCode: "CATCH_SYNTAX",
+    analyzerCodes: <String>["CATCH_SYNTAX"],
     message:
         r"""'catch' must be followed by '(identifier)' or '(identifier, identifier)'.""",
     tip:
@@ -694,7 +738,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageClassInClass = const MessageCode("ClassInClass",
-    analyzerCode: "CLASS_IN_CLASS",
+    index: 53,
     message: r"""Classes can't be declared inside other classes.""",
     tip: r"""Try moving the class to the top-level.""");
 
@@ -704,7 +748,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageColonInPlaceOfIn = const MessageCode(
     "ColonInPlaceOfIn",
-    analyzerCode: "COLON_IN_PLACE_OF_IN",
+    index: 54,
     message: r"""For-in loops use 'in' rather than a colon.""",
     tip: r"""Try replacing the colon with the keyword 'in'.""");
 
@@ -718,10 +762,12 @@
 const Code<Message Function(String name)> codeConflictsWithConstructor =
     const Code<Message Function(String name)>(
         "ConflictsWithConstructor", templateConflictsWithConstructor,
-        analyzerCode: "CONFLICTS_WITH_CONSTRUCTOR");
+        analyzerCodes: <String>["CONFLICTS_WITH_CONSTRUCTOR"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithConstructor(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithConstructor,
       message: """Conflicts with constructor '${name}'.""",
       arguments: {'name': name});
@@ -742,6 +788,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithFactory(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithFactory,
       message: """Conflicts with factory '${name}'.""",
       arguments: {'name': name});
@@ -757,10 +805,12 @@
 const Code<Message Function(String name)> codeConflictsWithMember =
     const Code<Message Function(String name)>(
         "ConflictsWithMember", templateConflictsWithMember,
-        analyzerCode: "CONFLICTS_WITH_MEMBER");
+        analyzerCodes: <String>["CONFLICTS_WITH_MEMBER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithMember(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithMember,
       message: """Conflicts with member '${name}'.""",
       arguments: {'name': name});
@@ -777,11 +827,13 @@
 const Code<Message Function(String name)> codeConflictsWithMemberWarning =
     const Code<Message Function(String name)>(
         "ConflictsWithMemberWarning", templateConflictsWithMemberWarning,
-        analyzerCode: "CONFLICTS_WITH_MEMBER",
+        analyzerCodes: <String>["CONFLICTS_WITH_MEMBER"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithMemberWarning(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithMemberWarning,
       message: """Conflicts with member '${name}'.""",
       arguments: {'name': name});
@@ -797,10 +849,12 @@
 const Code<Message Function(String name)> codeConflictsWithSetter =
     const Code<Message Function(String name)>(
         "ConflictsWithSetter", templateConflictsWithSetter,
-        analyzerCode: "CONFLICTS_WITH_MEMBER");
+        analyzerCodes: <String>["CONFLICTS_WITH_MEMBER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithSetter(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithSetter,
       message: """Conflicts with setter '${name}'.""",
       arguments: {'name': name});
@@ -817,11 +871,13 @@
 const Code<Message Function(String name)> codeConflictsWithSetterWarning =
     const Code<Message Function(String name)>(
         "ConflictsWithSetterWarning", templateConflictsWithSetterWarning,
-        analyzerCode: "CONFLICTS_WITH_MEMBER",
+        analyzerCodes: <String>["CONFLICTS_WITH_MEMBER"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithSetterWarning(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithSetterWarning,
       message: """Conflicts with setter '${name}'.""",
       arguments: {'name': name});
@@ -838,10 +894,12 @@
 const Code<Message Function(String name)> codeConflictsWithTypeVariable =
     const Code<Message Function(String name)>(
         "ConflictsWithTypeVariable", templateConflictsWithTypeVariable,
-        analyzerCode: "CONFLICTING_TYPE_VARIABLE_AND_MEMBER");
+        analyzerCodes: <String>["CONFLICTING_TYPE_VARIABLE_AND_MEMBER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConflictsWithTypeVariable(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithTypeVariable,
       message: """Conflicts with type variable '${name}'.""",
       arguments: {'name': name});
@@ -863,7 +921,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstAfterFactory = const MessageCode(
     "ConstAfterFactory",
-    analyzerCode: "CONST_AFTER_FACTORY",
+    index: 56,
     message:
         r"""The modifier 'const' should be before the modifier 'factory'.""",
     tip: r"""Try re-ordering the modifiers.""");
@@ -874,7 +932,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstAndCovariant = const MessageCode(
     "ConstAndCovariant",
-    analyzerCode: "CONST_AND_COVARIANT",
+    index: 57,
     message:
         r"""Members can't be declared to be both 'const' and 'covariant'.""",
     tip: r"""Try removing either the 'const' or 'covariant' keyword.""");
@@ -884,7 +942,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstAndFinal = const MessageCode("ConstAndFinal",
-    analyzerCode: "CONST_AND_FINAL",
+    index: 58,
     message: r"""Members can't be declared to be both 'const' and 'final'.""",
     tip: r"""Try removing either the 'const' or 'final' keyword.""");
 
@@ -893,7 +951,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstAndVar = const MessageCode("ConstAndVar",
-    analyzerCode: "CONST_AND_VAR",
+    index: 59,
     message: r"""Members can't be declared to be both 'const' and 'var'.""",
     tip: r"""Try removing either the 'const' or 'var' keyword.""");
 
@@ -902,7 +960,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstClass = const MessageCode("ConstClass",
-    analyzerCode: "CONST_CLASS",
+    index: 60,
     message: r"""Classes can't be declared to be 'const'.""",
     tip:
         r"""Try removing the 'const' keyword. If you're trying to indicate that instances of the class can be constants, place the 'const' keyword on  the class' constructor(s).""");
@@ -914,7 +972,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstConstructorInSubclassOfMixinApplication =
     const MessageCode("ConstConstructorInSubclassOfMixinApplication",
-        analyzerCode: "CONST_CONSTRUCTOR_IN_SUBCLASS_OF_MIXIN_APPLICATION",
+        analyzerCodes: <String>[
+      "CONST_CONSTRUCTOR_IN_SUBCLASS_OF_MIXIN_APPLICATION"
+    ],
         message: r"""Can't extend a mixin application and be 'const'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -924,7 +984,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstConstructorNonFinalField = const MessageCode(
     "ConstConstructorNonFinalField",
-    analyzerCode: "CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD",
+    analyzerCodes: <String>["CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD"],
     message: r"""Constructor is marked 'const' so all fields must be final.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -953,7 +1013,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstConstructorWithBody = const MessageCode(
     "ConstConstructorWithBody",
-    analyzerCode: "CONST_CONSTRUCTOR_WITH_BODY",
+    analyzerCodes: <String>["CONST_CONSTRUCTOR_WITH_BODY"],
     message: r"""A const constructor can't have a body.""",
     tip: r"""Try removing either the 'const' keyword or the body.""");
 
@@ -964,7 +1024,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstConstructorWithNonConstSuper = const MessageCode(
     "ConstConstructorWithNonConstSuper",
-    analyzerCode: "CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER",
+    analyzerCodes: <String>["CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER"],
     message:
         r"""Constant constructor can't call non-constant super constructors.""");
 
@@ -992,10 +1052,14 @@
 const Code<Message Function(String name)> codeConstEvalDeferredLibrary =
     const Code<Message Function(String name)>(
         "ConstEvalDeferredLibrary", templateConstEvalDeferredLibrary,
-        analyzerCode: "NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY");
+        analyzerCodes: <String>[
+      "NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY"
+    ]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalDeferredLibrary(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConstEvalDeferredLibrary,
       message:
           """'${name}' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.""",
@@ -1018,7 +1082,7 @@
 const Code<Message Function(Constant _constant)> codeConstEvalDuplicateKey =
     const Code<Message Function(Constant _constant)>(
         "ConstEvalDuplicateKey", templateConstEvalDuplicateKey,
-        analyzerCode: "EQUAL_KEYS_IN_MAP");
+        analyzerCodes: <String>["EQUAL_KEYS_IN_MAP"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalDuplicateKey(Constant _constant) {
@@ -1040,7 +1104,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstEvalFailedAssertion = const MessageCode(
     "ConstEvalFailedAssertion",
-    analyzerCode: "CONST_EVAL_THROWS_EXCEPTION",
+    analyzerCodes: <String>["CONST_EVAL_THROWS_EXCEPTION"],
     message: r"""This assertion failed.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1056,10 +1120,11 @@
     const Code<Message Function(String string)>(
         "ConstEvalFailedAssertionWithMessage",
         templateConstEvalFailedAssertionWithMessage,
-        analyzerCode: "CONST_EVAL_THROWS_EXCEPTION");
+        analyzerCodes: <String>["CONST_EVAL_THROWS_EXCEPTION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalFailedAssertionWithMessage(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeConstEvalFailedAssertionWithMessage,
       message: """This assertion failed with message: ${string}""",
       arguments: {'string': string});
@@ -1092,6 +1157,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalInvalidBinaryOperandType(
     String string, Constant _constant, DartType _type, DartType _type2) {
+  if (string.isEmpty) throw 'No string provided';
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -1134,11 +1200,12 @@
     const Code<Message Function(String string, Constant _constant)>(
         "ConstEvalInvalidMethodInvocation",
         templateConstEvalInvalidMethodInvocation,
-        analyzerCode: "UNDEFINED_OPERATOR");
+        analyzerCodes: <String>["UNDEFINED_OPERATOR"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalInvalidMethodInvocation(
     String string, Constant _constant) {
+  if (string.isEmpty) throw 'No string provided';
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -1166,10 +1233,12 @@
     const Code<Message Function(String name)>(
         "ConstEvalInvalidStaticInvocation",
         templateConstEvalInvalidStaticInvocation,
-        analyzerCode: "CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE");
+        analyzerCodes: <String>["CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalInvalidStaticInvocation(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConstEvalInvalidStaticInvocation,
       message:
           """The invocation of '${name}' is not allowed within a const context.""",
@@ -1191,7 +1260,7 @@
     const Code<Message Function(Constant _constant)>(
         "ConstEvalInvalidStringInterpolationOperand",
         templateConstEvalInvalidStringInterpolationOperand,
-        analyzerCode: "CONST_EVAL_TYPE_BOOL_NUM_STRING");
+        analyzerCodes: <String>["CONST_EVAL_TYPE_BOOL_NUM_STRING"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalInvalidStringInterpolationOperand(
@@ -1275,6 +1344,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalNegativeShift(
     String string, String string2, String string3) {
+  if (string.isEmpty) throw 'No string provided';
+  if (string2.isEmpty) throw 'No string provided';
+  if (string3.isEmpty) throw 'No string provided';
   return new Message(codeConstEvalNegativeShift,
       message:
           """Binary operator '${string}' on '${string2}' requires non-negative operand, but was '${string3}'.""",
@@ -1295,10 +1367,11 @@
 const Code<Message Function(String string)> codeConstEvalNonConstantLiteral =
     const Code<Message Function(String string)>(
         "ConstEvalNonConstantLiteral", templateConstEvalNonConstantLiteral,
-        analyzerCode: "NON_CONSTANT_DEFAULT_VALUE");
+        analyzerCodes: <String>["NON_CONSTANT_DEFAULT_VALUE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalNonConstantLiteral(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeConstEvalNonConstantLiteral,
       message:
           """Can't have a non-constant ${string} literal within a const context.""",
@@ -1321,10 +1394,11 @@
     const Code<Message Function(String string)>(
         "ConstEvalNonConstantVariableGet",
         templateConstEvalNonConstantVariableGet,
-        analyzerCode: "NON_CONSTANT_VALUE_IN_INITIALIZER");
+        analyzerCodes: <String>["NON_CONSTANT_VALUE_IN_INITIALIZER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalNonConstantVariableGet(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeConstEvalNonConstantVariableGet,
       message:
           """The variable '${string}' is not a constant, only constant expressions are allowed.""",
@@ -1347,10 +1421,12 @@
     codeConstEvalZeroDivisor =
     const Code<Message Function(String string, String string2)>(
         "ConstEvalZeroDivisor", templateConstEvalZeroDivisor,
-        analyzerCode: "CONST_EVAL_THROWS_IDBZE");
+        analyzerCodes: <String>["CONST_EVAL_THROWS_IDBZE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalZeroDivisor(String string, String string2) {
+  if (string.isEmpty) throw 'No string provided';
+  if (string2.isEmpty) throw 'No string provided';
   return new Message(codeConstEvalZeroDivisor,
       message:
           """Binary operator '${string}' on '${string2}' requires non-zero divisor, but divisor was '0'.""",
@@ -1362,7 +1438,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstFactory = const MessageCode("ConstFactory",
-    analyzerCode: "CONST_FACTORY",
+    analyzerCodes: <String>["CONST_FACTORY"],
     message:
         r"""Only redirecting factory constructors can be declared to be 'const'.""",
     tip:
@@ -1375,7 +1451,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstFactoryRedirectionToNonConst = const MessageCode(
     "ConstFactoryRedirectionToNonConst",
-    analyzerCode: "REDIRECT_TO_NON_CONST_CONSTRUCTOR",
+    analyzerCodes: <String>["REDIRECT_TO_NON_CONST_CONSTRUCTOR"],
     message:
         r"""Constant factory constructor can't delegate to a non-constant constructor.""",
     tip:
@@ -1396,10 +1472,12 @@
 const Code<Message Function(String name)> codeConstFieldWithoutInitializer =
     const Code<Message Function(String name)>(
         "ConstFieldWithoutInitializer", templateConstFieldWithoutInitializer,
-        analyzerCode: "CONST_NOT_INITIALIZED");
+        analyzerCodes: <String>["CONST_NOT_INITIALIZED"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstFieldWithoutInitializer(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConstFieldWithoutInitializer,
       message: """The const variable '${name}' must be initialized.""",
       tip:
@@ -1413,7 +1491,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstInstanceField = const MessageCode(
     "ConstInstanceField",
-    analyzerCode: "CONST_INSTANCE_FIELD",
+    analyzerCodes: <String>["CONST_INSTANCE_FIELD"],
     message: r"""Only static fields can be declared as const.""",
     tip:
         r"""Try using 'final' instead of 'const', or adding the keyword 'static'.""");
@@ -1423,7 +1501,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstMethod = const MessageCode("ConstMethod",
-    analyzerCode: "CONST_METHOD",
+    analyzerCodes: <String>["CONST_METHOD"],
     message:
         r"""Getters, setters and methods can't be declared to be 'const'.""",
     tip: r"""Try removing the 'const' keyword.""");
@@ -1434,7 +1512,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstructorCyclic = const MessageCode(
     "ConstructorCyclic",
-    analyzerCode: "RECURSIVE_CONSTRUCTOR_REDIRECT",
+    analyzerCodes: <String>["RECURSIVE_CONSTRUCTOR_REDIRECT"],
     message: r"""Redirecting constructers can't be cyclic.""",
     tip:
         r"""Try to have all constructors eventually redirect to a non-redirecting constructor.""");
@@ -1449,11 +1527,13 @@
 const Code<Message Function(String name)> codeConstructorNotFound =
     const Code<Message Function(String name)>(
         "ConstructorNotFound", templateConstructorNotFound,
-        analyzerCode: "CONSTRUCTOR_NOT_FOUND",
+        analyzerCodes: <String>["CONSTRUCTOR_NOT_FOUND"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstructorNotFound(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConstructorNotFound,
       message: """Couldn't find constructor '${name}'.""",
       arguments: {'name': name});
@@ -1465,7 +1545,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstructorNotSync = const MessageCode(
     "ConstructorNotSync",
-    analyzerCode: "NON_SYNC_CONSTRUCTOR",
+    analyzerCodes: <String>["NON_SYNC_CONSTRUCTOR"],
     message:
         r"""Constructor bodies can't use 'async', 'async*', or 'sync*'.""");
 
@@ -1476,7 +1556,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstructorWithReturnType = const MessageCode(
     "ConstructorWithReturnType",
-    analyzerCode: "CONSTRUCTOR_WITH_RETURN_TYPE",
+    index: 55,
     message: r"""Constructors can't have a return type.""",
     tip: r"""Try removing the return type.""");
 
@@ -1487,7 +1567,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstructorWithTypeArguments = const MessageCode(
     "ConstructorWithTypeArguments",
-    analyzerCode: "UNDEFINED_CLASS",
+    analyzerCodes: <String>["UNDEFINED_CLASS"],
     message:
         r"""A constructor invocation can't have type arguments on the constructor name.""",
     tip: r"""Try to place the type arguments on the class name.""");
@@ -1499,7 +1579,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstructorWithTypeParameters = const MessageCode(
     "ConstructorWithTypeParameters",
-    analyzerCode: "TYPE_PARAMETER_ON_CONSTRUCTOR",
+    analyzerCodes: <String>["TYPE_PARAMETER_ON_CONSTRUCTOR"],
     message: r"""Constructors can't have type parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1508,7 +1588,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstructorWithWrongName = const MessageCode(
     "ConstructorWithWrongName",
-    analyzerCode: "INVALID_CONSTRUCTOR_NAME",
+    analyzerCodes: <String>["INVALID_CONSTRUCTOR_NAME"],
     message:
         r"""The name of a constructor must match the name of the enclosing class.""");
 
@@ -1527,6 +1607,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstructorWithWrongNameContext(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeConstructorWithWrongNameContext,
       message: """The name of the enclosing class is '${name}'.""",
       arguments: {'name': name});
@@ -1538,7 +1620,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageContinueLabelNotTarget = const MessageCode(
     "ContinueLabelNotTarget",
-    analyzerCode: "LABEL_UNDEFINED",
+    analyzerCodes: <String>["LABEL_UNDEFINED"],
     message: r"""Target of continue must be a label.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1564,10 +1646,12 @@
 const Code<Message Function(String name)> codeContinueTargetOutsideFunction =
     const Code<Message Function(String name)>(
         "ContinueTargetOutsideFunction", templateContinueTargetOutsideFunction,
-        analyzerCode: "LABEL_IN_OUTER_SCOPE");
+        analyzerCodes: <String>["LABEL_IN_OUTER_SCOPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsContinueTargetOutsideFunction(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeContinueTargetOutsideFunction,
       message: """Can't continue at '${name}' in a different function.""",
       arguments: {'name': name});
@@ -1580,7 +1664,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageContinueWithoutLabelInCase = const MessageCode(
     "ContinueWithoutLabelInCase",
-    analyzerCode: "CONTINUE_WITHOUT_LABEL_IN_CASE",
+    analyzerCodes: <String>["CONTINUE_WITHOUT_LABEL_IN_CASE"],
     message:
         r"""A continue statement in a switch statement must have a label as a target.""",
     tip:
@@ -1603,6 +1687,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCouldNotParseUri(String string, String string2) {
+  if (string.isEmpty) throw 'No string provided';
+  if (string2.isEmpty) throw 'No string provided';
   return new Message(codeCouldNotParseUri,
       message: """Couldn't parse URI '${string}':
   ${string2}.""", arguments: {'string': string, 'string2': string2});
@@ -1614,7 +1700,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCovariantAfterFinal = const MessageCode(
     "CovariantAfterFinal",
-    analyzerCode: "COVARIANT_AFTER_FINAL",
+    analyzerCodes: <String>["COVARIANT_AFTER_FINAL"],
     message:
         r"""The modifier 'covariant' should be before the modifier 'final'.""",
     tip: r"""Try re-ordering the modifiers.""");
@@ -1636,7 +1722,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCovariantAndStatic = const MessageCode(
     "CovariantAndStatic",
-    analyzerCode: "COVARIANT_AND_STATIC",
+    analyzerCodes: <String>["COVARIANT_AND_STATIC"],
     message:
         r"""Members can't be declared to be both 'covariant' and 'static'.""",
     tip: r"""Try removing either the 'covariant' or 'static' keyword.""");
@@ -1646,7 +1732,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCovariantMember = const MessageCode("CovariantMember",
-    analyzerCode: "COVARIANT_MEMBER",
+    analyzerCodes: <String>["COVARIANT_MEMBER"],
     message:
         r"""Getters, setters and methods can't be declared to be 'covariant'.""",
     tip: r"""Try removing the 'covariant' keyword.""");
@@ -1668,10 +1754,13 @@
     codeCycleInTypeVariables =
     const Code<Message Function(String name, String string)>(
         "CycleInTypeVariables", templateCycleInTypeVariables,
-        analyzerCode: "TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND");
+        analyzerCodes: <String>["TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCycleInTypeVariables(String name, String string) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeCycleInTypeVariables,
       message: """Type '${name}' is a bound of itself via '${string}'.""",
       tip:
@@ -1691,10 +1780,13 @@
     codeCyclicClassHierarchy =
     const Code<Message Function(String name, String string)>(
         "CyclicClassHierarchy", templateCyclicClassHierarchy,
-        analyzerCode: "RECURSIVE_INTERFACE_INHERITANCE");
+        analyzerCodes: <String>["RECURSIVE_INTERFACE_INHERITANCE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCyclicClassHierarchy(String name, String string) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeCyclicClassHierarchy,
       message: """'${name}' is a supertype of itself via '${string}'.""",
       arguments: {'name': name, 'string': string});
@@ -1713,10 +1805,12 @@
     const Code<Message Function(String name)>(
         "CyclicRedirectingFactoryConstructors",
         templateCyclicRedirectingFactoryConstructors,
-        analyzerCode: "RECURSIVE_FACTORY_REDIRECT");
+        analyzerCodes: <String>["RECURSIVE_FACTORY_REDIRECT"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCyclicRedirectingFactoryConstructors(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeCyclicRedirectingFactoryConstructors,
       message: """Cyclic definition of factory '${name}'.""",
       arguments: {'name': name});
@@ -1732,10 +1826,12 @@
 const Code<Message Function(String name)> codeCyclicTypedef =
     const Code<Message Function(String name)>(
         "CyclicTypedef", templateCyclicTypedef,
-        analyzerCode: "TYPE_ALIAS_CANNOT_REFERENCE_ITSELF");
+        analyzerCodes: <String>["TYPE_ALIAS_CANNOT_REFERENCE_ITSELF"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsCyclicTypedef(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeCyclicTypedef,
       message: """The typedef '${name}' has a reference to itself.""",
       arguments: {'name': name});
@@ -1748,7 +1844,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageDeclaredMemberConflictsWithInheritedMember =
     const MessageCode("DeclaredMemberConflictsWithInheritedMember",
-        analyzerCode: "DECLARED_MEMBER_CONFLICTS_WITH_INHERITED",
+        analyzerCodes: <String>["DECLARED_MEMBER_CONFLICTS_WITH_INHERITED"],
         severity: Severity.errorLegacyWarning,
         message:
             r"""Can't declare a member that conflicts with an inherited one.""");
@@ -1779,10 +1875,14 @@
     const Code<Message Function(String name)>(
         "DefaultValueInRedirectingFactoryConstructor",
         templateDefaultValueInRedirectingFactoryConstructor,
-        analyzerCode: "DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR");
+        analyzerCodes: <String>[
+      "DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR"
+    ]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDefaultValueInRedirectingFactoryConstructor(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDefaultValueInRedirectingFactoryConstructor,
       message:
           """Can't have a default value here because any default values of '${name}' would be used instead.""",
@@ -1796,7 +1896,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageDeferredAfterPrefix = const MessageCode(
     "DeferredAfterPrefix",
-    analyzerCode: "DEFERRED_AFTER_PREFIX",
+    analyzerCodes: <String>["DEFERRED_AFTER_PREFIX"],
     message:
         r"""The deferred keyword should come immediately before the prefix ('as' clause).""",
     tip: r"""Try moving the deferred keyword before the prefix.""");
@@ -1815,10 +1915,12 @@
 const Code<Message Function(String name)> codeDeferredPrefixDuplicated =
     const Code<Message Function(String name)>(
         "DeferredPrefixDuplicated", templateDeferredPrefixDuplicated,
-        analyzerCode: "SHARED_DEFERRED_PREFIX");
+        analyzerCodes: <String>["SHARED_DEFERRED_PREFIX"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDeferredPrefixDuplicated(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDeferredPrefixDuplicated,
       message:
           """Can't use the name '${name}' for a deferred library, as the name is used elsewhere.""",
@@ -1840,6 +1942,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDeferredPrefixDuplicatedCause(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDeferredPrefixDuplicatedCause,
       message: """'${name}' is used here.""", arguments: {'name': name});
 }
@@ -1862,7 +1966,7 @@
     codeDeferredTypeAnnotation =
     const Code<Message Function(DartType _type, String name)>(
         "DeferredTypeAnnotation", templateDeferredTypeAnnotation,
-        analyzerCode: "TYPE_ANNOTATION_DEFERRED_CLASS",
+        analyzerCodes: <String>["TYPE_ANNOTATION_DEFERRED_CLASS"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1873,6 +1977,8 @@
   new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
   String type = '$buffer';
 
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDeferredTypeAnnotation,
       message:
           """The type '${type}' is deferred loaded via prefix '${name}' and can't be used as a type annotation.""",
@@ -1905,8 +2011,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDillOutlineSummary(
     int count, int count2, num _num1, num _num2, num _num3) {
+  if (count == null) throw 'No count provided';
+  if (count2 == null) throw 'No count provided';
+  if (_num1 == null) throw 'No number provided';
   String num1 = _num1.toStringAsFixed(3);
+  if (_num2 == null) throw 'No number provided';
   String num2 = _num2.toStringAsFixed(3).padLeft(12);
+  if (_num3 == null) throw 'No number provided';
   String num3 = _num3.toStringAsFixed(3).padLeft(12);
   return new Message(codeDillOutlineSummary,
       message:
@@ -1923,13 +2034,63 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            name)> templateDirectCycleInTypeVariables = const Template<
+        Message Function(String name)>(
+    messageTemplate: r"""Type '#name' can't use itself as a bound.""",
+    tipTemplate:
+        r"""Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.""",
+    withArguments: _withArgumentsDirectCycleInTypeVariables);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeDirectCycleInTypeVariables =
+    const Code<Message Function(String name)>(
+        "DirectCycleInTypeVariables", templateDirectCycleInTypeVariables,
+        analyzerCodes: <String>["TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDirectCycleInTypeVariables(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeDirectCycleInTypeVariables,
+      message: """Type '${name}' can't use itself as a bound.""",
+      tip:
+          """Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateDirectCyclicClassHierarchy =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""'#name' can't use itself as a supertype.""",
+        withArguments: _withArgumentsDirectCyclicClassHierarchy);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeDirectCyclicClassHierarchy =
+    const Code<Message Function(String name)>(
+        "DirectCyclicClassHierarchy", templateDirectCyclicClassHierarchy,
+        analyzerCodes: <String>["RECURSIVE_INTERFACE_INHERITANCE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDirectCyclicClassHierarchy(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeDirectCyclicClassHierarchy,
+      message: """'${name}' can't use itself as a supertype.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeDirectiveAfterDeclaration =
     messageDirectiveAfterDeclaration;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageDirectiveAfterDeclaration = const MessageCode(
     "DirectiveAfterDeclaration",
-    analyzerCode: "DIRECTIVE_AFTER_DECLARATION",
+    analyzerCodes: <String>["DIRECTIVE_AFTER_DECLARATION"],
     message: r"""Directives must appear before any declarations.""",
     tip: r"""Try moving the directive before any declarations.""");
 
@@ -1939,7 +2100,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageDuplicateDeferred = const MessageCode(
     "DuplicateDeferred",
-    analyzerCode: "DUPLICATE_DEFERRED",
+    analyzerCodes: <String>["DUPLICATE_DEFERRED"],
     message: r"""An import directive can only have one 'deferred' keyword.""",
     tip: r"""Try removing all but one 'deferred' keyword.""");
 
@@ -1956,10 +2117,12 @@
 const Code<Message Function(String name)> codeDuplicateLabelInSwitchStatement =
     const Code<Message Function(String name)>("DuplicateLabelInSwitchStatement",
         templateDuplicateLabelInSwitchStatement,
-        analyzerCode: "DUPLICATE_LABEL_IN_SWITCH_STATEMENT");
+        analyzerCodes: <String>["DUPLICATE_LABEL_IN_SWITCH_STATEMENT"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicateLabelInSwitchStatement(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicateLabelInSwitchStatement,
       message:
           """The label '${name}' was already used in this switch statement.""",
@@ -1972,7 +2135,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageDuplicatePrefix = const MessageCode("DuplicatePrefix",
-    analyzerCode: "DUPLICATE_PREFIX",
+    analyzerCodes: <String>["DUPLICATE_PREFIX"],
     message: r"""An import directive can only have one prefix ('as' clause).""",
     tip: r"""Try removing all but one prefix.""");
 
@@ -1986,10 +2149,12 @@
 const Code<Message Function(String name)> codeDuplicatedDeclaration =
     const Code<Message Function(String name)>(
         "DuplicatedDeclaration", templateDuplicatedDeclaration,
-        analyzerCode: "DUPLICATE_DEFINITION");
+        analyzerCodes: <String>["DUPLICATE_DEFINITION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedDeclaration(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedDeclaration,
       message: """'${name}' is already declared in this scope.""",
       arguments: {'name': name});
@@ -2010,12 +2175,42 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedDeclarationCause(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedDeclarationCause,
       message: """Previous declaration of '${name}'.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            name)> templateDuplicatedDeclarationSyntheticCause = const Template<
+        Message Function(String name)>(
+    messageTemplate:
+        r"""Previous declaration of '#name' is implied by this definition.""",
+    withArguments: _withArgumentsDuplicatedDeclarationSyntheticCause);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+    codeDuplicatedDeclarationSyntheticCause =
+    const Code<Message Function(String name)>(
+        "DuplicatedDeclarationSyntheticCause",
+        templateDuplicatedDeclarationSyntheticCause,
+        severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDuplicatedDeclarationSyntheticCause(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeDuplicatedDeclarationSyntheticCause,
+      message:
+          """Previous declaration of '${name}' is implied by this definition.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateDuplicatedDeclarationUse =
     const Template<Message Function(String name)>(
         messageTemplate:
@@ -2031,6 +2226,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedDeclarationUse(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedDeclarationUse,
       message: """Can't use '${name}' because it is declared more than once.""",
       arguments: {'name': name});
@@ -2049,10 +2246,12 @@
     codeDuplicatedExport =
     const Code<Message Function(String name, Uri uri_, Uri uri2_)>(
         "DuplicatedExport", templateDuplicatedExport,
-        analyzerCode: "AMBIGUOUS_EXPORT");
+        analyzerCodes: <String>["AMBIGUOUS_EXPORT"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedExport(String name, Uri uri_, Uri uri2_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   String uri = relativizeUri(uri_);
   String uri2 = relativizeUri(uri2_);
   return new Message(codeDuplicatedExport,
@@ -2077,6 +2276,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedExportInType(String name, Uri uri_, Uri uri2_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   String uri = relativizeUri(uri_);
   String uri2 = relativizeUri(uri2_);
   return new Message(codeDuplicatedExportInType,
@@ -2101,6 +2302,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedImport(String name, Uri uri_, Uri uri2_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   String uri = relativizeUri(uri_);
   String uri2 = relativizeUri(uri2_);
   return new Message(codeDuplicatedImport,
@@ -2121,11 +2324,13 @@
     codeDuplicatedImportInType =
     const Code<Message Function(String name, Uri uri_, Uri uri2_)>(
         "DuplicatedImportInType", templateDuplicatedImportInType,
-        analyzerCode: "AMBIGUOUS_IMPORT",
+        analyzerCodes: <String>["AMBIGUOUS_IMPORT"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedImportInType(String name, Uri uri_, Uri uri2_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   String uri = relativizeUri(uri_);
   String uri2 = relativizeUri(uri2_);
   return new Message(codeDuplicatedImportInType,
@@ -2144,10 +2349,12 @@
 const Code<Message Function(String name)> codeDuplicatedLibraryExport =
     const Code<Message Function(String name)>(
         "DuplicatedLibraryExport", templateDuplicatedLibraryExport,
-        analyzerCode: "EXPORT_DUPLICATED_LIBRARY_NAMED");
+        analyzerCodes: <String>["EXPORT_DUPLICATED_LIBRARY_NAMED"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedLibraryExport(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedLibraryExport,
       message: """A library with name '${name}' is exported more than once.""",
       arguments: {'name': name});
@@ -2168,6 +2375,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedLibraryExportContext(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedLibraryExportContext,
       message: """'${name}' is also exported here.""",
       arguments: {'name': name});
@@ -2184,10 +2393,13 @@
 const Code<Message Function(String name)> codeDuplicatedLibraryImport =
     const Code<Message Function(String name)>(
         "DuplicatedLibraryImport", templateDuplicatedLibraryImport,
-        analyzerCode: "IMPORT_DUPLICATED_LIBRARY_NAMED");
+        analyzerCodes: <String>["IMPORT_DUPLICATED_LIBRARY_NAMED"],
+        severity: Severity.warning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedLibraryImport(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedLibraryImport,
       message: """A library with name '${name}' is imported more than once.""",
       arguments: {'name': name});
@@ -2208,6 +2420,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedLibraryImportContext(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedLibraryImportContext,
       message: """'${name}' is also imported here.""",
       arguments: {'name': name});
@@ -2224,7 +2438,7 @@
 const Code<Message Function(Token token)> codeDuplicatedModifier =
     const Code<Message Function(Token token)>(
         "DuplicatedModifier", templateDuplicatedModifier,
-        analyzerCode: "DUPLICATED_MODIFIER");
+        analyzerCodes: <String>["DUPLICATED_MODIFIER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedModifier(Token token) {
@@ -2249,10 +2463,12 @@
 const Code<Message Function(String name)> codeDuplicatedNamePreviouslyUsed =
     const Code<Message Function(String name)>(
         "DuplicatedNamePreviouslyUsed", templateDuplicatedNamePreviouslyUsed,
-        analyzerCode: "REFERENCED_BEFORE_DECLARATION");
+        analyzerCodes: <String>["REFERENCED_BEFORE_DECLARATION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedNamePreviouslyUsed(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedNamePreviouslyUsed,
       message:
           """Can't declare '${name}' because it was already used in this scope.""",
@@ -2276,6 +2492,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedNamePreviouslyUsedCause(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedNamePreviouslyUsedCause,
       message: """Previous use of '${name}'.""", arguments: {'name': name});
 }
@@ -2290,10 +2508,12 @@
 const Code<Message Function(String name)> codeDuplicatedNamedArgument =
     const Code<Message Function(String name)>(
         "DuplicatedNamedArgument", templateDuplicatedNamedArgument,
-        analyzerCode: "DUPLICATE_NAMED_ARGUMENT");
+        analyzerCodes: <String>["DUPLICATE_NAMED_ARGUMENT"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedNamedArgument(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedNamedArgument,
       message: """Duplicated named argument '${name}'.""",
       arguments: {'name': name});
@@ -2309,10 +2529,12 @@
 const Code<Message Function(String name)> codeDuplicatedParameterName =
     const Code<Message Function(String name)>(
         "DuplicatedParameterName", templateDuplicatedParameterName,
-        analyzerCode: "DUPLICATE_DEFINITION");
+        analyzerCodes: <String>["DUPLICATE_DEFINITION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedParameterName(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedParameterName,
       message: """Duplicated parameter name '${name}'.""",
       arguments: {'name': name});
@@ -2333,6 +2555,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDuplicatedParameterNameCause(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedParameterNameCause,
       message: """Other parameter named '${name}'.""",
       arguments: {'name': name});
@@ -2344,7 +2568,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageEmptyNamedParameterList = const MessageCode(
     "EmptyNamedParameterList",
-    analyzerCode: "MISSING_IDENTIFIER",
+    analyzerCodes: <String>["MISSING_IDENTIFIER"],
     message: r"""Named parameter lists cannot be empty.""",
     tip: r"""Try adding a named parameter to the list.""");
 
@@ -2355,7 +2579,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageEmptyOptionalParameterList = const MessageCode(
     "EmptyOptionalParameterList",
-    analyzerCode: "MISSING_IDENTIFIER",
+    analyzerCodes: <String>["MISSING_IDENTIFIER"],
     message: r"""Optional parameter lists cannot be empty.""",
     tip: r"""Try adding an optional parameter to the list.""");
 
@@ -2380,10 +2604,12 @@
 const Code<Message Function(String name)> codeEnumConstantSameNameAsEnclosing =
     const Code<Message Function(String name)>("EnumConstantSameNameAsEnclosing",
         templateEnumConstantSameNameAsEnclosing,
-        analyzerCode: "ENUM_CONSTANT_WITH_ENUM_NAME");
+        analyzerCodes: <String>["ENUM_CONSTANT_WITH_ENUM_NAME"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsEnumConstantSameNameAsEnclosing(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeEnumConstantSameNameAsEnclosing,
       message:
           """Name of enum constant '${name}' can't be the same as the enum's own name.""",
@@ -2396,7 +2622,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageEnumDeclarationEmpty = const MessageCode(
     "EnumDeclarationEmpty",
-    analyzerCode: "EMPTY_ENUM_BODY",
+    analyzerCodes: <String>["EMPTY_ENUM_BODY"],
     message: r"""An enum declaration can't be empty.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2404,7 +2630,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageEnumInClass = const MessageCode("EnumInClass",
-    analyzerCode: "ENUM_IN_CLASS",
+    analyzerCodes: <String>["ENUM_IN_CLASS"],
     message: r"""Enums can't be declared inside classes.""",
     tip: r"""Try moving the enum to the top-level.""");
 
@@ -2414,7 +2640,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageEnumInstantiation = const MessageCode(
     "EnumInstantiation",
-    analyzerCode: "INSTANTIATE_ENUM",
+    analyzerCodes: <String>["INSTANTIATE_ENUM"],
     message: r"""Enums can't be instantiated.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2439,10 +2665,11 @@
 const Code<Message Function(String string)> codeExpectedAfterButGot =
     const Code<Message Function(String string)>(
         "ExpectedAfterButGot", templateExpectedAfterButGot,
-        analyzerCode: "EXPECTED_TOKEN");
+        analyzerCodes: <String>["EXPECTED_TOKEN"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedAfterButGot(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeExpectedAfterButGot,
       message: """Expected '${string}' after this.""",
       arguments: {'string': string});
@@ -2462,7 +2689,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExpectedBlock = const MessageCode("ExpectedBlock",
-    analyzerCode: "EXPECTED_TOKEN",
+    analyzerCodes: <String>["EXPECTED_TOKEN"],
     message: r"""Expected a block.""",
     tip: r"""Try adding {}.""");
 
@@ -2472,7 +2699,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExpectedBlockToSkip = const MessageCode(
     "ExpectedBlockToSkip",
-    analyzerCode: "MISSING_FUNCTION_BODY",
+    analyzerCodes: <String>["MISSING_FUNCTION_BODY"],
     message: r"""Expected a function body or '=>'.""",
     tip: r"""Try adding {}.""");
 
@@ -2481,7 +2708,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExpectedBody = const MessageCode("ExpectedBody",
-    analyzerCode: "MISSING_FUNCTION_BODY",
+    analyzerCodes: <String>["MISSING_FUNCTION_BODY"],
     message: r"""Expected a function body or '=>'.""",
     tip: r"""Try adding {}.""");
 
@@ -2495,10 +2722,11 @@
 const Code<Message Function(String string)> codeExpectedButGot =
     const Code<Message Function(String string)>(
         "ExpectedButGot", templateExpectedButGot,
-        analyzerCode: "EXPECTED_TOKEN");
+        analyzerCodes: <String>["EXPECTED_TOKEN"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedButGot(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeExpectedButGot,
       message: """Expected '${string}' before this.""",
       arguments: {'string': string});
@@ -2515,7 +2743,7 @@
 const Code<Message Function(Token token)> codeExpectedClassBodyToSkip =
     const Code<Message Function(Token token)>(
         "ExpectedClassBodyToSkip", templateExpectedClassBodyToSkip,
-        analyzerCode: "MISSING_CLASS_BODY");
+        analyzerCodes: <String>["MISSING_CLASS_BODY"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedClassBodyToSkip(Token token) {
@@ -2535,7 +2763,7 @@
 const Code<Message Function(Token token)> codeExpectedClassMember =
     const Code<Message Function(Token token)>(
         "ExpectedClassMember", templateExpectedClassMember,
-        analyzerCode: "EXPECTED_CLASS_MEMBER");
+        analyzerCodes: <String>["EXPECTED_CLASS_MEMBER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedClassMember(Token token) {
@@ -2556,7 +2784,7 @@
 const Code<Message Function(Token token)> codeExpectedClassOrMixinBody =
     const Code<Message Function(Token token)>(
         "ExpectedClassOrMixinBody", templateExpectedClassOrMixinBody,
-        analyzerCode: "MISSING_CLASS_BODY");
+        analyzerCodes: <String>["MISSING_CLASS_BODY"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedClassOrMixinBody(Token token) {
@@ -2576,7 +2804,7 @@
 const Code<Message Function(Token token)> codeExpectedDeclaration =
     const Code<Message Function(Token token)>(
         "ExpectedDeclaration", templateExpectedDeclaration,
-        analyzerCode: "EXPECTED_EXECUTABLE");
+        analyzerCodes: <String>["EXPECTED_EXECUTABLE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedDeclaration(Token token) {
@@ -2599,7 +2827,7 @@
 const Code<Message Function(Token token)> codeExpectedEnumBody =
     const Code<Message Function(Token token)>(
         "ExpectedEnumBody", templateExpectedEnumBody,
-        analyzerCode: "MISSING_ENUM_BODY");
+        analyzerCodes: <String>["MISSING_ENUM_BODY"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedEnumBody(Token token) {
@@ -2621,7 +2849,7 @@
 const Code<Message Function(Token token)> codeExpectedFunctionBody =
     const Code<Message Function(Token token)>(
         "ExpectedFunctionBody", templateExpectedFunctionBody,
-        analyzerCode: "MISSING_FUNCTION_BODY");
+        analyzerCodes: <String>["MISSING_FUNCTION_BODY"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedFunctionBody(Token token) {
@@ -2637,7 +2865,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExpectedHexDigit = const MessageCode(
     "ExpectedHexDigit",
-    analyzerCode: "MISSING_HEX_DIGIT",
+    analyzerCodes: <String>["MISSING_HEX_DIGIT"],
     message: r"""A hex digit (0-9 or A-F) must follow '0x'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2650,7 +2878,7 @@
 const Code<Message Function(Token token)> codeExpectedIdentifier =
     const Code<Message Function(Token token)>(
         "ExpectedIdentifier", templateExpectedIdentifier,
-        analyzerCode: "MISSING_IDENTIFIER");
+        analyzerCodes: <String>["MISSING_IDENTIFIER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedIdentifier(Token token) {
@@ -2661,12 +2889,32 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String string)> templateExpectedInstead =
+    const Template<Message Function(String string)>(
+        messageTemplate: r"""Expected '#string' instead of this.""",
+        withArguments: _withArgumentsExpectedInstead);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)> codeExpectedInstead =
+    const Code<Message Function(String string)>(
+        "ExpectedInstead", templateExpectedInstead,
+        index: 41);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsExpectedInstead(String string) {
+  if (string.isEmpty) throw 'No string provided';
+  return new Message(codeExpectedInstead,
+      message: """Expected '${string}' instead of this.""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExpectedNamedArgument = messageExpectedNamedArgument;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExpectedNamedArgument = const MessageCode(
     "ExpectedNamedArgument",
-    analyzerCode: "EXTRA_POSITIONAL_ARGUMENTS",
+    analyzerCodes: <String>["EXTRA_POSITIONAL_ARGUMENTS"],
     message: r"""Expected named argument.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2703,7 +2951,7 @@
 const Code<Message Function(Token token)> codeExpectedString =
     const Code<Message Function(Token token)>(
         "ExpectedString", templateExpectedString,
-        analyzerCode: "EXPECTED_STRING_LITERAL");
+        analyzerCodes: <String>["EXPECTED_STRING_LITERAL"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedString(Token token) {
@@ -2723,10 +2971,11 @@
 const Code<Message Function(String string)> codeExpectedToken =
     const Code<Message Function(String string)>(
         "ExpectedToken", templateExpectedToken,
-        analyzerCode: "EXPECTED_TOKEN");
+        analyzerCodes: <String>["EXPECTED_TOKEN"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedToken(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeExpectedToken,
       message: """Expected to find '${string}'.""",
       arguments: {'string': string});
@@ -2742,7 +2991,7 @@
 const Code<Message Function(Token token)> codeExpectedType =
     const Code<Message Function(Token token)>(
         "ExpectedType", templateExpectedType,
-        analyzerCode: "EXPECTED_TYPE_NAME");
+        analyzerCodes: <String>["EXPECTED_TYPE_NAME"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedType(Token token) {
@@ -2764,7 +3013,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExportAfterPart = const MessageCode("ExportAfterPart",
-    analyzerCode: "EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE",
+    analyzerCodes: <String>["EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE"],
     message: r"""Export directives must preceed part directives.""",
     tip: r"""Try moving the export directives before the part directives.""");
 
@@ -2785,6 +3034,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExportHidesExport(String name, Uri uri_, Uri uri2_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   String uri = relativizeUri(uri_);
   String uri2 = relativizeUri(uri2_);
   return new Message(codeExportHidesExport,
@@ -2813,10 +3064,12 @@
 const Code<Message Function(String name)> codeExtendingEnum =
     const Code<Message Function(String name)>(
         "ExtendingEnum", templateExtendingEnum,
-        analyzerCode: "EXTENDS_ENUM");
+        analyzerCodes: <String>["EXTENDS_ENUM"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExtendingEnum(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeExtendingEnum,
       message: """'${name}' is an enum and can't be extended or implemented.""",
       arguments: {'name': name});
@@ -2833,10 +3086,12 @@
 const Code<Message Function(String name)> codeExtendingRestricted =
     const Code<Message Function(String name)>(
         "ExtendingRestricted", templateExtendingRestricted,
-        analyzerCode: "EXTENDS_DISALLOWED_CLASS");
+        analyzerCodes: <String>["EXTENDS_DISALLOWED_CLASS"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExtendingRestricted(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeExtendingRestricted,
       message:
           """'${name}' is restricted and can't be extended or implemented.""",
@@ -2849,7 +3104,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalAfterConst = const MessageCode(
     "ExternalAfterConst",
-    analyzerCode: "EXTERNAL_AFTER_CONST",
+    index: 46,
     message:
         r"""The modifier 'external' should be before the modifier 'const'.""",
     tip: r"""Try re-ordering the modifiers.""");
@@ -2860,7 +3115,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalAfterFactory = const MessageCode(
     "ExternalAfterFactory",
-    analyzerCode: "EXTERNAL_AFTER_FACTORY",
+    index: 47,
     message:
         r"""The modifier 'external' should be before the modifier 'factory'.""",
     tip: r"""Try re-ordering the modifiers.""");
@@ -2871,7 +3126,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalAfterStatic = const MessageCode(
     "ExternalAfterStatic",
-    analyzerCode: "EXTERNAL_AFTER_STATIC",
+    index: 48,
     message:
         r"""The modifier 'external' should be before the modifier 'static'.""",
     tip: r"""Try re-ordering the modifiers.""");
@@ -2892,7 +3147,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalConstructorWithBody = const MessageCode(
     "ExternalConstructorWithBody",
-    analyzerCode: "EXTERNAL_CONSTRUCTOR_WITH_BODY",
+    analyzerCodes: <String>["EXTERNAL_CONSTRUCTOR_WITH_BODY"],
     message: r"""External constructors can't have a body.""",
     tip:
         r"""Try removing the body of the constructor, or removing the keyword 'external'.""");
@@ -2904,7 +3159,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalConstructorWithFieldInitializers =
     const MessageCode("ExternalConstructorWithFieldInitializers",
-        analyzerCode: "EXTERNAL_CONSTRUCTOR_WITH_FIELD_INITIALIZERS",
+        analyzerCodes: <String>["EXTERNAL_CONSTRUCTOR_WITH_FIELD_INITIALIZERS"],
         message: r"""An external constructor can't initialize fields.""",
         tip:
             r"""Try removing the field initializers, or removing the keyword 'external'.""");
@@ -2925,7 +3180,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalFactoryRedirection = const MessageCode(
     "ExternalFactoryRedirection",
-    analyzerCode: "EXTERNAL_CONSTRUCTOR_WITH_BODY",
+    analyzerCodes: <String>["EXTERNAL_CONSTRUCTOR_WITH_BODY"],
     message: r"""A redirecting factory can't be external.""",
     tip: r"""Try removing the 'external' modifier.""");
 
@@ -2935,7 +3190,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalFactoryWithBody = const MessageCode(
     "ExternalFactoryWithBody",
-    analyzerCode: "EXTERNAL_CONSTRUCTOR_WITH_BODY",
+    analyzerCodes: <String>["EXTERNAL_CONSTRUCTOR_WITH_BODY"],
     message: r"""External factories can't have a body.""",
     tip:
         r"""Try removing the body of the factory, or removing the keyword 'external'.""");
@@ -2945,7 +3200,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalField = const MessageCode("ExternalField",
-    analyzerCode: "EXTERNAL_FIELD",
+    index: 50,
     message: r"""Fields can't be declared to be 'external'.""",
     tip: r"""Try removing the keyword 'external'.""");
 
@@ -2955,7 +3210,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalMethodWithBody = const MessageCode(
     "ExternalMethodWithBody",
-    analyzerCode: "EXTERNAL_METHOD_WITH_BODY",
+    index: 49,
     message: r"""An external or native method can't have a body.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2963,7 +3218,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalTypedef = const MessageCode("ExternalTypedef",
-    analyzerCode: "EXTERNAL_TYPEDEF",
+    analyzerCodes: <String>["EXTERNAL_TYPEDEF"],
     message: r"""Typedefs can't be declared to be 'external'.""",
     tip: r"""Try removing the keyword 'external'.""");
 
@@ -2978,7 +3233,7 @@
 const Code<Message Function(Token token)> codeExtraneousModifier =
     const Code<Message Function(Token token)>(
         "ExtraneousModifier", templateExtraneousModifier,
-        analyzerCode: "EXTRANEOUS_MODIFIER");
+        analyzerCodes: <String>["EXTRANEOUS_MODIFIER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExtraneousModifier(Token token) {
@@ -2994,7 +3249,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFactoryNotSync = const MessageCode("FactoryNotSync",
-    analyzerCode: "NON_SYNC_FACTORY",
+    analyzerCodes: <String>["NON_SYNC_FACTORY"],
     message: r"""Factory bodies can't use 'async', 'async*', or 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3013,11 +3268,14 @@
     const Code<Message Function(String name, int count)>(
         "FactoryRedirecteeHasTooFewPositionalParameters",
         templateFactoryRedirecteeHasTooFewPositionalParameters,
-        analyzerCode: "REDIRECT_TO_INVALID_FUNCTION_TYPE");
+        analyzerCodes: <String>["REDIRECT_TO_INVALID_FUNCTION_TYPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsFactoryRedirecteeHasTooFewPositionalParameters(
     String name, int count) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (count == null) throw 'No count provided';
   return new Message(codeFactoryRedirecteeHasTooFewPositionalParameters,
       message:
           """Redirection target '${name}' accepts fewer arguments ('${count}') than the redirecting factory can provide.""",
@@ -3044,7 +3302,7 @@
     const Code<Message Function(DartType _type, String name, DartType _type2)>(
         "FactoryRedirecteeInvalidReturnType",
         templateFactoryRedirecteeInvalidReturnType,
-        analyzerCode: "REDIRECT_TO_INVALID_RETURN_TYPE");
+        analyzerCodes: <String>["REDIRECT_TO_INVALID_RETURN_TYPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsFactoryRedirecteeInvalidReturnType(
@@ -3055,6 +3313,8 @@
   new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
   String type = '$buffer';
 
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   buffer = new StringBuffer();
   new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
   String type2 = '$buffer';
@@ -3073,7 +3333,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFactoryTopLevelDeclaration = const MessageCode(
     "FactoryTopLevelDeclaration",
-    analyzerCode: "FACTORY_TOP_LEVEL_DECLARATION",
+    analyzerCodes: <String>["FACTORY_TOP_LEVEL_DECLARATION"],
     message: r"""Top-level declarations can't be declared to be 'factory'.""",
     tip: r"""Try removing the keyword 'factory'.""");
 
@@ -3092,6 +3352,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsFastaCLIArgumentRequired(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeFastaCLIArgumentRequired,
       message: """Expected value after '${name}'.""",
       arguments: {'name': name});
@@ -3173,7 +3435,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFieldInitializerOutsideConstructor = const MessageCode(
     "FieldInitializerOutsideConstructor",
-    analyzerCode: "FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR",
+    analyzerCodes: <String>["FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR"],
     message: r"""Field formal parameters can only be used in a constructor.""",
     tip: r"""Try removing 'this.'.""");
 
@@ -3183,7 +3445,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFinalAndCovariant = const MessageCode(
     "FinalAndCovariant",
-    analyzerCode: "FINAL_AND_COVARIANT",
+    analyzerCodes: <String>["FINAL_AND_COVARIANT"],
     message:
         r"""Members can't be declared to be both 'final' and 'covariant'.""",
     tip: r"""Try removing either the 'final' or 'covariant' keyword.""");
@@ -3193,7 +3455,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFinalAndVar = const MessageCode("FinalAndVar",
-    analyzerCode: "FINAL_AND_VAR",
+    analyzerCodes: <String>["FINAL_AND_VAR"],
     message: r"""Members can't be declared to be both 'final' and 'var'.""",
     tip: r"""Try removing the keyword 'var'.""");
 
@@ -3212,10 +3474,12 @@
 const Code<Message Function(String name)> codeFinalFieldNotInitialized =
     const Code<Message Function(String name)>(
         "FinalFieldNotInitialized", templateFinalFieldNotInitialized,
-        analyzerCode: "FINAL_NOT_INITIALIZED");
+        analyzerCodes: <String>["FINAL_NOT_INITIALIZED"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsFinalFieldNotInitialized(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeFinalFieldNotInitialized,
       message: """Final field '${name}' is not initialized.""",
       tip:
@@ -3241,10 +3505,12 @@
     const Code<Message Function(String name)>(
         "FinalFieldNotInitializedByConstructor",
         templateFinalFieldNotInitializedByConstructor,
-        analyzerCode: "FINAL_NOT_INITIALIZED_CONSTRUCTOR_1");
+        analyzerCodes: <String>["FINAL_NOT_INITIALIZED_CONSTRUCTOR_1"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsFinalFieldNotInitializedByConstructor(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeFinalFieldNotInitializedByConstructor,
       message:
           """Final field '${name}' is not initialized by this constructor.""",
@@ -3268,10 +3534,12 @@
 const Code<Message Function(String name)> codeFinalFieldWithoutInitializer =
     const Code<Message Function(String name)>(
         "FinalFieldWithoutInitializer", templateFinalFieldWithoutInitializer,
-        analyzerCode: "FINAL_NOT_INITIALIZED");
+        analyzerCodes: <String>["FINAL_NOT_INITIALIZED"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsFinalFieldWithoutInitializer(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeFinalFieldWithoutInitializer,
       message: """The final variable '${name}' must be initialized.""",
       tip:
@@ -3293,11 +3561,13 @@
     const Code<Message Function(String name)>(
         "FinalInstanceVariableAlreadyInitialized",
         templateFinalInstanceVariableAlreadyInitialized,
-        analyzerCode: "FINAL_INITIALIZED_MULTIPLE_TIMES",
+        analyzerCodes: <String>["FINAL_INITIALIZED_MULTIPLE_TIMES"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsFinalInstanceVariableAlreadyInitialized(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeFinalInstanceVariableAlreadyInitialized,
       message:
           """'${name}' is a final instance variable that has already been initialized.""",
@@ -3323,6 +3593,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsFinalInstanceVariableAlreadyInitializedCause(
     String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeFinalInstanceVariableAlreadyInitializedCause,
       message: """'${name}' was initialized here.""",
       arguments: {'name': name});
@@ -3346,7 +3618,7 @@
     const Code<Message Function(DartType _type, DartType _type2)>(
         "ForInLoopElementTypeNotAssignable",
         templateForInLoopElementTypeNotAssignable,
-        analyzerCode: "FOR_IN_OF_INVALID_ELEMENT_TYPE");
+        analyzerCodes: <String>["FOR_IN_OF_INVALID_ELEMENT_TYPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsForInLoopElementTypeNotAssignable(
@@ -3402,7 +3674,7 @@
     codeForInLoopTypeNotIterable =
     const Code<Message Function(DartType _type, DartType _type2)>(
         "ForInLoopTypeNotIterable", templateForInLoopTypeNotIterable,
-        analyzerCode: "FOR_IN_OF_INVALID_TYPE");
+        analyzerCodes: <String>["FOR_IN_OF_INVALID_TYPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsForInLoopTypeNotIterable(
@@ -3430,7 +3702,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageForInLoopWithConstVariable = const MessageCode(
     "ForInLoopWithConstVariable",
-    analyzerCode: "FOR_IN_WITH_CONST_VARIABLE",
+    analyzerCodes: <String>["FOR_IN_WITH_CONST_VARIABLE"],
     message: r"""A for-in loop-variable can't be 'const'.""",
     tip: r"""Try removing the 'const' modifier.""");
 
@@ -3440,7 +3712,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFunctionTypeDefaultValue = const MessageCode(
     "FunctionTypeDefaultValue",
-    analyzerCode: "DEFAULT_VALUE_IN_FUNCTION_TYPE",
+    analyzerCodes: <String>["DEFAULT_VALUE_IN_FUNCTION_TYPE"],
     message: r"""Can't have a default value in a function type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3450,7 +3722,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFunctionTypedParameterVar = const MessageCode(
     "FunctionTypedParameterVar",
-    analyzerCode: "FUNCTION_TYPED_PARAMETER_VAR",
+    analyzerCodes: <String>["FUNCTION_TYPED_PARAMETER_VAR"],
     message:
         r"""Function-typed parameters can't specify 'const', 'final' or 'var' in place of a return type.""",
     tip: r"""Try replacing the keyword with a return type.""");
@@ -3461,7 +3733,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageGeneratorReturnsValue = const MessageCode(
     "GeneratorReturnsValue",
-    analyzerCode: "RETURN_IN_GENERATOR",
+    analyzerCodes: <String>["RETURN_IN_GENERATOR"],
     message: r"""'sync*' and 'async*' can't return a value.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3471,7 +3743,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageGenericFunctionTypeInBound = const MessageCode(
     "GenericFunctionTypeInBound",
-    analyzerCode: "GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND",
+    analyzerCodes: <String>["GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND"],
     message:
         r"""Type variables can't have generic function types in their bounds.""");
 
@@ -3485,11 +3757,13 @@
 const Code<Message Function(String name)> codeGetterNotFound =
     const Code<Message Function(String name)>(
         "GetterNotFound", templateGetterNotFound,
-        analyzerCode: "UNDEFINED_GETTER",
+        analyzerCodes: <String>["UNDEFINED_GETTER"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsGetterNotFound(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeGetterNotFound,
       message: """Getter not found: '${name}'.""", arguments: {'name': name});
 }
@@ -3500,7 +3774,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageGetterWithFormals = const MessageCode(
     "GetterWithFormals",
-    analyzerCode: "GETTER_WITH_PARAMETERS",
+    analyzerCodes: <String>["GETTER_WITH_PARAMETERS"],
     message: r"""A getter can't have formal parameters.""",
     tip: r"""Try removing '(...)'.""");
 
@@ -3511,7 +3785,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageIllegalAssignmentToNonAssignable = const MessageCode(
     "IllegalAssignmentToNonAssignable",
-    analyzerCode: "ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE",
+    index: 45,
     message: r"""Illegal assignment to non-assignable expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3521,7 +3795,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageIllegalAsyncGeneratorReturnType = const MessageCode(
     "IllegalAsyncGeneratorReturnType",
-    analyzerCode: "ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE",
+    analyzerCodes: <String>["ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE"],
     message:
         r"""Functions marked 'async*' must have a return type assignable to 'Stream'.""");
 
@@ -3541,7 +3815,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageIllegalAsyncReturnType = const MessageCode(
     "IllegalAsyncReturnType",
-    analyzerCode: "ILLEGAL_ASYNC_RETURN_TYPE",
+    analyzerCodes: <String>["ILLEGAL_ASYNC_RETURN_TYPE"],
     message:
         r"""Functions marked 'async' must have a return type assignable to 'Future'.""");
 
@@ -3555,10 +3829,12 @@
 const Code<Message Function(String name)> codeIllegalMixin =
     const Code<Message Function(String name)>(
         "IllegalMixin", templateIllegalMixin,
-        analyzerCode: "ILLEGAL_MIXIN");
+        analyzerCodes: <String>["ILLEGAL_MIXIN"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsIllegalMixin(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeIllegalMixin,
       message: """The type '${name}' can't be mixed in.""",
       arguments: {'name': name});
@@ -3576,10 +3852,12 @@
 const Code<Message Function(String name)> codeIllegalMixinDueToConstructors =
     const Code<Message Function(String name)>(
         "IllegalMixinDueToConstructors", templateIllegalMixinDueToConstructors,
-        analyzerCode: "MIXIN_DECLARES_CONSTRUCTOR");
+        analyzerCodes: <String>["MIXIN_DECLARES_CONSTRUCTOR"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsIllegalMixinDueToConstructors(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeIllegalMixinDueToConstructors,
       message:
           """Can't use '${name}' as a mixin because it has constructors.""",
@@ -3604,6 +3882,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsIllegalMixinDueToConstructorsCause(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeIllegalMixinDueToConstructorsCause,
       message: """This constructor prevents using '${name}' as a mixin.""",
       arguments: {'name': name});
@@ -3616,7 +3896,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageIllegalSyncGeneratorReturnType = const MessageCode(
     "IllegalSyncGeneratorReturnType",
-    analyzerCode: "ILLEGAL_SYNC_GENERATOR_RETURN_TYPE",
+    analyzerCodes: <String>["ILLEGAL_SYNC_GENERATOR_RETURN_TYPE"],
     message:
         r"""Functions marked 'sync*' must have a return type assignable to 'Iterable'.""");
 
@@ -3635,7 +3915,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageImplementsBeforeExtends = const MessageCode(
     "ImplementsBeforeExtends",
-    analyzerCode: "IMPLEMENTS_BEFORE_EXTENDS",
+    index: 44,
     message: r"""The extends clause must be before the implements clause.""",
     tip: r"""Try moving the extends clause before the implements clause.""");
 
@@ -3645,7 +3925,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageImplementsBeforeOn = const MessageCode(
     "ImplementsBeforeOn",
-    analyzerCode: "IMPLEMENTS_BEFORE_ON",
+    index: 43,
     message: r"""The on clause must be before the implements clause.""",
     tip: r"""Try moving the on clause before the implements clause.""");
 
@@ -3655,7 +3935,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageImplementsBeforeWith = const MessageCode(
     "ImplementsBeforeWith",
-    analyzerCode: "IMPLEMENTS_BEFORE_WITH",
+    index: 42,
     message: r"""The with clause must be before the implements clause.""",
     tip: r"""Try moving the with clause before the implements clause.""");
 
@@ -3679,10 +3959,13 @@
 const Code<Message Function(String name, int count)> codeImplementsRepeated =
     const Code<Message Function(String name, int count)>(
         "ImplementsRepeated", templateImplementsRepeated,
-        analyzerCode: "IMPLEMENTS_REPEATED");
+        analyzerCodes: <String>["IMPLEMENTS_REPEATED"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsImplementsRepeated(String name, int count) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (count == null) throw 'No count provided';
   return new Message(codeImplementsRepeated,
       message: """'${name}' can only be implemented once.""",
       tip: """Try removing ${count} of the occurrences.""",
@@ -3704,10 +3987,12 @@
 const Code<Message Function(String name)> codeImplementsSuperClass =
     const Code<Message Function(String name)>(
         "ImplementsSuperClass", templateImplementsSuperClass,
-        analyzerCode: "IMPLEMENTS_SUPER_CLASS");
+        analyzerCodes: <String>["IMPLEMENTS_SUPER_CLASS"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsImplementsSuperClass(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeImplementsSuperClass,
       message:
           """'${name}' can't be used in both 'extends' and 'implements' clauses.""",
@@ -3731,7 +4016,7 @@
 const Code<Message Function(DartType _type)> codeImplicitCallOfNonMethod =
     const Code<Message Function(DartType _type)>(
         "ImplicitCallOfNonMethod", templateImplicitCallOfNonMethod,
-        analyzerCode: "IMPLICIT_CALL_OF_NON_METHOD");
+        analyzerCodes: <String>["IMPLICIT_CALL_OF_NON_METHOD"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsImplicitCallOfNonMethod(DartType _type) {
@@ -3749,6 +4034,36 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String name,
+        String
+            name2)> templateImplicitMixinOverrideContext = const Template<
+        Message Function(String name, String name2)>(
+    messageTemplate:
+        r"""Override was introduced when the mixin '#name' was applied to '#name2'.""",
+    withArguments: _withArgumentsImplicitMixinOverrideContext);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String name2)>
+    codeImplicitMixinOverrideContext =
+    const Code<Message Function(String name, String name2)>(
+        "ImplicitMixinOverrideContext", templateImplicitMixinOverrideContext,
+        severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsImplicitMixinOverrideContext(String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  return new Message(codeImplicitMixinOverrideContext,
+      message:
+          """Override was introduced when the mixin '${name}' was applied to '${name2}'.""",
+      arguments: {'name': name, 'name2': name2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeImportAfterPart = messageImportAfterPart;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3774,6 +4089,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsImportHidesImport(String name, Uri uri_, Uri uri2_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   String uri = relativizeUri(uri_);
   String uri2 = relativizeUri(uri2_);
   return new Message(codeImportHidesImport,
@@ -3788,7 +4105,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInheritedMembersConflict = const MessageCode(
     "InheritedMembersConflict",
-    analyzerCode: "CONFLICTS_WITH_INHERITED_MEMBER",
+    analyzerCodes: <String>["CONFLICTS_WITH_INHERITED_MEMBER"],
     severity: Severity.errorLegacyWarning,
     message: r"""Can't inherit members that conflict with each other.""");
 
@@ -3832,6 +4149,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInitializeFromDillNotSelfContained(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeInitializeFromDillNotSelfContained,
       message:
           """Tried to initialize from a previous compilation (${string}), but the file was not self-contained. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new.""",
@@ -3860,6 +4178,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInitializeFromDillUnknownProblem(
     String string, String string2) {
+  if (string.isEmpty) throw 'No string provided';
+  if (string2.isEmpty) throw 'No string provided';
   return new Message(codeInitializeFromDillUnknownProblem,
       message:
           """Tried to initialize from a previous compilation (${string}), but couldn't. Error message was '${string2}'. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new.""",
@@ -3873,7 +4193,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInitializedVariableInForEach = const MessageCode(
     "InitializedVariableInForEach",
-    analyzerCode: "INITIALIZED_VARIABLE_IN_FOR_EACH",
+    analyzerCodes: <String>["INITIALIZED_VARIABLE_IN_FOR_EACH"],
     message: r"""The loop variable in a for-each loop can't be initialized.""",
     tip:
         r"""Try removing the initializer, or using a different kind of loop.""");
@@ -3889,10 +4209,12 @@
 const Code<Message Function(String name)> codeInitializerForStaticField =
     const Code<Message Function(String name)>(
         "InitializerForStaticField", templateInitializerForStaticField,
-        analyzerCode: "INITIALIZER_FOR_STATIC_FIELD");
+        analyzerCodes: <String>["INITIALIZER_FOR_STATIC_FIELD"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInitializerForStaticField(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeInitializerForStaticField,
       message: """'${name}' isn't an instance field of this class.""",
       arguments: {'name': name});
@@ -3912,10 +4234,12 @@
 const Code<Message Function(String name)> codeInitializerOutsideConstructor =
     const Code<Message Function(String name)>(
         "InitializerOutsideConstructor", templateInitializerOutsideConstructor,
-        analyzerCode: "INITIALIZER_OUTSIDE_CONSTRUCTOR");
+        analyzerCodes: <String>["INITIALIZER_OUTSIDE_CONSTRUCTOR"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInitializerOutsideConstructor(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeInitializerOutsideConstructor,
       message:
           """Only constructors can have initializers, and '${name}' is not a constructor.""",
@@ -3942,12 +4266,14 @@
     const Code<Message Function(String name, DartType _type, DartType _type2)>(
         "InitializingFormalTypeMismatch",
         templateInitializingFormalTypeMismatch,
-        analyzerCode: "INVALID_PARAMETER_DECLARATION",
+        analyzerCodes: <String>["INVALID_PARAMETER_DECLARATION"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInitializingFormalTypeMismatch(
     String name, DartType _type, DartType _type2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -3998,30 +4324,56 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
-        Token
-            token)> templateIntegerLiteralIsOutOfRange = const Template<
-        Message Function(Token token)>(
+        String
+            string)> templateIntegerLiteralIsOutOfRange = const Template<
+        Message Function(String string)>(
     messageTemplate:
-        r"""The integer literal #lexeme can't be represented in 64 bits.""",
+        r"""The integer literal #string can't be represented in 64 bits.""",
     tipTemplate:
         r"""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.""",
     withArguments: _withArgumentsIntegerLiteralIsOutOfRange);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(Token token)> codeIntegerLiteralIsOutOfRange =
-    const Code<Message Function(Token token)>(
+const Code<Message Function(String string)> codeIntegerLiteralIsOutOfRange =
+    const Code<Message Function(String string)>(
         "IntegerLiteralIsOutOfRange", templateIntegerLiteralIsOutOfRange,
-        analyzerCode: "INTEGER_LITERAL_OUT_OF_RANGE");
+        analyzerCodes: <String>["INTEGER_LITERAL_OUT_OF_RANGE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIntegerLiteralIsOutOfRange(Token token) {
-  String lexeme = token.lexeme;
+Message _withArgumentsIntegerLiteralIsOutOfRange(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeIntegerLiteralIsOutOfRange,
       message:
-          """The integer literal ${lexeme} can't be represented in 64 bits.""",
+          """The integer literal ${string} can't be represented in 64 bits.""",
       tip:
           """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.""",
-      arguments: {'token': token});
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            name)> templateInterfaceCheckContext = const Template<
+        Message Function(String name)>(
+    messageTemplate:
+        r"""Both members are inherited by the non-abstract class '#name'.""",
+    withArguments: _withArgumentsInterfaceCheckContext);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeInterfaceCheckContext =
+    const Code<Message Function(String name)>(
+        "InterfaceCheckContext", templateInterfaceCheckContext,
+        severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInterfaceCheckContext(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeInterfaceCheckContext,
+      message:
+          """Both members are inherited by the non-abstract class '${name}'.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4062,6 +4414,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemConstructorNotFound(
     String name, Uri uri_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   String uri = relativizeUri(uri_);
   return new Message(codeInternalProblemConstructorNotFound,
       message: """No constructor named '${name}' in '${uri}'.""",
@@ -4085,6 +4439,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemContextSeverity(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemContextSeverity,
       message: """Non-context message has context severity: ${string}""",
       arguments: {'string': string});
@@ -4106,6 +4461,9 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemDebugAbort(String name, String string) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemDebugAbort,
       message: """Compilation aborted due to fatal '${name}' at:
 ${string}""", arguments: {'name': name, 'string': string});
@@ -4147,6 +4505,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemNotFound(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeInternalProblemNotFound,
       message: """Couldn't find '${name}'.""", arguments: {'name': name});
 }
@@ -4167,6 +4527,10 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemNotFoundIn(String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   return new Message(codeInternalProblemNotFoundIn,
       message: """Couldn't find '${name}' in '${name2}'.""",
       arguments: {'name': name, 'name2': name2});
@@ -4199,6 +4563,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemPrivateConstructorAccess(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeInternalProblemPrivateConstructorAccess,
       message: """Can't access private constructor '${name}'.""",
       arguments: {'name': name});
@@ -4231,6 +4597,9 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemStackNotEmpty(String name, String string) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemStackNotEmpty,
       message: """${name}.stack isn't empty:
   ${string}""", arguments: {'name': name, 'string': string});
@@ -4253,6 +4622,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemSuperclassNotFound(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeInternalProblemSuperclassNotFound,
       message: """Superclass not found '${name}'.""",
       arguments: {'name': name});
@@ -4274,6 +4645,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemUnexpected(String string, String string2) {
+  if (string.isEmpty) throw 'No string provided';
+  if (string2.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemUnexpected,
       message: """Expected '${string}', but got '${string2}'.""",
       arguments: {'string': string, 'string2': string2});
@@ -4295,6 +4668,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemUnhandled(String string, String string2) {
+  if (string.isEmpty) throw 'No string provided';
+  if (string2.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemUnhandled,
       message: """Unhandled ${string} in ${string2}.""",
       arguments: {'string': string, 'string2': string2});
@@ -4315,6 +4690,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemUnimplemented(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemUnimplemented,
       message: """Unimplemented ${string}.""", arguments: {'string': string});
 }
@@ -4334,6 +4710,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemUnsupported(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeInternalProblemUnsupported,
       message: """Unsupported operation: '${name}'.""",
       arguments: {'name': name});
@@ -4376,6 +4754,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemVerificationError(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemVerificationError,
       message: """Verification of the generated program failed:
 ${string}""", arguments: {'string': string});
@@ -4387,7 +4766,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInterpolationInUri = const MessageCode(
     "InterpolationInUri",
-    analyzerCode: "INVALID_LITERAL_IN_CONFIGURATION",
+    analyzerCodes: <String>["INVALID_LITERAL_IN_CONFIGURATION"],
     message: r"""Can't use string interpolation in a URI.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4408,7 +4787,7 @@
     codeInvalidAssignment =
     const Code<Message Function(DartType _type, DartType _type2)>(
         "InvalidAssignment", templateInvalidAssignment,
-        analyzerCode: "INVALID_ASSIGNMENT");
+        analyzerCodes: <String>["INVALID_ASSIGNMENT"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidAssignment(DartType _type, DartType _type2) {
@@ -4454,6 +4833,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidBreakTarget(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeInvalidBreakTarget,
       message: """Can't break to '${name}'.""", arguments: {'name': name});
 }
@@ -4476,7 +4857,7 @@
     codeInvalidCastFunctionExpr =
     const Code<Message Function(DartType _type, DartType _type2)>(
         "InvalidCastFunctionExpr", templateInvalidCastFunctionExpr,
-        analyzerCode: "INVALID_CAST_FUNCTION_EXPR");
+        analyzerCodes: <String>["INVALID_CAST_FUNCTION_EXPR"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastFunctionExpr(DartType _type, DartType _type2) {
@@ -4515,7 +4896,7 @@
     codeInvalidCastLiteralList =
     const Code<Message Function(DartType _type, DartType _type2)>(
         "InvalidCastLiteralList", templateInvalidCastLiteralList,
-        analyzerCode: "INVALID_CAST_LITERAL_LIST");
+        analyzerCodes: <String>["INVALID_CAST_LITERAL_LIST"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastLiteralList(DartType _type, DartType _type2) {
@@ -4554,7 +4935,7 @@
     codeInvalidCastLiteralMap =
     const Code<Message Function(DartType _type, DartType _type2)>(
         "InvalidCastLiteralMap", templateInvalidCastLiteralMap,
-        analyzerCode: "INVALID_CAST_LITERAL_MAP");
+        analyzerCodes: <String>["INVALID_CAST_LITERAL_MAP"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastLiteralMap(DartType _type, DartType _type2) {
@@ -4593,7 +4974,7 @@
     codeInvalidCastLocalFunction =
     const Code<Message Function(DartType _type, DartType _type2)>(
         "InvalidCastLocalFunction", templateInvalidCastLocalFunction,
-        analyzerCode: "INVALID_CAST_FUNCTION");
+        analyzerCodes: <String>["INVALID_CAST_FUNCTION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastLocalFunction(
@@ -4633,7 +5014,7 @@
     codeInvalidCastNewExpr =
     const Code<Message Function(DartType _type, DartType _type2)>(
         "InvalidCastNewExpr", templateInvalidCastNewExpr,
-        analyzerCode: "INVALID_CAST_NEW_EXPR");
+        analyzerCodes: <String>["INVALID_CAST_NEW_EXPR"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastNewExpr(DartType _type, DartType _type2) {
@@ -4672,7 +5053,7 @@
     codeInvalidCastStaticMethod =
     const Code<Message Function(DartType _type, DartType _type2)>(
         "InvalidCastStaticMethod", templateInvalidCastStaticMethod,
-        analyzerCode: "INVALID_CAST_METHOD");
+        analyzerCodes: <String>["INVALID_CAST_METHOD"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastStaticMethod(DartType _type, DartType _type2) {
@@ -4711,7 +5092,7 @@
     codeInvalidCastTopLevelFunction =
     const Code<Message Function(DartType _type, DartType _type2)>(
         "InvalidCastTopLevelFunction", templateInvalidCastTopLevelFunction,
-        analyzerCode: "INVALID_CAST_FUNCTION");
+        analyzerCodes: <String>["INVALID_CAST_FUNCTION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastTopLevelFunction(
@@ -4739,7 +5120,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidCatchArguments = const MessageCode(
     "InvalidCatchArguments",
-    analyzerCode: "INVALID_CATCH_ARGUMENTS",
+    analyzerCodes: <String>["INVALID_CATCH_ARGUMENTS"],
     message: r"""Invalid catch arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4748,7 +5129,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidCodePoint = const MessageCode(
     "InvalidCodePoint",
-    analyzerCode: "INVALID_CODE_POINT",
+    analyzerCodes: <String>["INVALID_CODE_POINT"],
     message:
         r"""The escape sequence starting with '\u' isn't a valid code point.""");
 
@@ -4767,6 +5148,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidContinueTarget(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeInvalidContinueTarget,
       message: """Can't continue at '${name}'.""", arguments: {'name': name});
 }
@@ -4787,7 +5170,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidInitializer = const MessageCode(
     "InvalidInitializer",
-    analyzerCode: "INVALID_INITIALIZER",
+    analyzerCodes: <String>["INVALID_INITIALIZER"],
     message: r"""Not a valid initializer.""",
     tip: r"""To initialize a field, use the syntax 'name = value'.""");
 
@@ -4798,7 +5181,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidInlineFunctionType = const MessageCode(
     "InvalidInlineFunctionType",
-    analyzerCode: "INVALID_INLINE_FUNCTION_TYPE",
+    analyzerCodes: <String>["INVALID_INLINE_FUNCTION_TYPE"],
     message:
         r"""Inline function types cannot be used for parameters in a generic function type.""",
     tip:
@@ -4842,6 +5225,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidPackageUri(Uri uri_, String string) {
   String uri = relativizeUri(uri_);
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeInvalidPackageUri,
       message: """Invalid package URI '${uri}':
   ${string}.""", arguments: {'uri': uri_, 'string': string});
@@ -4853,7 +5237,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidSyncModifier = const MessageCode(
     "InvalidSyncModifier",
-    analyzerCode: "MISSING_STAR_AFTER_SYNC",
+    analyzerCodes: <String>["MISSING_STAR_AFTER_SYNC"],
     message: r"""Invalid modifier 'sync'.""",
     tip: r"""Try replacing 'sync' with 'sync*'.""");
 
@@ -4874,7 +5258,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidUseOfNullAwareAccess = const MessageCode(
     "InvalidUseOfNullAwareAccess",
-    analyzerCode: "INVALID_USE_OF_NULL_AWARE_ACCESS",
+    analyzerCodes: <String>["INVALID_USE_OF_NULL_AWARE_ACCESS"],
     message: r"""Cannot use '?.' here.""",
     tip: r"""Try using '.'.""");
 
@@ -4883,7 +5267,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidVoid = const MessageCode("InvalidVoid",
-    analyzerCode: "EXPECTED_TYPE_NAME",
+    analyzerCodes: <String>["EXPECTED_TYPE_NAME"],
     message:
         r"""Type 'void' can't be used here because it isn't a return type.""",
     tip:
@@ -4900,10 +5284,12 @@
 const Code<Message Function(String name)> codeInvokeNonFunction =
     const Code<Message Function(String name)>(
         "InvokeNonFunction", templateInvokeNonFunction,
-        analyzerCode: "INVOCATION_OF_NON_FUNCTION");
+        analyzerCodes: <String>["INVOCATION_OF_NON_FUNCTION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvokeNonFunction(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeInvokeNonFunction,
       message: """'${name}' isn't a function or method and can't be invoked.""",
       arguments: {'name': name});
@@ -4922,10 +5308,12 @@
 const Code<Message Function(String name)> codeLabelNotFound =
     const Code<Message Function(String name)>(
         "LabelNotFound", templateLabelNotFound,
-        analyzerCode: "LABEL_UNDEFINED");
+        analyzerCodes: <String>["LABEL_UNDEFINED"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsLabelNotFound(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeLabelNotFound,
       message: """Can't find label '${name}'.""",
       tip:
@@ -4951,7 +5339,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageListLiteralTooManyTypeArguments = const MessageCode(
     "ListLiteralTooManyTypeArguments",
-    analyzerCode: "EXPECTED_ONE_LIST_TYPE_ARGUMENTS",
+    analyzerCodes: <String>["EXPECTED_ONE_LIST_TYPE_ARGUMENTS"],
     severity: Severity.errorLegacyWarning,
     message: r"""List literal requires exactly one type argument.""");
 
@@ -4987,7 +5375,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageLoadLibraryTakesNoArguments = const MessageCode(
     "LoadLibraryTakesNoArguments",
-    analyzerCode: "LOAD_LIBRARY_TAKES_NO_ARGUMENTS",
+    analyzerCodes: <String>["LOAD_LIBRARY_TAKES_NO_ARGUMENTS"],
     severity: Severity.errorLegacyWarning,
     message: r"""'loadLibrary' takes no arguments.""");
 
@@ -5008,6 +5396,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsLocalDefinitionHidesExport(String name, Uri uri_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   String uri = relativizeUri(uri_);
   return new Message(codeLocalDefinitionHidesExport,
       message: """Local definition of '${name}' hides export from '${uri}'.""",
@@ -5031,6 +5421,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsLocalDefinitionHidesImport(String name, Uri uri_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   String uri = relativizeUri(uri_);
   return new Message(codeLocalDefinitionHidesImport,
       message: """Local definition of '${name}' hides import from '${uri}'.""",
@@ -5044,7 +5436,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMapLiteralTypeArgumentMismatch = const MessageCode(
     "MapLiteralTypeArgumentMismatch",
-    analyzerCode: "EXPECTED_TWO_MAP_TYPE_ARGUMENTS",
+    analyzerCodes: <String>["EXPECTED_TWO_MAP_TYPE_ARGUMENTS"],
     severity: Severity.errorLegacyWarning,
     message: r"""Map literal requires exactly two type arguments.""");
 
@@ -5064,7 +5456,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMetadataTypeArguments = const MessageCode(
     "MetadataTypeArguments",
-    analyzerCode: "ANNOTATION_WITH_TYPE_ARGUMENTS",
+    analyzerCodes: <String>["ANNOTATION_WITH_TYPE_ARGUMENTS"],
     message: r"""An annotation (metadata) can't use type arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5077,11 +5469,13 @@
 const Code<Message Function(String name)> codeMethodNotFound =
     const Code<Message Function(String name)>(
         "MethodNotFound", templateMethodNotFound,
-        analyzerCode: "UNDEFINED_METHOD",
+        analyzerCodes: <String>["UNDEFINED_METHOD"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsMethodNotFound(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeMethodNotFound,
       message: """Method not found: '${name}'.""", arguments: {'name': name});
 }
@@ -5144,6 +5538,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsMissingExplicitTypeArguments(int count) {
+  if (count == null) throw 'No count provided';
   return new Message(codeMissingExplicitTypeArguments,
       message: """No type arguments provided, ${count} possible.""",
       arguments: {'count': count});
@@ -5154,7 +5549,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingExponent = const MessageCode("MissingExponent",
-    analyzerCode: "MISSING_DIGIT",
+    analyzerCodes: <String>["MISSING_DIGIT"],
     message:
         r"""Numbers in exponential notation should always contain an exponent (an integer number with an optional sign).""",
     tip:
@@ -5178,7 +5573,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingFunctionParameters = const MessageCode(
     "MissingFunctionParameters",
-    analyzerCode: "MISSING_FUNCTION_PARAMETERS",
+    analyzerCodes: <String>["MISSING_FUNCTION_PARAMETERS"],
     message:
         r"""A function declaration needs an explicit list of parameters.""",
     tip: r"""Try adding a parameter list to the function declaration.""");
@@ -5198,6 +5593,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsMissingImplementationCause(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeMissingImplementationCause,
       message: """'${name}' is defined here.""", arguments: {'name': name});
 }
@@ -5226,12 +5623,15 @@
     const Code<Message Function(String name, String string)>(
         "MissingImplementationNotAbstract",
         templateMissingImplementationNotAbstract,
-        analyzerCode: "CONCRETE_CLASS_WITH_ABSTRACT_MEMBER",
+        analyzerCodes: <String>["CONCRETE_CLASS_WITH_ABSTRACT_MEMBER"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsMissingImplementationNotAbstract(
     String name, String string) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeMissingImplementationNotAbstract,
       message:
           """The non-abstract class '${name}' is missing implementations for these members:
@@ -5266,7 +5666,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingMethodParameters = const MessageCode(
     "MissingMethodParameters",
-    analyzerCode: "MISSING_METHOD_PARAMETERS",
+    analyzerCodes: <String>["MISSING_METHOD_PARAMETERS"],
     message: r"""A method declaration needs an explicit list of parameters.""",
     tip: r"""Try adding a parameter list to the method declaration.""");
 
@@ -5293,7 +5693,7 @@
 const Code<Message Function(Uri uri_)> codeMissingPartOf =
     const Code<Message Function(Uri uri_)>(
         "MissingPartOf", templateMissingPartOf,
-        analyzerCode: "PART_OF_NON_PART");
+        analyzerCodes: <String>["PART_OF_NON_PART"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsMissingPartOf(Uri uri_) {
@@ -5321,7 +5721,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingTypedefParameters = const MessageCode(
     "MissingTypedefParameters",
-    analyzerCode: "MISSING_TYPEDEF_PARAMETERS",
+    analyzerCodes: <String>["MISSING_TYPEDEF_PARAMETERS"],
     message: r"""A typedef needs an explicit list of parameters.""",
     tip: r"""Try adding a parameter list to the typedef.""");
 
@@ -5342,11 +5742,15 @@
     codeMixinInferenceNoMatchingClass =
     const Code<Message Function(String name, String name2, DartType _type)>(
         "MixinInferenceNoMatchingClass", templateMixinInferenceNoMatchingClass,
-        analyzerCode: "MIXIN_INFERENCE_NO_POSSIBLE_SUBSTITUTION");
+        analyzerCodes: <String>["MIXIN_INFERENCE_NO_POSSIBLE_SUBSTITUTION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsMixinInferenceNoMatchingClass(
     String name, String name2, DartType _type) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -5366,7 +5770,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMoreThanOneSuperOrThisInitializer = const MessageCode(
     "MoreThanOneSuperOrThisInitializer",
-    analyzerCode: "SUPER_IN_REDIRECTING_CONSTRUCTOR",
+    analyzerCodes: <String>["SUPER_IN_REDIRECTING_CONSTRUCTOR"],
     message: r"""Can't have more than one 'super' or 'this' initializer.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5385,7 +5789,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMultipleImplements = const MessageCode(
     "MultipleImplements",
-    analyzerCode: "MULTIPLE_IMPLEMENTS_CLAUSES",
+    analyzerCodes: <String>["MULTIPLE_IMPLEMENTS_CLAUSES"],
     message:
         r"""Each class definition can have at most one implements clause.""",
     tip:
@@ -5427,10 +5831,36 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNamedFunctionExpression = const MessageCode(
     "NamedFunctionExpression",
-    analyzerCode: "NAMED_FUNCTION_EXPRESSION",
+    analyzerCodes: <String>["NAMED_FUNCTION_EXPRESSION"],
     message: r"""A function expression can't have a name.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            name)> templateNamedMixinOverrideContext = const Template<
+        Message Function(String name)>(
+    messageTemplate:
+        r"""Override was introduced in the mixin application class '#name'.""",
+    withArguments: _withArgumentsNamedMixinOverrideContext);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeNamedMixinOverrideContext =
+    const Code<Message Function(String name)>(
+        "NamedMixinOverrideContext", templateNamedMixinOverrideContext,
+        severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNamedMixinOverrideContext(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeNamedMixinOverrideContext,
+      message:
+          """Override was introduced in the mixin application class '${name}'.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNativeClauseShouldBeAnnotation =
     messageNativeClauseShouldBeAnnotation;
 
@@ -5454,7 +5884,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(Token token)> codeNoFormals =
     const Code<Message Function(Token token)>("NoFormals", templateNoFormals,
-        analyzerCode: "MISSING_FUNCTION_PARAMETERS");
+        analyzerCodes: <String>["MISSING_FUNCTION_PARAMETERS"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsNoFormals(Token token) {
@@ -5476,11 +5906,13 @@
 const Code<Message Function(String name)> codeNoSuchNamedParameter =
     const Code<Message Function(String name)>(
         "NoSuchNamedParameter", templateNoSuchNamedParameter,
-        analyzerCode: "UNDEFINED_NAMED_PARAMETER",
+        analyzerCodes: <String>["UNDEFINED_NAMED_PARAMETER"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsNoSuchNamedParameter(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeNoSuchNamedParameter,
       message: """No named parameter with the name '${name}'.""",
       arguments: {'name': name});
@@ -5513,10 +5945,11 @@
     codeNonAsciiIdentifier =
     const Code<Message Function(String character, int codePoint)>(
         "NonAsciiIdentifier", templateNonAsciiIdentifier,
-        analyzerCode: "ILLEGAL_CHARACTER");
+        analyzerCodes: <String>["ILLEGAL_CHARACTER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsNonAsciiIdentifier(String character, int codePoint) {
+  if (character.runes.length != 1) throw "Not a character '${character}'";
   String unicode =
       "U+${codePoint.toRadixString(16).toUpperCase().padLeft(4, '0')}";
   return new Message(codeNonAsciiIdentifier,
@@ -5540,7 +5973,7 @@
 const Code<Message Function(int codePoint)> codeNonAsciiWhitespace =
     const Code<Message Function(int codePoint)>(
         "NonAsciiWhitespace", templateNonAsciiWhitespace,
-        analyzerCode: "ILLEGAL_CHARACTER");
+        analyzerCodes: <String>["ILLEGAL_CHARACTER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsNonAsciiWhitespace(int codePoint) {
@@ -5558,7 +5991,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNonConstConstructor = const MessageCode(
     "NonConstConstructor",
-    analyzerCode: "NOT_CONSTANT_EXPRESSION",
+    analyzerCodes: <String>["NOT_CONSTANT_EXPRESSION"],
     message:
         r"""Cannot invoke a non-'const' constructor where a const expression is expected.""",
     tip: r"""Try using a constructor or factory that is 'const'.""");
@@ -5568,7 +6001,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNonConstFactory = const MessageCode("NonConstFactory",
-    analyzerCode: "NOT_CONSTANT_EXPRESSION",
+    analyzerCodes: <String>["NOT_CONSTANT_EXPRESSION"],
     message:
         r"""Cannot invoke a non-'const' factory where a const expression is expected.""",
     tip: r"""Try using a constructor or factory that is 'const'.""");
@@ -5580,7 +6013,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNonInstanceTypeVariableUse = const MessageCode(
     "NonInstanceTypeVariableUse",
-    analyzerCode: "TYPE_PARAMETER_REFERENCED_BY_STATIC",
+    analyzerCodes: <String>["TYPE_PARAMETER_REFERENCED_BY_STATIC"],
     severity: Severity.errorLegacyWarning,
     message: r"""Can only use type variables in instance methods.""");
 
@@ -5590,7 +6023,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNonPartOfDirectiveInPart = const MessageCode(
     "NonPartOfDirectiveInPart",
-    analyzerCode: "NON_PART_OF_DIRECTIVE_IN_PART",
+    analyzerCodes: <String>["NON_PART_OF_DIRECTIVE_IN_PART"],
     message: r"""The part-of directive must be the only directive in a part.""",
     tip:
         r"""Try removing the other directives, or moving them to the library for which this is a part.""");
@@ -5611,6 +6044,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsNonSimpleBoundViaReference(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeNonSimpleBoundViaReference,
       message: """Bound of this variable references raw type '${name}'.""",
       arguments: {'name': name});
@@ -5634,6 +6069,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsNonSimpleBoundViaVariable(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeNonSimpleBoundViaVariable,
       message:
           """Bound of this variable references variable '${name}' from the same declaration.""",
@@ -5646,7 +6083,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNotAConstantExpression = const MessageCode(
     "NotAConstantExpression",
-    analyzerCode: "NOT_CONSTANT_EXPRESSION",
+    analyzerCodes: <String>["NOT_CONSTANT_EXPRESSION"],
     message: r"""Not a constant expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5665,10 +6102,15 @@
     codeNotAPrefixInTypeAnnotation =
     const Code<Message Function(String name, String name2)>(
         "NotAPrefixInTypeAnnotation", templateNotAPrefixInTypeAnnotation,
-        analyzerCode: "NOT_A_TYPE", severity: Severity.errorLegacyWarning);
+        analyzerCodes: <String>["NOT_A_TYPE"],
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsNotAPrefixInTypeAnnotation(String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   return new Message(codeNotAPrefixInTypeAnnotation,
       message:
           """'${name}.${name2}' can't be used as a type because '${name}' doesn't refer to an import prefix.""",
@@ -5684,10 +6126,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeNotAType =
     const Code<Message Function(String name)>("NotAType", templateNotAType,
-        analyzerCode: "NOT_A_TYPE", severity: Severity.errorLegacyWarning);
+        analyzerCodes: <String>["NOT_A_TYPE"],
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsNotAType(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeNotAType,
       message: """'${name}' isn't a type.""", arguments: {'name': name});
 }
@@ -5697,7 +6142,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNotAnLvalue = const MessageCode("NotAnLvalue",
-    analyzerCode: "NOT_AN_LVALUE", message: r"""Can't assign to this.""");
+    analyzerCodes: <String>["NOT_AN_LVALUE"],
+    message: r"""Can't assign to this.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)> templateNotConstantExpression =
@@ -5709,10 +6155,11 @@
 const Code<Message Function(String string)> codeNotConstantExpression =
     const Code<Message Function(String string)>(
         "NotConstantExpression", templateNotConstantExpression,
-        analyzerCode: "NOT_CONSTANT_EXPRESSION");
+        analyzerCodes: <String>["NOT_CONSTANT_EXPRESSION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsNotConstantExpression(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeNotConstantExpression,
       message: """${string} is not a constant expression.""",
       arguments: {'string': string});
@@ -5723,7 +6170,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageOnlyTry = const MessageCode("OnlyTry",
-    analyzerCode: "MISSING_CATCH_OR_FINALLY",
+    analyzerCodes: <String>["MISSING_CATCH_OR_FINALLY"],
     message:
         r"""Try block should be followed by 'on', 'catch', or 'finally' block.""",
     tip: r"""Did you forget to add a 'finally' block?""");
@@ -5742,11 +6189,14 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeOperatorMinusParameterMismatch =
     const Code<Message Function(String name)>("OperatorMinusParameterMismatch",
-        templateOperatorMinusParameterMismatch,
-        analyzerCode: "WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS");
+        templateOperatorMinusParameterMismatch, analyzerCodes: <String>[
+  "WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS"
+]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOperatorMinusParameterMismatch(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeOperatorMinusParameterMismatch,
       message: """Operator '${name}' should have zero or one parameter.""",
       tip:
@@ -5770,6 +6220,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOperatorParameterMismatch0(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeOperatorParameterMismatch0,
       message: """Operator '${name}' shouldn't have any parameters.""",
       arguments: {'name': name});
@@ -5787,10 +6239,12 @@
 const Code<Message Function(String name)> codeOperatorParameterMismatch1 =
     const Code<Message Function(String name)>(
         "OperatorParameterMismatch1", templateOperatorParameterMismatch1,
-        analyzerCode: "WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR");
+        analyzerCodes: <String>["WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOperatorParameterMismatch1(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeOperatorParameterMismatch1,
       message: """Operator '${name}' should have exactly one parameter.""",
       arguments: {'name': name});
@@ -5808,10 +6262,12 @@
 const Code<Message Function(String name)> codeOperatorParameterMismatch2 =
     const Code<Message Function(String name)>(
         "OperatorParameterMismatch2", templateOperatorParameterMismatch2,
-        analyzerCode: "WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR");
+        analyzerCodes: <String>["WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOperatorParameterMismatch2(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeOperatorParameterMismatch2,
       message: """Operator '${name}' should have exactly two parameters.""",
       arguments: {'name': name});
@@ -5840,6 +6296,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverriddenMethodCause(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeOverriddenMethodCause,
       message: """This is the overridden method ('${name}').""",
       arguments: {'name': name});
@@ -5861,11 +6319,15 @@
     codeOverrideFewerNamedArguments =
     const Code<Message Function(String name, String name2)>(
         "OverrideFewerNamedArguments", templateOverrideFewerNamedArguments,
-        analyzerCode: "INVALID_OVERRIDE_NAMED",
+        analyzerCodes: <String>["INVALID_OVERRIDE_NAMED"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideFewerNamedArguments(String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   return new Message(codeOverrideFewerNamedArguments,
       message:
           """The method '${name}' has fewer named arguments than those of overridden method '${name2}'.""",
@@ -5889,12 +6351,16 @@
     const Code<Message Function(String name, String name2)>(
         "OverrideFewerPositionalArguments",
         templateOverrideFewerPositionalArguments,
-        analyzerCode: "INVALID_OVERRIDE_POSITIONAL",
+        analyzerCodes: <String>["INVALID_OVERRIDE_POSITIONAL"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideFewerPositionalArguments(
     String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   return new Message(codeOverrideFewerPositionalArguments,
       message:
           """The method '${name}' has fewer positional arguments than those of overridden method '${name2}'.""",
@@ -5919,12 +6385,18 @@
     const Code<Message Function(String name, String name2, String name3)>(
         "OverrideMismatchNamedParameter",
         templateOverrideMismatchNamedParameter,
-        analyzerCode: "INVALID_OVERRIDE_NAMED",
+        analyzerCodes: <String>["INVALID_OVERRIDE_NAMED"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideMismatchNamedParameter(
     String name, String name2, String name3) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  if (name3.isEmpty) throw 'No name provided';
+  name3 = demangleMixinApplicationName(name3);
   return new Message(codeOverrideMismatchNamedParameter,
       message:
           """The method '${name}' doesn't have the named parameter '${name2}' of overridden method '${name3}'.""",
@@ -5947,11 +6419,15 @@
     codeOverrideMoreRequiredArguments =
     const Code<Message Function(String name, String name2)>(
         "OverrideMoreRequiredArguments", templateOverrideMoreRequiredArguments,
-        analyzerCode: "INVALID_OVERRIDE_REQUIRED",
+        analyzerCodes: <String>["INVALID_OVERRIDE_REQUIRED"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideMoreRequiredArguments(String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   return new Message(codeOverrideMoreRequiredArguments,
       message:
           """The method '${name}' has more required arguments than those of overridden method '${name2}'.""",
@@ -5982,11 +6458,15 @@
             Message Function(
                 String name, String name2, DartType _type, DartType _type2)>(
         "OverrideTypeMismatchParameter", templateOverrideTypeMismatchParameter,
-        analyzerCode: "INVALID_METHOD_OVERRIDE");
+        analyzerCodes: <String>["INVALID_METHOD_OVERRIDE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideTypeMismatchParameter(
     String name, String name2, DartType _type, DartType _type2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -6028,11 +6508,13 @@
     const Code<Message Function(String name, DartType _type, DartType _type2)>(
         "OverrideTypeMismatchReturnType",
         templateOverrideTypeMismatchReturnType,
-        analyzerCode: "INVALID_METHOD_OVERRIDE");
+        analyzerCodes: <String>["INVALID_METHOD_OVERRIDE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideTypeMismatchReturnType(
     String name, DartType _type, DartType _type2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -6066,11 +6548,15 @@
     codeOverrideTypeVariablesMismatch =
     const Code<Message Function(String name, String name2)>(
         "OverrideTypeVariablesMismatch", templateOverrideTypeVariablesMismatch,
-        analyzerCode: "INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS",
+        analyzerCodes: <String>["INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsOverrideTypeVariablesMismatch(String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   return new Message(codeOverrideTypeVariablesMismatch,
       message:
           """Declared type variables of '${name}' doesn't match those on overridden method '${name2}'.""",
@@ -6094,6 +6580,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsPackageNotFound(String name, Uri uri_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   String uri = relativizeUri(uri_);
   return new Message(codePackageNotFound,
       message: """Could not resolve the package '${name}' in '${uri}'.""",
@@ -6115,6 +6603,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsPackagesFileFormat(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codePackagesFileFormat,
       message: """Problem in packages configuration file: ${string}""",
       arguments: {'string': string});
@@ -6125,7 +6614,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePartExport = const MessageCode("PartExport",
-    analyzerCode: "EXPORT_OF_NON_LIBRARY",
+    analyzerCodes: <String>["EXPORT_OF_NON_LIBRARY"],
     message:
         r"""Can't export this file because it contains a 'part of' declaration.""");
 
@@ -6143,7 +6632,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePartInPart = const MessageCode("PartInPart",
-    analyzerCode: "NON_PART_OF_DIRECTIVE_IN_PART",
+    analyzerCodes: <String>["NON_PART_OF_DIRECTIVE_IN_PART"],
     message: r"""A file that's a part of a library can't have parts itself.""",
     tip: r"""Try moving the 'part' declaration to the containing library.""");
 
@@ -6170,7 +6659,7 @@
 const Code<Message Function(Uri uri_)> codePartOfInLibrary =
     const Code<Message Function(Uri uri_)>(
         "PartOfInLibrary", templatePartOfInLibrary,
-        analyzerCode: "IMPORT_OF_NON_LIBRARY");
+        analyzerCodes: <String>["IMPORT_OF_NON_LIBRARY"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsPartOfInLibrary(Uri uri_) {
@@ -6200,13 +6689,17 @@
     codePartOfLibraryNameMismatch =
     const Code<Message Function(Uri uri_, String name, String name2)>(
         "PartOfLibraryNameMismatch", templatePartOfLibraryNameMismatch,
-        analyzerCode: "PART_OF_DIFFERENT_LIBRARY",
+        analyzerCodes: <String>["PART_OF_DIFFERENT_LIBRARY"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsPartOfLibraryNameMismatch(
     Uri uri_, String name, String name2) {
   String uri = relativizeUri(uri_);
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   return new Message(codePartOfLibraryNameMismatch,
       message:
           """Using '${uri}' as part of '${name}' but its 'part of' declaration says '${name2}'.""",
@@ -6218,7 +6711,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePartOfSelf = const MessageCode("PartOfSelf",
-    analyzerCode: "PART_OF_NON_PART",
+    analyzerCodes: <String>["PART_OF_NON_PART"],
     message: r"""A file can't be a part of itself.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6236,7 +6729,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePartOfTwoLibraries = const MessageCode(
     "PartOfTwoLibraries",
-    analyzerCode: "PART_OF_DIFFERENT_LIBRARY",
+    analyzerCodes: <String>["PART_OF_DIFFERENT_LIBRARY"],
     message: r"""A file can't be part of more than one library.""",
     tip:
         r"""Try moving the shared declarations into the libraries, or into a new library.""");
@@ -6268,7 +6761,7 @@
     codePartOfUriMismatch =
     const Code<Message Function(Uri uri_, Uri uri2_, Uri uri3_)>(
         "PartOfUriMismatch", templatePartOfUriMismatch,
-        analyzerCode: "PART_OF_DIFFERENT_LIBRARY",
+        analyzerCodes: <String>["PART_OF_DIFFERENT_LIBRARY"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6301,13 +6794,15 @@
     codePartOfUseUri =
     const Code<Message Function(Uri uri_, Uri uri2_, String name)>(
         "PartOfUseUri", templatePartOfUseUri,
-        analyzerCode: "PART_OF_UNNAMED_LIBRARY",
+        analyzerCodes: <String>["PART_OF_UNNAMED_LIBRARY"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsPartOfUseUri(Uri uri_, Uri uri2_, String name) {
   String uri = relativizeUri(uri_);
   String uri2 = relativizeUri(uri2_);
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codePartOfUseUri,
       message:
           """Using '${uri}' as part of '${uri2}' but its 'part of' declaration says '${name}'.""",
@@ -6332,7 +6827,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(Uri uri_)> codePartTwice =
     const Code<Message Function(Uri uri_)>("PartTwice", templatePartTwice,
-        analyzerCode: "DUPLICATE_PART");
+        analyzerCodes: <String>["DUPLICATE_PART"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsPartTwice(Uri uri_) {
@@ -6395,6 +6890,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsPatchInjectionFailed(String name, Uri uri_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   String uri = relativizeUri(uri_);
   return new Message(codePatchInjectionFailed,
       message: """Can't inject '${name}' into '${uri}'.""",
@@ -6419,7 +6916,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePlatformPrivateLibraryAccess = const MessageCode(
     "PlatformPrivateLibraryAccess",
-    analyzerCode: "IMPORT_INTERNAL_LIBRARY",
+    analyzerCodes: <String>["IMPORT_INTERNAL_LIBRARY"],
     message: r"""Can't access platform private library.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6429,7 +6926,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePositionalAfterNamedArgument = const MessageCode(
     "PositionalAfterNamedArgument",
-    analyzerCode: "POSITIONAL_AFTER_NAMED_ARGUMENT",
+    analyzerCodes: <String>["POSITIONAL_AFTER_NAMED_ARGUMENT"],
     message: r"""Place positional arguments before named arguments.""",
     tip:
         r"""Try moving the positional argument before the named arguments, or add a name to the argument.""");
@@ -6441,7 +6938,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePositionalParameterWithEquals = const MessageCode(
     "PositionalParameterWithEquals",
-    analyzerCode: "WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER",
+    analyzerCodes: <String>["WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER"],
     message:
         r"""Positional optional parameters can't use ':' to specify a default value.""",
     tip: r"""Try replacing ':' with '='.""");
@@ -6463,7 +6960,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePrivateNamedParameter = const MessageCode(
     "PrivateNamedParameter",
-    analyzerCode: "PRIVATE_OPTIONAL_PARAMETER",
+    analyzerCodes: <String>["PRIVATE_OPTIONAL_PARAMETER"],
     message: r"""An optional named parameter can't start with '_'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6493,7 +6990,7 @@
     const Code<Message Function(DartType _type, DartType _type2)>(
         "RedirectingFactoryIncompatibleTypeArgument",
         templateRedirectingFactoryIncompatibleTypeArgument,
-        analyzerCode: "TYPE_ARGUMENT_NOT_MATCHING_BOUNDS");
+        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsRedirectingFactoryIncompatibleTypeArgument(
@@ -6531,11 +7028,13 @@
     const Code<Message Function(String name, DartType _type, DartType _type2)>(
         "RedirectingFactoryInvalidNamedParameterType",
         templateRedirectingFactoryInvalidNamedParameterType,
-        analyzerCode: "REDIRECT_TO_INVALID_FUNCTION_TYPE");
+        analyzerCodes: <String>["REDIRECT_TO_INVALID_FUNCTION_TYPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsRedirectingFactoryInvalidNamedParameterType(
     String name, DartType _type, DartType _type2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -6570,11 +7069,13 @@
     const Code<Message Function(String name, DartType _type, DartType _type2)>(
         "RedirectingFactoryInvalidPositionalParameterType",
         templateRedirectingFactoryInvalidPositionalParameterType,
-        analyzerCode: "REDIRECT_TO_INVALID_FUNCTION_TYPE");
+        analyzerCodes: <String>["REDIRECT_TO_INVALID_FUNCTION_TYPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsRedirectingFactoryInvalidPositionalParameterType(
     String name, DartType _type, DartType _type2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -6608,11 +7109,15 @@
     const Code<Message Function(String name, String name2)>(
         "RedirectingFactoryMissingNamedParameter",
         templateRedirectingFactoryMissingNamedParameter,
-        analyzerCode: "REDIRECT_TO_INVALID_FUNCTION_TYPE");
+        analyzerCodes: <String>["REDIRECT_TO_INVALID_FUNCTION_TYPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsRedirectingFactoryMissingNamedParameter(
     String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   return new Message(codeRedirectingFactoryMissingNamedParameter,
       message:
           """The constructor '${name}' does not have a named parameter '${name2}'.""",
@@ -6637,11 +7142,17 @@
             Message Function(String name, int count, String name2, int count2)>(
         "RedirectingFactoryProvidesTooFewRequiredParameters",
         templateRedirectingFactoryProvidesTooFewRequiredParameters,
-        analyzerCode: "REDIRECT_TO_INVALID_FUNCTION_TYPE");
+        analyzerCodes: <String>["REDIRECT_TO_INVALID_FUNCTION_TYPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsRedirectingFactoryProvidesTooFewRequiredParameters(
     String name, int count, String name2, int count2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (count == null) throw 'No count provided';
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  if (count2 == null) throw 'No count provided';
   return new Message(codeRedirectingFactoryProvidesTooFewRequiredParameters,
       message:
           """Redirecting factory '${name}' can provide less arguments ('${count}') than required by the redirection target '${name2}' ('${count2}').""",
@@ -6677,11 +7188,13 @@
 const Code<Message Function(String name)> codeRedirectionTargetNotFound =
     const Code<Message Function(String name)>(
         "RedirectionTargetNotFound", templateRedirectionTargetNotFound,
-        analyzerCode: "REDIRECT_TO_MISSING_CONSTRUCTOR",
+        analyzerCodes: <String>["REDIRECT_TO_MISSING_CONSTRUCTOR"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsRedirectionTargetNotFound(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeRedirectionTargetNotFound,
       message: """Redirection constructor target not found: '${name}'""",
       arguments: {'name': name});
@@ -6694,7 +7207,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageRequiredParameterWithDefault = const MessageCode(
     "RequiredParameterWithDefault",
-    analyzerCode: "NAMED_PARAMETER_OUTSIDE_GROUP",
+    analyzerCodes: <String>["NAMED_PARAMETER_OUTSIDE_GROUP"],
     message: r"""Non-optional parameters can't have a default value.""",
     tip:
         r"""Try removing the default value or making the parameter optional.""");
@@ -6704,7 +7217,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageRethrowNotCatch = const MessageCode("RethrowNotCatch",
-    analyzerCode: "RETHROW_OUTSIDE_CATCH",
+    analyzerCodes: <String>["RETHROW_OUTSIDE_CATCH"],
     message: r"""'rethrow' can only be used in catch clauses.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6713,7 +7226,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageReturnFromVoidFunction = const MessageCode(
     "ReturnFromVoidFunction",
-    analyzerCode: "RETURN_OF_INVALID_TYPE",
+    analyzerCodes: <String>["RETURN_OF_INVALID_TYPE"],
     message: r"""Can't return a value from a void function.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6732,7 +7245,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageReturnWithoutExpression = const MessageCode(
     "ReturnWithoutExpression",
-    analyzerCode: "RETURN_WITHOUT_VALUE",
+    analyzerCodes: <String>["RETURN_WITHOUT_VALUE"],
     severity: Severity.warning,
     message: r"""Must explicitly return a value from a non-void function.""");
 
@@ -6815,11 +7328,13 @@
 const Code<Message Function(String name)> codeSetterNotFound =
     const Code<Message Function(String name)>(
         "SetterNotFound", templateSetterNotFound,
-        analyzerCode: "UNDEFINED_SETTER",
+        analyzerCodes: <String>["UNDEFINED_SETTER"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSetterNotFound(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeSetterNotFound,
       message: """Setter not found: '${name}'.""", arguments: {'name': name});
 }
@@ -6829,7 +7344,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSetterNotSync = const MessageCode("SetterNotSync",
-    analyzerCode: "INVALID_MODIFIER_ON_SETTER",
+    analyzerCodes: <String>["INVALID_MODIFIER_ON_SETTER"],
     message: r"""Setters can't use 'async', 'async*', or 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6839,7 +7354,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSetterWithWrongNumberOfFormals = const MessageCode(
     "SetterWithWrongNumberOfFormals",
-    analyzerCode: "WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER",
+    analyzerCodes: <String>["WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER"],
     message: r"""A setter should have exactly one formal parameter.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6871,8 +7386,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSourceBodySummary(
     int count, int count2, num _num1, num _num2, num _num3) {
+  if (count == null) throw 'No count provided';
+  if (count2 == null) throw 'No count provided';
+  if (_num1 == null) throw 'No number provided';
   String num1 = _num1.toStringAsFixed(3);
+  if (_num2 == null) throw 'No number provided';
   String num2 = _num2.toStringAsFixed(3).padLeft(12);
+  if (_num3 == null) throw 'No number provided';
   String num3 = _num3.toStringAsFixed(3).padLeft(12);
   return new Message(codeSourceBodySummary,
       message:
@@ -6917,8 +7437,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSourceOutlineSummary(
     int count, int count2, num _num1, num _num2, num _num3) {
+  if (count == null) throw 'No count provided';
+  if (count2 == null) throw 'No count provided';
+  if (_num1 == null) throw 'No number provided';
   String num1 = _num1.toStringAsFixed(3);
+  if (_num2 == null) throw 'No number provided';
   String num2 = _num2.toStringAsFixed(3).padLeft(12);
+  if (_num3 == null) throw 'No number provided';
   String num3 = _num3.toStringAsFixed(3).padLeft(12);
   return new Message(codeSourceOutlineSummary,
       message:
@@ -6939,7 +7464,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageStackOverflow = const MessageCode("StackOverflow",
-    analyzerCode: "STACK_OVERFLOW", message: r"""Stack overflow.""");
+    analyzerCodes: <String>["STACK_OVERFLOW"], message: r"""Stack overflow.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeStaticAfterConst = messageStaticAfterConst;
@@ -6997,7 +7522,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSuperAsExpression = const MessageCode(
     "SuperAsExpression",
-    analyzerCode: "SUPER_AS_EXPRESSION",
+    analyzerCodes: <String>["SUPER_AS_EXPRESSION"],
     message: r"""Can't use 'super' as an expression.""",
     tip:
         r"""To delegate a constructor to a super constructor, put the super call as an initializer.""");
@@ -7008,7 +7533,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSuperAsIdentifier = const MessageCode(
     "SuperAsIdentifier",
-    analyzerCode: "SUPER_AS_EXPRESSION",
+    analyzerCodes: <String>["SUPER_AS_EXPRESSION"],
     message: r"""Expected identifier, but got 'super'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7017,7 +7542,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSuperInitializerNotLast = const MessageCode(
     "SuperInitializerNotLast",
-    analyzerCode: "INVALID_SUPER_INVOCATION",
+    analyzerCodes: <String>["INVALID_SUPER_INVOCATION"],
     message: r"""Can't have initializers after 'super'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7025,11 +7550,37 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSuperNullAware = const MessageCode("SuperNullAware",
-    analyzerCode: "INVALID_OPERATOR_FOR_SUPER",
+    analyzerCodes: <String>["INVALID_OPERATOR_FOR_SUPER"],
     message: r"""'super' can't be null.""",
     tip: r"""Try replacing '?.' with '.'""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateSuperclassHasNoConstructor =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""Superclass has no constructor named '#name'.""",
+        withArguments: _withArgumentsSuperclassHasNoConstructor);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeSuperclassHasNoConstructor =
+    const Code<Message Function(String name)>(
+        "SuperclassHasNoConstructor", templateSuperclassHasNoConstructor,
+        analyzerCodes: <String>[
+          "UNDEFINED_CONSTRUCTOR_IN_INITIALIZER",
+          "UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT"
+        ],
+        severity: Severity.errorLegacyWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSuperclassHasNoConstructor(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeSuperclassHasNoConstructor,
+      message: """Superclass has no constructor named '${name}'.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String
@@ -7045,10 +7596,12 @@
     const Code<Message Function(String name)>(
         "SuperclassHasNoDefaultConstructor",
         templateSuperclassHasNoDefaultConstructor,
-        analyzerCode: "NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT");
+        analyzerCodes: <String>["NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSuperclassHasNoDefaultConstructor(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassHasNoDefaultConstructor,
       message:
           """The superclass, '${name}', has no unnamed constructor that takes no arguments.""",
@@ -7065,11 +7618,13 @@
 const Code<Message Function(String name)> codeSuperclassHasNoGetter =
     const Code<Message Function(String name)>(
         "SuperclassHasNoGetter", templateSuperclassHasNoGetter,
-        analyzerCode: "UNDEFINED_SUPER_GETTER",
+        analyzerCodes: <String>["UNDEFINED_SUPER_GETTER"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSuperclassHasNoGetter(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassHasNoGetter,
       message: """Superclass has no getter named '${name}'.""",
       arguments: {'name': name});
@@ -7085,11 +7640,13 @@
 const Code<Message Function(String name)> codeSuperclassHasNoMethod =
     const Code<Message Function(String name)>(
         "SuperclassHasNoMethod", templateSuperclassHasNoMethod,
-        analyzerCode: "UNDEFINED_SUPER_METHOD",
+        analyzerCodes: <String>["UNDEFINED_SUPER_METHOD"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSuperclassHasNoMethod(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassHasNoMethod,
       message: """Superclass has no method named '${name}'.""",
       arguments: {'name': name});
@@ -7105,11 +7662,13 @@
 const Code<Message Function(String name)> codeSuperclassHasNoSetter =
     const Code<Message Function(String name)>(
         "SuperclassHasNoSetter", templateSuperclassHasNoSetter,
-        analyzerCode: "UNDEFINED_SUPER_SETTER",
+        analyzerCodes: <String>["UNDEFINED_SUPER_SETTER"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSuperclassHasNoSetter(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassHasNoSetter,
       message: """Superclass has no setter named '${name}'.""",
       arguments: {'name': name});
@@ -7134,6 +7693,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSuperclassMethodArgumentMismatch(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassMethodArgumentMismatch,
       message:
           """Superclass doesn't have a method named '${name}' with matching arguments.""",
@@ -7158,10 +7719,12 @@
 const Code<Message Function(String name)> codeSupertypeIsIllegal =
     const Code<Message Function(String name)>(
         "SupertypeIsIllegal", templateSupertypeIsIllegal,
-        analyzerCode: "EXTENDS_NON_CLASS");
+        analyzerCodes: <String>["EXTENDS_NON_CLASS"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSupertypeIsIllegal(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeSupertypeIsIllegal,
       message: """The type '${name}' can't be used as supertype.""",
       arguments: {'name': name});
@@ -7178,10 +7741,12 @@
 const Code<Message Function(String name)> codeSupertypeIsTypeVariable =
     const Code<Message Function(String name)>(
         "SupertypeIsTypeVariable", templateSupertypeIsTypeVariable,
-        analyzerCode: "EXTENDS_NON_CLASS");
+        analyzerCodes: <String>["EXTENDS_NON_CLASS"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSupertypeIsTypeVariable(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeSupertypeIsTypeVariable,
       message: """The type variable '${name}' can't be used as supertype.""",
       arguments: {'name': name});
@@ -7193,7 +7758,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSwitchCaseFallThrough = const MessageCode(
     "SwitchCaseFallThrough",
-    analyzerCode: "CASE_BLOCK_NOT_TERMINATED",
+    analyzerCodes: <String>["CASE_BLOCK_NOT_TERMINATED"],
     severity: Severity.errorLegacyWarning,
     message: r"""Switch case may fall through to the next case.""");
 
@@ -7213,7 +7778,7 @@
     codeSwitchExpressionNotAssignable =
     const Code<Message Function(DartType _type, DartType _type2)>(
         "SwitchExpressionNotAssignable", templateSwitchExpressionNotAssignable,
-        analyzerCode: "SWITCH_EXPRESSION_NOT_ASSIGNABLE");
+        analyzerCodes: <String>["SWITCH_EXPRESSION_NOT_ASSIGNABLE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSwitchExpressionNotAssignable(
@@ -7268,6 +7833,13 @@
     tip: r"""Try removing all but one default case.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeSyntheticToken = messageSyntheticToken;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageSyntheticToken = const MessageCode("SyntheticToken",
+    message: r"""This couldn't be parsed.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateThisAccessInFieldInitializer =
     const Template<Message Function(String name)>(
@@ -7279,10 +7851,12 @@
 const Code<Message Function(String name)> codeThisAccessInFieldInitializer =
     const Code<Message Function(String name)>(
         "ThisAccessInFieldInitializer", templateThisAccessInFieldInitializer,
-        analyzerCode: "THIS_ACCESS_FROM_INITIALIZER");
+        analyzerCodes: <String>["THIS_ACCESS_FROM_INITIALIZER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsThisAccessInFieldInitializer(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeThisAccessInFieldInitializer,
       message:
           """Can't access 'this' in a field initializer to read '${name}'.""",
@@ -7295,7 +7869,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageThisAsIdentifier = const MessageCode(
     "ThisAsIdentifier",
-    analyzerCode: "INVALID_REFERENCE_TO_THIS",
+    analyzerCodes: <String>["INVALID_REFERENCE_TO_THIS"],
     message: r"""Expected identifier, but got 'this'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7304,7 +7878,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageThisInitializerNotAlone = const MessageCode(
     "ThisInitializerNotAlone",
-    analyzerCode: "FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR",
+    analyzerCodes: <String>["FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR"],
     message: r"""Can't have other initializers together with 'this'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7320,10 +7894,11 @@
     const Code<Message Function(String string)>(
         "ThisOrSuperAccessInFieldInitializer",
         templateThisOrSuperAccessInFieldInitializer,
-        analyzerCode: "THIS_ACCESS_FROM_INITIALIZER");
+        analyzerCodes: <String>["THIS_ACCESS_FROM_INITIALIZER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsThisOrSuperAccessInFieldInitializer(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeThisOrSuperAccessInFieldInitializer,
       message: """Can't access '${string}' in a field initializer.""",
       arguments: {'string': string});
@@ -7344,11 +7919,13 @@
 const Code<Message Function(int count, int count2)> codeTooFewArguments =
     const Code<Message Function(int count, int count2)>(
         "TooFewArguments", templateTooFewArguments,
-        analyzerCode: "NOT_ENOUGH_REQUIRED_ARGUMENTS",
+        analyzerCodes: <String>["NOT_ENOUGH_REQUIRED_ARGUMENTS"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsTooFewArguments(int count, int count2) {
+  if (count == null) throw 'No count provided';
+  if (count2 == null) throw 'No count provided';
   return new Message(codeTooFewArguments,
       message:
           """Too few positional arguments: ${count} required, ${count2} given.""",
@@ -7371,11 +7948,13 @@
 const Code<Message Function(int count, int count2)> codeTooManyArguments =
     const Code<Message Function(int count, int count2)>(
         "TooManyArguments", templateTooManyArguments,
-        analyzerCode: "EXTRA_POSITIONAL_ARGUMENTS",
+        analyzerCodes: <String>["EXTRA_POSITIONAL_ARGUMENTS"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsTooManyArguments(int count, int count2) {
+  if (count == null) throw 'No count provided';
+  if (count2 == null) throw 'No count provided';
   return new Message(codeTooManyArguments,
       message:
           """Too many positional arguments: ${count} allowed, but ${count2} found.""",
@@ -7399,7 +7978,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypeAfterVar = const MessageCode("TypeAfterVar",
-    analyzerCode: "VAR_AND_TYPE",
+    analyzerCodes: <String>["VAR_AND_TYPE"],
     message: r"""Can't have both a type and 'var'.""",
     tip: r"""Try removing 'var.'""");
 
@@ -7413,11 +7992,12 @@
 const Code<Message Function(int count)> codeTypeArgumentMismatch =
     const Code<Message Function(int count)>(
         "TypeArgumentMismatch", templateTypeArgumentMismatch,
-        analyzerCode: "WRONG_NUMBER_OF_TYPE_ARGUMENTS",
+        analyzerCodes: <String>["WRONG_NUMBER_OF_TYPE_ARGUMENTS"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsTypeArgumentMismatch(int count) {
+  if (count == null) throw 'No count provided';
   return new Message(codeTypeArgumentMismatch,
       message: """Expected ${count} type arguments.""",
       arguments: {'count': count});
@@ -7440,6 +8020,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsTypeArgumentsOnTypeVariable(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeTypeArgumentsOnTypeVariable,
       message: """Can't use type arguments with type variable '${name}'.""",
       tip: """Try removing the type arguments.""",
@@ -7456,10 +8038,13 @@
 const Code<Message Function(String name)> codeTypeNotFound =
     const Code<Message Function(String name)>(
         "TypeNotFound", templateTypeNotFound,
-        analyzerCode: "UNDEFINED_CLASS", severity: Severity.errorLegacyWarning);
+        analyzerCodes: <String>["UNDEFINED_CLASS"],
+        severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsTypeNotFound(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeTypeNotFound,
       message: """Type '${name}' not found.""", arguments: {'name': name});
 }
@@ -7471,7 +8056,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypeVariableDuplicatedName = const MessageCode(
     "TypeVariableDuplicatedName",
-    analyzerCode: "DUPLICATE_DEFINITION",
+    analyzerCodes: <String>["DUPLICATE_DEFINITION"],
     message: r"""A type variable can't have the same name as another.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7489,6 +8074,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsTypeVariableDuplicatedNameCause(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeTypeVariableDuplicatedNameCause,
       message: """The other type variable named '${name}'.""",
       arguments: {'name': name});
@@ -7501,7 +8088,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypeVariableInConstantContext = const MessageCode(
     "TypeVariableInConstantContext",
-    analyzerCode: "TYPE_PARAMETER_IN_CONST_EXPRESSION",
+    analyzerCodes: <String>["TYPE_PARAMETER_IN_CONST_EXPRESSION"],
     message: r"""Type variables can't be used as constants.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7511,7 +8098,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypeVariableInStaticContext = const MessageCode(
     "TypeVariableInStaticContext",
-    analyzerCode: "TYPE_PARAMETER_REFERENCED_BY_STATIC",
+    analyzerCodes: <String>["TYPE_PARAMETER_REFERENCED_BY_STATIC"],
     severity: Severity.errorLegacyWarning,
     message: r"""Type variables can't be used in static members.""");
 
@@ -7522,7 +8109,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypeVariableSameNameAsEnclosing = const MessageCode(
     "TypeVariableSameNameAsEnclosing",
-    analyzerCode: "CONFLICTING_TYPE_VARIABLE_AND_CLASS",
+    analyzerCodes: <String>["CONFLICTING_TYPE_VARIABLE_AND_CLASS"],
     message:
         r"""A type variable can't have the same name as its enclosing declaration.""");
 
@@ -7541,7 +8128,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypedefNotFunction = const MessageCode(
     "TypedefNotFunction",
-    analyzerCode: "INVALID_GENERIC_FUNCTION_TYPE",
+    analyzerCodes: <String>["INVALID_GENERIC_FUNCTION_TYPE"],
     message: r"""Can't create typedef from non-function type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7561,10 +8148,12 @@
 const Code<Message Function(String name, DartType _type)> codeUndefinedGetter =
     const Code<Message Function(String name, DartType _type)>(
         "UndefinedGetter", templateUndefinedGetter,
-        analyzerCode: "UNDEFINED_GETTER");
+        analyzerCodes: <String>["UNDEFINED_GETTER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsUndefinedGetter(String name, DartType _type) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -7596,10 +8185,12 @@
 const Code<Message Function(String name, DartType _type)> codeUndefinedMethod =
     const Code<Message Function(String name, DartType _type)>(
         "UndefinedMethod", templateUndefinedMethod,
-        analyzerCode: "UNDEFINED_METHOD");
+        analyzerCodes: <String>["UNDEFINED_METHOD"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsUndefinedMethod(String name, DartType _type) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -7631,10 +8222,12 @@
 const Code<Message Function(String name, DartType _type)> codeUndefinedSetter =
     const Code<Message Function(String name, DartType _type)>(
         "UndefinedSetter", templateUndefinedSetter,
-        analyzerCode: "UNDEFINED_SETTER");
+        analyzerCodes: <String>["UNDEFINED_SETTER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsUndefinedSetter(String name, DartType _type) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   NameSystem nameSystem = new NameSystem();
   StringBuffer buffer;
   buffer = new StringBuffer();
@@ -7655,7 +8248,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageUnexpectedDollarInString = const MessageCode(
     "UnexpectedDollarInString",
-    analyzerCode: "UNEXPECTED_DOLLAR_IN_STRING",
+    analyzerCodes: <String>["UNEXPECTED_DOLLAR_IN_STRING"],
     message:
         r"""A '$' has special meaning inside a string, and must be followed by an identifier or an expression in curly braces ({}).""",
     tip: r"""Try adding a backslash (\) to escape the '$'.""");
@@ -7670,7 +8263,7 @@
 const Code<Message Function(Token token)> codeUnexpectedToken =
     const Code<Message Function(Token token)>(
         "UnexpectedToken", templateUnexpectedToken,
-        analyzerCode: "UNEXPECTED_TOKEN");
+        analyzerCodes: <String>["UNEXPECTED_TOKEN"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsUnexpectedToken(Token token) {
@@ -7691,10 +8284,11 @@
 const Code<Message Function(String string, Token token)> codeUnmatchedToken =
     const Code<Message Function(String string, Token token)>(
         "UnmatchedToken", templateUnmatchedToken,
-        analyzerCode: "EXPECTED_TOKEN");
+        analyzerCodes: <String>["EXPECTED_TOKEN"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsUnmatchedToken(String string, Token token) {
+  if (string.isEmpty) throw 'No string provided';
   String lexeme = token.lexeme;
   return new Message(codeUnmatchedToken,
       message: """Can't find '${string}' to match '${lexeme}'.""",
@@ -7718,12 +8312,16 @@
     const Code<Message Function(String name, String name2)>(
         "UnresolvedPrefixInTypeAnnotation",
         templateUnresolvedPrefixInTypeAnnotation,
-        analyzerCode: "NOT_A_TYPE",
+        analyzerCodes: <String>["NOT_A_TYPE"],
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsUnresolvedPrefixInTypeAnnotation(
     String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
   return new Message(codeUnresolvedPrefixInTypeAnnotation,
       message:
           """'${name}.${name2}' can't be used as a type because '${name}' isn't defined.""",
@@ -7745,6 +8343,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsUnspecified(String string) {
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeUnspecified,
       message: """${string}""", arguments: {'string': string});
 }
@@ -7759,7 +8358,7 @@
 const Code<Message Function(Token token)> codeUnsupportedOperator =
     const Code<Message Function(Token token)>(
         "UnsupportedOperator", templateUnsupportedOperator,
-        analyzerCode: "UNSUPPORTED_OPERATOR");
+        analyzerCodes: <String>["UNSUPPORTED_OPERATOR"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsUnsupportedOperator(Token token) {
@@ -7775,7 +8374,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageUnsupportedPrefixPlus = const MessageCode(
     "UnsupportedPrefixPlus",
-    analyzerCode: "MISSING_IDENTIFIER",
+    analyzerCodes: <String>["MISSING_IDENTIFIER"],
     message: r"""'+' is not a prefix operator.""",
     tip: r"""Try removing '+'.""");
 
@@ -7785,7 +8384,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageUnterminatedComment = const MessageCode(
     "UnterminatedComment",
-    analyzerCode: "UNTERMINATED_MULTI_LINE_COMMENT",
+    analyzerCodes: <String>["UNTERMINATED_MULTI_LINE_COMMENT"],
     message: r"""Comment starting with '/*' must end with '*/'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7801,10 +8400,12 @@
     codeUnterminatedString =
     const Code<Message Function(String string, String string2)>(
         "UnterminatedString", templateUnterminatedString,
-        analyzerCode: "UNTERMINATED_STRING_LITERAL");
+        analyzerCodes: <String>["UNTERMINATED_STRING_LITERAL"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsUnterminatedString(String string, String string2) {
+  if (string.isEmpty) throw 'No string provided';
+  if (string2.isEmpty) throw 'No string provided';
   return new Message(codeUnterminatedString,
       message: """String starting with ${string} must end with ${string2}.""",
       arguments: {'string': string, 'string2': string2});
@@ -7827,7 +8428,7 @@
 const Code<Message Function(Uri uri_)> codeUntranslatableUri =
     const Code<Message Function(Uri uri_)>(
         "UntranslatableUri", templateUntranslatableUri,
-        analyzerCode: "URI_DOES_NOT_EXIST");
+        analyzerCodes: <String>["URI_DOES_NOT_EXIST"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsUntranslatableUri(Uri uri_) {
@@ -7851,11 +8452,20 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsUseOfDeprecatedIdentifier(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
   return new Message(codeUseOfDeprecatedIdentifier,
       message: """'${name}' is deprecated.""", arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeVarAsTypeName = messageVarAsTypeName;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageVarAsTypeName = const MessageCode("VarAsTypeName",
+    index: 61, message: r"""The keyword 'var' can't be used as a type name.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeVarReturnType = messageVarReturnType;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7870,7 +8480,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageVoidExpression = const MessageCode("VoidExpression",
-    analyzerCode: "USE_OF_VOID_RESULT",
+    analyzerCodes: <String>["USE_OF_VOID_RESULT"],
     message: r"""This expression has type 'void' and can't be used.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7897,6 +8507,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsWebLiteralCannotBeRepresentedExactly(
     String string, String string2) {
+  if (string.isEmpty) throw 'No string provided';
+  if (string2.isEmpty) throw 'No string provided';
   return new Message(codeWebLiteralCannotBeRepresentedExactly,
       message:
           """The integer literal ${string} can't be represented exactly in JavaScript.""",
@@ -7920,7 +8532,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageYieldAsIdentifier = const MessageCode(
     "YieldAsIdentifier",
-    analyzerCode: "ASYNC_KEYWORD_USED_AS_IDENTIFIER",
+    analyzerCodes: <String>["ASYNC_KEYWORD_USED_AS_IDENTIFIER"],
     message:
         r"""'yield' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.""");
 
@@ -7930,5 +8542,5 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageYieldNotGenerator = const MessageCode(
     "YieldNotGenerator",
-    analyzerCode: "YIELD_IN_NON_GENERATOR",
+    analyzerCodes: <String>["YIELD_IN_NON_GENERATOR"],
     message: r"""'yield' can only be used in 'sync*' or 'async*' methods.""");
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index c599b61..ab61403 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -614,7 +614,7 @@
           uriTranslator.translate(importUri, false) != fileUri) {
         return true;
       }
-      if (builders[importUri]?.isSynthetic == true) return true;
+      if (builders[importUri]?.isSynthetic ?? false) return true;
       return false;
     }
 
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 64a2e04..b9f0605 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -75,9 +75,9 @@
         IncompletePropertyAccessGenerator,
         IncompleteSendGenerator,
         IndexedAccessGenerator,
-        IntAccessGenerator,
         LoadLibraryGenerator,
         ParenthesizedExpressionGenerator,
+        ParserErrorGenerator,
         PrefixUseGenerator,
         ReadOnlyAccessGenerator,
         SendAccessGenerator,
@@ -850,14 +850,12 @@
       Member resolvedTarget = redirectionTarget?.target;
 
       if (resolvedTarget == null) {
-        String name = initialTarget.enclosingClass.name;
-        if (initialTarget.name.name != "") {
-          name += ".${initialTarget.name.name}";
-        }
+        String name = constructorNameForDiagnostics(initialTarget.name.name,
+            className: initialTarget.enclosingClass.name);
         // TODO(dmitryas): Report this error earlier.
         replacementNode = buildProblem(
                 fasta.templateCyclicRedirectingFactoryConstructors
-                    .withArguments(initialTarget.name.name),
+                    .withArguments(name),
                 initialTarget.fileOffset,
                 name.length)
             .desugared;
@@ -1141,8 +1139,20 @@
   @override
   void handleParenthesizedExpression(Token token) {
     debugEvent("ParenthesizedExpression");
-    push(new ParenthesizedExpressionGenerator(
-        this, token.endGroup, popForValue()));
+    Expression value = popForValue();
+    if (value is ShadowLargeIntLiteral) {
+      // We need to know that the expression was parenthesized because we will
+      // treat -n differently from -(n).  If the expression occurs in a double
+      // context, -n is a double literal and -(n) is an application of unary- to
+      // an integer literal.  And in any other context, '-' is part of the
+      // syntax of -n, i.e., -9223372036854775808 is OK and it is the minimun
+      // 64-bit integer, and '-' is an application of unary- in -(n), i.e.,
+      // -(9223372036854775808) is an error because the literal does not fit in
+      // 64-bits.
+      push(value..isParenthesized = true);
+    } else {
+      push(new ParenthesizedExpressionGenerator(this, token.endGroup, value));
+    }
   }
 
   @override
@@ -1177,6 +1187,8 @@
   finishSend(Object receiver, Arguments arguments, int charOffset) {
     if (receiver is Generator) {
       return receiver.doInvocation(charOffset, arguments);
+    } else if (receiver is ParserRecovery) {
+      return new ParserErrorGenerator(this, null, fasta.messageSyntheticToken);
     } else {
       return buildMethodInvocation(
           toValue(receiver), callName, arguments, charOffset,
@@ -1342,65 +1354,60 @@
       bool isGetter: false,
       bool isSetter: false,
       bool isStatic: false,
-      LocatedMessage argMessage}) {
-    Message message;
+      LocatedMessage message}) {
+    int length = name.length;
+    int periodIndex = name.lastIndexOf(".");
+    if (periodIndex != -1) {
+      length -= periodIndex + 1;
+    }
     Name kernelName = new Name(name, library.library);
     List<LocatedMessage> context;
     if (candidate != null) {
       Uri uri = candidate.location.file;
       int offset = candidate.fileOffset;
-      Message message;
+      Message contextMessage;
       int length = noLength;
       if (offset == -1 && candidate is Constructor) {
         offset = candidate.enclosingClass.fileOffset;
-        message = fasta.templateCandidateFoundIsDefaultConstructor
+        contextMessage = fasta.templateCandidateFoundIsDefaultConstructor
             .withArguments(candidate.enclosingClass.name);
       } else {
         length = name.length;
-        message = fasta.messageCandidateFound;
+        contextMessage = fasta.messageCandidateFound;
       }
-      context = [message.withLocation(uri, offset, length)];
+      context = [contextMessage.withLocation(uri, offset, length)];
     }
-
-    if (isGetter) {
-      message = warnUnresolvedGet(kernelName, charOffset,
-          isSuper: isSuper,
-          reportWarning: constantContext == ConstantContext.none,
-          context: context);
-    } else if (isSetter) {
-      message = warnUnresolvedSet(kernelName, charOffset,
-          isSuper: isSuper,
-          reportWarning: constantContext == ConstantContext.none,
-          context: context);
-    } else {
-      if (argMessage != null) {
-        message = argMessage.messageObject;
-        charOffset = argMessage.charOffset;
-        addProblemErrorIfConst(message, charOffset, argMessage.length,
-            context: context);
+    if (message == null) {
+      if (isGetter) {
+        message = warnUnresolvedGet(kernelName, charOffset,
+                isSuper: isSuper, reportWarning: false, context: context)
+            .withLocation(uri, charOffset, length);
+      } else if (isSetter) {
+        message = warnUnresolvedSet(kernelName, charOffset,
+                isSuper: isSuper, reportWarning: false, context: context)
+            .withLocation(uri, charOffset, length);
       } else {
         message = warnUnresolvedMethod(kernelName, charOffset,
-            isSuper: isSuper,
-            reportWarning: constantContext == ConstantContext.none,
-            context: context);
+                isSuper: isSuper, reportWarning: false, context: context)
+            .withLocation(uri, charOffset, length);
       }
     }
-    if (constantContext != ConstantContext.none) {
-      // TODO(ahe): Use [error] below instead of building a compile-time error,
-      // should be:
-      //    return library.loader.throwCompileConstantError(error, charOffset);
-      return buildProblem(message, charOffset, noLength, context: context)
-          .desugared;
-    } else {
-      Expression error = library.loader.instantiateNoSuchMethodError(
+    if (!library.loader.target.strongMode &&
+        constantContext == ConstantContext.none) {
+      addProblem(message.messageObject, message.charOffset, message.length,
+          wasHandled: true, context: context);
+      return new Throw(library.loader.instantiateNoSuchMethodError(
           receiver, name, forest.castArguments(arguments), charOffset,
           isMethod: !isGetter && !isSetter,
           isGetter: isGetter,
           isSetter: isSetter,
           isStatic: isStatic,
-          isTopLevel: !isStatic && !isSuper);
-      return new Throw(error);
+          isTopLevel: !isStatic && !isSuper));
     }
+    return buildProblem(
+            message.messageObject, message.charOffset, message.length,
+            context: context)
+        .desugared;
   }
 
   @override
@@ -1494,11 +1501,12 @@
     Member target = isSuper
         ? hierarchy.getDispatchTarget(cls, name, setter: isSetter)
         : hierarchy.getInterfaceMember(cls, name, setter: isSetter);
-    if (isSuper &&
-        target == null &&
-        library.loader.target.backendTarget.enableSuperMixins &&
-        classBuilder.isAbstract) {
-      target = 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;
   }
@@ -1583,7 +1591,11 @@
       addProblem(
           fasta.messageNotAConstantExpression, token.charOffset, token.length);
     }
-    push(new Identifier.preserveToken(token));
+    if (token.isSynthetic) {
+      push(new ParserRecovery(offsetForToken(token)));
+    } else {
+      push(new Identifier.preserveToken(token));
+    }
   }
 
   /// Look up [name] in [scope] using [token] as location information (both to
@@ -1595,6 +1607,9 @@
   scopeLookup(Scope scope, String name, Token token,
       {bool isQualified: false, PrefixBuilder prefix}) {
     int charOffset = offsetForToken(token);
+    if (token.isSynthetic) {
+      return new ParserErrorGenerator(this, token, fasta.messageSyntheticToken);
+    }
     Declaration declaration = scope.lookup(name, charOffset, uri);
     if (declaration is UnlinkedDeclaration) {
       return new UnlinkedGenerator(this, token, declaration);
@@ -1715,9 +1730,16 @@
   @override
   void handleQualified(Token period) {
     debugEvent("Qualified");
-    Identifier identifier = pop();
+    Object node = pop();
     Object qualifier = pop();
-    push(identifier.withQualifier(qualifier));
+    if (qualifier is ParserRecovery) {
+      push(qualifier);
+    } else if (node is ParserRecovery) {
+      push(node);
+    } else {
+      Identifier identifier = node;
+      push(identifier.withQualifier(qualifier));
+    }
   }
 
   @override
@@ -1820,7 +1842,23 @@
   @override
   void handleLiteralInt(Token token) {
     debugEvent("LiteralInt");
-    push(IntAccessGenerator.parseIntLiteral(this, token));
+    int value = int.tryParse(token.lexeme);
+    if (!library.loader.target.strongMode) {
+      if (value == null) {
+        push(unhandled(
+            'large integer', 'handleLiteralInt', token.charOffset, uri));
+      } else {
+        push(forest.literalInt(value, token));
+      }
+      return;
+    }
+    // Postpone parsing of literals resulting in a negative value
+    // (hex literals >= 2^63). These are only allowed when not negated.
+    if (value == null || value < 0) {
+      push(forest.literalLargeInt(token.lexeme, token));
+    } else {
+      push(forest.literalInt(value, token));
+    }
   }
 
   @override
@@ -1906,7 +1944,12 @@
   }
 
   void pushNewLocalVariable(Expression initializer, {Token equalsToken}) {
-    Identifier identifier = pop();
+    Object node = pop();
+    if (node is ParserRecovery) {
+      push(node);
+      return;
+    }
+    Identifier identifier = node;
     assert(currentLocalVariableModifiers != -1);
     bool isConst = (currentLocalVariableModifiers & constMask) != 0;
     bool isFinal = (currentLocalVariableModifiers & finalMask) != 0;
@@ -1949,7 +1992,12 @@
   void endInitializedIdentifier(Token nameToken) {
     // TODO(ahe): Use [InitializedIdentifier] here?
     debugEvent("InitializedIdentifier");
-    VariableDeclaration variable = pop();
+    Object node = pop();
+    if (node is ParserRecovery) {
+      push(node);
+      return;
+    }
+    VariableDeclaration variable = node;
     variable.fileOffset = nameToken.charOffset;
     push(variable);
     declareVariable(variable, scope);
@@ -1974,11 +2022,16 @@
   void endVariablesDeclaration(int count, Token endToken) {
     debugEvent("VariablesDeclaration");
     if (count == 1) {
-      VariableDeclaration variable = pop();
+      Object node = pop();
       constantContext = pop();
       currentLocalVariableType = pop();
       currentLocalVariableModifiers = pop();
       List<Expression> annotations = pop();
+      if (node is ParserRecovery) {
+        push(node);
+        return;
+      }
+      VariableDeclaration variable = node;
       if (annotations != null) {
         for (Expression annotation in annotations) {
           variable.addAnnotation(annotation);
@@ -1993,7 +2046,7 @@
       currentLocalVariableModifiers = pop();
       List<Expression> annotations = pop();
       if (variables == null) {
-        push(new ParserRecovery(endToken.charOffset));
+        push(new ParserRecovery(offsetForToken(endToken)));
         return;
       }
       if (annotations != null) {
@@ -2137,6 +2190,11 @@
       result = forest.syntheticLabeledStatement(result);
       breakTarget.resolveBreaks(forest, result);
     }
+    if (variableOrExpression is ParserRecovery) {
+      problemInLoopOrSwitch ??= buildProblemStatement(
+          fasta.messageSyntheticToken, variableOrExpression.charOffset,
+          suppressMessage: true);
+    }
     exitLoopOrSwitch(result);
   }
 
@@ -2260,19 +2318,24 @@
   @override
   void endLiteralSymbol(Token hashToken, int identifierCount) {
     debugEvent("LiteralSymbol");
-    String value;
     if (identifierCount == 1) {
       Object part = pop();
-      value = symbolPartToString(part);
-      push(forest.literalSymbolSingluar(value, hashToken, part));
+      if (part is ParserRecovery) {
+        push(new ParserErrorGenerator(
+            this, hashToken, fasta.messageSyntheticToken));
+      } else {
+        push(forest.literalSymbolSingluar(
+            symbolPartToString(part), hashToken, part));
+      }
     } else {
       List<Identifier> parts =
           const FixedNullableList<Identifier>().pop(stack, identifierCount);
       if (parts == null) {
-        push(new ParserRecovery(hashToken.charOffset));
+        push(new ParserErrorGenerator(
+            this, hashToken, fasta.messageSyntheticToken));
         return;
       }
-      value = symbolPartToString(parts.first);
+      String value = symbolPartToString(parts.first);
       for (int i = 1; i < parts.length; i++) {
         value += ".${symbolPartToString(parts[i])}";
       }
@@ -2293,10 +2356,19 @@
       if (prefix is Generator) {
         name = prefix.qualifiedLookup(suffix);
       } else {
-        String displayName = debugName(getNodeName(prefix), suffix.lexeme);
-        addProblem(fasta.templateNotAType.withArguments(displayName),
-            offsetForToken(beginToken), lengthOfSpan(beginToken, suffix));
-        push(const InvalidType());
+        String name = getNodeName(prefix);
+        String displayName = debugName(name, suffix.lexeme);
+        int offset = offsetForToken(beginToken);
+        push(new UnresolvedType<KernelTypeBuilder>(
+            new KernelNamedTypeBuilder(name, null)
+              ..bind(new KernelInvalidTypeBuilder(
+                  name,
+                  fasta.templateNotAType
+                      .withArguments(displayName)
+                      .withLocation(
+                          uri, offset, lengthOfSpan(beginToken, suffix)))),
+            offset,
+            uri));
         return;
       }
     }
@@ -2477,7 +2549,7 @@
         thisKeyword = null;
       }
     }
-    Identifier name = pop();
+    Object nameNode = pop();
     UnresolvedType<KernelTypeBuilder> type = pop();
     if (functionNestingLevel == 0) {
       // TODO(ahe): The type we compute here may be different from what is
@@ -2494,10 +2566,11 @@
       modifiers |= finalMask;
     }
     List<Expression> annotations = pop();
-    if (nameToken.isSynthetic) {
-      push(new ParserRecovery(nameToken.charOffset));
+    if (nameNode is ParserRecovery) {
+      push(nameNode);
       return;
     }
+    Identifier name = nameNode;
     KernelFormalParameterBuilder parameter;
     if (!inCatchClause &&
         functionNestingLevel == 0 &&
@@ -2781,19 +2854,13 @@
       Expression receiverValue;
       if (optional("-", token)) {
         operator = "unary-";
-
-        if (receiver is IntAccessGenerator) {
-          receiverValue = receiver.buildNegatedRead();
-        }
       }
       bool isSuper = false;
-      if (receiverValue == null) {
-        if (receiver is ThisAccessGenerator && receiver.isSuper) {
-          isSuper = true;
-          receiverValue = forest.thisExpression(receiver.token);
-        } else {
-          receiverValue = toValue(receiver);
-        }
+      if (receiver is ThisAccessGenerator && receiver.isSuper) {
+        isSuper = true;
+        receiverValue = forest.thisExpression(receiver.token);
+      } else {
+        receiverValue = toValue(receiver);
       }
       push(buildMethodInvocation(receiverValue, new Name(operator),
           forest.argumentsEmpty(noLocation), token.charOffset,
@@ -2938,7 +3005,7 @@
             arguments,
             charOffset,
             candidate: target,
-            argMessage: argMessage);
+            message: argMessage);
         if (target is Constructor) {
           return new InvalidConstructorInvocationJudgment(
               error, target, arguments)
@@ -3150,6 +3217,9 @@
     if (type is Generator) {
       push(type.invokeConstructor(
           typeArguments, name, arguments, nameToken, nameLastToken, constness));
+    } else if (type is ParserRecovery) {
+      push(new ParserErrorGenerator(
+          this, nameToken, fasta.messageSyntheticToken));
     } else {
       push(new SyntheticExpressionJudgment(throwNoSuchMethodError(
           forest.literalNull(null)..fileOffset = offset,
@@ -3892,11 +3962,7 @@
           labelToken.charOffset,
           length: labelToken.length));
     } else if (target.functionNestingLevel != functionNestingLevel) {
-      Token labelToken = breakKeyword.next;
-      push(problemInLoopOrSwitch = buildProblemStatement(
-          fasta.templateBreakTargetOutsideFunction.withArguments(name),
-          labelToken.charOffset,
-          length: labelToken.length));
+      push(buildProblemTargetOutsideLocalFunction(name, breakKeyword));
     } else {
       Statement statement =
           forest.breakStatement(breakKeyword, identifier, endToken);
@@ -3905,6 +3971,27 @@
     }
   }
 
+  Statement buildProblemTargetOutsideLocalFunction(String name, Token keyword) {
+    Statement problem;
+    bool isBreak = optional("break", keyword);
+    if (name != null) {
+      Template<Message Function(String)> template = isBreak
+          ? fasta.templateBreakTargetOutsideFunction
+          : fasta.templateContinueTargetOutsideFunction;
+      problem = buildProblemStatement(
+          template.withArguments(name), offsetForToken(keyword),
+          length: lengthOfSpan(keyword, keyword.next));
+    } else {
+      Message message = isBreak
+          ? fasta.messageAnonymousBreakTargetOutsideFunction
+          : fasta.messageAnonymousContinueTargetOutsideFunction;
+      problem = buildProblemStatement(message, offsetForToken(keyword),
+          length: lengthForToken(keyword));
+    }
+    problemInLoopOrSwitch ??= problem;
+    return problem;
+  }
+
   @override
   void handleContinueStatement(
       bool hasTarget, Token continueKeyword, Token endToken) {
@@ -3954,11 +4041,7 @@
           labelToken.charOffset,
           length: labelToken.length));
     } else if (target.functionNestingLevel != functionNestingLevel) {
-      Token labelToken = continueKeyword.next;
-      push(problemInLoopOrSwitch = buildProblemStatement(
-          fasta.templateContinueTargetOutsideFunction.withArguments(name),
-          labelToken.charOffset,
-          length: labelToken.length));
+      push(buildProblemTargetOutsideLocalFunction(name, continueKeyword));
     } else {
       Statement statement =
           forest.continueStatement(continueKeyword, identifier, endToken);
@@ -4067,11 +4150,15 @@
   @override
   SyntheticExpressionJudgment buildProblem(
       Message message, int charOffset, int length,
-      {List<LocatedMessage> context}) {
-    addProblem(message, charOffset, length, wasHandled: true, context: context);
-    return new SyntheticExpressionJudgment(library.loader
-        .throwCompileConstantError(
-            library.loader.buildProblem(message, charOffset, length, uri)));
+      {List<LocatedMessage> context, bool suppressMessage: false}) {
+    if (!suppressMessage) {
+      addProblem(message, charOffset, length,
+          wasHandled: true, context: context);
+    }
+    String text = library.loader.target.context
+        .format(message.withLocation(uri, charOffset, length), Severity.error);
+    return new SyntheticExpressionJudgment(
+        new InvalidExpression(text)..fileOffset = charOffset);
   }
 
   @override
@@ -4144,10 +4231,11 @@
   }
 
   Statement buildProblemStatement(Message message, int charOffset,
-      {List<LocatedMessage> context, int length}) {
+      {List<LocatedMessage> context, int length, bool suppressMessage: false}) {
     length ??= noLength;
-    return new ExpressionStatementJudgment(
-        buildProblem(message, charOffset, length, context: context));
+    return new ExpressionStatementJudgment(buildProblem(
+        message, charOffset, length,
+        context: context, suppressMessage: suppressMessage));
   }
 
   Statement wrapInProblemStatement(Statement statement, Message message) {
@@ -4554,6 +4642,22 @@
     }
     return types;
   }
+
+  @override
+  String constructorNameForDiagnostics(String name,
+      {String className, bool isSuper: false}) {
+    if (className == null) {
+      Class cls = classBuilder.cls;
+      if (isSuper) {
+        cls = cls.superclass;
+        while (cls.isMixinApplication) {
+          cls = cls.superclass;
+        }
+      }
+      className = cls.name;
+    }
+    return name.isEmpty ? className : "$className.$name";
+  }
 }
 
 class Operator {
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 ba11d9f..c7c2b56 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -19,14 +19,13 @@
         messageIllegalAssignmentToNonAssignable,
         messageInvalidInitializer,
         messageNotAConstantExpression,
+        noLength,
         templateCantUseDeferredPrefixAsConstant,
         templateDeferredTypeAnnotation,
-        templateIntegerLiteralIsOutOfRange,
         templateMissingExplicitTypeArguments,
         templateNotAPrefixInTypeAnnotation,
         templateNotAType,
-        templateUnresolvedPrefixInTypeAnnotation,
-        templateWebLiteralCannotBeRepresentedExactly;
+        templateUnresolvedPrefixInTypeAnnotation;
 
 import '../names.dart'
     show
@@ -127,7 +126,8 @@
       {int offset,
       bool voidContext,
       Procedure interfaceTarget,
-      bool isPreIncDec});
+      bool isPreIncDec,
+      bool isPostIncDec});
 
   /// Returns a [Expression] representing a pre-increment or pre-decrement of
   /// the generator.
@@ -245,7 +245,8 @@
     return new InvalidConstructorInvocationJudgment(
         helper.throwNoSuchMethodError(
             forest.literalNull(token),
-            name == "" ? plainNameForRead : "${plainNameForRead}.$name",
+            helper.constructorNameForDiagnostics(name,
+                className: plainNameForRead),
             arguments,
             nameToken.charOffset),
         null,
@@ -664,96 +665,6 @@
   String get debugName => "ReadOnlyAccessGenerator";
 }
 
-abstract class IntAccessGenerator implements Generator {
-  factory IntAccessGenerator(ExpressionGeneratorHelper helper, Token token) {
-    return helper.forest.intAccessGenerator(helper, token);
-  }
-
-  // TODO(ahe): This should probably be calling unhandled.
-  @override
-  String get plainNameForRead => null;
-
-  @override
-  String get debugName => "IntAccessGenerator";
-
-  static void checkWebIntLiteralsErrorIfUnexact(
-      ExpressionGeneratorHelper helper, int value, Token token) {
-    if (value >= 0 && value <= (1 << 53)) return;
-    if (!helper.library.loader.target.backendTarget
-        .errorOnUnexactWebIntLiterals) return;
-    BigInt asInt = new BigInt.from(value).toUnsigned(64);
-    BigInt asDouble = new BigInt.from(asInt.toDouble());
-    if (asInt != asDouble) {
-      String nearest;
-      if (token.lexeme.startsWith("0x") || token.lexeme.startsWith("0X")) {
-        nearest = '0x${asDouble.toRadixString(16)}';
-      } else {
-        nearest = '$asDouble';
-      }
-      helper.addProblem(
-          templateWebLiteralCannotBeRepresentedExactly.withArguments(
-              token.lexeme, nearest),
-          token.charOffset,
-          token.charCount);
-    }
-  }
-
-  static Object parseIntLiteral(ExpressionGeneratorHelper helper, Token token) {
-    int value = int.tryParse(token.lexeme);
-    // Postpone parsing of literals resulting in a negative value
-    // (hex literals >= 2^63). These are only allowed when not negated.
-    if (value == null || value < 0) {
-      return new IntAccessGenerator(helper, token);
-    } else {
-      checkWebIntLiteralsErrorIfUnexact(helper, value, token);
-      return helper.forest.literalInt(value, token);
-    }
-  }
-
-  Expression parseOrError(String literal, Token token) {
-    int value = int.tryParse(literal);
-    if (value != null) {
-      checkWebIntLiteralsErrorIfUnexact(helper, value, token);
-      return helper.forest.literalInt(value, token);
-    } else {
-      return buildError();
-    }
-  }
-
-  @override
-  Expression buildSimpleRead() {
-    // Called when literal that previously failed to parse, or resulted in
-    // a negative value (hex literals >= 2^63), is not negated.
-    // Try parsing again, this time accepting negative values.
-    return parseOrError(token.lexeme, token);
-  }
-
-  Expression buildNegatedRead() {
-    // Called when literal that previously failed to parse, or resulted in
-    // a negative value (hex literals >= 2^63), is negated.
-    // Try parsing with a '-' in front.
-    return parseOrError("-" + token.lexeme, token);
-  }
-
-  SyntheticExpressionJudgment buildError() {
-    return helper.buildProblem(
-        templateIntegerLiteralIsOutOfRange.withArguments(token),
-        offsetForToken(token),
-        lengthForToken(token));
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return buildError();
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", lexeme: ");
-    sink.write(token.lexeme);
-  }
-}
-
 abstract class ErroneousExpressionGenerator implements Generator {
   /// Pass [arguments] that must be evaluated before throwing an error.  At
   /// most one of [isGetter] and [isSetter] should be true and they're passed
@@ -870,6 +781,9 @@
 abstract class UnresolvedNameGenerator implements ErroneousExpressionGenerator {
   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);
   }
 
@@ -1253,3 +1167,97 @@
     prefixGenerator.printOn(sink);
   }
 }
+
+abstract class ParserErrorGenerator implements Generator {
+  factory ParserErrorGenerator(
+      ExpressionGeneratorHelper helper, Token token, Message message) {
+    return helper.forest.parserErrorGenerator(helper, token, message);
+  }
+
+  Message get message => null;
+
+  @override
+  String get plainNameForRead => "#parser-error";
+
+  @override
+  String get debugName => "ParserErrorGenerator";
+
+  @override
+  void printOn(StringSink sink) {}
+
+  SyntheticExpressionJudgment buildProblem() {
+    return helper.buildProblem(message, offsetForToken(token), noLength,
+        suppressMessage: true);
+  }
+
+  Expression buildSimpleRead() => buildProblem();
+
+  Expression buildAssignment(Expression value, {bool voidContext}) {
+    return buildProblem();
+  }
+
+  Expression buildNullAwareAssignment(
+      Expression value, DartType type, int offset,
+      {bool voidContext}) {
+    return buildProblem();
+  }
+
+  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
+      {int offset,
+      bool voidContext,
+      Procedure interfaceTarget,
+      bool isPreIncDec,
+      bool isPostIncDec}) {
+    return buildProblem();
+  }
+
+  Expression buildPrefixIncrement(Name binaryOperator,
+      {int offset, bool voidContext, Procedure interfaceTarget}) {
+    return buildProblem();
+  }
+
+  Expression buildPostfixIncrement(Name binaryOperator,
+      {int offset, bool voidContext, Procedure interfaceTarget}) {
+    return buildProblem();
+  }
+
+  Expression makeInvalidRead() => buildProblem();
+
+  Expression makeInvalidWrite(Expression value) => buildProblem();
+
+  Initializer buildFieldInitializer(Map<String, int> initializedFields) {
+    return helper.buildInvalidInitializer(buildProblem().desugared);
+  }
+
+  Expression doInvocation(int offset, Arguments arguments) {
+    return buildProblem();
+  }
+
+  Expression buildPropertyAccess(
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
+    return buildProblem();
+  }
+
+  KernelTypeBuilder buildTypeWithResolvedArguments(
+      List<UnresolvedType<KernelTypeBuilder>> arguments) {
+    KernelNamedTypeBuilder result =
+        new KernelNamedTypeBuilder(token.lexeme, null);
+    result.bind(result.buildInvalidType(
+        message.withLocation(uri, offsetForToken(token), noLength)));
+    return result;
+  }
+
+  Expression qualifiedLookup(Token name) {
+    return buildProblem();
+  }
+
+  Expression invokeConstructor(
+      List<UnresolvedType<KernelTypeBuilder>> typeArguments,
+      String name,
+      Arguments arguments,
+      Token nameToken,
+      Token nameLastToken,
+      Constness constness) {
+    return buildProblem();
+  }
+}
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 6629dba..ea26ede 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
@@ -94,7 +94,7 @@
       bool isGetter,
       bool isSetter,
       bool isStatic,
-      LocatedMessage argMessage});
+      LocatedMessage message});
 
   LocatedMessage checkArgumentsForFunction(FunctionNode function,
       Arguments arguments, int offset, List<TypeParameter> typeParameters);
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index f0f16e5..a4e9c2f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -44,9 +44,9 @@
         KernelDelayedAssignment,
         KernelDelayedPostfixIncrement,
         KernelIndexedAccessGenerator,
-        KernelIntAccessGenerator,
         KernelLoadLibraryGenerator,
         KernelNullAwarePropertyAccessGenerator,
+        KernelParserErrorGenerator,
         KernelPrefixUseGenerator,
         KernelPropertyAccessGenerator,
         KernelReadOnlyAccessGenerator,
@@ -94,6 +94,7 @@
         NullJudgment,
         RethrowJudgment,
         ReturnJudgment,
+        ShadowLargeIntLiteral,
         StringConcatenationJudgment,
         StringLiteralJudgment,
         SymbolLiteralJudgment,
@@ -112,6 +113,7 @@
         Forest,
         Generator,
         LoadLibraryBuilder,
+        Message,
         PrefixBuilder,
         PrefixUseGenerator,
         TypeDeclarationBuilder,
@@ -168,7 +170,13 @@
 
   @override
   IntJudgment literalInt(int value, Token token) {
-    return new IntJudgment(value)..fileOffset = offsetForToken(token);
+    return new IntJudgment(value, token?.lexeme)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  ShadowLargeIntLiteral literalLargeInt(String literal, Token token) {
+    return new ShadowLargeIntLiteral(literal, offsetForToken(token));
   }
 
   @override
@@ -697,12 +705,6 @@
   }
 
   @override
-  KernelIntAccessGenerator intAccessGenerator(
-      ExpressionGeneratorHelper helper, Token token) {
-    return new KernelIntAccessGenerator(helper, token);
-  }
-
-  @override
   KernelUnresolvedNameGenerator unresolvedNameGenerator(
       ExpressionGeneratorHelper helper, Token token, Name name) {
     return new KernelUnresolvedNameGenerator(helper, token, name);
@@ -751,6 +753,12 @@
     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 ffb30fa..e51a8e6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -36,8 +36,12 @@
         TypeDeclarationBuilder,
         UnlinkedDeclaration;
 
+import '../fasta_codes.dart' show Message;
+
 import '../scanner.dart' show Token;
 
+export '../fasta_codes.dart' show Message;
+
 export 'body_builder.dart' show Operator;
 
 export 'constness.dart' show Constness;
@@ -85,6 +89,8 @@
   /// literal has the given [value].
   Expression literalInt(int value, Token location);
 
+  Expression literalLargeInt(String literal, Token location);
+
   /// Return a representation of a list literal. The [constKeyword] is the
   /// location of the `const` keyword, or `null` if there is no keyword. The
   /// [isConst] is `true` if the literal is either explicitly or implicitly a
@@ -386,9 +392,6 @@
   Generator readOnlyAccessGenerator(ExpressionGeneratorHelper helper,
       Token location, Expression expression, String plainNameForRead);
 
-  Generator intAccessGenerator(
-      ExpressionGeneratorHelper helper, Token location);
-
   Generator unresolvedNameGenerator(
       ExpressionGeneratorHelper helper, Token location, Name name);
 
@@ -411,6 +414,9 @@
   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/kernel_ast_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
index d794aa9..a7e9319 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
@@ -12,8 +12,8 @@
         AssertStatement,
         AsyncMarker,
         Block,
-        BreakStatement,
         BottomType,
+        BreakStatement,
         Catch,
         CheckLibraryIsLoaded,
         Class,
@@ -31,6 +31,7 @@
         FunctionType,
         Initializer,
         InterfaceType,
+        InvalidExpression,
         InvalidType,
         LabeledStatement,
         Let,
@@ -62,9 +63,9 @@
         SwitchCase,
         Throw,
         TreeNode,
-        Typedef,
         TypeParameter,
         TypeParameterType,
+        Typedef,
         VariableDeclaration,
         VariableGet,
         VariableSet,
@@ -112,6 +113,7 @@
         RedirectingInitializerJudgment,
         RethrowJudgment,
         ReturnJudgment,
+        ShadowLargeIntLiteral,
         StaticAssignmentJudgment,
         StaticGetJudgment,
         StaticInvocationJudgment,
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
index 3ad8c9c..35adb8a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -60,8 +60,11 @@
         templateFactoryRedirecteeInvalidReturnType,
         templateImplementsRepeated,
         templateImplementsSuperClass,
+        templateImplicitMixinOverrideContext,
+        templateInterfaceCheckContext,
         templateMissingImplementationCause,
         templateMissingImplementationNotAbstract,
+        templateNamedMixinOverrideContext,
         templateOverriddenMethodCause,
         templateOverrideFewerNamedArguments,
         templateOverrideFewerPositionalArguments,
@@ -362,84 +365,100 @@
         .add(new StaticGet(constructor.target)..parent = literal);
   }
 
-  void checkOverrides(
-      ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {
-    handleSeenCovariant(
-        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 = hierarchy.getInterfaceMember(
-            supertype.classNode, interfaceMember.name,
-            setter: isSetter);
-        if (m != null) {
-          callback(declaredMember, m, isSetter);
+  void handleSeenCovariant(
+      ClassHierarchy hierarchy,
+      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 = hierarchy.getInterfaceMember(
+          supertype.classNode, interfaceMember.name,
+          setter: isSetter);
+      if (m != null) {
+        callback(declaredMember, m, isSetter);
+      }
+    }
+  }
+
+  void checkOverride(
+      ClassHierarchy hierarchy,
+      TypeEnvironment typeEnvironment,
+      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(hierarchy, typeEnvironment,
+            declaredMember, interfaceMember, isInterfaceCheck);
+        if (seenCovariant) {
+          handleSeenCovariant(
+              hierarchy, declaredMember, interfaceMember, isSetter, callback);
+        }
+      }
+      if (declaredMember.kind == ProcedureKind.Getter &&
+          interfaceMember.kind == ProcedureKind.Getter) {
+        checkGetterOverride(hierarchy, typeEnvironment, declaredMember,
+            interfaceMember, isInterfaceCheck);
+      }
+      if (declaredMember.kind == ProcedureKind.Setter &&
+          interfaceMember.kind == ProcedureKind.Setter) {
+        bool seenCovariant = checkSetterOverride(hierarchy, typeEnvironment,
+            declaredMember, interfaceMember, isInterfaceCheck);
+        if (seenCovariant) {
+          handleSeenCovariant(
+              hierarchy, 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 is Procedure && declaredMember.isSetter;
+      bool interfaceMemberHasSetter = interfaceMember is Field ||
+          interfaceMember is Procedure && interfaceMember.isSetter;
+      if (declaredMemberHasGetter && interfaceMemberHasGetter) {
+        checkGetterOverride(hierarchy, typeEnvironment, declaredMember,
+            interfaceMember, isInterfaceCheck);
+      } else if (declaredMemberHasSetter && interfaceMemberHasSetter) {
+        bool seenCovariant = checkSetterOverride(hierarchy, typeEnvironment,
+            declaredMember, interfaceMember, isInterfaceCheck);
+        if (seenCovariant) {
+          handleSeenCovariant(
+              hierarchy, declaredMember, interfaceMember, isSetter, callback);
         }
       }
     }
+    // TODO(ahe): Handle other cases: accessors, operators, and fields.
+  }
 
-    overridePairCallback(
+  void checkOverrides(
+      ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {
+    void overridePairCallback(
         Member declaredMember, Member interfaceMember, bool isSetter) {
-      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(
-              hierarchy, typeEnvironment, declaredMember, interfaceMember);
-          if (seenCovariant) {
-            handleSeenCovariant(declaredMember, interfaceMember, isSetter,
-                overridePairCallback);
-          }
-        }
-        if (declaredMember.kind == ProcedureKind.Getter &&
-            interfaceMember.kind == ProcedureKind.Getter) {
-          checkGetterOverride(
-              hierarchy, typeEnvironment, declaredMember, interfaceMember);
-        }
-        if (declaredMember.kind == ProcedureKind.Setter &&
-            interfaceMember.kind == ProcedureKind.Setter) {
-          bool seenCovariant = checkSetterOverride(
-              hierarchy, typeEnvironment, declaredMember, interfaceMember);
-          if (seenCovariant) {
-            handleSeenCovariant(declaredMember, interfaceMember, isSetter,
-                overridePairCallback);
-          }
-        }
-      } 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 is Procedure && declaredMember.isSetter;
-        bool interfaceMemberHasSetter = interfaceMember is Field ||
-            interfaceMember is Procedure && interfaceMember.isSetter;
-        if (declaredMemberHasGetter && interfaceMemberHasGetter) {
-          checkGetterOverride(
-              hierarchy, typeEnvironment, declaredMember, interfaceMember);
-        } else if (declaredMemberHasSetter && interfaceMemberHasSetter) {
-          bool seenCovariant = checkSetterOverride(
-              hierarchy, typeEnvironment, declaredMember, interfaceMember);
-          if (seenCovariant) {
-            handleSeenCovariant(declaredMember, interfaceMember, isSetter,
-                overridePairCallback);
-          }
-        }
-      }
-      // TODO(ahe): Handle other cases: accessors, operators, and fields.
+      checkOverride(hierarchy, typeEnvironment, declaredMember, interfaceMember,
+          isSetter, overridePairCallback);
     }
 
     hierarchy.forEachOverridePair(cls, overridePairCallback);
   }
 
-  void checkAbstractMembers(CoreTypes coreTypes, ClassHierarchy hierarchy) {
+  void checkAbstractMembers(CoreTypes coreTypes, ClassHierarchy hierarchy,
+      TypeEnvironment typeEnvironment) {
     if (isAbstract) {
       // Unimplemented members allowed
       return;
@@ -458,57 +477,11 @@
       return true;
     }
 
-    bool isValidImplementation(Member interfaceMember, Member dispatchTarget,
-        {bool setters}) {
-      // If they're the exact same it's valid.
-      if (interfaceMember == dispatchTarget) return true;
-
-      if (interfaceMember is Procedure && dispatchTarget is Procedure) {
-        // E.g. getter vs method.
-        if (interfaceMember.kind != dispatchTarget.kind) return false;
-
-        if (dispatchTarget.function.positionalParameters.length <
-                interfaceMember.function.requiredParameterCount ||
-            dispatchTarget.function.positionalParameters.length <
-                interfaceMember.function.positionalParameters.length)
-          return false;
-
-        if (interfaceMember.function.requiredParameterCount <
-            dispatchTarget.function.requiredParameterCount) return false;
-
-        if (dispatchTarget.function.namedParameters.length <
-            interfaceMember.function.namedParameters.length) return false;
-
-        // Two Procedures of the same kind with the same number of parameters.
-        return true;
-      }
-
-      if ((interfaceMember is Field || interfaceMember is Procedure) &&
-          (dispatchTarget is Field || dispatchTarget is Procedure)) {
-        if (setters) {
-          bool interfaceMemberHasSetter =
-              (interfaceMember is Field && interfaceMember.hasSetter) ||
-                  interfaceMember is Procedure && interfaceMember.isSetter;
-          bool dispatchTargetHasSetter =
-              (dispatchTarget is Field && dispatchTarget.hasSetter) ||
-                  dispatchTarget is Procedure && dispatchTarget.isSetter;
-          // Combination of (settable) field and/or (procedure) setter is valid.
-          return interfaceMemberHasSetter && dispatchTargetHasSetter;
-        } else {
-          bool interfaceMemberHasGetter = interfaceMember is Field ||
-              interfaceMember is Procedure && interfaceMember.isGetter;
-          bool dispatchTargetHasGetter = dispatchTarget is Field ||
-              dispatchTarget is Procedure && dispatchTarget.isGetter;
-          // Combination of field and/or (procedure) getter is valid.
-          return interfaceMemberHasGetter && dispatchTargetHasGetter;
-        }
-      }
-
-      return unhandled(
-          "${interfaceMember.runtimeType} and ${dispatchTarget.runtimeType}",
-          "isValidImplementation",
-          interfaceMember.fileOffset,
-          interfaceMember.fileUri);
+    void overridePairCallback(
+        Member declaredMember, Member interfaceMember, bool isSetter) {
+      checkOverride(hierarchy, typeEnvironment, declaredMember, interfaceMember,
+          isSetter, overridePairCallback,
+          isInterfaceCheck: true);
     }
 
     bool hasNoSuchMethod =
@@ -532,13 +505,25 @@
               ClassHierarchy.compareMembers(
                       dispatchTargets[targetIndex], interfaceMember) <=
                   0;
-          bool hasProblem = true;
-          if (foundTarget &&
-              isValidImplementation(
-                  interfaceMember, dispatchTargets[targetIndex],
-                  setters: setters)) hasProblem = false;
-          if (hasNoSuchMethod && !foundTarget) hasProblem = false;
-          if (hasProblem) {
+          if (foundTarget) {
+            Member dispatchTarget = dispatchTargets[targetIndex];
+            while (dispatchTarget is Procedure &&
+                !dispatchTarget.isExternal &&
+                dispatchTarget.forwardingStubSuperTarget != null) {
+              dispatchTarget =
+                  (dispatchTarget as Procedure).forwardingStubSuperTarget;
+            }
+            while (interfaceMember is Procedure &&
+                !interfaceMember.isExternal &&
+                interfaceMember.forwardingStubInterfaceTarget != null) {
+              interfaceMember =
+                  (interfaceMember as Procedure).forwardingStubInterfaceTarget;
+            }
+            if (!hierarchy.isSubtypeOf(dispatchTarget.enclosingClass,
+                interfaceMember.enclosingClass)) {
+              overridePairCallback(dispatchTarget, interfaceMember, setters);
+            }
+          } else if (!hasNoSuchMethod) {
             Name name = interfaceMember.name;
             String displayName = name.name + (setters ? "=" : "");
             if (interfaceMember is Procedure &&
@@ -783,27 +768,31 @@
       Member declaredMember,
       Member interfaceMember,
       FunctionNode declaredFunction,
-      FunctionNode interfaceFunction) {
-    Substitution interfaceSubstitution;
+      FunctionNode interfaceFunction,
+      bool isInterfaceCheck) {
+    Substitution interfaceSubstitution = Substitution.empty;
     if (interfaceMember.enclosingClass.typeParameters.isNotEmpty) {
       interfaceSubstitution = Substitution.fromSupertype(
           hierarchy.getClassAsInstanceOf(cls, interfaceMember.enclosingClass));
     }
     if (declaredFunction?.typeParameters?.length !=
         interfaceFunction?.typeParameters?.length) {
-      addProblem(
+      library.addProblem(
           templateOverrideTypeVariablesMismatch.withArguments(
-              "$name::${declaredMember.name.name}",
+              "${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)
-          ]);
+                templateOverriddenMethodCause
+                    .withArguments(interfaceMember.name.name)
+                    .withLocation(_getMemberUri(interfaceMember),
+                        interfaceMember.fileOffset, noLength)
+              ] +
+              inheritedContext(isInterfaceCheck, declaredMember));
     } else if (library.loader.target.backendTarget.strongMode &&
         declaredFunction?.typeParameters != null) {
       Map<TypeParameter, DartType> substitutionMap =
@@ -825,44 +814,61 @@
                 interfaceSubstitution.substituteType(interfaceBound);
           }
           if (declaredBound != substitution.substituteType(interfaceBound)) {
-            addProblem(
+            library.addProblem(
                 templateOverrideTypeVariablesMismatch.withArguments(
-                    "$name::${declaredMember.name.name}",
+                    "${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)
-                ]);
+                      templateOverriddenMethodCause
+                          .withArguments(interfaceMember.name.name)
+                          .withLocation(_getMemberUri(interfaceMember),
+                              interfaceMember.fileOffset, noLength)
+                    ] +
+                    inheritedContext(isInterfaceCheck, declaredMember));
           }
         }
       }
-      interfaceSubstitution = interfaceSubstitution == null
-          ? substitution
-          : Substitution.combine(interfaceSubstitution, substitution);
+      interfaceSubstitution =
+          Substitution.combine(interfaceSubstitution, substitution);
     }
     return interfaceSubstitution;
   }
 
+  Substitution _computeDeclaredSubstitution(
+      ClassHierarchy hierarchy, Member declaredMember) {
+    Substitution declaredSubstitution = Substitution.empty;
+    if (declaredMember.enclosingClass.typeParameters.isNotEmpty) {
+      declaredSubstitution = Substitution.fromSupertype(
+          hierarchy.getClassAsInstanceOf(cls, declaredMember.enclosingClass));
+    }
+    return declaredSubstitution;
+  }
+
   bool _checkTypes(
       TypeEnvironment typeEnvironment,
       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.strongMode) return false;
 
     if (interfaceSubstitution != null) {
       interfaceType = interfaceSubstitution.substituteType(interfaceType);
     }
+    if (declaredSubstitution != null) {
+      declaredType = declaredSubstitution.substituteType(declaredType);
+    }
 
     bool inParameter = declaredParameter != null || asIfDeclaredParameter;
     DartType subtype = inParameter ? interfaceType : declaredType;
@@ -877,7 +883,8 @@
       // Report an error.
       // TODO(ahe): The double-colon notation shouldn't be used in error
       // messages.
-      String declaredMemberName = '$name::${declaredMember.name.name}';
+      String declaredMemberName =
+          '${declaredMember.enclosingClass.name}::${declaredMember.name.name}';
       Message message;
       int fileOffset;
       if (declaredParameter == null) {
@@ -892,12 +899,14 @@
             interfaceType);
         fileOffset = declaredParameter.fileOffset;
       }
-      library.addProblem(message, fileOffset, noLength, fileUri, context: [
-        templateOverriddenMethodCause
-            .withArguments(interfaceMember.name.name)
-            .withLocation(_getMemberUri(interfaceMember),
-                interfaceMember.fileOffset, noLength)
-      ]);
+      library.addProblem(message, fileOffset, noLength, declaredMember.fileUri,
+          context: [
+                templateOverriddenMethodCause
+                    .withArguments(interfaceMember.name.name)
+                    .withLocation(_getMemberUri(interfaceMember),
+                        interfaceMember.fileOffset, noLength)
+              ] +
+              inheritedContext(isInterfaceCheck, declaredMember));
       return true;
     }
     return false;
@@ -909,12 +918,8 @@
       ClassHierarchy hierarchy,
       TypeEnvironment typeEnvironment,
       Procedure declaredMember,
-      Procedure interfaceMember) {
-    if (declaredMember.enclosingClass != cls) {
-      // TODO(ahe): Include these checks as well, but the message needs to
-      // explain that [declaredMember] is inherited.
-      return false;
-    }
+      Procedure interfaceMember,
+      bool isInterfaceCheck) {
     assert(declaredMember.kind == ProcedureKind.Method);
     assert(interfaceMember.kind == ProcedureKind.Method);
     bool seenCovariant = false;
@@ -926,65 +931,78 @@
         declaredMember,
         interfaceMember,
         declaredFunction,
-        interfaceFunction);
+        interfaceFunction,
+        isInterfaceCheck);
+
+    Substitution declaredSubstitution =
+        _computeDeclaredSubstitution(hierarchy, declaredMember);
 
     _checkTypes(
         typeEnvironment,
         interfaceSubstitution,
+        declaredSubstitution,
         declaredMember,
         interfaceMember,
         declaredFunction.returnType,
         interfaceFunction.returnType,
         false,
-        null);
+        null,
+        isInterfaceCheck);
     if (declaredFunction.positionalParameters.length <
-            interfaceFunction.requiredParameterCount ||
-        declaredFunction.positionalParameters.length <
-            interfaceFunction.positionalParameters.length) {
-      addProblem(
+        interfaceFunction.positionalParameters.length) {
+      library.addProblem(
           templateOverrideFewerPositionalArguments.withArguments(
-              "$name::${declaredMember.name.name}",
+              "${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)
-          ]);
+                templateOverriddenMethodCause
+                    .withArguments(interfaceMember.name.name)
+                    .withLocation(interfaceMember.fileUri,
+                        interfaceMember.fileOffset, noLength)
+              ] +
+              inheritedContext(isInterfaceCheck, declaredMember));
     }
     if (interfaceFunction.requiredParameterCount <
         declaredFunction.requiredParameterCount) {
-      addProblem(
+      library.addProblem(
           templateOverrideMoreRequiredArguments.withArguments(
-              "$name::${declaredMember.name.name}",
+              "${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)
-          ]);
+                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(
           typeEnvironment,
           interfaceSubstitution,
+          declaredSubstitution,
           declaredMember,
           interfaceMember,
           declaredParameter.type,
           interfaceFunction.positionalParameters[i].type,
-          declaredParameter.isCovariant,
-          declaredParameter);
+          declaredParameter.isCovariant || interfaceParameter.isCovariant,
+          declaredParameter,
+          isInterfaceCheck);
       if (declaredParameter.isCovariant) seenCovariant = true;
     }
     if (declaredFunction.namedParameters.isEmpty &&
@@ -993,19 +1011,22 @@
     }
     if (declaredFunction.namedParameters.length <
         interfaceFunction.namedParameters.length) {
-      addProblem(
+      library.addProblem(
           templateOverrideFewerNamedArguments.withArguments(
-              "$name::${declaredMember.name.name}",
+              "${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)
-          ]);
+                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);
@@ -1027,20 +1048,23 @@
       while (declaredNamedParameters.current.name !=
           interfaceNamedParameters.current.name) {
         if (!declaredNamedParameters.moveNext()) {
-          addProblem(
+          library.addProblem(
               templateOverrideMismatchNamedParameter.withArguments(
-                  "$name::${declaredMember.name.name}",
+                  "${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)
-              ]);
+                    templateOverriddenMethodCause
+                        .withArguments(interfaceMember.name.name)
+                        .withLocation(interfaceMember.fileUri,
+                            interfaceMember.fileOffset, noLength)
+                  ] +
+                  inheritedContext(isInterfaceCheck, declaredMember));
           break outer;
         }
       }
@@ -1048,12 +1072,14 @@
       _checkTypes(
           typeEnvironment,
           interfaceSubstitution,
+          declaredSubstitution,
           declaredMember,
           interfaceMember,
           declaredParameter.type,
           interfaceNamedParameters.current.type,
           declaredParameter.isCovariant,
-          declaredParameter);
+          declaredParameter,
+          isInterfaceCheck);
       if (declaredParameter.isCovariant) seenCovariant = true;
     }
     return seenCovariant;
@@ -1063,18 +1089,30 @@
       ClassHierarchy hierarchy,
       TypeEnvironment typeEnvironment,
       Member declaredMember,
-      Member interfaceMember) {
-    if (declaredMember.enclosingClass != cls) {
-      // TODO(paulberry): Include these checks as well, but the message needs to
-      // explain that [declaredMember] is inherited.
-      return;
-    }
+      Member interfaceMember,
+      bool isInterfaceCheck) {
     Substitution interfaceSubstitution = _computeInterfaceSubstitution(
-        hierarchy, declaredMember, interfaceMember, null, null);
+        hierarchy,
+        declaredMember,
+        interfaceMember,
+        null,
+        null,
+        isInterfaceCheck);
+    Substitution declaredSubstitution =
+        _computeDeclaredSubstitution(hierarchy, declaredMember);
     var declaredType = declaredMember.getterType;
     var interfaceType = interfaceMember.getterType;
-    _checkTypes(typeEnvironment, interfaceSubstitution, declaredMember,
-        interfaceMember, declaredType, interfaceType, false, null);
+    _checkTypes(
+        typeEnvironment,
+        interfaceSubstitution,
+        declaredSubstitution,
+        declaredMember,
+        interfaceMember,
+        declaredType,
+        interfaceType,
+        false,
+        null,
+        isInterfaceCheck);
   }
 
   /// Returns whether a covariant parameter was seen and more methods thus have
@@ -1083,14 +1121,17 @@
       ClassHierarchy hierarchy,
       TypeEnvironment typeEnvironment,
       Member declaredMember,
-      Member interfaceMember) {
-    if (declaredMember.enclosingClass != cls) {
-      // TODO(paulberry): Include these checks as well, but the message needs to
-      // explain that [declaredMember] is inherited.
-      return false;
-    }
+      Member interfaceMember,
+      bool isInterfaceCheck) {
     Substitution interfaceSubstitution = _computeInterfaceSubstitution(
-        hierarchy, declaredMember, interfaceMember, null, null);
+        hierarchy,
+        declaredMember,
+        interfaceMember,
+        null,
+        null,
+        isInterfaceCheck);
+    Substitution declaredSubstitution =
+        _computeDeclaredSubstitution(hierarchy, declaredMember);
     var declaredType = declaredMember.setterType;
     var interfaceType = interfaceMember.setterType;
     var declaredParameter =
@@ -1100,16 +1141,54 @@
     _checkTypes(
         typeEnvironment,
         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
         ? "${supertype.fullNameForErrors} with ${mixedInType.fullNameForErrors}"
@@ -1190,20 +1269,15 @@
   }
 
   // Computes the function type of a given redirection target. Returns [null] if
-  // the type of actual target could not be computed.
+  // the type of the target could not be computed.
   FunctionType computeRedirecteeType(KernelRedirectingFactoryBuilder factory,
       TypeEnvironment typeEnvironment) {
     ConstructorReferenceBuilder redirectionTarget = factory.redirectionTarget;
     FunctionNode target;
-    bool isConstructor = false;
-    Class targetClass; // Used when the redirection target is a constructor.
+    if (redirectionTarget.target == null) return null;
     if (redirectionTarget.target is KernelFunctionBuilder) {
       KernelFunctionBuilder targetBuilder = redirectionTarget.target;
       target = targetBuilder.function;
-      isConstructor = targetBuilder.isConstructor;
-      if (isConstructor) {
-        targetClass = targetBuilder.parent.target;
-      }
     } else if (redirectionTarget.target is DillMemberBuilder &&
         (redirectionTarget.target.isConstructor ||
             redirectionTarget.target.isFactory)) {
@@ -1218,12 +1292,9 @@
       //   class B implements A {}
       //
       target = targetBuilder.member.function;
-      isConstructor = targetBuilder.isConstructor;
-      if (isConstructor) {
-        targetClass = targetBuilder.member.enclosingClass;
-      }
     } else {
-      return null;
+      unhandled("${redirectionTarget.target}", "computeRedirecteeType",
+          charOffset, fileUri);
     }
 
     List<DartType> typeArguments =
@@ -1277,32 +1348,13 @@
       return null;
     }
 
-    FunctionType redirecteeType;
-    // If the target is a constructor then we need to patch the return type of
-    // [targetFunctionType], because constructors always have return type to be
-    // "void", whereas the return type of a factory is its enclosing
-    // class. TODO(hillerstrom): It may be worthwhile to change the typing of
-    // constructors such that the return type is its enclosing class.
-    if (isConstructor) {
-      DartType returnType =
-          new InterfaceType(targetClass, typeArguments ?? const <DartType>[]);
-
-      redirecteeType = new FunctionType(
-          targetFunctionType.positionalParameters, returnType,
-          namedParameters: targetFunctionType.namedParameters,
-          typeParameters: targetFunctionType.typeParameters,
-          requiredParameterCount: targetFunctionType.requiredParameterCount);
-    } else {
-      redirecteeType = targetFunctionType;
-    }
-
     // Substitute if necessary.
-    redirecteeType = substitution == null
-        ? redirecteeType
-        : (substitution.substituteType(redirecteeType.withoutTypeParameters)
+    targetFunctionType = substitution == null
+        ? targetFunctionType
+        : (substitution.substituteType(targetFunctionType.withoutTypeParameters)
             as FunctionType);
 
-    return hasProblem ? null : redirecteeType;
+    return hasProblem ? null : targetFunctionType;
   }
 
   String computeRedirecteeName(ConstructorReferenceBuilder redirectionTarget) {
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
index 908aa05..ba576ed 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
@@ -34,6 +34,7 @@
         messageNoUnnamedConstructorInObject,
         templateDuplicatedDeclaration,
         templateDuplicatedDeclarationCause,
+        templateDuplicatedDeclarationSyntheticCause,
         templateEnumConstantSameNameAsEnclosing;
 
 import '../modifier.dart' show constMask, finalMask, staticMask;
@@ -170,12 +171,19 @@
         EnumConstantInfo enumConstantInfo = enumConstantInfos[i];
         List<MetadataBuilder> metadata = enumConstantInfo.metadata;
         String name = enumConstantInfo.name;
-        int charOffset = enumConstantInfo.charOffset;
         String documentationComment = enumConstantInfo.documentationComment;
         MemberBuilder existing = members[name];
         if (existing != null) {
-          List<LocatedMessage> context = existing.isSynthetic
-              ? 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)
@@ -183,13 +191,13 @@
                           parent.fileUri, existing.charOffset, name.length)
                 ];
           parent.addProblem(templateDuplicatedDeclaration.withArguments(name),
-              charOffset, name.length, parent.fileUri,
+              enumConstantInfo.charOffset, name.length, parent.fileUri,
               context: context);
           enumConstantInfos[i] = null;
         } else if (name == className) {
           parent.addProblem(
               templateEnumConstantSameNameAsEnclosing.withArguments(name),
-              charOffset,
+              enumConstantInfo.charOffset,
               name.length,
               parent.fileUri);
         }
@@ -199,7 +207,7 @@
             name,
             constMask | staticMask,
             parent,
-            charOffset,
+            enumConstantInfo.charOffset,
             null,
             true);
         metadataCollector?.setDocumentationComment(
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
index b7ac953..ebcc398 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
@@ -11,17 +11,19 @@
 
 import '../fasta_codes.dart'
     show
-        Message,
         LocatedMessage,
+        Message,
+        messageCannotAssignToParenthesizedExpression,
         messageCannotAssignToSuper,
+        messageInvalidUseOfNullAwareAccess,
         messageLoadLibraryTakesNoArguments,
         messageNotAConstantExpression,
         messageNotAnLvalue,
-        messageCannotAssignToParenthesizedExpression,
-        templateNotConstantExpression,
         messageSuperAsExpression,
-        templateThisOrSuperAccessInFieldInitializer,
-        messageInvalidUseOfNullAwareAccess;
+        templateConstructorNotFound,
+        templateNotConstantExpression,
+        templateSuperclassHasNoConstructor,
+        templateThisOrSuperAccessInFieldInitializer;
 
 import '../messages.dart' show Message, noLength;
 
@@ -47,9 +49,9 @@
         ExpressionGenerator,
         Generator,
         IndexedAccessGenerator,
-        IntAccessGenerator,
         LoadLibraryGenerator,
         NullAwarePropertyAccessGenerator,
+        ParserErrorGenerator,
         PrefixUseGenerator,
         PropertyAccessGenerator,
         ReadOnlyAccessGenerator,
@@ -1395,31 +1397,6 @@
   }
 }
 
-class KernelIntAccessGenerator extends KernelGenerator with IntAccessGenerator {
-  KernelIntAccessGenerator(ExpressionGeneratorHelper helper, Token token)
-      : super(helper, token);
-
-  @override
-  Expression _makeSimpleRead() => buildError();
-
-  @override
-  Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    return buildError();
-  }
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    return buildError();
-  }
-
-  @override
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    return buildError();
-  }
-}
-
 class KernelUnresolvedNameGenerator extends KernelGenerator
     with ErroneousExpressionGenerator, UnresolvedNameGenerator {
   @override
@@ -1565,6 +1542,16 @@
       : 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);
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
index 24358ca..d38346f 100644
--- 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
@@ -115,20 +115,28 @@
   Initializer buildConstructorInitializer(
       int offset, Name name, Arguments arguments) {
     Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper);
-    LocatedMessage argMessage;
+    LocatedMessage message;
     if (constructor != null) {
-      argMessage = helper.checkArgumentsForFunction(
+      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 (constructor == null || argMessage != null) {
+    if (message != null) {
       return helper.buildInvalidInitializer(new SyntheticExpressionJudgment(
           helper.throwNoSuchMethodError(
               forest.literalNull(null)..fileOffset = offset,
-              name.name,
+              helper.constructorNameForDiagnostics(name.name, isSuper: isSuper),
               arguments,
               offset,
               isSuper: isSuper,
-              argMessage: argMessage)));
+              message: message)));
     } else if (isSuper) {
       return helper.buildSuperInitializer(
           false, constructor, arguments, offset);
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
index cae832e..c742c32 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -231,7 +231,7 @@
         modifiers,
         className,
         typeVariables,
-        applyMixins(supertype, supertypeOffset, className,
+        applyMixins(supertype, charOffset, className, isMixinDeclaration,
             typeVariables: typeVariables),
         interfaces,
         classScope,
@@ -307,8 +307,8 @@
     return typeVariablesByName;
   }
 
-  KernelTypeBuilder applyMixins(
-      KernelTypeBuilder type, int charOffset, String subclassName,
+  KernelTypeBuilder applyMixins(KernelTypeBuilder type, int charOffset,
+      String subclassName, bool isMixinDeclaration,
       {String documentationComment,
       List<MetadataBuilder> metadata,
       String name,
@@ -469,8 +469,10 @@
                 : abstractMask,
             fullname,
             applicationTypeVariables,
-            supertype,
-            isNamedMixinApplication ? interfaces : null,
+            isMixinDeclaration ? null : supertype,
+            isNamedMixinApplication
+                ? interfaces
+                : isMixinDeclaration ? [supertype, mixin] : null,
             new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{},
                 scope.withTypeVariables(typeVariables),
                 "mixin $fullname ", isModifiable: false),
@@ -481,7 +483,7 @@
             startCharOffset,
             charOffset,
             TreeNode.noOffset,
-            mixedInType: mixin);
+            mixedInType: isMixinDeclaration ? null : mixin);
         if (isNamedMixinApplication) {
           loader.target.metadataCollector?.setDocumentationComment(
               application.target, documentationComment);
@@ -512,7 +514,7 @@
     // Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`.
     endNestedDeclaration(name).resolveTypes(typeVariables, this);
     KernelNamedTypeBuilder supertype = applyMixins(
-        mixinApplication, charOffset, name,
+        mixinApplication, charOffset, name, false,
         documentationComment: documentationComment,
         metadata: metadata,
         name: name,
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
index 3b12ad17..aa98c01 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -16,6 +16,7 @@
         Expression,
         FunctionNode,
         Initializer,
+        InterfaceType,
         Member,
         Name,
         Procedure,
@@ -481,8 +482,18 @@
   }
 
   FunctionNode buildFunction(LibraryBuilder library) {
-    // TODO(ahe): Should complain if another type is explicitly set.
-    return super.buildFunction(library)..returnType = const VoidType();
+    // 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;
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 14df1f6..c7a11ce 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
@@ -44,7 +44,9 @@
         templateCantUseSuperBoundedTypeForInstanceCreation,
         templateForInLoopElementTypeNotAssignable,
         templateForInLoopTypeNotIterable,
-        templateSwitchExpressionNotAssignable;
+        templateIntegerLiteralIsOutOfRange,
+        templateSwitchExpressionNotAssignable,
+        templateWebLiteralCannotBeRepresentedExactly;
 
 import '../problems.dart' show unhandled, unsupported;
 
@@ -168,8 +170,7 @@
   ExpressionJudgment get judgment => operand;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferrer.inferExpression(judgment, const UnknownType(), false,
         isVoidAllowed: true);
     inferredType = type;
@@ -185,8 +186,7 @@
   AssertStatementJudgment get judgment => statement;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     inferrer.inferStatement(judgment);
   }
 }
@@ -206,8 +206,7 @@
   ExpressionJudgment get messageJudgment => message;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var conditionJudgment = this.conditionJudgment;
     var messageJudgment = this.messageJudgment;
     var expectedType = inferrer.coreTypes.boolClass.rawType;
@@ -230,8 +229,7 @@
   ExpressionJudgment get judgment => operand;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     if (!inferrer.typeSchemaEnvironment.isEmptyContext(typeContext)) {
       typeContext = inferrer.wrapFutureOrType(typeContext);
     }
@@ -250,8 +248,7 @@
   List<Statement> get judgments => statements;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     for (var judgment in judgments) {
       inferrer.inferStatement(judgment);
     }
@@ -265,8 +262,7 @@
   BoolJudgment(bool value) : super(value);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = inferrer.coreTypes.boolClass.rawType;
     return null;
   }
@@ -279,8 +275,7 @@
   LabeledStatementJudgment get targetJudgment => target;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     // No inference needs to be done.
   }
 }
@@ -292,8 +287,7 @@
   LabeledStatementJudgment get targetJudgment => target;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     // No inference needs to be done.
   }
 }
@@ -365,8 +359,7 @@
   }
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = inferrer.inferExpression(targetJudgment, typeContext, true);
     if (inferrer.strongMode) {
       variable.type = inferredType;
@@ -500,11 +493,8 @@
   DartType _getWriteType(ShadowTypeInferrer inferrer) => unhandled(
       '$runtimeType', 'ShadowComplexAssignment._getWriteType', -1, null);
 
-  _ComplexAssignmentInferenceResult
-      _inferRhs<Expression, Statement, Initializer, Type>(
-          ShadowTypeInferrer inferrer,
-          DartType readType,
-          DartType writeContext) {
+  _ComplexAssignmentInferenceResult _inferRhs(
+      ShadowTypeInferrer inferrer, DartType readType, DartType writeContext) {
     assert(writeContext != null);
     if (readType is VoidType &&
         (combiner != null || nullAwareCombiner != null)) {
@@ -622,8 +612,7 @@
     return parts;
   }
 
-  DartType _inferReceiver<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  DartType _inferReceiver(ShadowTypeInferrer inferrer) {
     if (receiver != null) {
       inferrer.inferExpression(receiver, const UnknownType(), true);
       var receiverType = receiver.inferredType;
@@ -655,8 +644,7 @@
       : super(condition, then, otherwise, null);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var conditionJudgment = this.conditionJudgment;
     var thenJudgment = this.thenJudgment;
     var otherwiseJudgment = this.otherwiseJudgment;
@@ -693,16 +681,19 @@
   ArgumentsJudgment get argumentJudgments => arguments;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var library = inferrer.engine.beingInferred[target];
     if (library != null) {
       // There is a cyclic dependency where inferring the types of the
       // initializing formals of a constructor required us to infer the
       // corresponding field type which required us to know the type of the
       // constructor.
-      var name = target.enclosingClass.name;
-      if (target.name.name != '') name += '.${target.name.name}';
+      String name = target.enclosingClass.name;
+      if (target.name.name.isNotEmpty) {
+        // TODO(ahe): Use `inferrer.helper.constructorNameForDiagnostics`
+        // instead. However, `inferrer.helper` may be null.
+        name += ".${target.name.name}";
+      }
       library.addProblem(
           templateCantInferTypeDueToCircularity.withArguments(name),
           target.fileOffset,
@@ -756,8 +747,7 @@
   SwitchCaseJudgment get targetJudgment => target;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     // No inference needs to be done.
   }
 }
@@ -772,8 +762,7 @@
   ExpressionJudgment get judgment => body;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     // Since the variable is not used in the body we don't need to type infer
     // it.  We can just type infer the body.
     var judgment = this.judgment;
@@ -792,8 +781,7 @@
   ExpressionJudgment get conditionJudgment => condition;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var conditionJudgment = this.conditionJudgment;
     inferrer.inferStatement(bodyJudgment);
     var boolType = inferrer.coreTypes.boolClass.rawType;
@@ -810,8 +798,7 @@
   DoubleJudgment(double value) : super(value);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = inferrer.coreTypes.doubleClass.rawType;
     return null;
   }
@@ -819,13 +806,12 @@
 
 /// Common base class for shadow objects representing expressions in kernel
 /// form.
-abstract class ExpressionJudgment implements Expression {
+abstract class ExpressionJudgment extends Expression {
   DartType inferredType;
 
   /// Calls back to [inferrer] to perform type inference for whatever concrete
   /// type of [ExpressionJudgment] this is.
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext);
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext);
 }
 
 /// Concrete shadow object representing an empty statement in kernel form.
@@ -834,8 +820,7 @@
   EmptyStatementJudgment();
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     // No inference needs to be done.
   }
 }
@@ -848,8 +833,7 @@
   Expression get judgment => expression;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     inferrer.inferExpression(judgment, const UnknownType(), false,
         isVoidAllowed: true);
   }
@@ -869,8 +853,7 @@
   ArgumentsJudgment get argumentJudgments => arguments;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var inferenceResult = inferrer.inferInvocation(
         typeContext,
         fileOffset,
@@ -918,8 +901,7 @@
   ShadowFieldInitializer(Field field, Expression value) : super(field, value);
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var initializerType = inferrer.inferExpression(value, field.type, true);
     inferrer.ensureAssignable(field.type, initializerType, value, fileOffset);
   }
@@ -943,8 +925,7 @@
   StatementJudgment get bodyJudgment => body;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var iterableClass = isAsync
         ? inferrer.coreTypes.streamClass
         : inferrer.coreTypes.iterableClass;
@@ -1057,8 +1038,7 @@
   StatementJudgment get bodyJudgment => body;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var initializers = this.initializers;
     var conditionJudgment = this.conditionJudgment;
     if (initializers != null) {
@@ -1107,7 +1087,7 @@
             asyncMarker: asyncMarker,
             dartAsyncMarker: dartAsyncMarker);
 
-  ExpressionInferenceResult infer<Expression, Statement, Initializer, Type>(
+  ExpressionInferenceResult infer(
       ShadowTypeInferrer inferrer,
       DartType typeContext,
       DartType returnContext,
@@ -1132,8 +1112,7 @@
   FunctionNodeJudgment get functionJudgment => function;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     inferrer.inferMetadataKeepingHelper(variable.annotations);
     DartType returnContext = _hasImplicitReturnType
         ? (inferrer.strongMode ? null : const DynamicType())
@@ -1159,8 +1138,7 @@
   FunctionNodeJudgment get judgment => function;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var judgment = this.judgment;
     var inferenceResult =
         judgment.infer(inferrer, typeContext, null, fileOffset);
@@ -1180,8 +1158,7 @@
       : super(variable);
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var substitution = Substitution.fromSupertype(inferrer.classHierarchy
         .getClassAsInstanceOf(
             inferrer.thisType.classNode, target.enclosingClass));
@@ -1218,8 +1195,7 @@
   ExpressionJudgment get rightJudgment => body.then;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var leftJudgment = this.leftJudgment;
     var rightJudgment = this.rightJudgment;
     // To infer `e0 ?? e1` in context K:
@@ -1265,8 +1241,7 @@
   StatementJudgment get otherwiseJudgment => otherwise;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var conditionJudgment = this.conditionJudgment;
     var expectedType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(
@@ -1298,8 +1273,7 @@
   }
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     if (write != null) {
       inferrer.inferExpression(write, const UnknownType(), false);
     }
@@ -1341,8 +1315,7 @@
   }
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var receiverType = _inferReceiver(inferrer);
     var writeMember = inferrer.findMethodInvocationMember(receiverType, write);
     // To replicate analyzer behavior, we base type inference on the write
@@ -1407,19 +1380,123 @@
 abstract class InitializerJudgment implements Initializer {
   /// Performs type inference for whatever concrete type of [InitializerJudgment]
   /// this is.
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer);
+  void infer(ShadowTypeInferrer inferrer);
+}
+
+Expression checkWebIntLiteralsErrorIfUnexact(
+    ShadowTypeInferrer inferrer, int value, String literal, int charOffset) {
+  if (value >= 0 && value <= (1 << 53)) return null;
+  if (inferrer.library == null) return null;
+  if (!inferrer.library.loader.target.backendTarget
+      .errorOnUnexactWebIntLiterals) return null;
+  BigInt asInt = BigInt.from(value).toUnsigned(64);
+  BigInt asDouble = BigInt.from(asInt.toDouble());
+  if (asInt == asDouble) return null;
+  String text = literal ?? value.toString();
+  String nearest = text.startsWith('0x') || text.startsWith('0X')
+      ? '0x${asDouble.toRadixString(16)}'
+      : asDouble.toString();
+  int length = literal?.length ?? noLength;
+  return inferrer.helper
+      .buildProblem(
+          templateWebLiteralCannotBeRepresentedExactly.withArguments(
+              text, nearest),
+          charOffset,
+          length)
+      .desugared;
 }
 
 /// Concrete shadow object representing an integer literal in kernel form.
 class IntJudgment extends IntLiteral implements ExpressionJudgment {
   DartType inferredType;
+  final String literal;
 
-  IntJudgment(int value) : super(value);
+  IntJudgment(int value, this.literal) : super(value);
+
+  double asDouble({bool negated: false}) {
+    if (value == 0 && negated) return -0.0;
+    BigInt intValue = BigInt.from(negated ? -value : value);
+    double doubleValue = intValue.toDouble();
+    return intValue == BigInt.from(doubleValue) ? doubleValue : null;
+  }
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
+    if (inferrer.isDoubleContext(typeContext)) {
+      double doubleValue = asDouble();
+      if (doubleValue != null) {
+        parent.replaceChild(
+            this, DoubleLiteral(doubleValue)..fileOffset = fileOffset);
+        inferredType = inferrer.coreTypes.doubleClass.rawType;
+        return null;
+      }
+    }
+    Expression error =
+        checkWebIntLiteralsErrorIfUnexact(inferrer, value, literal, fileOffset);
+    if (error != null) {
+      parent.replaceChild(this, error);
+      inferredType = const BottomType();
+      return null;
+    }
+    inferredType = inferrer.coreTypes.intClass.rawType;
+    return null;
+  }
+}
+
+class ShadowLargeIntLiteral extends IntLiteral implements ExpressionJudgment {
+  final String literal;
+  final int fileOffset;
+  bool isParenthesized = false;
+
+  DartType inferredType;
+
+  ShadowLargeIntLiteral(this.literal, this.fileOffset) : super(0);
+
+  double asDouble({bool negated: false}) {
+    BigInt intValue = BigInt.tryParse(negated ? '-${literal}' : literal);
+    if (intValue == null) return null;
+    double doubleValue = intValue.toDouble();
+    return !doubleValue.isNaN &&
+            !doubleValue.isInfinite &&
+            intValue == BigInt.from(doubleValue)
+        ? doubleValue
+        : null;
+  }
+
+  int asInt64({bool negated: false}) {
+    return int.tryParse(negated ? '-${literal}' : literal);
+  }
+
+  @override
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
+    if (inferrer.isDoubleContext(typeContext)) {
+      double doubleValue = asDouble();
+      if (doubleValue != null) {
+        parent.replaceChild(
+            this, DoubleLiteral(doubleValue)..fileOffset = fileOffset);
+        inferredType = inferrer.coreTypes.doubleClass.rawType;
+        return null;
+      }
+    }
+
+    int intValue = asInt64();
+    if (intValue == null) {
+      Expression replacement = inferrer.helper.buildProblem(
+          templateIntegerLiteralIsOutOfRange.withArguments(literal),
+          fileOffset,
+          literal.length);
+      parent.replaceChild(this, replacement);
+      inferredType = const BottomType();
+      return null;
+    }
+    Expression error = checkWebIntLiteralsErrorIfUnexact(
+        inferrer, intValue, literal, fileOffset);
+    if (error != null) {
+      parent.replaceChild(this, error);
+      inferredType = const BottomType();
+      return null;
+    }
+    parent.replaceChild(this, IntLiteral(intValue)..fileOffset = fileOffset);
     inferredType = inferrer.coreTypes.intClass.rawType;
     return null;
   }
@@ -1431,8 +1508,7 @@
   ShadowInvalidInitializer(VariableDeclaration variable) : super(variable);
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     inferrer.inferExpression(variable.initializer, const UnknownType(), false);
   }
 }
@@ -1452,8 +1528,7 @@
   ExpressionJudgment get judgment => value;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     inferrer.inferExpression(value, field.type, false);
   }
 }
@@ -1467,8 +1542,7 @@
   IsJudgment(Expression operand, DartType type) : super(operand, type);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferrer.inferExpression(judgment, const UnknownType(), false);
     inferredType = inferrer.coreTypes.boolClass.rawType;
     return null;
@@ -1488,8 +1562,7 @@
       : super(new IsExpression(operand, type)..fileOffset = charOffset);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferrer.inferExpression(judgment, const UnknownType(), false);
     inferredType = inferrer.coreTypes.boolClass.rawType;
     return null;
@@ -1504,8 +1577,7 @@
   StatementJudgment get judgment => body;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     inferrer.inferStatement(judgment);
   }
 }
@@ -1526,8 +1598,7 @@
             isConst: isConst);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var listClass = inferrer.coreTypes.listClass;
     var listType = listClass.thisType;
     List<DartType> inferredTypes;
@@ -1598,8 +1669,7 @@
   ExpressionJudgment get rightJudgment => right;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var boolType = inferrer.coreTypes.boolClass.rawType;
     var leftJudgment = this.leftJudgment;
     var rightJudgment = this.rightJudgment;
@@ -1627,9 +1697,7 @@
 
   MapEntryJudgment(Expression key, Expression value) : super(key, value);
 
-  MapEntry infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer,
-      DartType keyTypeContext,
+  MapEntry infer(ShadowTypeInferrer inferrer, DartType keyTypeContext,
       DartType valueTypeContext) {
     ExpressionJudgment keyJudgment = this.keyJudgment;
     inferrer.inferExpression(keyJudgment, keyTypeContext, true,
@@ -1664,8 +1732,7 @@
             isConst: isConst);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var mapClass = inferrer.coreTypes.mapClass;
     var mapType = mapClass.thisType;
     List<DartType> inferredTypes;
@@ -1783,8 +1850,76 @@
   ArgumentsJudgment get argumentJudgments => arguments;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
+    if (name.name == 'unary-' &&
+        arguments.types.isEmpty &&
+        arguments.positional.isEmpty &&
+        arguments.named.isEmpty) {
+      // Replace integer literals in a double context with the corresponding
+      // double literal if it's exact.  For double literals, the negation is
+      // folded away.  In any non-double context, or if there is no exact
+      // double value, then the corresponding integer literal is left.  The
+      // negation is not folded away so that platforms with web literals can
+      // distinguish between (non-negated) 0x8000000000000000 represented as
+      // integer literal -9223372036854775808 which should be a positive number,
+      // and negated 9223372036854775808 represented as
+      // -9223372036854775808.unary-() which should be a negative number.
+      if (receiver is IntJudgment) {
+        IntJudgment receiver = this.receiver;
+        if (inferrer.isDoubleContext(typeContext)) {
+          double doubleValue = receiver.asDouble(negated: true);
+          if (doubleValue != null) {
+            parent.replaceChild(
+                this, DoubleLiteral(doubleValue)..fileOffset = fileOffset);
+            inferredType = inferrer.coreTypes.doubleClass.rawType;
+            return null;
+          }
+        }
+        Expression error = checkWebIntLiteralsErrorIfUnexact(
+            inferrer, receiver.value, receiver.literal, receiver.fileOffset);
+        if (error != null) {
+          parent.replaceChild(this, error);
+          inferredType = const BottomType();
+          return null;
+        }
+      } else if (receiver is ShadowLargeIntLiteral) {
+        ShadowLargeIntLiteral receiver = this.receiver;
+        if (!receiver.isParenthesized) {
+          if (inferrer.isDoubleContext(typeContext)) {
+            double doubleValue = receiver.asDouble(negated: true);
+            if (doubleValue != null) {
+              parent.replaceChild(
+                  this, DoubleLiteral(doubleValue)..fileOffset = fileOffset);
+              inferredType = inferrer.coreTypes.doubleClass.rawType;
+              return null;
+            }
+          }
+          int intValue = receiver.asInt64(negated: true);
+          if (intValue == null) {
+            Expression error = inferrer.helper.buildProblem(
+                templateIntegerLiteralIsOutOfRange
+                    .withArguments(receiver.literal),
+                receiver.fileOffset,
+                receiver.literal.length);
+            parent.replaceChild(this, error);
+            inferredType = const BottomType();
+            return null;
+          }
+          if (intValue != null) {
+            Expression error = checkWebIntLiteralsErrorIfUnexact(
+                inferrer, intValue, receiver.literal, receiver.fileOffset);
+            if (error != null) {
+              parent.replaceChild(this, error);
+              inferredType = const BottomType();
+              return null;
+            }
+            this.receiver = IntLiteral(-intValue)
+              ..fileOffset = this.receiver.fileOffset
+              ..parent = this;
+          }
+        }
+      }
+    }
     var inferenceResult = inferrer.inferMethodInvocation(
         this, receiver, fileOffset, _isImplicitCall, typeContext,
         desugaredInvocation: this);
@@ -1816,8 +1951,7 @@
   VariableDeclarationJudgment get variableJudgment => variable;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     ExpressionJudgment initializer = variableJudgment.initializer;
     inferrer.inferExpression(initializer, typeContext, true);
     inferredType = initializer.inferredType;
@@ -1837,8 +1971,7 @@
   ExpressionJudgment get judgment => operand;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var judgment = this.judgment;
     // First infer the receiver so we can look up the method that was invoked.
     var boolType = inferrer.coreTypes.boolClass.rawType;
@@ -1872,8 +2005,7 @@
   MethodInvocation get _desugaredInvocation => body.otherwise;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var inferenceResult = inferrer.inferMethodInvocation(
         this, variable.initializer, fileOffset, false, typeContext,
         receiverVariable: variable, desugaredInvocation: _desugaredInvocation);
@@ -1906,8 +2038,7 @@
   ExpressionJudgment get receiverJudgment => variable.initializer;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferrer.inferPropertyGet(
         this, receiverJudgment, fileOffset, false, typeContext,
         receiverVariable: variable, desugaredGet: _desugaredGet);
@@ -1925,8 +2056,7 @@
   NullJudgment();
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = inferrer.coreTypes.nullClass.rawType;
     return null;
   }
@@ -1995,8 +2125,7 @@
   }
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var receiverType = _inferReceiver(inferrer);
 
     DartType readType;
@@ -2041,8 +2170,7 @@
   ExpressionJudgment get receiverJudgment => receiver;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferrer.inferPropertyGet(
         this, receiverJudgment, fileOffset, forSyntheticToken, typeContext,
         desugaredGet: this);
@@ -2061,7 +2189,7 @@
   ArgumentsJudgment get argumentJudgments => arguments;
 
   @override
-  infer<Expression, Statement, Initializer, Type>(ShadowTypeInferrer inferrer) {
+  infer(ShadowTypeInferrer inferrer) {
     List<TypeParameter> classTypeParameters =
         target.enclosingClass.typeParameters;
     List<DartType> typeArguments =
@@ -2086,8 +2214,7 @@
   RethrowJudgment(this.desugaredError);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = const BottomType();
     if (desugaredError != null) {
       parent.replaceChild(this, desugaredError);
@@ -2107,8 +2234,7 @@
   ExpressionJudgment get judgment => expression;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var judgment = this.judgment;
     var closureContext = inferrer.closureContext;
     DartType typeContext = !closureContext.isGenerator
@@ -2132,8 +2258,7 @@
 abstract class StatementJudgment extends Statement {
   /// Calls back to [inferrer] to perform type inference for whatever concrete
   /// type of [StatementJudgment] this is.
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer);
+  void infer(ShadowTypeInferrer inferrer);
 }
 
 /// Concrete shadow object representing an assignment to a static variable.
@@ -2147,8 +2272,7 @@
   }
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     DartType readType = const DynamicType(); // Only used in error recovery
     var read = this.read;
     if (read is StaticGet) {
@@ -2180,8 +2304,7 @@
   StaticGetJudgment(Member target) : super(target);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var target = this.target;
     if (target is ShadowField && target.inferenceNode != null) {
       target.inferenceNode.resolve();
@@ -2209,8 +2332,7 @@
   ArgumentsJudgment get argumentJudgments => arguments;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     FunctionType calleeType = target != null
         ? target.function.functionType
         : new FunctionType([], const DynamicType());
@@ -2234,8 +2356,7 @@
       : super(expressions);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     if (!inferrer.isTopLevel) {
       for (var expression in expressions) {
         inferrer.inferExpression(expression, const UnknownType(), false);
@@ -2254,8 +2375,7 @@
   StringLiteralJudgment(String value) : super(value);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = inferrer.coreTypes.stringClass.rawType;
     return null;
   }
@@ -2270,8 +2390,7 @@
   ArgumentsJudgment get argumentJudgments => arguments;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var substitution = Substitution.fromSupertype(inferrer.classHierarchy
         .getClassAsInstanceOf(
             inferrer.thisType.classNode, target.enclosingClass));
@@ -2299,8 +2418,7 @@
   ArgumentsJudgment get argumentJudgments => arguments;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     if (interfaceTarget != null) {
       inferrer.instrumentation?.record(inferrer.uri, fileOffset, 'target',
           new InstrumentationValueForMember(interfaceTarget));
@@ -2330,8 +2448,7 @@
       : super(name, interfaceTarget);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     if (interfaceTarget != null) {
       inferrer.instrumentation?.record(inferrer.uri, fileOffset, 'target',
           new InstrumentationValueForMember(interfaceTarget));
@@ -2373,8 +2490,7 @@
   List<SwitchCaseJudgment> get caseJudgments => cases.cast();
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var expressionJudgment = this.expressionJudgment;
     inferrer.inferExpression(expressionJudgment, const UnknownType(), true);
     var expressionType = expressionJudgment.inferredType;
@@ -2410,8 +2526,7 @@
   SymbolLiteralJudgment(String value) : super(value);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = inferrer.coreTypes.symbolClass.rawType;
     return null;
   }
@@ -2432,8 +2547,7 @@
   ArgumentsJudgment get argumentJudgments => arguments;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     FunctionType calleeType;
     DartType returnType;
     if (constructor != null) {
@@ -2459,8 +2573,7 @@
       : super(desugared);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     // When a compound assignment, the expression is already wrapping in
     // VariableDeclaration in _makeRead(). Otherwise, temporary associate
     // the expression with this node.
@@ -2492,8 +2605,7 @@
   }
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     _replaceWithDesugared();
     inferredType = const DynamicType();
     return null;
@@ -2544,8 +2656,7 @@
   ThisJudgment();
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = inferrer.thisType ?? const DynamicType();
     return null;
   }
@@ -2562,8 +2673,7 @@
       : super(expression);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferrer.inferExpression(judgment, const UnknownType(), false);
     inferredType = const BottomType();
     if (desugaredError != null) {
@@ -2585,8 +2695,7 @@
       : super(new NullLiteral());
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     inferrer.inferStatement(statement);
 
     // If this judgment is a part of a Block, replace it there.
@@ -2610,8 +2719,7 @@
 
   StatementJudgment get bodyJudgment => body;
 
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     inferrer.inferStatement(bodyJudgment);
   }
 }
@@ -2625,8 +2733,7 @@
   List<CatchJudgment> get catchJudgments => catches.cast();
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     inferrer.inferStatement(bodyJudgment);
     for (var catch_ in catchJudgments) {
       catch_.infer(inferrer);
@@ -2646,8 +2753,7 @@
   StatementJudgment get finalizerJudgment => finalizer;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     inferrer.inferStatement(body);
     if (catchJudgments != null) {
       for (var catch_ in catchJudgments) {
@@ -2705,7 +2811,7 @@
   }
 
   @override
-  DartType inferExpression<Expression, Statement, Initializer, Type>(
+  DartType inferExpression(
       kernel.Expression expression, DartType typeContext, bool typeNeeded,
       {bool isVoidAllowed: false}) {
     // `null` should never be used as the type context.  An instance of
@@ -2741,6 +2847,10 @@
         }
       }
       return inferredType;
+    } else if (expression is IntLiteral) {
+      return coreTypes.intClass.rawType;
+    } else if (expression is DoubleLiteral) {
+      return coreTypes.doubleClass.rawType;
     } else {
       // Encountered an expression type for which type inference is not yet
       // implemented, so just infer dynamic for now.
@@ -2751,15 +2861,14 @@
   }
 
   @override
-  DartType inferFieldTopLevel<Expression, Statement, Initializer, Type>(
-      ShadowField field, bool typeNeeded) {
+  DartType inferFieldTopLevel(ShadowField field, bool typeNeeded) {
     if (field.initializer == null) return const DynamicType();
     return inferExpression(field.initializer, const UnknownType(), typeNeeded,
         isVoidAllowed: true);
   }
 
   @override
-  void inferInitializer<Expression, Statement, Initializer, Type>(
+  void inferInitializer(
       InferenceHelper helper, kernel.Initializer initializer) {
     assert(initializer is InitializerJudgment);
     this.helper = helper;
@@ -2774,8 +2883,7 @@
   }
 
   @override
-  void inferStatement<Expression, Statement, Initializer, Type>(
-      Statement statement) {
+  void inferStatement(Statement statement) {
     // For full (non-top level) inference, we need access to the
     // ExpressionGeneratorHelper so that we can perform error recovery.
     if (!isTopLevel) assert(helper != null);
@@ -2802,8 +2910,7 @@
   TypeLiteralJudgment(DartType type) : super(type);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = inferrer.coreTypes.typeClass.rawType;
     return null;
   }
@@ -2888,8 +2995,7 @@
   }
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     DartType readType;
     var read = this.read;
     if (read is VariableGet) {
@@ -2976,8 +3082,7 @@
   ExpressionJudgment get initializerJudgment => initializer;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     if (annotationJudgments.isNotEmpty) {
       if (infersAnnotations) {
         inferrer.inferMetadataKeepingHelper(annotationJudgments);
@@ -3057,8 +3162,7 @@
       : super(desugared);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     var result = super.infer(inferrer, typeContext);
     inferrer.inferInvocation(
         typeContext,
@@ -3081,8 +3185,7 @@
       : super(desugared);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferrer.inferExpression(rhs, const UnknownType(), true);
     inferredType = isCompound ? const DynamicType() : rhs.inferredType;
     return super.infer(inferrer, typeContext);
@@ -3101,8 +3204,7 @@
       : super(variable);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     VariableDeclarationJudgment variable = this.variable;
     bool mutatedInClosure = variable._mutatedInClosure;
     DartType declaredOrInferredType = variable.type;
@@ -3132,8 +3234,7 @@
   StatementJudgment get bodyJudgment => body;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var conditionJudgment = this.conditionJudgment;
     var expectedType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(
@@ -3152,8 +3253,7 @@
   ExpressionJudgment get judgment => expression;
 
   @override
-  void infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer) {
+  void infer(ShadowTypeInferrer inferrer) {
     var judgment = this.judgment;
     var closureContext = inferrer.closureContext;
     if (closureContext.isGenerator) {
@@ -3185,8 +3285,7 @@
   ArgumentsJudgment get argumentJudgments => arguments;
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType =
         inferrer.typeSchemaEnvironment.futureType(const DynamicType());
     if (arguments != null) {
@@ -3208,8 +3307,7 @@
   LoadLibraryTearOffJudgment(this.import, Procedure target) : super(target);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = new FunctionType(
         [], inferrer.typeSchemaEnvironment.futureType(const DynamicType()));
     return null;
@@ -3224,8 +3322,7 @@
   CheckLibraryIsLoadedJudgment(LibraryDependency import) : super(import);
 
   @override
-  Expression infer<Expression, Statement, Initializer, Type>(
-      ShadowTypeInferrer inferrer, DartType typeContext) {
+  Expression infer(ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = inferrer.typeSchemaEnvironment.objectType;
     return null;
   }
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 bf3f19e..772b960 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -22,6 +22,7 @@
         FieldInitializer,
         FunctionNode,
         Initializer,
+        InterfaceType,
         InvalidInitializer,
         Library,
         ListLiteral,
@@ -37,9 +38,9 @@
         SuperInitializer,
         Throw,
         TypeParameter,
+        TypeParameterType,
         VariableDeclaration,
-        VariableGet,
-        VoidType;
+        VariableGet;
 
 import 'package:kernel/type_algebra.dart' show substitute;
 
@@ -511,15 +512,19 @@
                     builder.charOffset, dynamicType),
                 builder.parent);
         if (supertype.cls.constructors.isEmpty) {
-          builder.addSyntheticConstructor(makeDefaultConstructor());
+          builder
+              .addSyntheticConstructor(makeDefaultConstructor(builder.target));
         } else {
           for (Constructor constructor in supertype.cls.constructors) {
             builder.addSyntheticConstructor(makeMixinApplicationConstructor(
-                builder.cls.mixin, constructor, substitutionMap));
+                builder.target,
+                builder.cls.mixin,
+                constructor,
+                substitutionMap));
           }
         }
       } else if (supertype is InvalidTypeBuilder) {
-        builder.addSyntheticConstructor(makeDefaultConstructor());
+        builder.addSyntheticConstructor(makeDefaultConstructor(builder.target));
       } else {
         unhandled("${supertype.runtimeType}", "installDefaultConstructor",
             builder.charOffset, builder.fileUri);
@@ -528,7 +533,7 @@
       /// >Iff no constructor is specified for a class C, it implicitly has a
       /// >default constructor C() : super() {}, unless C is class Object.
       // The superinitializer is installed below in [finishConstructors].
-      builder.addSyntheticConstructor(makeDefaultConstructor());
+      builder.addSyntheticConstructor(makeDefaultConstructor(builder.target));
     }
   }
 
@@ -544,7 +549,7 @@
     return result;
   }
 
-  Constructor makeMixinApplicationConstructor(Class mixin,
+  Constructor makeMixinApplicationConstructor(Class cls, Class mixin,
       Constructor constructor, Map<TypeParameter, DartType> substitutionMap) {
     VariableDeclaration copyFormal(VariableDeclaration formal) {
       // TODO(ahe): Handle initializers.
@@ -574,7 +579,7 @@
         positionalParameters: positionalParameters,
         namedParameters: namedParameters,
         requiredParameterCount: constructor.function.requiredParameterCount,
-        returnType: const VoidType());
+        returnType: makeConstructorReturnType(cls));
     SuperInitializer initializer = new SuperInitializer(
         constructor, new Arguments(positional, named: named));
     return new Constructor(function,
@@ -583,13 +588,23 @@
         isSynthetic: true);
   }
 
-  Constructor makeDefaultConstructor() {
+  Constructor makeDefaultConstructor(Class enclosingClass) {
     return new Constructor(
-        new FunctionNode(new EmptyStatement(), returnType: const VoidType()),
+        new FunctionNode(new EmptyStatement(),
+            returnType: makeConstructorReturnType(enclosingClass)),
         name: new Name(""),
         isSynthetic: true);
   }
 
+  DartType makeConstructorReturnType(Class enclosingClass) {
+    List<DartType> typeParameterTypes = new List<DartType>();
+    for (int i = 0; i < enclosingClass.typeParameters.length; i++) {
+      TypeParameter typeParameter = enclosingClass.typeParameters[i];
+      typeParameterTypes.add(new TypeParameterType(typeParameter));
+    }
+    return new InterfaceType(enclosingClass, typeParameterTypes);
+  }
+
   void computeCoreTypes() {
     List<Library> libraries = <Library>[];
     for (String platformLibrary in const [
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 0d794a7..91253b4 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -250,6 +250,17 @@
 fileUri: $fileUri
 severity: $severity
 """;
+    // TODO(askesc): Swap message and context around for interface checks
+    // and mixin overrides to make comparing context here unnecessary.
+    if (context != null) {
+      for (LocatedMessage contextMessage in context) {
+        trace += """
+message: ${contextMessage.message}
+charOffset: ${contextMessage.charOffset}
+fileUri: ${contextMessage.uri}
+""";
+      }
+    }
     if (!seenMessages.add(trace)) return false;
     if (message.code.severity == Severity.context) {
       internalProblem(
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 9814c3b..c59f7ea 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
@@ -709,7 +709,7 @@
       return parser.insertSyntheticIdentifier(identifier, this,
           message: fasta.messageMissingOperatorKeyword,
           messageOnToken: identifier);
-    } else if (isOneOfOrEof(identifier, const ['.', '(', '{', '=>']) ||
+    } else if (isOneOfOrEof(identifier, const ['.', '(', '{', '=>', '}']) ||
         looksLikeStartOfNextClassMember(identifier)) {
       return parser.insertSyntheticIdentifier(token, this);
     } else if (!identifier.isKeywordOrIdentifier) {
@@ -875,6 +875,8 @@
           parser.reportRecoverableErrorWithToken(
               next, fasta.templateBuiltInIdentifierAsType);
         }
+      } else if (optional('var', next)) {
+        parser.reportRecoverableError(next, fasta.messageVarAsTypeName);
       } else {
         parser.reportRecoverableErrorWithToken(
             next, fasta.templateExpectedType);
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 760424c..2b0748d 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -28,9 +28,11 @@
 
 import '../scanner/token_constants.dart'
     show
+        BANG_EQ_EQ_TOKEN,
         COMMA_TOKEN,
         DOUBLE_TOKEN,
         EOF_TOKEN,
+        EQ_EQ_EQ_TOKEN,
         EQ_TOKEN,
         FUNCTION_TOKEN,
         HASH_TOKEN,
@@ -1753,7 +1755,17 @@
       // and generate the same events as in the parseClassHeader method above.
       recoveryListener.clear();
 
-      token = parseClassExtendsOpt(token);
+      if (token.next.isKeywordOrIdentifier &&
+          const ['extend', 'on'].contains(token.next.lexeme)) {
+        reportRecoverableError(
+            token.next, fasta.templateExpectedInstead.withArguments('extends'));
+        Token incorrectExtendsKeyword = token.next;
+        token = computeType(incorrectExtendsKeyword, true)
+            .ensureTypeNotVoid(incorrectExtendsKeyword, this);
+        listener.handleClassExtends(incorrectExtendsKeyword);
+      } else {
+        token = parseClassExtendsOpt(token);
+      }
 
       if (recoveryListener.extendsKeyword != null) {
         if (hasExtends) {
@@ -1901,7 +1913,15 @@
       // During recovery, clauses are parsed in the same order and
       // generate the same events as in the parseMixinHeaderOpt method above.
       recoveryListener.clear();
-      token = parseMixinOnOpt(token);
+
+      if (token.next.isKeywordOrIdentifier &&
+          const ['extend', 'extends'].contains(token.next.lexeme)) {
+        reportRecoverableError(
+            token.next, fasta.templateExpectedInstead.withArguments('on'));
+        token = parseMixinOn(token);
+      } else {
+        token = parseMixinOnOpt(token);
+      }
 
       if (recoveryListener.onKeyword != null) {
         if (hasOn) {
@@ -1942,16 +1962,24 @@
   /// ;
   /// ```
   Token parseMixinOnOpt(Token token) {
-    Token onKeyword;
-    int typeCount = 0;
-    if (optional('on', token.next)) {
-      onKeyword = token.next;
-      do {
-        token =
-            computeType(token.next, true).ensureTypeNotVoid(token.next, this);
-        ++typeCount;
-      } while (optional(',', token.next));
+    if (!optional('on', token.next)) {
+      listener.handleMixinOn(null, 0);
+      return token;
     }
+    return parseMixinOn(token);
+  }
+
+  Token parseMixinOn(Token token) {
+    Token onKeyword = token.next;
+    // During recovery, the [onKeyword] can be "extend" or "extends"
+    assert(optional('on', onKeyword) ||
+        optional('extends', onKeyword) ||
+        onKeyword.lexeme == 'extend');
+    int typeCount = 0;
+    do {
+      token = computeType(token.next, true).ensureTypeNotVoid(token.next, this);
+      ++typeCount;
+    } while (optional(',', token.next));
     listener.handleMixinOn(onKeyword, typeCount);
     return token;
   }
@@ -2904,7 +2932,16 @@
       TypeInfo typeInfo,
       Token getOrSet,
       Token name) {
-    bool isOperator = getOrSet == null && optional('operator', name);
+    bool isOperator = false;
+    if (getOrSet == null && optional('operator', name)) {
+      Token operator = name.next;
+      if (operator.isOperator ||
+          identical(operator.kind, EQ_EQ_EQ_TOKEN) ||
+          identical(operator.kind, BANG_EQ_EQ_TOKEN) ||
+          isUnaryMinus(operator)) {
+        isOperator = true;
+      }
+    }
 
     if (staticToken != null) {
       if (isOperator) {
@@ -2965,7 +3002,9 @@
         : MemberKind.NonStaticMethod;
     checkFormals(token, name, isGetter, kind);
     Token beforeParam = token;
-    token = parseFormalParametersOpt(token, kind);
+    token = isGetter
+        ? parseFormalParametersOpt(token, kind)
+        : parseFormalParametersRequiredOpt(token, kind);
     token = parseInitializersOpt(token);
 
     AsyncModifier savedAsyncModifier = asyncState;
@@ -3477,6 +3516,9 @@
     } else if (identical(value, 'yield')) {
       switch (asyncState) {
         case AsyncModifier.Sync:
+          if (optional(':', token.next.next)) {
+            return parseLabeledStatement(token);
+          }
           return parseExpressionStatementOrDeclaration(token);
 
         case AsyncModifier.SyncStar:
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info.dart b/pkg/front_end/lib/src/fasta/parser/type_info.dart
index 317cc51..b2c407e 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info.dart
@@ -12,7 +12,7 @@
 
 import 'type_info_impl.dart';
 
-import 'util.dart' show optional;
+import 'util.dart' show isOneOf, optional;
 
 /// [TypeInfo] provides information collected by [computeType]
 /// about a particular type reference.
@@ -136,7 +136,7 @@
         // Recovery: built-in `<` ... `>`
         if (required || looksLikeName(typeParamOrArg.skip(next).next)) {
           return new ComplexTypeInfo(token, typeParamOrArg)
-              .computeBuiltinAsType(required);
+              .computeBuiltinOrVarAsType(required);
         }
       } else if (required || isGeneralizedFunctionType(next.next)) {
         String value = next.stringValue;
@@ -146,14 +146,22 @@
             !identical('operator', value) &&
             !(identical('typedef', value) && next.next.isIdentifier))) {
           return new ComplexTypeInfo(token, typeParamOrArg)
-              .computeBuiltinAsType(required);
+              .computeBuiltinOrVarAsType(required);
         }
       }
-    } else if (required && optional('.', next)) {
-      // Recovery: looks like prefixed type missing the prefix
-      return new ComplexTypeInfo(
-              token, computeTypeParamOrArg(next, inDeclaration))
-          .computePrefixedType(required);
+    } else if (required) {
+      // Recovery
+      if (optional('.', next)) {
+        // Looks like prefixed type missing the prefix
+        return new ComplexTypeInfo(
+                token, computeTypeParamOrArg(next, inDeclaration))
+            .computePrefixedType(required);
+      } else if (optional('var', next) &&
+          isOneOf(next.next, const ['<', ',', '>'])) {
+        return new ComplexTypeInfo(
+                token, computeTypeParamOrArg(next, inDeclaration))
+            .computeBuiltinOrVarAsType(required);
+      }
     }
     return noType;
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
index 84d4024..e19d8e3 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
@@ -450,8 +450,8 @@
 
   /// Given a builtin, return the receiver so that parseType will report
   /// an error for the builtin used as a type.
-  TypeInfo computeBuiltinAsType(bool required) {
-    assert(start.type.isBuiltIn);
+  TypeInfo computeBuiltinOrVarAsType(bool required) {
+    assert(start.type.isBuiltIn || optional('var', start));
 
     end = typeArguments.skip(start);
     computeRest(end.next, required);
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 facfdae..5b05fe8 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -896,6 +896,11 @@
       Declaration nearestDeclaration;
       int minDistance = -1;
       do {
+        // [distance] will always be non-negative as we ensure [token] is
+        // always at the beginning of the declaration. The minimum distance
+        // will often be larger than 0, for example, in a class declaration
+        // where [token] will point to `abstract` or `class`, but the
+        // declaration's offset points to the name of the class.
         int distance = declaration.charOffset - offset;
         if (distance >= 0) {
           if (minDistance == -1 || distance < minDistance) {
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 73bb7c4..4874302 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -30,6 +30,7 @@
         messageStaticConstructor,
         messageTypedefNotFunction,
         templateCycleInTypeVariables,
+        templateDirectCycleInTypeVariables,
         templateDuplicatedParameterName,
         templateDuplicatedParameterNameCause,
         templateOperatorMinusParameterMismatch,
@@ -1376,12 +1377,11 @@
               via.add(bound.name);
               bound = typeVariablesByName[bound.bound.name];
             }
-            String involvedString = via.join("', '");
-            addProblem(
-                templateCycleInTypeVariables.withArguments(
-                    builder.name, involvedString),
-                builder.charOffset,
-                builder.name.length);
+            Message message = via.isEmpty
+                ? templateDirectCycleInTypeVariables.withArguments(builder.name)
+                : templateCycleInTypeVariables.withArguments(
+                    builder.name, via.join("', '"));
+            addProblem(message, builder.charOffset, builder.name.length);
           }
         }
       }
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 cd86540..0baa13b 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
@@ -535,11 +535,21 @@
               name, existing, member, charOffset);
         });
     } else if (isDuplicatedDeclaration(existing, declaration)) {
-      addProblem(templateDuplicatedDeclaration.withArguments(name), charOffset,
-          name.length, fileUri,
+      String fullName = name;
+      if (isConstructor) {
+        if (name.isEmpty) {
+          fullName = currentDeclaration.name;
+        } else {
+          fullName = "${currentDeclaration.name}.$name";
+        }
+      }
+      addProblem(templateDuplicatedDeclaration.withArguments(fullName),
+          charOffset, fullName.length, fileUri,
           context: <LocatedMessage>[
-            templateDuplicatedDeclarationCause.withArguments(name).withLocation(
-                existing.fileUri, existing.charOffset, name.length)
+            templateDuplicatedDeclarationCause
+                .withArguments(fullName)
+                .withLocation(
+                    existing.fileUri, existing.charOffset, fullName.length)
           ]);
     }
     return members[name] = declaration;
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 ac9aedb..b7a0016 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -30,8 +30,6 @@
 
 import 'package:kernel/core_types.dart' show CoreTypes;
 
-import 'package:kernel/type_environment.dart' show TypeEnvironment;
-
 import '../../api_prototype/file_system.dart';
 
 import '../../base/instrumentation.dart'
@@ -73,6 +71,7 @@
         templateIllegalMixinDueToConstructorsCause,
         templateInternalProblemUriMissingScheme,
         templateSourceOutlineSummary,
+        templateDirectCyclicClassHierarchy,
         templateUntranslatableUri;
 
 import '../fasta_codes.dart' as fasta_codes;
@@ -584,9 +583,14 @@
                 .toList()
                   ..sort())
             .join("', '");
-        messages[templateCyclicClassHierarchy
-            .withArguments(cls.fullNameForErrors, involvedString)
-            .withLocation(cls.fileUri, cls.charOffset, noLength)] = cls;
+        LocatedMessage message = involvedString.isEmpty
+            ? templateDirectCyclicClassHierarchy
+                .withArguments(cls.fullNameForErrors)
+                .withLocation(cls.fileUri, cls.charOffset, noLength)
+            : templateCyclicClassHierarchy
+                .withArguments(cls.fullNameForErrors, involvedString)
+                .withLocation(cls.fileUri, cls.charOffset, noLength);
+        messages[message] = cls;
       });
 
       // Report all classes involved in a cycle, sorted to ensure stability as
@@ -795,16 +799,9 @@
   }
 
   void handleAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {
-    String name = cls.name;
-    TypeEnvironment env = new TypeEnvironment(coreTypes, hierarchy,
-        strongMode: target.strongMode);
-
-    if (cls.isAnonymousMixin) return;
-
-    if (env.isSubtypeOf(a.asInterfaceType, b.asInterfaceType)) return;
     addProblem(
         templateAmbiguousSupertypes.withArguments(
-            name, a.asInterfaceType, b.asInterfaceType),
+            cls.name, a.asInterfaceType, b.asInterfaceType),
         cls.fileOffset,
         noLength,
         cls.fileUri);
@@ -850,7 +847,8 @@
     assert(hierarchy != null);
     for (SourceClassBuilder builder in sourceClasses) {
       if (builder.library.loader == this) {
-        builder.checkAbstractMembers(coreTypes, hierarchy);
+        builder.checkAbstractMembers(
+            coreTypes, hierarchy, typeInferenceEngine.typeSchemaEnvironment);
       }
     }
     ticker.logMs("Checked abstract members");
@@ -1009,16 +1007,6 @@
         isTopLevel: isTopLevel);
   }
 
-  Expression throwCompileConstantError(Expression error) {
-    return target.backendTarget.throwCompileConstantError(coreTypes, error);
-  }
-
-  Expression buildProblem(Message message, int offset, int length, Uri uri) {
-    String text = target.context
-        .format(message.withLocation(uri, offset, length), Severity.error);
-    return target.backendTarget.buildCompileTimeError(coreTypes, text, offset);
-  }
-
   void recordMessage(Severity severity, Message message, int charOffset,
       int length, Uri fileUri,
       {List<LocatedMessage> context}) {
@@ -1086,6 +1074,8 @@
   }
 }
 
+/// A minimal implementation of dart:core that is sufficient to create an
+/// instance of [CoreTypes] and compile a program.
 const String defaultDartCoreSource = """
 import 'dart:_internal';
 import 'dart:async';
@@ -1141,6 +1131,8 @@
 }
 """;
 
+/// A minimal implementation of dart:async that is sufficient to create an
+/// instance of [CoreTypes] and compile program.
 const String defaultDartAsyncSource = """
 _asyncErrorWrapperHelper(continuation) {}
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
index 22aa02d..5a7e58b 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
@@ -11,7 +11,7 @@
 abstract class InferenceHelper {
   SyntheticExpressionJudgment buildProblem(
       Message message, int charOffset, int length,
-      {List<LocatedMessage> context});
+      {List<LocatedMessage> context, bool suppressMessage});
 
   LocatedMessage checkArgumentsForType(
       FunctionType function, Arguments arguments, int offset);
@@ -21,4 +21,7 @@
 
   Expression wrapInProblem(Expression expression, Message message, int length,
       {List<LocatedMessage> context});
+
+  String constructorNameForDiagnostics(String name,
+      {String className, bool isSuper});
 }
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 6dab19c..2829d66 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
@@ -8,6 +8,7 @@
         DartType,
         DartTypeVisitor,
         DynamicType,
+        Field,
         FunctionType,
         InterfaceType,
         TypeParameter,
@@ -278,9 +279,9 @@
 
   void inferInitializingFormal(VariableDeclaration formal, Constructor parent) {
     if (formal.type == null) {
-      for (ShadowField field in parent.enclosingClass.fields) {
+      for (Field field in parent.enclosingClass.fields) {
         if (field.name.name == formal.name) {
-          if (field.inferenceNode != null) {
+          if (field is ShadowField && field.inferenceNode != null) {
             field.inferenceNode.resolve();
           }
           formal.type = field.type;
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 61560c5..2ad0724 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -35,6 +35,7 @@
         PropertyGet,
         PropertySet,
         ReturnStatement,
+        Statement,
         StaticGet,
         SuperMethodInvocation,
         SuperPropertyGet,
@@ -450,37 +451,28 @@
   Uri get uri;
 
   /// Performs full type inference on the given field initializer.
-  void inferFieldInitializer<Expression, Statement, Initializer, Type>(
-      InferenceHelper helper,
-      DartType declaredType,
+  void inferFieldInitializer(InferenceHelper helper, DartType declaredType,
       kernel.Expression initializer);
 
   /// Performs type inference on the given function body.
-  void inferFunctionBody<Expression, Statement, Initializer, Type>(
-      InferenceHelper helper,
-      DartType returnType,
-      AsyncMarker asyncMarker,
-      Statement body);
+  void inferFunctionBody(InferenceHelper helper, DartType returnType,
+      AsyncMarker asyncMarker, Statement body);
 
   /// Performs type inference on the given constructor initializer.
-  void inferInitializer<Expression, Statement, Initializer, Type>(
-      InferenceHelper helper, kernel.Initializer initializer);
+  void inferInitializer(InferenceHelper helper, kernel.Initializer initializer);
 
   /// Performs type inference on the given metadata annotations.
-  void inferMetadata<Expression, Statement, Initializer, Type>(
+  void inferMetadata(
       InferenceHelper helper, List<kernel.Expression> annotations);
 
   /// Performs type inference on the given metadata annotations keeping the
   /// existing helper if possible.
-  void inferMetadataKeepingHelper<Expression, Statement, Initializer, Type>(
-      List<kernel.Expression> annotations);
+  void inferMetadataKeepingHelper(List<kernel.Expression> annotations);
 
   /// Performs type inference on the given function parameter initializer
   /// expression.
-  void inferParameterInitializer<Expression, Statement, Initializer, Type>(
-      InferenceHelper helper,
-      kernel.Expression initializer,
-      DartType declaredType);
+  void inferParameterInitializer(InferenceHelper helper,
+      kernel.Expression initializer, DartType declaredType);
 }
 
 /// Implementation of [TypeInferrer] which doesn't do any type inference.
@@ -500,35 +492,27 @@
   Uri get uri => null;
 
   @override
-  void inferFieldInitializer<Expression, Statement, Initializer, Type>(
-      InferenceHelper helper,
-      DartType declaredType,
+  void inferFieldInitializer(InferenceHelper helper, DartType declaredType,
       kernel.Expression initializer) {}
 
   @override
-  void inferFunctionBody<Expression, Statement, Initializer, Type>(
-      InferenceHelper helper,
-      DartType returnType,
-      AsyncMarker asyncMarker,
-      Statement body) {}
+  void inferFunctionBody(InferenceHelper helper, DartType returnType,
+      AsyncMarker asyncMarker, Statement body) {}
 
   @override
-  void inferInitializer<Expression, Statement, Initializer, Type>(
+  void inferInitializer(
       InferenceHelper helper, kernel.Initializer initializer) {}
 
   @override
-  void inferMetadata<Expression, Statement, Initializer, Type>(
+  void inferMetadata(
       InferenceHelper helper, List<kernel.Expression> annotations) {}
 
   @override
-  void inferMetadataKeepingHelper<Expression, Statement, Initializer, Type>(
-      List<kernel.Expression> annotations) {}
+  void inferMetadataKeepingHelper(List<kernel.Expression> annotations) {}
 
   @override
-  void inferParameterInitializer<Expression, Statement, Initializer, Type>(
-      InferenceHelper helper,
-      kernel.Expression initializer,
-      DartType declaredType) {}
+  void inferParameterInitializer(InferenceHelper helper,
+      kernel.Expression initializer, DartType declaredType) {}
 }
 
 /// Derived class containing generic implementations of [TypeInferrer].
@@ -593,6 +577,22 @@
   /// inference.
   TypePromoter get typePromoter;
 
+  bool isDoubleContext(DartType typeContext) {
+    // A context is a double context if double is assignable to it but int is
+    // not.  That is the type context is a double context if it is:
+    //   * double
+    //   * FutureOr<T> where T is a double context
+    //
+    // We check directly, rather than using isAssignable because it's simpler.
+    while (typeContext is InterfaceType &&
+        typeContext.classNode == coreTypes.futureOrClass &&
+        typeContext.typeArguments.isNotEmpty) {
+      InterfaceType type = typeContext;
+      typeContext = type.typeArguments.first;
+    }
+    return typeContext == coreTypes.doubleClass.rawType;
+  }
+
   bool isAssignable(DartType expectedType, DartType actualType) {
     return typeSchemaEnvironment.isSubtypeOf(expectedType, actualType) ||
         typeSchemaEnvironment.isSubtypeOf(actualType, expectedType);
@@ -1130,14 +1130,12 @@
   ///
   /// Derived classes should override this method with logic that dispatches on
   /// the expression type and calls the appropriate specialized "infer" method.
-  DartType inferExpression<Expression, Statement, Initializer, Type>(
+  DartType inferExpression(
       kernel.Expression expression, DartType typeContext, bool typeNeeded,
       {bool isVoidAllowed});
 
   @override
-  void inferFieldInitializer<Expression, Statement, Initializer, Type>(
-      InferenceHelper helper,
-      DartType declaredType,
+  void inferFieldInitializer(InferenceHelper helper, DartType declaredType,
       kernel.Expression initializer) {
     assert(closureContext == null);
     this.helper = helper;
@@ -1156,15 +1154,11 @@
   ///
   /// Derived classes should provide an implementation that calls
   /// [inferExpression] for the given [field]'s initializer expression.
-  DartType inferFieldTopLevel<Expression, Statement, Initializer, Type>(
-      ShadowField field, bool typeNeeded);
+  DartType inferFieldTopLevel(ShadowField field, bool typeNeeded);
 
   @override
-  void inferFunctionBody<Expression, Statement, Initializer, Type>(
-      InferenceHelper helper,
-      DartType returnType,
-      AsyncMarker asyncMarker,
-      Statement body) {
+  void inferFunctionBody(InferenceHelper helper, DartType returnType,
+      AsyncMarker asyncMarker, Statement body) {
     assert(closureContext == null);
     this.helper = helper;
     closureContext = new ClosureContext(this, asyncMarker, returnType, false);
@@ -1175,17 +1169,12 @@
 
   /// Performs the type inference steps that are shared by all kinds of
   /// invocations (constructors, instance methods, and static methods).
-  ExpressionInferenceResult
-      inferInvocation<Expression, Statement, Initializer, Type>(
-          DartType typeContext,
-          int offset,
-          FunctionType calleeType,
-          DartType returnType,
-          ArgumentsJudgment arguments,
-          {bool isOverloadedArithmeticOperator: false,
-          DartType receiverType,
-          bool skipTypeArgumentInference: false,
-          bool isConst: false}) {
+  ExpressionInferenceResult inferInvocation(DartType typeContext, int offset,
+      FunctionType calleeType, DartType returnType, ArgumentsJudgment arguments,
+      {bool isOverloadedArithmeticOperator: false,
+      DartType receiverType,
+      bool skipTypeArgumentInference: false,
+      bool isConst: false}) {
     lastInferredSubstitution = null;
     lastCalleeType = null;
     var calleeTypeParameters = calleeType.typeParameters;
@@ -1355,12 +1344,8 @@
     return new ExpressionInferenceResult(null, inferredType);
   }
 
-  ExpressionInferenceResult
-      inferLocalFunction<Expression, Statement, Initializer, Type>(
-          FunctionNode function,
-          DartType typeContext,
-          int fileOffset,
-          DartType returnContext) {
+  ExpressionInferenceResult inferLocalFunction(FunctionNode function,
+      DartType typeContext, int fileOffset, DartType returnContext) {
     bool hasImplicitReturnType = false;
     if (returnContext == null) {
       hasImplicitReturnType = true;
@@ -1503,7 +1488,7 @@
   }
 
   @override
-  void inferMetadata<Expression, Statement, Initializer, Type>(
+  void inferMetadata(
       InferenceHelper helper, List<kernel.Expression> annotations) {
     if (annotations != null) {
       this.helper = helper;
@@ -1513,8 +1498,7 @@
   }
 
   @override
-  void inferMetadataKeepingHelper<Expression, Statement, Initializer, Type>(
-      List<kernel.Expression> annotations) {
+  void inferMetadataKeepingHelper(List<kernel.Expression> annotations) {
     if (annotations != null) {
       // Place annotations in a temporary list literal so that they will have a
       // parent.  This is necessary in case any of the annotations need to get
@@ -1532,18 +1516,17 @@
 
   /// Performs the core type inference algorithm for method invocations (this
   /// handles both null-aware and non-null-aware method invocations).
-  ExpressionInferenceResult
-      inferMethodInvocation<Expression, Statement, Initializer, Type>(
-          kernel.Expression expression,
-          kernel.Expression receiver,
-          int fileOffset,
-          bool isImplicitCall,
-          DartType typeContext,
-          {VariableDeclaration receiverVariable,
-          MethodInvocation desugaredInvocation,
-          Object interfaceMember,
-          Name methodName,
-          Arguments arguments}) {
+  ExpressionInferenceResult inferMethodInvocation(
+      kernel.Expression expression,
+      kernel.Expression receiver,
+      int fileOffset,
+      bool isImplicitCall,
+      DartType typeContext,
+      {VariableDeclaration receiverVariable,
+      MethodInvocation desugaredInvocation,
+      Object interfaceMember,
+      Name methodName,
+      Arguments arguments}) {
     // First infer the receiver so we can look up the method that was invoked.
     var receiverType = receiver == null
         ? thisType
@@ -1606,10 +1589,8 @@
   }
 
   @override
-  void inferParameterInitializer<Expression, Statement, Initializer, Type>(
-      InferenceHelper helper,
-      kernel.Expression initializer,
-      DartType declaredType) {
+  void inferParameterInitializer(InferenceHelper helper,
+      kernel.Expression initializer, DartType declaredType) {
     assert(closureContext == null);
     this.helper = helper;
     assert(declaredType != null);
@@ -1621,7 +1602,7 @@
 
   /// Performs the core type inference algorithm for property gets (this handles
   /// both null-aware and non-null-aware property gets).
-  void inferPropertyGet<Expression, Statement, Initializer, Type>(
+  void inferPropertyGet(
       ExpressionJudgment expression,
       ExpressionJudgment receiver,
       int fileOffset,
@@ -1682,8 +1663,7 @@
   ///
   /// Derived classes should override this method with logic that dispatches on
   /// the statement type and calls the appropriate specialized "infer" method.
-  void inferStatement<Expression, Statement, Initializer, Type>(
-      Statement statement);
+  void inferStatement(Statement statement);
 
   /// Performs the type inference steps necessary to instantiate a tear-off
   /// (if necessary).
@@ -1932,26 +1912,38 @@
     if (mixinSupertype.typeArguments.isEmpty) {
       // The supertype constraint isn't generic; it doesn't constrain anything.
     } else if (mixinSupertype.classNode.isAnonymousMixin) {
-      // We had a mixin M<X0, ..., Xn> with a superclass constraint of the form
-      // S0 with M0 where S0 and M0 each possibly have type arguments.  That has
-      // been compiled a named mixin application class of the form
+      // We have either a mixin declaration `mixin M<X0, ..., Xn> on S0, S1` or
+      // a VM-style super mixin `abstract class M<X0, ..., Xn> extends S0 with
+      // S1` where S0 and S1 are superclass constraints that possibly have type
+      // arguments.
       //
-      // class S0&M0<...> = S0 with M0;
-      // class M<X0, ..., Xn> extends S0&M0<...>
+      // It has been compiled by naming the superclass to either:
       //
-      // where the type parameters of S0&M0 are the X0, ..., Xn that occured
-      // free in S0 and M0.  Treat S0 and M0 as separate supertype constraints
-      // by recursively calling this algorithm.
+      // abstract class S0&S1<...> extends Object implements S0, S1 {}
+      // abstract class M<X0, ..., Xn> extends S0&S1<...> ...
       //
-      // In some back ends (e.g., the Dart VM) the mixin application classes
-      // themselves are all eliminated by translating them to normal classes.
-      // In that case, the mixin appears as the only interface in the
-      // introduced class:
+      // for a mixin declaration, or else:
       //
-      // class S0&M0<...> extends S0 implements M0 {}
+      // abstract class S0&S1<...> = S0 with S1;
+      // 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
+      // supertype constraints by recursively calling this algorithm.
+      //
+      // In the Dart VM the mixin application classes themselves are all
+      // eliminated by translating them to normal classes.  In that case, the
+      // mixin appears as the only interface in the introduced class.  We
+      // support three forms for the superclass constraints:
+      //
+      // abstract class S0&S1<...> extends Object implements S0, S1 {}
+      // abstract class S0&S1<...> = S0 with S1;
+      // abstract class S0&S1<...> extends S0 implements S1 {}
       var mixinSuperclass = mixinSupertype.classNode;
       if (mixinSuperclass.mixedInType == null &&
-          mixinSuperclass.implementedTypes.length != 1) {
+          mixinSuperclass.implementedTypes.length != 1 &&
+          (mixinSuperclass.superclass != coreTypes.objectClass ||
+              mixinSuperclass.implementedTypes.length != 2)) {
         unexpected(
             'Compiler-generated mixin applications have a mixin or else '
             'implement exactly one type',
@@ -1961,11 +1953,21 @@
             mixinSuperclass.fileUri);
       }
       var substitution = Substitution.fromSupertype(mixinSupertype);
-      var s0 = substitution.substituteSupertype(mixinSuperclass.supertype);
-      var m0 = substitution.substituteSupertype(mixinSuperclass.mixedInType ??
-          mixinSuperclass.implementedTypes.first);
+      Supertype s0, s1;
+      if (mixinSuperclass.implementedTypes.length == 2) {
+        s0 = mixinSuperclass.implementedTypes[0];
+        s1 = mixinSuperclass.implementedTypes[1];
+      } else if (mixinSuperclass.implementedTypes.length == 1) {
+        s0 = mixinSuperclass.supertype;
+        s1 = mixinSuperclass.implementedTypes.first;
+      } else {
+        s0 = mixinSuperclass.supertype;
+        s1 = mixinSuperclass.mixedInType;
+      }
+      s0 = substitution.substituteSupertype(s0);
+      s1 = substitution.substituteSupertype(s1);
       generateConstraints(hierarchy, mixinClass, baseType, s0);
-      generateConstraints(hierarchy, mixinClass, baseType, m0);
+      generateConstraints(hierarchy, mixinClass, baseType, s1);
     } else {
       // Find the type U0 which is baseType as an instance of mixinSupertype's
       // class.
@@ -2028,11 +2030,10 @@
           return p;
         }
         assert(constraint == null || constraint.upper == constraint.lower);
+        bool exact =
+            constraint != null && constraint.upper != const UnknownType();
         return new TypeParameter(
-            p.name,
-            constraint == null || constraint.upper == const UnknownType()
-                ? p.bound
-                : constraint.upper);
+            p.name, exact ? constraint.upper : p.bound, p.defaultType);
       }).toList();
       // Bounds might mention the mixin class's type parameters so we have to
       // substitute them before calling instantiate to bounds.
@@ -2053,7 +2054,7 @@
 }
 
 /// The result of an expression inference.
-class ExpressionInferenceResult<Expression> {
+class ExpressionInferenceResult {
   final Expression expression;
   final DartType type;
 
diff --git a/pkg/front_end/lib/src/incremental/file_state.dart b/pkg/front_end/lib/src/incremental/file_state.dart
deleted file mode 100644
index 4d84961..0000000
--- a/pkg/front_end/lib/src/incremental/file_state.dart
+++ /dev/null
@@ -1,614 +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 'dart:async';
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'package:convert/convert.dart';
-import 'package:crypto/crypto.dart';
-import 'package:kernel/target/targets.dart';
-
-import '../api_prototype/byte_store.dart';
-import '../api_prototype/file_system.dart';
-import '../base/api_signature.dart';
-import '../base/resolve_relative_uri.dart';
-import '../dependency_walker.dart' as graph;
-import '../fasta/uri_translator.dart';
-import 'format.dart';
-import 'unlinked_unit.dart';
-
-/// This function is called for each newly discovered file, and the returned
-/// [Future] is awaited before reading the file content.
-typedef Future<Null> NewFileFn(Uri uri);
-
-/// Information about a file being compiled, explicitly or implicitly.
-///
-/// It provides a consistent view on its properties.
-///
-/// The properties are not guaranteed to represent the most recent state
-/// of the file system. To update the file to the most recent state, [refresh]
-/// should be called.
-class FileState {
-  final FileSystemState _fsState;
-
-  /// The absolute URI of the file.
-  final Uri uri;
-
-  /// The UTF8 bytes of the [uri].
-  final List<int> uriBytes;
-
-  /// The resolved URI of the file in the file system.
-  final Uri fileUri;
-
-  bool _exists;
-  List<int> _content;
-  List<int> _contentHash;
-  List<int> _lineStarts;
-  bool _hasMixinApplication;
-  List<int> _apiSignature;
-
-  List<FileState> _importedLibraries;
-  List<FileState> _exportedLibraries;
-  List<FileState> _partFiles;
-
-  /// If this file is a part, the [FileState] of its library.
-  FileState _libraryFile;
-
-  Set<FileState> _directReferencedFiles = new Set<FileState>();
-  List<FileState> _directReferencedLibraries = <FileState>[];
-  Set<FileState> _transitiveFiles;
-  List<int> _signature;
-
-  /// This flag is set to `true` during the mark phase of garbage collection
-  /// and set back to `false` for survived instances.
-  bool _gcMarked = false;
-
-  FileState._(this._fsState, this.uri, this.fileUri)
-      : uriBytes = utf8.encode(uri.toString());
-
-  /// The MD5 signature of the file API as a byte array.
-  /// It depends on all non-comment tokens outside the block bodies.
-  List<int> get apiSignature => _apiSignature;
-
-  /// The content of the file.
-  List<int> get content => _content;
-
-  /// The MD5 hash of the [content].
-  List<int> get contentHash => _contentHash;
-
-  /// Libraries that this library file directly imports or exports.
-  List<FileState> get directReferencedLibraries => _directReferencedLibraries;
-
-  /// Whether the file exists.
-  bool get exists => _exists;
-
-  /// The list of the libraries exported by this library.
-  List<FileState> get exportedLibraries => _exportedLibraries;
-
-  /// Return the [fileUri] string.
-  String get fileUriStr => fileUri.toString();
-
-  @override
-  int get hashCode => uri.hashCode;
-
-  /// Whether the file has a mixin application.
-  bool get hasMixinApplication => _hasMixinApplication;
-
-  /// Whether a unit of the library has a mixin application.
-  bool get hasMixinApplicationLibrary {
-    return _hasMixinApplication ||
-        _partFiles.any((part) => part._hasMixinApplication);
-  }
-
-  /// The list of the libraries imported by this library.
-  List<FileState> get importedLibraries => _importedLibraries;
-
-  /// Return the line starts in the [content].
-  List<int> get lineStarts => _lineStarts;
-
-  /// The list of files this library file references as parts.
-  List<FileState> get partFiles => _partFiles;
-
-  /// Return the resolution signature of the library. It depends on API
-  /// signatures of transitive files, and the content of the library files.
-  List<int> get signature {
-    if (_signature == null) {
-      var signatureBuilder = new ApiSignature();
-      signatureBuilder.addBytes(_fsState._salt);
-
-      Set<FileState> transitiveFiles = this.transitiveFiles;
-      signatureBuilder.addInt(transitiveFiles.length);
-
-      // Append API signatures of transitive files.
-      for (var file in transitiveFiles) {
-        signatureBuilder.addBytes(file.uriBytes);
-        signatureBuilder.addBytes(file.apiSignature);
-      }
-
-      // Append content hashes of the library and part.
-      signatureBuilder.addBytes(contentHash);
-      for (var part in partFiles) {
-        signatureBuilder.addBytes(part.contentHash);
-      }
-
-      // Finalize the signature.
-      _signature = signatureBuilder.toByteList();
-    }
-    return _signature;
-  }
-
-  /// Return the hex string version of [signature].
-  String get signatureStr => hex.encode(signature);
-
-  /// Return topologically sorted cycles of dependencies for this library.
-  List<LibraryCycle> get topologicalOrder {
-    var libraryWalker = new _LibraryWalker();
-    libraryWalker.walk(libraryWalker.getNode(this));
-    return libraryWalker.topologicallySortedCycles;
-  }
-
-  /// Return the set of transitive files - the file itself and all of the
-  /// directly or indirectly referenced files.
-  Set<FileState> get transitiveFiles {
-    if (_transitiveFiles == null) {
-      _transitiveFiles = new Set<FileState>.identity();
-
-      void appendReferenced(FileState file) {
-        if (_transitiveFiles.add(file)) {
-          file._directReferencedFiles.forEach(appendReferenced);
-        }
-      }
-
-      appendReferenced(this);
-    }
-    return _transitiveFiles;
-  }
-
-  /// Return the [uri] string.
-  String get uriStr => uri.toString();
-
-  @override
-  bool operator ==(Object other) {
-    return other is FileState && other.uri == uri;
-  }
-
-  /// Read the file content and ensure that all of the file properties are
-  /// consistent with the read content, including all its dependencies.
-  ///
-  /// Return `true` if the API signature changed since the last refresh.
-  Future<bool> refresh() async {
-    // Read the content.
-    try {
-      FileSystemEntity entry = _fsState.fileSystem.entityForUri(fileUri);
-      _content = await entry.readAsBytes();
-      _exists = true;
-    } catch (_) {
-      _content = new Uint8List(0);
-      _exists = false;
-    }
-
-    // Compute the content hash.
-    _contentHash = md5.convert(_content).bytes;
-
-    // Compute the line starts.
-    _lineStarts = <int>[0];
-    for (int i = 0; i < _content.length; i++) {
-      if (_content[i] == 0x0A) {
-        _lineStarts.add(i + 1);
-      }
-    }
-
-    // Prepare bytes of the unlinked unit - existing or new.
-    List<int> unlinkedBytes;
-    {
-      String unlinkedKey = hex.encode(_contentHash) + '.unlinked';
-      unlinkedBytes = _fsState._byteStore.get(unlinkedKey);
-      if (unlinkedBytes == null) {
-        var builder = computeUnlinkedUnit(_fsState._salt, _content);
-        unlinkedBytes = builder.toBytes();
-        _fsState._byteStore.put(unlinkedKey, unlinkedBytes);
-      }
-    }
-
-    // Read the unlinked unit.
-    UnlinkedUnit unlinkedUnit = new UnlinkedUnit(unlinkedBytes);
-    _hasMixinApplication = unlinkedUnit.hasMixinApplication;
-
-    // Prepare API signature.
-    List<int> newApiSignature = unlinkedUnit.apiSignature;
-    bool apiSignatureChanged = _apiSignature != null &&
-        !_equalByteLists(_apiSignature, newApiSignature);
-    _apiSignature = newApiSignature;
-
-    // The resolution signature of the library changed.
-    (_libraryFile ?? this)._signature = null;
-
-    // The existing parts might be not parts anymore.
-    if (_partFiles != null) {
-      for (var part in _partFiles) {
-        part._libraryFile = null;
-      }
-    }
-
-    // Build the graph.
-    _importedLibraries = <FileState>[];
-    _exportedLibraries = <FileState>[];
-    _partFiles = <FileState>[];
-    {
-      FileState coreFile = await _getFileForRelativeUri('dart:core');
-      // TODO(scheglov) add error handling
-      if (coreFile != null) {
-        _importedLibraries.add(coreFile);
-      }
-    }
-    for (var import_ in unlinkedUnit.imports) {
-      FileState file = await _getFileForRelativeUri(import_.uri);
-      if (file != null) {
-        _importedLibraries.add(file);
-      }
-    }
-    await _addTargetExtraRequiredLibraries();
-    for (var export_ in unlinkedUnit.exports) {
-      FileState file = await _getFileForRelativeUri(export_.uri);
-      if (file != null) {
-        _exportedLibraries.add(file);
-      }
-    }
-    for (var part_ in unlinkedUnit.parts) {
-      FileState file = await _getFileForRelativeUri(part_);
-      if (file != null) {
-        _partFiles.add(file);
-        file._libraryFile = this;
-      }
-    }
-
-    // Compute referenced files.
-    var oldDirectReferencedFiles = _directReferencedFiles;
-    _directReferencedFiles = new Set<FileState>()
-      ..addAll(_importedLibraries)
-      ..addAll(_exportedLibraries)
-      ..addAll(_partFiles);
-    _directReferencedLibraries = (new Set<FileState>()
-          ..addAll(_importedLibraries)
-          ..addAll(_exportedLibraries))
-        .toList();
-
-    // If the set of directly referenced files of this file is changed,
-    // then the transitive sets of files that include this file are also
-    // changed. Reset these transitive sets.
-    if (_directReferencedFiles.length != oldDirectReferencedFiles.length ||
-        !_directReferencedFiles.containsAll(oldDirectReferencedFiles)) {
-      for (var file in _fsState._uriToFile.values) {
-        if (file._transitiveFiles != null &&
-            file._transitiveFiles.contains(this)) {
-          file._transitiveFiles = null;
-          file._signature = null;
-        }
-      }
-    }
-
-    // Return whether the API signature changed.
-    return apiSignatureChanged;
-  }
-
-  @override
-  String toString() {
-    if (uri.scheme == 'file') return uri.path;
-    return uri.toString();
-  }
-
-  /// Fasta unconditionally loads extra libraries based on the target.  In order
-  /// to be able to serve them using the file system view, pretend that all of
-  /// them were imported into `dart:core`.
-  /// TODO(scheglov,sigmund): remove this implicit import, instead make fasta
-  /// and IKG aware of extra code that needs to be loaded.
-  Future<Null> _addTargetExtraRequiredLibraries() async {
-    if (uri.toString() != 'dart:core') return;
-    for (String uri in _fsState.target.extraRequiredLibraries) {
-      FileState file = await _getFileForRelativeUri(uri);
-      // TODO(scheglov) add error handling
-      if (file != null) {
-        _importedLibraries.add(file);
-      }
-    }
-  }
-
-  /// Return the [FileState] for the given [relativeUri] or `null` if the URI
-  /// cannot be parsed, cannot correspond any file, etc.
-  Future<FileState> _getFileForRelativeUri(String relativeUri) async {
-    if (relativeUri.isEmpty) return null;
-
-    // Resolve the relative URI into absolute.
-    // The result is either:
-    //   1) The absolute file URI.
-    //   2) The absolute non-file URI, e.g. `package:foo/foo.dart`.
-    Uri absoluteUri;
-    try {
-      absoluteUri = resolveRelativeUri(uri, Uri.parse(relativeUri));
-    } on FormatException {
-      return null;
-    }
-
-    return await _fsState.getFile(absoluteUri);
-  }
-
-  /**
-   * Return `true` if the given byte lists are equal.
-   */
-  static bool _equalByteLists(List<int> a, List<int> b) {
-    if (a == null) {
-      return b == null;
-    } else if (b == null) {
-      return false;
-    }
-    if (a.length != b.length) {
-      return false;
-    }
-    for (int i = 0; i < a.length; i++) {
-      if (a[i] != b[i]) {
-        return false;
-      }
-    }
-    return true;
-  }
-}
-
-/// Information about known file system state.
-class FileSystemState {
-  final ByteStore _byteStore;
-  final FileSystem fileSystem;
-  final Target target;
-  final UriTranslator uriTranslator;
-  final List<int> _salt;
-  final NewFileFn _newFileFn;
-
-  _FileSystemView _fileSystemView;
-
-  /// Mapping from import URIs to corresponding [FileState]s. For example, this
-  /// may contain an entry for `dart:core`.
-  final Map<Uri, FileState> _uriToFile = {};
-
-  /// Mapping from file URIs to corresponding [FileState]s.
-  ///
-  /// This map should only contain URIs understood by [fileSystem], which
-  /// excludes `package:*` and `dart:*` URIs.
-  final Map<Uri, FileState> _fileUriToFile = {};
-
-  /// The set of absolute URIs with the `dart` scheme that should be skipped.
-  /// We do this when we use SDK outline instead of compiling SDK sources.
-  final Set<Uri> skipSdkLibraries = new Set<Uri>();
-
-  FileSystemState(this._byteStore, this.fileSystem, this.target,
-      this.uriTranslator, this._salt, this._newFileFn);
-
-  /// Return the [FileSystem] that is backed by this [FileSystemState].  The
-  /// files in this [FileSystem] always have the same content as the
-  /// corresponding [FileState]s, thus avoiding race conditions when a file
-  /// is updated on the actual file system.
-  FileSystem get fileSystemView {
-    return _fileSystemView ??= new _FileSystemView(this);
-  }
-
-  /// The [fileSystem]'s URIs of all files currently tracked by this instance.
-  Iterable<Uri> get fileUris => _fileUriToFile.keys;
-
-  /// Perform mark and sweep garbage collection of [FileState]s.
-  /// Return [FileState]s that became garbage.
-  List<FileState> gc(Uri entryPoint) {
-    void mark(FileState file) {
-      if (!file._gcMarked) {
-        file._gcMarked = true;
-        file._directReferencedFiles.forEach(mark);
-      }
-    }
-
-    var file = _uriToFile[entryPoint];
-    if (file == null) return const [];
-
-    mark(file);
-
-    var filesToRemove = <FileState>[];
-    var urisToRemove = new Set<Uri>();
-    var fileUrisToRemove = new Set<Uri>();
-    for (var file in _uriToFile.values) {
-      if (file._gcMarked) {
-        file._gcMarked = false;
-      } else {
-        filesToRemove.add(file);
-        urisToRemove.add(file.uri);
-        fileUrisToRemove.add(file.fileUri);
-      }
-    }
-
-    urisToRemove.forEach(_uriToFile.remove);
-    fileUrisToRemove.forEach(_fileUriToFile.remove);
-    return filesToRemove;
-  }
-
-  /// Return the [FileState] for the given [absoluteUri], or `null` if the
-  /// [absoluteUri] cannot be resolved into a file URI.
-  ///
-  /// The returned file has the last known state since it was last refreshed.
-  Future<FileState> getFile(Uri absoluteUri) async {
-    // We don't need to process SDK libraries if we have SDK outline.
-    if (skipSdkLibraries.contains(absoluteUri)) {
-      return null;
-    }
-
-    // Resolve the absolute URI into the absolute file URI.
-    Uri fileUri;
-    var scheme = absoluteUri.scheme;
-    if (scheme == 'package' || scheme == 'dart') {
-      fileUri = uriTranslator.translate(absoluteUri);
-      if (fileUri == null) return null;
-    } else {
-      fileUri = absoluteUri;
-    }
-
-    FileState file = _uriToFile[absoluteUri];
-    if (file == null) {
-      file = new FileState._(this, absoluteUri, fileUri);
-      _uriToFile[absoluteUri] = file;
-      _fileUriToFile[fileUri] = file;
-
-      // Notify the function about a new file.
-      if (_newFileFn != null) {
-        await _newFileFn(fileUri);
-      }
-
-      // Build the sub-graph of the file.
-      await file.refresh();
-    }
-    return file;
-  }
-
-  /// Return the [FileState] for the given [fileUri], or `null` if the
-  /// [fileUri] does not yet correspond to any referenced [FileState].
-  FileState getFileByFileUri(Uri fileUri) => _fileUriToFile[fileUri];
-
-  /// Return the [FileState] for the given [absoluteUri], or `null` if
-  /// the file have not yet been created for this URI.
-  FileState getFileOrNull(Uri absoluteUri) {
-    return _uriToFile[absoluteUri];
-  }
-}
-
-/// List of libraries that reference each other, so form a cycle.
-class LibraryCycle {
-  final List<FileState> libraries = <FileState>[];
-
-  /// The cycles this cycle directly depends on.
-  final Set<LibraryCycle> directDependencies = new Set<LibraryCycle>();
-
-  /// The cycles that directly import or export this cycle.
-  final List<LibraryCycle> directUsers = <LibraryCycle>[];
-
-  bool get _isForVm {
-    return libraries.any((l) => l.uri.toString().endsWith('dart:_vmservice'));
-  }
-
-  @override
-  String toString() {
-    if (_isForVm) {
-      return '[core + vm]';
-    }
-    return '[' + libraries.join(', ') + ']';
-  }
-}
-
-/// [FileSystemState] based implementation of [FileSystem].
-/// It provides a consistent view on the known file system state.
-class _FileSystemView implements FileSystem {
-  final FileSystemState fsState;
-
-  _FileSystemView(this.fsState);
-
-  @override
-  FileSystemEntity entityForUri(Uri uri) {
-    FileState file = fsState._fileUriToFile[uri];
-    return new _FileSystemViewEntry(uri, file);
-  }
-}
-
-/// [FileSystemState] based implementation of [FileSystemEntity].
-class _FileSystemViewEntry implements FileSystemEntity {
-  @override
-  final Uri uri;
-
-  final FileState file;
-
-  _FileSystemViewEntry(this.uri, this.file);
-
-  @override
-  Future<bool> exists() async => _shouldNotBeQueried();
-
-  @override
-  Future<List<int>> readAsBytes() async {
-    if (file == null) {
-      throw new FileSystemException(uri, 'File $uri does not exist.');
-    }
-    return file.content;
-  }
-
-  @override
-  Future<String> readAsString() async => _shouldNotBeQueried();
-
-  /// [_FileSystemViewEntry] is used by the incremental kernel generator to
-  /// provide Fasta with a consistent, race condition free view of the files
-  /// constituting the project.  It should only need to be used for reading
-  /// file contents.
-  dynamic _shouldNotBeQueried() {
-    throw new StateError('The method should not be invoked.');
-  }
-}
-
-/// Node in [_LibraryWalker].
-class _LibraryNode extends graph.Node<_LibraryNode> {
-  final _LibraryWalker walker;
-  final FileState file;
-
-  @override
-  bool isEvaluated = false;
-
-  _LibraryNode(this.walker, this.file);
-
-  @override
-  List<_LibraryNode> computeDependencies() {
-    return file.directReferencedLibraries.map(walker.getNode).toList();
-  }
-}
-
-/// Helper that organizes dependencies of a library into topologically
-/// sorted [LibraryCycle]s.
-class _LibraryWalker extends graph.DependencyWalker<_LibraryNode> {
-  final nodesOfFiles = <FileState, _LibraryNode>{};
-  final fileToCycleMap = <FileState, LibraryCycle>{};
-  final topologicallySortedCycles = <LibraryCycle>[];
-
-  @override
-  void evaluate(_LibraryNode v) {
-    evaluateScc([v]);
-  }
-
-  @override
-  void evaluateScc(List<_LibraryNode> scc) {
-    var cycle = new LibraryCycle();
-
-    // Compute direct dependencies.
-    for (var node in scc) {
-      var file = node.file;
-      for (var importedLibrary in file.importedLibraries) {
-        var importedCycle = fileToCycleMap[importedLibrary];
-        if (importedCycle != null) {
-          cycle.directDependencies.add(importedCycle);
-        }
-      }
-      for (var exportedLibrary in file.exportedLibraries) {
-        var exportedCycle = fileToCycleMap[exportedLibrary];
-        if (exportedCycle != null) {
-          cycle.directDependencies.add(exportedCycle);
-        }
-      }
-    }
-
-    // Register this cycle as a direct user of the direct dependencies.
-    for (var directDependency in cycle.directDependencies) {
-      directDependency.directUsers.add(cycle);
-    }
-
-    // Fill the cycle with libraries.
-    for (var node in scc) {
-      node.isEvaluated = true;
-      cycle.libraries.add(node.file);
-      fileToCycleMap[node.file] = cycle;
-    }
-
-    topologicallySortedCycles.add(cycle);
-  }
-
-  _LibraryNode getNode(FileState file) {
-    return nodesOfFiles.putIfAbsent(file, () => new _LibraryNode(this, file));
-  }
-}
diff --git a/pkg/front_end/lib/src/incremental/format.dart b/pkg/front_end/lib/src/incremental/format.dart
deleted file mode 100644
index 20d1a0e..0000000
--- a/pkg/front_end/lib/src/incremental/format.dart
+++ /dev/null
@@ -1,318 +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 'dart:typed_data' show Uint8List;
-
-import '../base/flat_buffers.dart' as fb;
-
-/// Unlinked information about a `show` or `hide` combinator in an import or
-/// export directive.
-abstract class UnlinkedCombinator {
-  factory UnlinkedCombinator(List<int> bytes) {
-    fb.BufferContext rootRef = new fb.BufferContext.fromBytes(bytes);
-    return const _UnlinkedCombinatorReader().read(rootRef, 0);
-  }
-
-  /// Whether a `show` combinator.
-  bool get isShow;
-
-  /// List of names which are shown or hidden.
-  /// Empty if this is a `show` combinator.
-  List<String> get names;
-}
-
-/// Builder of [UnlinkedCombinator]s.
-class UnlinkedCombinatorBuilder {
-  final bool _isShow;
-  final List<String> _names;
-
-  UnlinkedCombinatorBuilder({bool isShow, List<String> names})
-      : _isShow = isShow,
-        _names = names;
-
-  /// Finish building, and store into the [fbBuilder].
-  fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_names;
-    if (!(_names == null || _names.isEmpty)) {
-      offset_names = fbBuilder
-          .writeList(_names.map((b) => fbBuilder.writeString(b)).toList());
-    }
-    fbBuilder.startTable();
-    if (_isShow == true) {
-      fbBuilder.addBool(0, _isShow);
-    }
-    if (offset_names != null) {
-      fbBuilder.addOffset(1, offset_names);
-    }
-    return fbBuilder.endTable();
-  }
-
-  Uint8List toBytes() {
-    fb.Builder fbBuilder = new fb.Builder();
-    fb.Offset offset = finish(fbBuilder);
-    return fbBuilder.finish(offset);
-  }
-}
-
-/// Unlinked summary information about an import, export or part directive.
-abstract class UnlinkedNamespaceDirective {
-  factory UnlinkedNamespaceDirective(List<int> bytes) {
-    fb.BufferContext rootRef = new fb.BufferContext.fromBytes(bytes);
-    return const _UnlinkedNamespaceDirectiveReader().read(rootRef, 0);
-  }
-
-  /// Combinators contained in the directive.
-  List<UnlinkedCombinator> get combinators;
-
-  /// URI used in the directive.
-  String get uri;
-}
-
-/// Builder of [UnlinkedNamespaceDirective]s.
-class UnlinkedNamespaceDirectiveBuilder {
-  final String _uri;
-  final List<UnlinkedCombinatorBuilder> _combinators;
-
-  UnlinkedNamespaceDirectiveBuilder(
-      {String uri, List<UnlinkedCombinatorBuilder> combinators})
-      : _uri = uri,
-        _combinators = combinators;
-
-  /// Finish building, and store into the [fbBuilder].
-  fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_uri;
-    fb.Offset offset_combinators;
-    if (!(_uri == null || _uri.isEmpty)) {
-      offset_uri = fbBuilder.writeString(_uri);
-    }
-    if (!(_combinators == null || _combinators.isEmpty)) {
-      offset_combinators = fbBuilder
-          .writeList(_combinators.map((b) => b.finish(fbBuilder)).toList());
-    }
-    fbBuilder.startTable();
-    fbBuilder.addOffset(0, offset_uri);
-    fbBuilder.addOffset(1, offset_combinators);
-    return fbBuilder.endTable();
-  }
-
-  Uint8List toBytes() {
-    fb.Builder fbBuilder = new fb.Builder();
-    fb.Offset offset = finish(fbBuilder);
-    return fbBuilder.finish(offset);
-  }
-}
-
-abstract class UnlinkedUnit {
-  factory UnlinkedUnit(List<int> bytes) {
-    fb.BufferContext rootRef = new fb.BufferContext.fromBytes(bytes);
-    return const _UnlinkedUnitReader().read(rootRef, 0);
-  }
-
-  /// API signature of the unit.
-  /// It depends on all non-comment tokens outside the block bodies.
-  List<int> get apiSignature;
-
-  /// Export directives in the compilation unit.
-  List<UnlinkedNamespaceDirective> get exports;
-
-  /// Whether the unit has a mixin application.
-  bool get hasMixinApplication;
-
-  /// Import directives in the compilation unit.
-  List<UnlinkedNamespaceDirective> get imports;
-
-  /// URIs of part directives in the compilation unit.
-  List<String> get parts;
-}
-
-/// Builder of [UnlinkedUnit]s.
-class UnlinkedUnitBuilder {
-  final List<int> _apiSignature;
-  final List<UnlinkedNamespaceDirectiveBuilder> _imports;
-  final List<UnlinkedNamespaceDirectiveBuilder> _exports;
-  final List<String> _parts;
-  final bool _hasMixinApplication;
-
-  UnlinkedUnitBuilder(
-      {List<int> apiSignature,
-      List<UnlinkedNamespaceDirectiveBuilder> imports,
-      List<UnlinkedNamespaceDirectiveBuilder> exports,
-      List<String> parts,
-      bool hasMixinApplication})
-      : _apiSignature = apiSignature,
-        _imports = imports,
-        _exports = exports,
-        _parts = parts,
-        _hasMixinApplication = hasMixinApplication;
-
-  /// Finish building, and store into the [fbBuilder].
-  fb.Offset finish(fb.Builder fbBuilder) {
-    fb.Offset offset_apiSignature;
-    fb.Offset offset_imports;
-    fb.Offset offset_exports;
-    fb.Offset offset_parts;
-    if (!(_apiSignature == null || _apiSignature.isEmpty)) {
-      offset_apiSignature = fbBuilder.writeListUint8(_apiSignature);
-    }
-    if (!(_imports == null || _imports.isEmpty)) {
-      offset_imports = fbBuilder
-          .writeList(_imports.map((b) => b.finish(fbBuilder)).toList());
-    }
-    if (!(_exports == null || _exports.isEmpty)) {
-      offset_exports = fbBuilder
-          .writeList(_exports.map((b) => b.finish(fbBuilder)).toList());
-    }
-    if (!(_parts == null || _parts.isEmpty)) {
-      offset_parts = fbBuilder
-          .writeList(_parts.map((b) => fbBuilder.writeString(b)).toList());
-    }
-    fbBuilder.startTable();
-    if (offset_apiSignature != null) {
-      fbBuilder.addOffset(0, offset_apiSignature);
-    }
-    if (offset_imports != null) {
-      fbBuilder.addOffset(1, offset_imports);
-    }
-    if (offset_exports != null) {
-      fbBuilder.addOffset(2, offset_exports);
-    }
-    if (offset_parts != null) {
-      fbBuilder.addOffset(3, offset_parts);
-    }
-    if (_hasMixinApplication == true) {
-      fbBuilder.addBool(4, _hasMixinApplication);
-    }
-    return fbBuilder.endTable();
-  }
-
-  Uint8List toBytes() {
-    fb.Builder fbBuilder = new fb.Builder();
-    fb.Offset offset = finish(fbBuilder);
-    return fbBuilder.finish(offset);
-  }
-}
-
-class _UnlinkedCombinatorImpl implements UnlinkedCombinator {
-  final fb.BufferContext _bc;
-  final int _bcOffset;
-
-  bool _isShow;
-  List<String> _names;
-
-  _UnlinkedCombinatorImpl(this._bc, this._bcOffset);
-
-  @override
-  bool get isShow {
-    _isShow ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 0, false);
-    return _isShow;
-  }
-
-  @override
-  List<String> get names {
-    _names ??= const fb.ListReader<String>(const fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 1, const <String>[]);
-    return _names;
-  }
-}
-
-class _UnlinkedCombinatorReader
-    extends fb.TableReader<_UnlinkedCombinatorImpl> {
-  const _UnlinkedCombinatorReader();
-
-  @override
-  _UnlinkedCombinatorImpl createObject(fb.BufferContext bc, int offset) =>
-      new _UnlinkedCombinatorImpl(bc, offset);
-}
-
-class _UnlinkedNamespaceDirectiveImpl implements UnlinkedNamespaceDirective {
-  final fb.BufferContext _bc;
-  final int _bcOffset;
-
-  String _uri;
-  List<UnlinkedCombinator> _combinators;
-
-  _UnlinkedNamespaceDirectiveImpl(this._bc, this._bcOffset);
-
-  @override
-  List<UnlinkedCombinator> get combinators {
-    _combinators ??= const fb.ListReader<UnlinkedCombinator>(
-            const _UnlinkedCombinatorReader())
-        .vTableGet(_bc, _bcOffset, 1, const <UnlinkedCombinator>[]);
-    return _combinators;
-  }
-
-  @override
-  String get uri {
-    _uri ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
-    return _uri;
-  }
-}
-
-class _UnlinkedNamespaceDirectiveReader
-    extends fb.TableReader<_UnlinkedNamespaceDirectiveImpl> {
-  const _UnlinkedNamespaceDirectiveReader();
-
-  @override
-  _UnlinkedNamespaceDirectiveImpl createObject(
-          fb.BufferContext bc, int offset) =>
-      new _UnlinkedNamespaceDirectiveImpl(bc, offset);
-}
-
-class _UnlinkedUnitImpl implements UnlinkedUnit {
-  final fb.BufferContext _bc;
-  final int _bcOffset;
-
-  List<int> _apiSignature;
-  List<UnlinkedNamespaceDirective> _imports;
-  List<UnlinkedNamespaceDirective> _exports;
-  List<String> _parts;
-  bool _hasMixinApplication;
-
-  _UnlinkedUnitImpl(this._bc, this._bcOffset);
-
-  @override
-  List<int> get apiSignature {
-    _apiSignature ??=
-        const fb.Uint8ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
-    return _apiSignature;
-  }
-
-  @override
-  List<UnlinkedNamespaceDirective> get exports {
-    _exports ??= const fb.ListReader<UnlinkedNamespaceDirective>(
-            const _UnlinkedNamespaceDirectiveReader())
-        .vTableGet(_bc, _bcOffset, 2, const <UnlinkedNamespaceDirective>[]);
-    return _exports;
-  }
-
-  @override
-  bool get hasMixinApplication {
-    _hasMixinApplication ??=
-        const fb.BoolReader().vTableGet(_bc, _bcOffset, 4, false);
-    return _hasMixinApplication;
-  }
-
-  @override
-  List<UnlinkedNamespaceDirective> get imports {
-    _imports ??= const fb.ListReader<UnlinkedNamespaceDirective>(
-            const _UnlinkedNamespaceDirectiveReader())
-        .vTableGet(_bc, _bcOffset, 1, const <UnlinkedNamespaceDirective>[]);
-    return _imports;
-  }
-
-  @override
-  List<String> get parts {
-    _parts ??= const fb.ListReader<String>(const fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 3, const <String>[]);
-    return _parts;
-  }
-}
-
-class _UnlinkedUnitReader extends fb.TableReader<UnlinkedUnit> {
-  const _UnlinkedUnitReader();
-
-  @override
-  _UnlinkedUnitImpl createObject(fb.BufferContext bc, int offset) =>
-      new _UnlinkedUnitImpl(bc, offset);
-}
diff --git a/pkg/front_end/lib/src/incremental/kernel_driver.dart b/pkg/front_end/lib/src/incremental/kernel_driver.dart
deleted file mode 100644
index c23eb4e..0000000
--- a/pkg/front_end/lib/src/incremental/kernel_driver.dart
+++ /dev/null
@@ -1,682 +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 'dart:async';
-
-import 'package:kernel/binary/ast_from_binary.dart';
-import 'package:kernel/class_hierarchy.dart';
-import 'package:kernel/core_types.dart';
-import 'package:kernel/kernel.dart';
-import 'package:kernel/type_environment.dart';
-import 'package:meta/meta.dart';
-
-import '../api_prototype/byte_store.dart';
-import '../api_prototype/compilation_message.dart';
-import '../api_prototype/file_system.dart';
-import '../base/api_signature.dart';
-import '../base/performance_logger.dart';
-import '../base/processed_options.dart';
-import '../fasta/compiler_context.dart';
-import '../fasta/dill/dill_target.dart';
-import '../fasta/kernel/kernel_target.dart';
-import '../fasta/kernel/metadata_collector.dart';
-import '../fasta/kernel/utils.dart';
-import '../fasta/ticker.dart';
-import '../fasta/uri_translator.dart';
-import 'file_state.dart';
-
-/// This function is invoked for each newly discovered file, and the returned
-/// [Future] is awaited before reading the file content.
-typedef Future<Null> KernelDriverFileAddedFn(Uri uri);
-
-/// This function is invoked to create a new instance of [KernelTarget],
-/// which might be a backend specific subclass.
-typedef KernelTarget KernelTargetFactory(FileSystem fileSystem,
-    bool includeComments, DillTarget dillTarget, UriTranslator uriTranslator,
-    {MetadataCollector metadataCollector});
-
-/// This class computes [KernelSequenceResult]s for Dart files.
-///
-/// Let the "current file state" represent a map from file URI to the file
-/// contents most recently read from that file. When the driver needs to
-/// access a file that is not in the current file state yet, it will call
-/// the optional "file added" function, read the file and put it into the
-/// current file state.
-///
-/// The client invokes [getKernelSequence] to schedule computing the
-/// [KernelSequenceResult] for a Dart file. The driver will eventually use the
-/// current file state of the specified file and all files that it transitively
-/// depends on to compute corresponding kernel files (or read them from the
-/// [ByteStore]).
-///
-/// If the client is interested only in the full library for a single Dart
-/// file, it should use [getKernel] instead. This will allow the driver to
-/// compute only single fully resolved library (or the cycle it belongs to),
-/// and provide just outlines of other libraries.
-///
-/// A call to [invalidate] removes the specified file from the current file
-/// state, so that it will be reread before any following [getKernel] or
-/// [getKernelSequence] will return a result.
-class KernelDriver {
-  /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 2;
-
-  /// Options used by the kernel compiler.
-  final ProcessedOptions _options;
-
-  /// The optional SDK outline as a serialized component.
-  /// If provided, the driver will not attempt to read SDK files.
-  final List<int> _sdkOutlineBytes;
-
-  /// The logger to report compilation progress.
-  final PerformanceLog _logger;
-
-  /// The [FileSystem] which should be used by the front end to access files.
-  final FileSystem _fileSystem;
-
-  /// The byte storage to get and put serialized data.
-  final ByteStore _byteStore;
-
-  /// The object that knows how to resolve "package:" and "dart:" URIs.
-  final UriTranslator uriTranslator;
-
-  /// The function that is invoked when a new file is about to be added to
-  /// the current file state. The [Future] that it returns is awaited before
-  /// reading the file contents.
-  final KernelDriverFileAddedFn _fileAddedFn;
-
-  /// Factory for working with metadata.
-  final MetadataFactory _metadataFactory;
-
-  /// The listener to errors during kernel compilation.
-  final KernelErrorListener kernelErrorListener;
-
-  /// The optional SDK outline loaded from [_sdkOutlineBytes].
-  /// Might be `null` if the bytes are not provided, or if not loaded yet.
-  Component _sdkOutline;
-
-  /// The salt to mix into all hashes used as keys for serialized data.
-  List<int> _salt;
-
-  /// The current file system state.
-  FileSystemState _fsState;
-
-  /// The set of absolute file URIs that were reported through [invalidate]
-  /// and not checked for actual changes yet.
-  final Set<Uri> _invalidatedFiles = new Set<Uri>();
-
-  /// The object that provides additional information for tests.
-  final _TestView _testView = new _TestView();
-
-  KernelDriver(this._options, this.uriTranslator, this.kernelErrorListener,
-      {List<int> sdkOutlineBytes,
-      KernelDriverFileAddedFn fileAddedFn,
-      MetadataFactory metadataFactory})
-      : _logger = _options.logger,
-        _fileSystem = _options.fileSystem,
-        _byteStore = _options.byteStore,
-        _sdkOutlineBytes = sdkOutlineBytes,
-        _fileAddedFn = fileAddedFn,
-        _metadataFactory = metadataFactory {
-    _computeSalt();
-
-    Future<Null> onFileAdded(Uri uri) {
-      if (_fileAddedFn != null) {
-        return _fileAddedFn(uri);
-      }
-      return new Future.value();
-    }
-
-    _fsState = new FileSystemState(_byteStore, _fileSystem, _options.target,
-        uriTranslator, _salt, onFileAdded);
-  }
-
-  /// Return the [FileSystemState] that contains the current file state.
-  FileSystemState get fsState => _fsState;
-
-  /// Return the object that provides additional information for tests.
-  @visibleForTesting
-  _TestView get test => _testView;
-
-  /// Compile the library with the given [uri] using the [KernelTarget] that
-  /// is returned by the [kernelTargetFactory].
-  ///
-  /// TODO(scheglov) I think we don't need the return, or most of it.
-  Future<KernelSequenceResult> compileLibrary(
-      KernelTargetFactory kernelTargetFactory, Uri uri) async {
-    return await runWithFrontEndContext('Compile library $uri', () async {
-      await _refreshInvalidatedFiles();
-
-      CanonicalName nameRoot = new CanonicalName.root();
-
-      // Load the SDK outline before building the graph, so that the file
-      // system state is configured to skip SDK libraries.
-      await _loadSdkOutline();
-      if (_sdkOutline != null) {
-        for (var library in _sdkOutline.libraries) {
-          nameRoot.adoptChild(library.canonicalName);
-        }
-      }
-
-      // Ensure that the graph starting at the entry point is ready.
-      FileState entryLibrary =
-          await _logger.runAsync('Build graph of files', () async {
-        return await _fsState.getFile(uri);
-      });
-
-      List<LibraryCycle> cycles = _logger.run('Compute library cycles', () {
-        List<LibraryCycle> cycles = entryLibrary.topologicalOrder;
-        _logger.writeln('Computed ${cycles.length} cycles.');
-        return cycles;
-      });
-
-      DillTarget dillTarget = new DillTarget(
-          new Ticker(isVerbose: false), uriTranslator, _options.target);
-
-      // If there is SDK outline, load it.
-      if (_sdkOutline != null) {
-        dillTarget.loader.appendLibraries(_sdkOutline);
-        await dillTarget.buildOutlines();
-      }
-
-      List<LibraryCycleResult> results = [];
-
-      // Even if we don't compile SDK libraries, add them to results.
-      // We need to be able to access dart:core and dart:async classes.
-      if (_sdkOutline != null) {
-        results.add(new LibraryCycleResult(
-            new LibraryCycle(),
-            '<sdk>',
-            {},
-            _sdkOutline.libraries
-                // TODO are there errors to report here?
-                .map((l) => new LibraryResult(l, []))
-                .toList()));
-      }
-
-      var lastCycle = cycles.last;
-
-      // Compute results for all, but the very last cycle. We need just
-      // outlines for these cycles, to be able to compile the last one.
-      _testView.compiledCycles.clear();
-      await _logger.runAsync('Compute results for cycles', () async {
-        for (LibraryCycle cycle in cycles) {
-          if (cycle == lastCycle) {
-            break;
-          }
-          LibraryCycleResult result =
-              await _compileCycle(nameRoot, dillTarget, cycle, null);
-          results.add(result);
-        }
-      });
-
-      // Compile the last cycle using the given KernelTargetFactory.
-      LibraryCycleResult lastResult = await _compileCycle(
-          nameRoot, dillTarget, lastCycle, kernelTargetFactory);
-      results.add(lastResult);
-
-      TypeEnvironment types = _buildTypeEnvironment(nameRoot, results);
-
-      return new KernelSequenceResult(nameRoot, types, results);
-    });
-  }
-
-  /// Return the [KernelResult] for the Dart file with the given [uri].
-  ///
-  /// The [uri] must be absolute and normalized.
-  ///
-  /// The driver will update the current file state for any file previously
-  /// reported using [invalidate].
-  ///
-  /// If the driver has cached results for the file and its dependencies for
-  /// the current file state, these cached results are returned.
-  ///
-  /// Otherwise the driver will compute new results and return them.
-  Future<KernelResult> getKernel(Uri uri) async {
-    // TODO(scheglov): Use IKG-like implementation with full program in memory.
-    KernelSequenceResult sequence = await getKernelSequence(uri);
-
-    var dependencies = <Library>[];
-    LibraryResult requestedLibrary;
-    for (var i = 0; i < sequence.results.length; i++) {
-      List<LibraryResult> libraryResults = sequence.results[i].libraryResults;
-      if (i == sequence.results.length - 1) {
-        for (var libraryResult in libraryResults) {
-          if (libraryResult.library.importUri == uri) {
-            requestedLibrary = libraryResult;
-          } else {
-            dependencies.add(libraryResult.library);
-          }
-        }
-      } else {
-        dependencies.addAll(libraryResults.map((l) => l.library));
-      }
-    }
-
-    return new KernelResult(dependencies, sequence.types, requestedLibrary);
-  }
-
-  /// Return the [KernelSequenceResult] for the Dart file with the given [uri].
-  ///
-  /// The [uri] must be absolute and normalized.
-  ///
-  /// The driver will update the current file state for any file previously
-  /// reported using [invalidate].
-  ///
-  /// If the driver has cached results for the file and its dependencies for
-  /// the current file state, these cached results are returned.
-  ///
-  /// Otherwise the driver will compute new results and return them.
-  Future<KernelSequenceResult> getKernelSequence(Uri uri) async {
-    return await runWithFrontEndContext('Compute kernels', () async {
-      await _refreshInvalidatedFiles();
-
-      CanonicalName nameRoot = new CanonicalName.root();
-
-      // Load the SDK outline before building the graph, so that the file
-      // system state is configured to skip SDK libraries.
-      await _loadSdkOutline();
-      if (_sdkOutline != null) {
-        for (var library in _sdkOutline.libraries) {
-          nameRoot.adoptChild(library.canonicalName);
-        }
-      }
-
-      // Ensure that the graph starting at the entry point is ready.
-      FileState entryLibrary =
-          await _logger.runAsync('Build graph of files', () async {
-        return await _fsState.getFile(uri);
-      });
-
-      List<LibraryCycle> cycles;
-      if (_fsState.skipSdkLibraries.contains(uri)) {
-        cycles = <LibraryCycle>[];
-      } else {
-        cycles = _logger.run('Compute library cycles', () {
-          List<LibraryCycle> cycles = entryLibrary.topologicalOrder;
-          _logger.writeln('Computed ${cycles.length} cycles.');
-          return cycles;
-        });
-      }
-
-      DillTarget dillTarget = new DillTarget(
-          new Ticker(isVerbose: false), uriTranslator, _options.target);
-
-      // If there is SDK outline, load it.
-      if (_sdkOutline != null) {
-        dillTarget.loader.appendLibraries(_sdkOutline);
-        await dillTarget.buildOutlines();
-      }
-
-      List<LibraryCycleResult> results = [];
-
-      // Even if we don't compile SDK libraries, add them to results.
-      // We need to be able to access dart:core and dart:async classes.
-      if (_sdkOutline != null) {
-        results.add(new LibraryCycleResult(
-            new LibraryCycle(),
-            '<sdk>',
-            {},
-            _sdkOutline.libraries
-                // TODO are there errors to report here?
-                .map((l) => new LibraryResult(l, []))
-                .toList()));
-      }
-
-      _testView.compiledCycles.clear();
-      await _logger.runAsync('Compute results for cycles', () async {
-        for (LibraryCycle cycle in cycles) {
-          LibraryCycleResult result =
-              await _compileCycle(nameRoot, dillTarget, cycle, null);
-          results.add(result);
-        }
-      });
-
-      TypeEnvironment types = _buildTypeEnvironment(nameRoot, results);
-
-      return new KernelSequenceResult(nameRoot, types, results);
-    });
-  }
-
-  /// The file with the given [uri] might have changed - updated, added, or
-  /// removed. Or not, we don't know. Or it might have, but then changed back.
-  ///
-  /// The [uri] must be absolute and normalized file URI.
-  ///
-  /// Schedules the file contents for the [uri] to be read into the current
-  /// file state prior the next invocation of [getKernel] or
-  /// [getKernelSequence] returns the result.
-  ///
-  /// Invocation of this method will not prevent a [Future] returned from
-  /// [getKernelSequence] from completing with a result, but the result is not
-  /// guaranteed to be consistent with the new current file state after this
-  /// [invalidate] invocation.
-  void invalidate(Uri uri) {
-    _invalidatedFiles.add(uri);
-  }
-
-  Future<T> runWithFrontEndContext<T>(String msg, Future<T> f()) async {
-    return await CompilerContext.runWithOptions(_options, (context) {
-      context.disableColors();
-      return _logger.runAsync(msg, f);
-    });
-  }
-
-  /// Return the [TypeEnvironment] that corresponds to the [results].
-  /// All the libraries for [CoreTypes] are expected to be in the first result.
-  TypeEnvironment _buildTypeEnvironment(
-      CanonicalName nameRoot, List<LibraryCycleResult> results) {
-    var coreLibraries =
-        results.first.libraryResults.map((l) => l.library).toList();
-    var component = new Component(nameRoot: nameRoot, libraries: coreLibraries);
-    return new TypeEnvironment(
-        new CoreTypes(component), new ClassHierarchy(component));
-  }
-
-  /// Ensure that [dillTarget] includes the [cycle] libraries.  It already
-  /// contains all the libraries that sorted before the given [cycle] in
-  /// topological order.  Return the result with the cycle libraries.
-  Future<LibraryCycleResult> _compileCycle(
-      CanonicalName nameRoot,
-      DillTarget dillTarget,
-      LibraryCycle cycle,
-      KernelTargetFactory kernelTargetFactory) async {
-    return _logger.runAsync('Compile cycle $cycle', () async {
-      String signature = _getCycleSignature(cycle);
-
-      _logger.writeln('Signature: $signature.');
-      var kernelKey = '$signature.kernel';
-
-      // We need kernel libraries for these URIs.
-      var libraryUris = new Set<Uri>();
-      var libraryUriToFile = <Uri, FileState>{};
-      for (FileState library in cycle.libraries) {
-        Uri uri = library.uri;
-        libraryUris.add(uri);
-        libraryUriToFile[uri] = library;
-      }
-
-      // Prepare file URIs for the cycle.
-      var cycleFileUris = new Set<Uri>();
-      for (FileState library in cycle.libraries) {
-        cycleFileUris.add(library.fileUri);
-        for (var partFile in library.partFiles) {
-          cycleFileUris.add(partFile.fileUri);
-        }
-      }
-
-      Future<Null> appendNewDillLibraries(Component component) async {
-        dillTarget.loader
-            .appendLibraries(component, filter: libraryUris.contains);
-        await dillTarget.buildOutlines();
-      }
-
-      // Check if there is already a bundle with these libraries.
-      if (kernelTargetFactory == null) {
-        kernelTargetFactory = _defaultKernelTargetFactory;
-        List<int> bytes = _byteStore.get(kernelKey);
-        if (bytes != null) {
-          return _logger.runAsync('Read serialized libraries', () async {
-            var component = _options.target
-                .configureComponent(new Component(nameRoot: nameRoot));
-            _readComponent(component, bytes);
-            await appendNewDillLibraries(component);
-
-            return new LibraryCycleResult(
-                cycle,
-                signature,
-                component.uriToSource,
-                component.libraries
-                    // TODO report errors here
-                    .map((l) => new LibraryResult(l, []))
-                    .toList());
-          });
-        }
-      }
-
-      // Create KernelTarget and configure it for compiling the cycle URIs.
-      KernelTarget kernelTarget = kernelTargetFactory(
-          _fsState.fileSystemView, true, dillTarget, uriTranslator,
-          metadataCollector: _metadataFactory?.newCollector());
-      for (FileState library in cycle.libraries) {
-        kernelTarget.read(library.uri);
-      }
-
-      // Compile the cycle libraries into a new full component.
-      Component component = await _logger
-          .runAsync('Compile ${cycle.libraries.length} libraries', () async {
-        await kernelTarget.buildOutlines(nameRoot: nameRoot);
-        return await kernelTarget.buildComponent();
-      });
-
-      _testView.compiledCycles.add(cycle);
-
-      // Add newly compiled libraries into DILL.
-      await appendNewDillLibraries(component);
-
-      List<Library> kernelLibraries = component.libraries
-          .where((library) => libraryUris.contains(library.importUri))
-          .toList();
-
-      final indexedErrors = <Uri, List<CompilationMessage>>{};
-      kernelErrorListener.errors.forEach((error) =>
-          indexedErrors.putIfAbsent(error.span.sourceUrl, () => []).add(error));
-      List<LibraryResult> kernelLibrariesResults = kernelLibraries
-          .map((l) => new LibraryResult(l, indexedErrors[l.fileUri]))
-          .toList();
-
-      kernelErrorListener.errors.clear();
-
-      // Remove source for libraries outside of the cycle.
-      {
-        var urisToRemoveSources = <Uri>[];
-        for (var uri in component.uriToSource.keys) {
-          if (!cycleFileUris.contains(uri)) {
-            urisToRemoveSources.add(uri);
-          }
-        }
-        urisToRemoveSources.forEach(component.uriToSource.remove);
-      }
-
-      _logger.run('Serialize ${kernelLibraries.length} libraries', () {
-        List<int> bytes =
-            serializeComponent(component, filter: kernelLibraries.contains);
-        _byteStore.put(kernelKey, bytes);
-        _logger.writeln('Stored ${bytes.length} bytes.');
-      });
-
-      return new LibraryCycleResult(
-          cycle, signature, component.uriToSource, kernelLibrariesResults);
-    });
-  }
-
-  /// Compute salt and put into [_salt].
-  void _computeSalt() {
-    var saltBuilder = new ApiSignature();
-    saltBuilder.addInt(DATA_VERSION);
-    saltBuilder.addBool(_options.strongMode);
-    if (_sdkOutlineBytes != null) {
-      saltBuilder.addBytes(_sdkOutlineBytes);
-    }
-    if (_metadataFactory != null) {
-      saltBuilder.addInt(_metadataFactory.version);
-    }
-    _salt = saltBuilder.toByteList();
-  }
-
-  String _getCycleSignature(LibraryCycle cycle) {
-    bool hasMixinApplication =
-        cycle.libraries.any((library) => library.hasMixinApplicationLibrary);
-    var signatureBuilder = new ApiSignature();
-    signatureBuilder.addBytes(_salt);
-    Set<FileState> transitiveFiles = cycle.libraries
-        .map((library) => library.transitiveFiles)
-        .expand((files) => files)
-        .toSet();
-    signatureBuilder.addInt(transitiveFiles.length);
-
-    // Append API signatures of transitive files.
-    for (var file in transitiveFiles) {
-      signatureBuilder.addBytes(file.uriBytes);
-      // TODO(scheglov): Stop using content hashes here, when Kernel stops
-      // copying methods of mixed-in classes.
-      // https://github.com/dart-lang/sdk/issues/29881
-      if (hasMixinApplication) {
-        signatureBuilder.addBytes(file.contentHash);
-      } else {
-        signatureBuilder.addBytes(file.apiSignature);
-      }
-    }
-
-    // Append content hashes of the cycle files.
-    for (var library in cycle.libraries) {
-      signatureBuilder.addBytes(library.contentHash);
-      for (var part in library.partFiles) {
-        signatureBuilder.addBytes(part.contentHash);
-      }
-    }
-
-    return signatureBuilder.toHex();
-  }
-
-  /// If SDK outline bytes are provided, and it is not loaded yet into
-  /// [_sdkOutline], load it and configure the file system state to skip SDK
-  /// library files.
-  Future<Null> _loadSdkOutline() async {
-    if (_sdkOutlineBytes != null && _sdkOutline == null) {
-      await _logger.runAsync('Load SDK outline from bytes', () async {
-        _sdkOutline = loadComponentFromBytes(_sdkOutlineBytes);
-        // Configure the file system state to skip the outline libraries.
-        for (var outlineLibrary in _sdkOutline.libraries) {
-          _fsState.skipSdkLibraries.add(outlineLibrary.importUri);
-        }
-      });
-    }
-  }
-
-  /// Read libraries from the given [bytes] into the [component], using the
-  /// configured metadata factory.  The [component] must be ready to read these
-  /// libraries, i.e. either the [bytes] represent a full component with all
-  /// dependencies, or the [component] already has all required dependencies.
-  void _readComponent(Component component, List<int> bytes) {
-    if (_metadataFactory != null) {
-      var repository = _metadataFactory.newRepositoryForReading();
-      component.addMetadataRepository(repository);
-      new BinaryBuilderWithMetadata(bytes).readSingleFileComponent(component);
-    } else {
-      new BinaryBuilder(bytes).readComponent(component);
-    }
-  }
-
-  /// Refresh all the invalidated files and update dependencies.
-  Future<Null> _refreshInvalidatedFiles() async {
-    await _logger.runAsync('Refresh invalidated files', () async {
-      // Create a copy to avoid concurrent modifications.
-      var invalidatedFiles = _invalidatedFiles.toList();
-      _invalidatedFiles.clear();
-
-      // Refresh the files.
-      for (var fileUri in invalidatedFiles) {
-        var file = _fsState.getFileByFileUri(fileUri);
-        if (file != null) {
-          _logger.writeln('Refresh $fileUri');
-          await file.refresh();
-        }
-      }
-    });
-  }
-
-  /// The default [KernelTargetFactory], that creates [KernelTarget].
-  static KernelTarget _defaultKernelTargetFactory(FileSystem fileSystem,
-      bool includeComments, DillTarget dillTarget, UriTranslator uriTranslator,
-      {Map<String, Source> uriToSource, MetadataCollector metadataCollector}) {
-    return new KernelTarget(
-        fileSystem, includeComments, dillTarget, uriTranslator,
-        metadataCollector: metadataCollector);
-  }
-}
-
-/// The result of compiling of a single file.
-class KernelResult {
-  /// The dependencies of the [library].
-  /// Most of them are shaken outlines, but some might be full libraries.
-  final List<Library> dependencies;
-
-  /// The [TypeEnvironment] based on the SDK library outlines.
-  final TypeEnvironment types;
-
-  /// The library of the requested file.
-  final LibraryResult libraryResult;
-
-  KernelResult(this.dependencies, this.types, this.libraryResult);
-}
-
-/// The result of compiling of a sequence of libraries.
-class KernelSequenceResult {
-  final CanonicalName nameRoot;
-  final TypeEnvironment types;
-  final List<LibraryCycleResult> results;
-
-  KernelSequenceResult(this.nameRoot, this.types, this.results);
-}
-
-/// Compilation result for a library cycle.
-class LibraryCycleResult {
-  final LibraryCycle cycle;
-
-  /// The signature of the result.
-  ///
-  /// It is based on the full content of the libraries in the [cycle], and
-  /// either API signatures of the transitive dependencies (usually), or
-  /// the full content of them (in the [cycle] has a library with a mixin
-  /// application).
-  final String signature;
-
-  /// Map from the [cycle] file URIs to their [Source]s.
-  final Map<Uri, Source> uriToSource;
-
-  /// Kernel libraries for libraries in the [cycle].  Bodies of dependencies
-  /// are not included, but but references to those dependencies are included.
-  final List<LibraryResult> libraryResults;
-
-  LibraryCycleResult(
-      this.cycle, this.signature, this.uriToSource, this.libraryResults);
-}
-
-/// A [Library] produced by front end and the errors produced from compiling it.
-class LibraryResult {
-  final Library library;
-  final List<CompilationMessage> errors;
-
-  LibraryResult(this.library, this.errors);
-}
-
-/// Factory for creating [MetadataCollector]s and [MetadataRepository]s.
-abstract class MetadataFactory {
-  /// This version is mixed into the signatures of cached compilation result,
-  /// because content of these results depends on whether we write additional
-  /// metadata or not.
-  int get version;
-
-  /// Return a new [MetadataCollector] to write metadata to while compiling a
-  /// new library cycle.
-  MetadataCollector newCollector();
-
-  /// Return a new [MetadataRepository] instance to read metadata while
-  /// reading a [Component] for a library cycle.
-  MetadataRepository newRepositoryForReading();
-}
-
-@visibleForTesting
-class _TestView {
-  /// The list of [LibraryCycle]s compiled for the last delta.
-  /// It does not include libraries which were read from the cache.
-  final List<LibraryCycle> compiledCycles = [];
-}
-
-/// A simple errors listener for [CompilationMessage]s from kernel.
-class KernelErrorListener {
-  final List<CompilationMessage> errors = [];
-  void onError(CompilationMessage error) => errors.add(error);
-}
diff --git a/pkg/front_end/lib/src/incremental/unlinked_unit.dart b/pkg/front_end/lib/src/incremental/unlinked_unit.dart
deleted file mode 100644
index c086846..0000000
--- a/pkg/front_end/lib/src/incremental/unlinked_unit.dart
+++ /dev/null
@@ -1,144 +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 'dart:typed_data';
-
-import '../base/api_signature.dart';
-import '../fasta/parser.dart' show Listener, Parser, optional;
-import '../fasta/parser/top_level_parser.dart';
-import '../fasta/scanner.dart';
-import '../fasta/scanner/token_constants.dart' show STRING_TOKEN;
-import '../fasta/source/directive_listener.dart';
-import 'format.dart';
-
-/// Compute the [UnlinkedUnitBuilder] for the [content].
-UnlinkedUnitBuilder computeUnlinkedUnit(List<int> salt, List<int> content) {
-  // Scan the content.
-  ScannerResult scanResult = _scan(content);
-  Token token = scanResult.tokens;
-
-  // Parse directives.
-  var listener = new _UnlinkedDirectiveListener();
-  new TopLevelParser(listener).parseUnit(token);
-
-  // Parse to record function bodies.
-  var parser = new _BodySkippingParser();
-  parser.parseUnit(token);
-
-  ApiSignature apiSignature = new ApiSignature();
-  apiSignature.addBytes(salt);
-
-  // Iterate over tokens and skip bodies.
-  Iterator<_BodyRange> bodyIterator = parser.bodyRanges.iterator;
-  bodyIterator.moveNext();
-  for (; token.kind != EOF_TOKEN; token = token.next) {
-    // Move to the body range that ends after the token.
-    while (bodyIterator.current != null &&
-        bodyIterator.current.last < token.charOffset) {
-      bodyIterator.moveNext();
-    }
-    // If the current body range starts before or at the token, skip it.
-    if (bodyIterator.current != null &&
-        bodyIterator.current.first <= token.charOffset) {
-      continue;
-    }
-    // The token is outside of a function body, add it.
-    if (token is! ErrorToken) {
-      apiSignature.addString(token.lexeme);
-    }
-  }
-
-  return new UnlinkedUnitBuilder(
-      apiSignature: apiSignature.toByteList(),
-      imports: listener.imports.map(_toUnlinkedNamespaceDirective).toList(),
-      exports: listener.exports.map(_toUnlinkedNamespaceDirective).toList(),
-      parts: listener.parts.toList(),
-      hasMixinApplication: listener.hasMixin);
-}
-
-/// Exclude all `native 'xyz';` token sequences.
-void _excludeNativeClauses(Token token) {
-  while (token.kind != EOF_TOKEN) {
-    Token next = token.next;
-    if (optional('native', next) &&
-        next.next.kind == STRING_TOKEN &&
-        optional(';', next.next.next)) {
-      next = next.next.next;
-      token.setNext(next);
-    }
-    token = next;
-  }
-}
-
-/// Scan the content of the file.
-ScannerResult _scan(List<int> content) {
-  var zeroTerminatedBytes = new Uint8List(content.length + 1);
-  zeroTerminatedBytes.setRange(0, content.length, content);
-  ScannerResult result = scan(zeroTerminatedBytes);
-  _excludeNativeClauses(result.tokens);
-  return result;
-}
-
-/// Convert [NamespaceCombinator] into [UnlinkedCombinatorBuilder].
-UnlinkedCombinatorBuilder _toUnlinkedCombinator(NamespaceCombinator c) =>
-    new UnlinkedCombinatorBuilder(isShow: c.isShow, names: c.names.toList());
-
-/// Convert [NamespaceDirective] into [UnlinkedNamespaceDirectiveBuilder].
-UnlinkedNamespaceDirectiveBuilder _toUnlinkedNamespaceDirective(
-        NamespaceDirective directive) =>
-    new UnlinkedNamespaceDirectiveBuilder(
-        uri: directive.uri,
-        combinators: directive.combinators.map(_toUnlinkedCombinator).toList());
-
-/// The char range of a function body.
-class _BodyRange {
-  /// The char offset of the first token in the range.
-  final int first;
-
-  /// The char offset of the last token in the range.
-  final int last;
-
-  _BodyRange(this.first, this.last);
-
-  @override
-  String toString() => '[$first, $last]';
-}
-
-/// The [Parser] that skips function bodies and remembers their token ranges.
-class _BodySkippingParser extends Parser {
-  final List<_BodyRange> bodyRanges = [];
-
-  _BodySkippingParser() : super(new Listener());
-
-  @override
-  Token parseFunctionBody(
-      Token token, bool ofFunctionExpression, bool allowAbstract) {
-    Token next = token.next;
-    if (identical('{', next.lexeme)) {
-      Token close = skipBlock(token);
-      bodyRanges.add(new _BodyRange(next.charOffset, close.charOffset));
-      return close;
-    }
-    return super.parseFunctionBody(token, ofFunctionExpression, allowAbstract);
-  }
-
-  @override
-  Token parseInvalidBlock(Token token) => skipBlock(token);
-}
-
-class _UnlinkedDirectiveListener extends DirectiveListener {
-  bool hasMixin = false;
-
-  @override
-  void handleClassWithClause(Token withKeyword) {
-    hasMixin = true;
-    super.handleClassWithClause(withKeyword);
-  }
-
-  @override
-  void handleNamedMixinApplicationWithClause(Token withKeyword) {
-    hasMixin = true;
-    super.handleNamedMixinApplicationWithClause(withKeyword);
-  }
-}
diff --git a/pkg/front_end/lib/src/scanner/errors.dart b/pkg/front_end/lib/src/scanner/errors.dart
index f96daa0..8822805 100644
--- a/pkg/front_end/lib/src/scanner/errors.dart
+++ b/pkg/front_end/lib/src/scanner/errors.dart
@@ -114,7 +114,7 @@
   }
 
   var errorCode = token.errorCode;
-  switch (errorCode.analyzerCode) {
+  switch (errorCode.analyzerCodes?.first) {
     case "UNTERMINATED_STRING_LITERAL":
       // TODO(paulberry,ahe): Fasta reports the error location as the entire
       // string; analyzer expects the end of the string.
@@ -166,7 +166,8 @@
       } else if (errorCode == codeUnexpectedDollarInString) {
         return _makeError(ScannerErrorCode.MISSING_IDENTIFIER, null);
       }
-      throw new UnimplementedError('$errorCode "${errorCode.analyzerCode}"');
+      throw new UnimplementedError(
+          '$errorCode "${errorCode.analyzerCodes?.first}"');
   }
 }
 
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index fc2c472..be04c73 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -11,6 +11,8 @@
 AccessError/example: Fail
 AmbiguousSupertypes/example: Fail
 AnnotationOnEnumConstant/example: Fail
+AnonymousBreakTargetOutsideFunction/statement: Fail # Duplicated error as parser also complains.
+AnonymousContinueTargetOutsideFunction/statement: Fail # Duplicated error as parser also complains.
 ArgumentTypeNotAssignable/example: Fail
 AssertAsExpression/analyzerCode: Fail
 AssertAsExpression/example: Fail
@@ -19,7 +21,6 @@
 AsyncAsIdentifier/example: Fail
 AwaitAsIdentifier/example: Fail
 AwaitNotAsync/example: Fail
-BreakTargetOutsideFunction/example: Fail
 BuiltInIdentifierAsType/example: Fail
 BuiltInIdentifierInDeclaration/example: Fail
 CannotAssignToParenthesizedExpression/example: Fail
@@ -78,7 +79,6 @@
 ConstructorNotSync/example: Fail
 ContinueLabelNotTarget/example: Fail
 ContinueOutsideOfLoop/script1: Fail
-ContinueTargetOutsideFunction/example: Fail
 ContinueWithoutLabelInCase/script1: Fail
 CouldNotParseUri/analyzerCode: Fail
 CouldNotParseUri/example: Fail
@@ -88,7 +88,9 @@
 CovariantAndStatic/script2: Fail
 CovariantMember/script1: Fail
 CovariantMember/script2: Fail
-CyclicClassHierarchy/example: Fail
+CycleInTypeVariables/script1: Fail # We report an error for each type variable involved in the cycle.
+CyclicClassHierarchy/script1: Fail # We report an error for each class involved in the cycle.
+CyclicClassHierarchy/script2: Fail # We report an error for each class involved in the cycle.
 CyclicTypedef/example: Fail
 DeferredAfterPrefix/example: Fail
 DeferredPrefixDuplicated/example: Fail
@@ -115,7 +117,6 @@
 EnumInstantiation/example: Fail
 EqualityCannotBeEqualityOperand/script1: Fail
 EqualityCannotBeEqualityOperand/script2: Fail
-ExpectedAnInitializer/script1: Fail
 ExpectedBlock/script: Fail
 ExpectedBlockToSkip/script: Fail
 ExpectedButGot/script1: Fail
@@ -276,6 +277,7 @@
 PackageNotFound/example: Fail
 PackagesFileFormat/analyzerCode: Fail # Analyzer crashes when .packages file has format error
 PartOfLibraryNameMismatch/example: Fail
+PartOfTwice/script2: Fail # TODO(ahe): Investigate why this fails.
 PartOfUriMismatch/example: Fail
 PartOfUseUri/example: Fail
 PartOrphan/analyzerCode: Fail # Analyzer can't handle this situation
@@ -328,6 +330,7 @@
 SupertypeIsIllegal/example: Fail
 SupertypeIsTypeVariable/example: Fail
 SwitchCaseFallThrough/example: Fail
+SyntheticToken/example: Fail # Can't be tested, used to recover from other errors.
 ThisAccessInFieldInitializer/example: Fail
 ThisAsIdentifier/example: Fail
 ThisOrSuperAccessInFieldInitializer/example: Fail
@@ -344,16 +347,11 @@
 TypeVariableInStaticContext/declaration4: Fail # Unfortunate message from outline phase.
 TypeVariableSameNameAsEnclosing/example: Fail
 TypedefNotFunction/example: Fail
-UnexpectedDollarInString/script1: Fail
-UnexpectedDollarInString/script2: Fail
-UnexpectedDollarInString/script3: Fail
-UnexpectedDollarInString/script4: Fail
 UnexpectedToken/script1: Fail
 UnmatchedToken/script1: Fail
 UnmatchedToken/script3: Fail
 Unspecified/analyzerCode: Fail
 Unspecified/example: Fail
-UnsupportedPrefixPlus/script: Fail
 UnterminatedString/script2: Fail
 UnterminatedString/script4: Fail
 UnterminatedString/script5: Fail
@@ -362,6 +360,7 @@
 UnterminatedString/script8: Fail
 UnterminatedToken/analyzerCode: Fail
 UnterminatedToken/example: Fail
+VarAsTypeName/script1: Fail # Too many problems
 WebLiteralCannotBeRepresentedExactly/analyzerCode: Fail
 WebLiteralCannotBeRepresentedExactly/example: Fail
 YieldAsIdentifier/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 1ccc260..971f4b2 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -209,7 +209,7 @@
   statement: "void;"
 
 ExpectedButGot:
-  # Also see ExpectedAfterButGot
+  # Also see ExpectedAfterButGot and ExpectedInstead
   template: "Expected '#string' before this."
   # Consider the second example below: the parser expects a ')' before 'y', but
   # a ',' would also have worked. We don't have enough information to give a
@@ -220,7 +220,7 @@
     - "main() => foo(x: 1 y: 2);"
 
 ExpectedAfterButGot:
-  # Also see ExpectedButGot
+  # Also see ExpectedButGot and ExpectedInstead
   template: "Expected '#string' after this."
   # This is an alternative to ExpectedButGot when it's better for the error to be
   # associated with the last consumed token rather than the token being parsed.
@@ -244,6 +244,29 @@
   script:
     - "main() { return true }"
 
+ExpectedInstead:
+  # Also see ExpectedButGot and ExpectedAfterButGot
+  index: 41
+  template: "Expected '#string' instead of this."
+  # This is an alternative to ExpectedButGot when the last consumed token
+  # should be replaced with a different token.
+  #
+  # For example, this is ok...
+  #
+  #    mixin Foo extends Bar {
+  #              ^^^^^^^
+  #              Expected 'on' before this
+  #
+  # but this is easier for the user...
+  #
+  #    mixin Foo extends Bar {
+  #              ^^^^^^^
+  #              Expected 'on' instead of this
+  #
+  analyzerCode: ParserErrorCode.EXPECTED_INSTEAD
+  script:
+    - "mixin A extends B { }"
+
 MultipleLibraryDirectives:
   index: 27
   template: "Only one library directive may be declared in a file."
@@ -272,21 +295,24 @@
   script: "class B {} class A with B extends C {}"
 
 ImplementsBeforeExtends:
+  index: 44
   template: "The extends clause must be before the implements clause."
   tip: "Try moving the extends clause before the implements clause."
-  analyzerCode: IMPLEMENTS_BEFORE_EXTENDS
+  analyzerCode: ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS
   script: "class A implements B extends C {}"
 
 ImplementsBeforeOn:
+  index: 43
   template: "The on clause must be before the implements clause."
   tip: "Try moving the on clause before the implements clause."
-  analyzerCode: IMPLEMENTS_BEFORE_ON
+  analyzerCode: ParserErrorCode.IMPLEMENTS_BEFORE_ON
   script: "mixin A implements B on C {}"
 
 ImplementsBeforeWith:
+  index: 42
   template: "The with clause must be before the implements clause."
   tip: "Try moving the with clause before the implements clause."
-  analyzerCode: IMPLEMENTS_BEFORE_WITH
+  analyzerCode: ParserErrorCode.IMPLEMENTS_BEFORE_WITH
   script: "class A extends B implements C with D {}"
 
 ImplementsRepeated:
@@ -384,6 +410,13 @@
   template: "Expected a type, but got '#lexeme'."
   analyzerCode: EXPECTED_TYPE_NAME
 
+VarAsTypeName:
+  index: 61
+  template: "The keyword 'var' can't be used as a type name."
+  analyzerCode: ParserErrorCode.VAR_AS_TYPE_NAME
+  script:
+    - "class A { Map<String, var> m; }"
+
 MissingExpressionInThrow:
   index: 32
   template: "Missing expression after 'throw'."
@@ -410,9 +443,10 @@
     - "void f(var x()) {}"
 
 AbstractClassMember:
+  index: 51
   template: "Members of classes can't be declared to be 'abstract'."
   tip: "Try removing the 'abstract' keyword. You can add the 'abstract' keyword before the class declaration."
-  analyzerCode: ABSTRACT_CLASS_MEMBER
+  analyzerCode: ParserErrorCode.ABSTRACT_CLASS_MEMBER
   script:
     - "abstract class C {abstract C.c();}"
     - "abstract class C {abstract m();}"
@@ -422,9 +456,10 @@
     - "abstract class C {abstract static f;}"
 
 ClassInClass:
+  index: 53
   template: "Classes can't be declared inside other classes."
   tip: "Try moving the class to the top-level."
-  analyzerCode: CLASS_IN_CLASS
+  analyzerCode: ParserErrorCode.CLASS_IN_CLASS
   script:
     - "class C { class B {} }"
 
@@ -461,23 +496,26 @@
     - "class C { var C() {} }"
 
 ConstClass:
+  index: 60
   template: "Classes can't be declared to be 'const'."
   tip: "Try removing the 'const' keyword. If you're trying to indicate that instances of the class can be constants, place the 'const' keyword on  the class' constructor(s)."
-  analyzerCode: CONST_CLASS
+  analyzerCode: ParserErrorCode.CONST_CLASS
   script: "const class C {}"
 
 ConstAndCovariant:
+  index: 57
   template: "Members can't be declared to be both 'const' and 'covariant'."
   tip: "Try removing either the 'const' or 'covariant' keyword."
-  analyzerCode: CONST_AND_COVARIANT
+  analyzerCode: ParserErrorCode.CONST_AND_COVARIANT
   script:
     - "class C { covariant const C f; }"
     - "class C { const covariant C f; }"
 
 ConstAndFinal:
+  index: 58
   template: "Members can't be declared to be both 'const' and 'final'."
   tip: "Try removing either the 'const' or 'final' keyword."
-  analyzerCode: CONST_AND_FINAL
+  analyzerCode: ParserErrorCode.CONST_AND_FINAL
   declaration:
     - "class C { static const final int x = 5; }"
     - "class C { static final const int x = 5; }"
@@ -485,9 +523,10 @@
     - "final const int x = 5;"
 
 ConstAndVar:
+  index: 59
   template: "Members can't be declared to be both 'const' and 'var'."
   tip: "Try removing either the 'const' or 'var' keyword."
-  analyzerCode: CONST_AND_VAR
+  analyzerCode: ParserErrorCode.CONST_AND_VAR
   script:
     - "class C { const var x; }"
     - "class C { var const x; }"
@@ -521,9 +560,10 @@
   analyzerCode: NOT_CONSTANT_EXPRESSION
 
 ConstAfterFactory:
+  index: 56
   template: "The modifier 'const' should be before the modifier 'factory'."
   tip: "Try re-ordering the modifiers."
-  analyzerCode: CONST_AFTER_FACTORY
+  analyzerCode: ParserErrorCode.CONST_AFTER_FACTORY
   script:
     - "class C { factory const C() = prefix.B.foo; }"
 
@@ -576,23 +616,26 @@
     - "class C { var var m; }"
 
 ExternalAfterConst:
+  index: 46
   template: "The modifier 'external' should be before the modifier 'const'."
   tip: "Try re-ordering the modifiers."
-  analyzerCode: EXTERNAL_AFTER_CONST
+  analyzerCode: ParserErrorCode.EXTERNAL_AFTER_CONST
   script:
     - "class C { const external C(); }"
 
 ExternalAfterFactory:
+  index: 47
   template: "The modifier 'external' should be before the modifier 'factory'."
   tip: "Try re-ordering the modifiers."
-  analyzerCode: EXTERNAL_AFTER_FACTORY
+  analyzerCode: ParserErrorCode.EXTERNAL_AFTER_FACTORY
   script:
     - "class C { factory external C(); }"
 
 ExternalAfterStatic:
+  index: 48
   template: "The modifier 'external' should be before the modifier 'static'."
   tip: "Try re-ordering the modifiers."
-  analyzerCode: EXTERNAL_AFTER_STATIC
+  analyzerCode: ParserErrorCode.EXTERNAL_AFTER_STATIC
   script:
     - "class C { static external f(); }"
 
@@ -616,9 +659,10 @@
     - "class C { external factory C() {} }"
 
 ExternalField:
+  index: 50
   template: "Fields can't be declared to be 'external'."
   tip: "Try removing the keyword 'external'."
-  analyzerCode: EXTERNAL_FIELD
+  analyzerCode: ParserErrorCode.EXTERNAL_FIELD
   script:
     - "class C { external var f; }"
 
@@ -746,9 +790,10 @@
     - "class C { static operator +(int x) => x + 1; }"
 
 BreakOutsideOfLoop:
+  index: 52
   template: "A break statement can't be used outside of a loop or switch statement."
   tip: "Try removing the break statement."
-  analyzerCode: BREAK_OUTSIDE_OF_LOOP
+  analyzerCode: ParserErrorCode.BREAK_OUTSIDE_OF_LOOP
   script:
     - "main() { break; }"
 
@@ -758,6 +803,24 @@
 BreakTargetOutsideFunction:
   template: "Can't break to '#name' in a different function."
   analyzerCode: LABEL_IN_OUTER_SCOPE
+  statement: |
+    label: while (true) {
+      void f() {
+        while (true) {
+          break label;
+        }
+      }
+    }
+
+AnonymousBreakTargetOutsideFunction:
+  template: "Can't break to a target in a different function."
+  analyzerCode: LABEL_IN_OUTER_SCOPE
+  statement: |
+    while (true) {
+      void f() {
+        break;
+      }
+    }
 
 ContinueOutsideOfLoop:
   index: 2
@@ -773,6 +836,24 @@
 ContinueTargetOutsideFunction:
   template: "Can't continue at '#name' in a different function."
   analyzerCode: LABEL_IN_OUTER_SCOPE
+  statement: |
+    label: while (true) {
+      void f() {
+        while (true) {
+          continue label;
+        }
+      }
+    }
+
+AnonymousContinueTargetOutsideFunction:
+  template: "Can't continue at a target in a different function."
+  analyzerCode: LABEL_IN_OUTER_SCOPE
+  statement: |
+    while (true) {
+      void f() {
+        continue;
+      }
+    }
 
 ContinueLabelNotTarget:
   template: "Target of continue must be a label."
@@ -921,23 +1002,11 @@
   template: "A '$' has special meaning inside a string, and must be followed by an identifier or an expression in curly braces ({})."
   tip: "Try adding a backslash (\\) to escape the '$'."
   analyzerCode: UNEXPECTED_DOLLAR_IN_STRING
-  script:
-    - >
-      main() {
-        return '$';
-      }
-    - >
-      main() {
-        return "$";
-      }
-    - >
-      main() {
-        return '''$''';
-      }
-    - >
-      main() {
-        return """$""";
-      }
+  expression:
+    - "'$'"
+    - '"$"'
+    - "'''$'''"
+    - '"""$"""'
 
 UnexpectedToken:
   template: "Unexpected token '#lexeme'."
@@ -964,7 +1033,7 @@
   template: "'+' is not a prefix operator."
   tip: "Try removing '+'."
   analyzerCode: MISSING_IDENTIFIER
-  script: "main() => +2;  // No longer a valid way to write '2'"
+  expression: "+2" # No longer a valid way to write '2'
 
 UnterminatedComment:
   template: "Comment starting with '/*' must end with '*/'."
@@ -1170,9 +1239,10 @@
   analyzerCode: CONSTRUCTOR_NOT_FOUND
 
 ConstructorWithReturnType:
+  index: 55
   template: "Constructors can't have a return type."
   tip: "Try removing the return type."
-  analyzerCode: CONSTRUCTOR_WITH_RETURN_TYPE
+  analyzerCode: ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE
   script:
     - "class C { int C() {} }"
 
@@ -1312,6 +1382,18 @@
   template: "'#name' is defined here."
   severity: CONTEXT
 
+InterfaceCheckContext:
+  template: "Both members are inherited by the non-abstract class '#name'."
+  severity: CONTEXT
+
+NamedMixinOverrideContext:
+  template: "Override was introduced in the mixin application class '#name'."
+  severity: CONTEXT
+
+ImplicitMixinOverrideContext:
+  template: "Override was introduced when the mixin '#name' was applied to '#name2'."
+  severity: CONTEXT
+
 ListLiteralTooManyTypeArguments:
   template: "List literal requires exactly one type argument."
   severity: ERROR_LEGACY_WARNING
@@ -1605,6 +1687,7 @@
 
 DuplicatedLibraryImport:
   template: "A library with name '#name' is imported more than once."
+  severity: WARNING
   analyzerCode: IMPORT_DUPLICATED_LIBRARY_NAMED
   script:
     lib1.dart: "library foo;"
@@ -1627,6 +1710,21 @@
 CyclicClassHierarchy:
   template: "'#name' is a supertype of itself via '#string'."
   analyzerCode: RECURSIVE_INTERFACE_INHERITANCE
+  script:
+    - |
+      class A extends B {}
+      class B extends A {}
+    - |
+      class A implements B {}
+      class B implements A {}
+
+DirectCyclicClassHierarchy:
+  template: "'#name' can't use itself as a supertype."
+  analyzerCode: RECURSIVE_INTERFACE_INHERITANCE
+  script:
+    - "class C = Object with C;"
+    - "class C extends C {}"
+    - "class C implements C {}"
 
 ExtendingEnum:
   template: "'#name' is an enum and can't be extended or implemented."
@@ -1889,8 +1987,9 @@
 
 ExternalMethodWithBody:
   # TODO(danrubel): remove reference to `native` once support has been removed
+  index: 49
   template: "An external or native method can't have a body."
-  analyzerCode: EXTERNAL_METHOD_WITH_BODY
+  analyzerCode: ParserErrorCode.EXTERNAL_METHOD_WITH_BODY
   script:
     - "class C {external foo() {}}"
     - "class C {foo() native {}}"
@@ -1960,13 +2059,24 @@
   tip: "Try removing all but one of the part-of directives."
   analyzerCode: ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES
   script:
-    main.dart: |
-      part "part.dart";
-      main() {}
-    other.dart: ""
-    part.dart: |
-      part of "other.dart";
-      part of "main.dart";
+    - main.dart: |
+        part "part.dart";
+        main() {}
+      other.dart: ""
+      part.dart: |
+        part of "other.dart";
+        part of "main.dart";
+    - main.dart: |
+        part of "lib.dart";
+        part of "lib.dart";
+        main() {}
+      lib.dart: |
+        part "main.dart";
+    - main.dart: |
+        part "part.dart";
+      part.dart: |
+        part of "main.dart";
+        part of "main.dart";
 
 PartTwice:
   template: "Can't use '#uri' as a part more than once."
@@ -2152,6 +2262,10 @@
   template: "Previous declaration of '#name'."
   severity: CONTEXT
 
+DuplicatedDeclarationSyntheticCause:
+  template: "Previous declaration of '#name' is implied by this definition."
+  severity: CONTEXT
+
 # Use this message when a duplicated declaration is used.
 DuplicatedDeclarationUse:
   template: "Can't use '#name' because it is declared more than once."
@@ -2425,6 +2539,30 @@
   severity: ERROR_LEGACY_WARNING
   analyzerCode: UNDEFINED_SUPER_METHOD
 
+SuperclassHasNoConstructor:
+  template: "Superclass has no constructor named '#name'."
+  severity: ERROR_LEGACY_WARNING
+  analyzerCode:
+    - UNDEFINED_CONSTRUCTOR_IN_INITIALIZER
+    - UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT
+  script:
+    - |
+      class Super {
+        Super._();
+      }
+
+      class Sub extends Super {
+        Sub() : super();
+      }
+    - |
+      class Super {
+        Super._();
+      }
+
+      class Sub extends Super {
+        Sub.foo() : super.foo();
+      }
+
 SuperclassHasNoDefaultConstructor:
   template: "The superclass, '#name', has no unnamed constructor that takes no arguments."
   analyzerCode: NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
@@ -2492,8 +2630,9 @@
   analyzerCode: NOT_AN_LVALUE
 
 IllegalAssignmentToNonAssignable:
+  index: 45
   template: "Illegal assignment to non-assignable expression."
-  analyzerCode: ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE
+  analyzerCode: ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE
   script:
     - "main(){ f()++; }"
 
@@ -2533,14 +2672,15 @@
   analyzerCode: INVALID_LITERAL_IN_CONFIGURATION
 
 IntegerLiteralIsOutOfRange:
-  template: "The integer literal #lexeme can't be represented in 64 bits."
+  template: "The integer literal #string can't be represented in 64 bits."
   tip: "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."
   analyzerCode: INTEGER_LITERAL_OUT_OF_RANGE
 
 ColonInPlaceOfIn:
+  index: 54
   template: "For-in loops use 'in' rather than a colon."
   tip: "Try replacing the colon with the keyword 'in'."
-  analyzerCode: COLON_IN_PLACE_OF_IN
+  analyzerCode: ParserErrorCode.COLON_IN_PLACE_OF_IN
 
 ExternalFactoryRedirection:
   template: "A redirecting factory can't be external."
@@ -2806,6 +2946,13 @@
   tip: "Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle."
   analyzerCode: TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND
   script:
+    - "foo<A extends B, B extends A>() {}"
+
+DirectCycleInTypeVariables:
+  template: "Type '#name' can't use itself as a bound."
+  tip: "Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle."
+  analyzerCode: TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND
+  script:
     - "foo<A extends A>() {}"
 
 CantUsePrefixAsExpression:
@@ -3015,3 +3162,7 @@
          factory A() = B<T, int>;
       }
       class B<T extends int, S extends String> implements A<T> {}
+
+SyntheticToken:
+  template: "This couldn't be parsed."
+  frontendInternal: true
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index f87dfc4..0fdbbb9 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -1,7 +1,7 @@
 name: front_end
 # Currently, front_end API is not stable and users should not
 # depend on semver semantics when depending on this package.
-version: 0.1.5
+version: 0.1.6
 author: Dart Team <misc@dartlang.org>
 description: Front end for compilation of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/front_end
@@ -11,14 +11,14 @@
   charcode: '^1.1.1'
   convert: '^2.0.1'
   crypto: '^2.0.2'
-  kernel: 0.3.5
+  kernel: 0.3.6
   meta: '^1.1.1'
   package_config: '^1.0.1'
   path: '^1.3.9'
   source_span: '^1.2.3'
   yaml: '^2.1.12'
 dev_dependencies:
-  analyzer: '^0.33.0-alpha.0'
+  analyzer: '^0.33.0'
   args: '>=0.13.0 <2.0.0'
   build_integration:
     path: ../build_integration
diff --git a/pkg/front_end/test/fasta/expression_test.dart b/pkg/front_end/test/fasta/expression_test.dart
index 2eeba80..086eeab 100644
--- a/pkg/front_end/test/fasta/expression_test.dart
+++ b/pkg/front_end/test/fasta/expression_test.dart
@@ -394,8 +394,15 @@
   final ExternalStateSnapshot snapshot =
       new ExternalStateSnapshot(await options.loadSdkSummary(null));
 
-  return new Context(new CompilerContext(options), snapshot, errors,
-      new String.fromEnvironment("updateExpectations") == "true");
+  final bool updateExpectations = environment["updateExpectations"] == "true";
+
+  final CompilerContext compilerContext = new CompilerContext(options);
+
+  // Disable colors to ensure that expectation files are the same across
+  // platforms and independent of stdin/stderr.
+  compilerContext.disableColors();
+
+  return new Context(compilerContext, snapshot, errors, updateExpectations);
 }
 
 main([List<String> arguments = const []]) =>
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 cd77f74..ac0cf99 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -59,7 +59,6 @@
         KernelDelayedAssignment,
         KernelDelayedPostfixIncrement,
         KernelIndexedAccessGenerator,
-        KernelIntAccessGenerator,
         KernelLoadLibraryGenerator,
         KernelNullAwarePropertyAccessGenerator,
         KernelPrefixUseGenerator,
@@ -222,8 +221,6 @@
         "ReadOnlyAccessGenerator(offset: 4, expression: expression,"
         " plainNameForRead: foo, value: null)",
         new KernelReadOnlyAccessGenerator(helper, token, expression, "foo"));
-    check("IntAccessGenerator(offset: 4, lexeme: myToken)",
-        new KernelIntAccessGenerator(helper, token));
     check(
         "ParenthesizedExpressionGenerator(offset: 4, expression: expression,"
         " plainNameForRead: null, value: null)",
diff --git a/pkg/front_end/test/fasta/graph_test.dart b/pkg/front_end/test/fasta/graph_test.dart
deleted file mode 100644
index b8bc6f1..0000000
--- a/pkg/front_end/test/fasta/graph_test.dart
+++ /dev/null
@@ -1,45 +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.md file.
-
-library fasta.test.graph_test;
-
-import 'package:expect/expect.dart' show Expect;
-
-import 'package:test_reflective_loader/test_reflective_loader.dart'
-    show defineReflectiveSuite, defineReflectiveTests, reflectiveTest;
-
-import 'package:kernel/util/graph.dart';
-
-import '../src/dependency_walker_test.dart' show DependencyWalkerTest;
-
-class TestGraph implements Graph<String> {
-  final Map<String, List<String>> graph;
-
-  TestGraph(this.graph);
-
-  Iterable<String> get vertices => graph.keys;
-
-  Iterable<String> neighborsOf(String vertex) => graph[vertex];
-}
-
-main() {
-  // TODO(ahe): Delete this file and move DependencyWalkerTest to
-  // pkg/kernel/test/graph_test.dart.
-  defineReflectiveSuite(() {
-    defineReflectiveTests(GraphTest);
-  });
-}
-
-@reflectiveTest
-class GraphTest extends DependencyWalkerTest {
-  void checkGraph(Map<String, List<String>> graph, String startingNodeName,
-      List<List<String>> expectedEvaluations, List<bool> expectedSccFlags) {
-    List<List<String>> result = computeStrongComponents(new TestGraph(graph));
-    List<List<String>> expectedReversed = <List<String>>[];
-    for (List<String> list in expectedEvaluations) {
-      expectedReversed.add(list.reversed.toList());
-    }
-    Expect.stringEquals(expectedReversed.join(", "), result.join(", "));
-  }
-}
diff --git a/pkg/front_end/test/fasta/messages_test.dart b/pkg/front_end/test/fasta/messages_test.dart
index 839bc54..afa390e 100644
--- a/pkg/front_end/test/fasta/messages_test.dart
+++ b/pkg/front_end/test/fasta/messages_test.dart
@@ -89,7 +89,7 @@
       List<Example> examples = <Example>[];
       String externalTest;
       bool frontendInternal = false;
-      String analyzerCode;
+      List<String> analyzerCodes;
       Severity severity;
       YamlNode badSeverity;
       YamlNode unnecessarySeverity;
@@ -116,7 +116,9 @@
             break;
 
           case "analyzerCode":
-            analyzerCode = value;
+            analyzerCodes = value is String
+                ? <String>[value]
+                : new List<String>.from(value);
             break;
 
           case "bytes":
@@ -263,7 +265,7 @@
           null,
           exampleAndAnalyzerCodeRequired &&
                   !frontendInternal &&
-                  analyzerCode == null
+                  analyzerCodes == null
               ? "No analyzer code for $name."
                   "\nTry running"
                   " <BUILDDIR>/dart-sdk/bin/dartanalyzer --format=machine"
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index c3bde5b..7b1c206 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -332,6 +332,7 @@
       }
       context.componentToTarget.clear();
       context.componentToTarget[p] = sourceTarget;
+      context.componentToProblems.clear();
       context.componentToProblems[p] = errors;
       return pass(p);
     });
diff --git a/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart b/pkg/front_end/test/hot_reload_e2e_test.dart
similarity index 99%
rename from pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart
rename to pkg/front_end/test/hot_reload_e2e_test.dart
index 023efa7..f31e7c3 100644
--- a/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart
+++ b/pkg/front_end/test/hot_reload_e2e_test.dart
@@ -39,7 +39,7 @@
 import 'package:front_end/src/fasta/hybrid_file_system.dart'
     show HybridFileSystem;
 
-import '../../tool/reload.dart' show RemoteVm;
+import 'tool/reload.dart' show RemoteVm;
 
 abstract class TestCase {
   IncrementalKernelGenerator compiler;
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 ba72579..027eb10 100644
--- a/pkg/front_end/test/incremental_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_test.dart
@@ -136,10 +136,11 @@
     }
     String source = sourceFiles[filename];
     if (filename == ".packages") {
-      source = substituteVariables(source, outDir.uri);
       packagesUri = uri;
     }
-    new File.fromUri(uri).writeAsStringSync(source);
+    File file = new File.fromUri(uri);
+    await file.parent.create(recursive: true);
+    await file.writeAsString(source);
   }
   for (String invalidateFilename in invalidateFilenames) {
     if (invalidateFilename.startsWith('package:')) {
@@ -226,7 +227,6 @@
       String data = sourceFiles[filename] ?? "";
       Uri uri = base.resolve(filename);
       if (filename == ".packages") {
-        data = substituteVariables(data, base);
         packagesUri = uri;
       }
       fs.entityForUri(uri).writeAsStringSync(data);
@@ -300,9 +300,7 @@
             world["invalidate"].length, filteredInvalidated?.length ?? 0);
         List expectedInvalidatedUri = world["expectedInvalidatedUri"];
         if (expectedInvalidatedUri != null) {
-          Expect.setEquals(
-              expectedInvalidatedUri
-                  .map((s) => Uri.parse(substituteVariables(s, base))),
+          Expect.setEquals(expectedInvalidatedUri.map((s) => base.resolve(s)),
               filteredInvalidated);
         }
       } else {
@@ -454,10 +452,6 @@
   return result;
 }
 
-String substituteVariables(String source, Uri base) {
-  return source.replaceAll(r"${outDirUri}", "${base}");
-}
-
 class TestIncrementalCompiler extends IncrementalCompiler {
   Set<Uri> invalidatedImportUrisForTesting;
   final Uri entryPoint;
diff --git a/pkg/front_end/test/scanner_test.dart b/pkg/front_end/test/scanner_test.dart
index 9eb2956..936ad38 100644
--- a/pkg/front_end/test/scanner_test.dart
+++ b/pkg/front_end/test/scanner_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:front_end/src/base/errors.dart';
-import 'package:front_end/src/base/jenkins_smi_hash.dart';
 import 'package:front_end/src/fasta/scanner/abstract_scanner.dart'
     show AbstractScanner;
 import 'package:front_end/src/scanner/errors.dart';
@@ -1518,6 +1517,20 @@
   }
 }
 
+// TODO(ahe): Remove this when http://dartbug.com/11617 is fixed.
+int combineHash(int hash, int value) {
+  hash = 0x1fffffff & (hash + value);
+  hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+  return hash ^ (hash >> 6);
+}
+
+// TODO(ahe): Remove this when http://dartbug.com/11617 is fixed.
+int finishHash(int hash) {
+  hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
+  hash = hash ^ (hash >> 11);
+  return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+}
+
 class TestError {
   final int offset;
   final ErrorCode errorCode;
@@ -1527,13 +1540,13 @@
 
   @override
   get hashCode {
-    var h = new JenkinsSmiHash()..add(offset)..add(errorCode);
+    int h = combineHash(combineHash(0, offset), errorCode.hashCode);
     if (arguments != null) {
       for (Object argument in arguments) {
-        h.add(argument);
+        h = combineHash(h, argument.hashCode);
       }
     }
-    return h.hashCode;
+    return finishHash(h);
   }
 
   @override
diff --git a/pkg/front_end/test/src/base/file_repository_test.dart b/pkg/front_end/test/src/base/file_repository_test.dart
deleted file mode 100644
index f6917aa..0000000
--- a/pkg/front_end/test/src/base/file_repository_test.dart
+++ /dev/null
@@ -1,75 +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:front_end/src/base/file_repository.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(FileRepositoryTest);
-  });
-}
-
-/// Generic URI resolver tests which do not depend on the particular path
-/// context in use.
-@reflectiveTest
-class FileRepositoryTest {
-  final fileRepository = new FileRepository();
-
-  test_clearContents() {
-    var uri = Uri.parse('file:///foo/bar.dart');
-    fileRepository.store(uri, 'contents1');
-    expect(fileRepository.getContentsForTesting(), isNotEmpty);
-    fileRepository.clearContents();
-    expect(fileRepository.getContentsForTesting(), isEmpty);
-  }
-
-  test_contentsForPath() {
-    var path1 =
-        fileRepository.store(Uri.parse('file:///foo/bar.dart'), 'contents1');
-    var path2 =
-        fileRepository.store(Uri.parse('package:foo/bar.dart'), 'contents2');
-    expect(fileRepository.contentsForPath(path1), 'contents1');
-    expect(fileRepository.contentsForPath(path2), 'contents2');
-  }
-
-  test_pathForUri() {
-    var uri1 = Uri.parse('file:///foo/bar.dart');
-    var path1 = fileRepository.store(uri1, 'contents1');
-    var uri2 = Uri.parse('package:foo/bar.dart');
-    var path2 = fileRepository.store(uri2, 'contents2');
-    expect(fileRepository.pathForUri(uri1), path1);
-    expect(fileRepository.pathForUri(uri2), path2);
-  }
-
-  test_pathForUri_allocate() {
-    var uri1 = Uri.parse('file:///foo/bar.dart');
-    var path1 = fileRepository.pathForUri(uri1, allocate: true);
-    var uri2 = Uri.parse('package:foo/bar.dart');
-    var path2 = fileRepository.pathForUri(uri2, allocate: true);
-    expect(fileRepository.store(uri1, 'contents1'), path1);
-    expect(fileRepository.store(uri2, 'contents2'), path2);
-  }
-
-  test_store() {
-    var uri = Uri.parse('file:///foo/bar.dart');
-    var path = fileRepository.store(uri, 'contents1');
-    expect(path, endsWith('.dart'));
-    expect(fileRepository.contentsForPath(path), 'contents1');
-    expect(fileRepository.getContentsForTesting(), {path: 'contents1'});
-    expect(fileRepository.store(uri, 'contents2'), path);
-    expect(fileRepository.contentsForPath(path), 'contents2');
-    expect(fileRepository.getContentsForTesting(), {path: 'contents2'});
-  }
-
-  test_uriForPath() {
-    var uri1 = Uri.parse('file:///foo/bar.dart');
-    var path1 = fileRepository.store(uri1, 'contents1');
-    var uri2 = Uri.parse('package:foo/bar.dart');
-    var path2 = fileRepository.store(uri2, 'contents2');
-    expect(fileRepository.uriForPath(path1), uri1);
-    expect(fileRepository.uriForPath(path2), uri2);
-  }
-}
diff --git a/pkg/front_end/test/src/base/test_all.dart b/pkg/front_end/test/src/base/test_all.dart
deleted file mode 100644
index 81c8ea8..0000000
--- a/pkg/front_end/test/src/base/test_all.dart
+++ /dev/null
@@ -1,22 +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:test_reflective_loader/test_reflective_loader.dart';
-
-import 'api_signature_test.dart' as api_signature;
-import 'file_repository_test.dart' as file_repository;
-import 'flat_buffers_test.dart' as flat_buffers;
-import 'processed_options_test.dart' as processed_options;
-import 'uri_resolver_test.dart' as uri_resolver;
-
-/// Utility for manually running all tests.
-main() {
-  defineReflectiveSuite(() {
-    api_signature.main();
-    file_repository.main();
-    flat_buffers.main();
-    processed_options.main();
-    uri_resolver.main();
-  }, name: 'incremental');
-}
diff --git a/pkg/front_end/test/src/base/uri_resolver_test.dart b/pkg/front_end/test/src/base/uri_resolver_test.dart
deleted file mode 100644
index 627b466..0000000
--- a/pkg/front_end/test/src/base/uri_resolver_test.dart
+++ /dev/null
@@ -1,175 +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:front_end/src/base/uri_resolver.dart';
-import 'package:path/path.dart' as p;
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(UriResolverTestNative);
-    defineReflectiveTests(UriResolverTestPosix);
-    defineReflectiveTests(UriResolverTestWindows);
-  });
-}
-
-/// Generic URI resolver tests which do not depend on the particular path
-/// context in use.
-abstract class UriResolverTest {
-  p.Context get pathContext;
-
-  void test_badScheme() {
-    _expectResolutionUri('foo:bar/baz.dart', Uri.parse('foo:bar/baz.dart'));
-  }
-
-  void test_dart() {
-    _expectResolution('dart:core', _p('sdk/lib/core/core.dart'));
-    _expectResolution('dart:async', _p('sdk/lib/async/async.dart'));
-  }
-
-  void test_dartLeadingSlash() {
-    _expectResolution('dart:/core', null);
-  }
-
-  void test_dartLeadingSlash2() {
-    _expectResolution('dart://core', null);
-  }
-
-  void test_dartLeadingSlash3() {
-    _expectResolution('dart:///core', null);
-  }
-
-  void test_dartPart() {
-    _expectResolution('dart:core/bool.dart', _p('sdk/lib/core/bool.dart'));
-  }
-
-  void test_file() {
-    _expectResolution(_fileUri('foo.dart'), _p('foo.dart'));
-  }
-
-  void test_fileLongPath() {
-    _expectResolution(_fileUri('foo/bar.dart'), _p('foo/bar.dart'));
-  }
-
-  void test_noSchemeAbsolute() {
-    _expectResolutionUri('/foo.dart', Uri.parse('/foo.dart'));
-  }
-
-  void test_noSchemeRelative() {
-    _expectResolution('foo.dart', 'foo.dart');
-  }
-
-  void test_package() {
-    _expectResolution('package:foo/bar.dart', _p('packages/foo/lib/bar.dart'));
-    _expectResolution('package:bar/baz.dart', _p('packages/bar/lib/baz.dart'));
-  }
-
-  void test_packageLeadingSlash() {
-    _expectResolution('package:/foo', null);
-  }
-
-  void test_packageLeadingSlash2() {
-    _expectResolution('package://foo', null);
-  }
-
-  void test_packageLeadingSlash3() {
-    _expectResolution('package:///foo', null);
-  }
-
-  void test_packageLongPath() {
-    _expectResolution(
-        'package:foo/bar/baz.dart', _p('packages/foo/lib/bar/baz.dart'));
-  }
-
-  void test_packageNoPath() {
-    // In practice "package:foo/" is meaningless.  But the VM treats it as
-    // resolving to the package's lib directory (and then later reports the
-    // error when trying to open that directory as a file), so for consistency
-    // we do the same.
-    _expectResolution('package:foo/', _p('packages/foo/lib/'));
-  }
-
-  void test_packageNoSlash() {
-    _expectResolution('package:foo', null);
-  }
-
-  void test_packageUnmatchedName() {
-    _expectResolution('package:doesNotExist/foo.dart', null);
-  }
-
-  /// Verifies that the resolution of [uriString] produces the path
-  /// [expectedResult].
-  void _expectResolution(String uriString, String expectedResult) {
-    _expectResolutionUri(uriString,
-        expectedResult == null ? null : pathContext.toUri(expectedResult));
-  }
-
-  /// Verifies that the resolution of [uriString] produces the URI
-  /// [expectedResult].
-  void _expectResolutionUri(String uriString, Uri expectedResult) {
-    var packages = {
-      'foo': _u('packages/foo/lib/'),
-      'bar': _u('packages/bar/lib/')
-    };
-    var sdkLibraries = {
-      'core': _u('sdk/lib/core/core.dart'),
-      'async': _u('sdk/lib/async/async.dart')
-    };
-    var uriResolver = new UriResolver(packages, sdkLibraries);
-    expect(uriResolver.resolve(Uri.parse(uriString)), expectedResult);
-  }
-
-  /// Prepends "file:///", plus a Windows drive letter if applicable, to the
-  /// given path.
-  String _fileUri(String pathPart) {
-    if (pathContext.separator == '/') {
-      return 'file:///$pathPart';
-    } else {
-      return 'file:///C:/$pathPart';
-    }
-  }
-
-  /// Converts a posix style path into a path appropriate for the current path
-  /// context.
-  String _p(String posixPath) {
-    if (!posixPath.startsWith('/')) posixPath = '/$posixPath';
-    if (pathContext.separator == '/') return posixPath;
-    // Windows
-    return 'C:${posixPath.replaceAll('/', pathContext.separator)}';
-  }
-
-  /// Converts a posix style path into a file URI.
-  Uri _u(String posixPath) => pathContext.toUri(_p(posixPath));
-}
-
-/// Override of [UriResolverTest] which uses the native path context for the
-/// platform the test is running on.
-@reflectiveTest
-class UriResolverTestNative extends UriResolverTest {
-  final p.Context pathContext = p.context;
-}
-
-/// Override of [UriResolverTest] which uses a posix path context, regardless of
-/// the platform the test is running on.
-@reflectiveTest
-class UriResolverTestPosix extends UriResolverTest {
-  final p.Context pathContext = p.posix;
-}
-
-/// Override of [UriResolverTest] which uses a windows path context, regardless
-/// of the platform the test is running on.
-@reflectiveTest
-class UriResolverTestWindows extends UriResolverTest {
-  final p.Context pathContext = p.windows;
-
-  void test_fileWindowsLocal() {
-    _expectResolution('file:///C:/foo/bar.dart', r'C:\foo\bar.dart');
-  }
-
-  void test_fileWindowsUNC() {
-    _expectResolution(
-        'file://computer/directory/foo.dart', r'\\computer\directory\foo.dart');
-  }
-}
diff --git a/pkg/front_end/test/src/byte_store/test_all.dart b/pkg/front_end/test/src/byte_store/test_all.dart
deleted file mode 100644
index 57ae68f..0000000
--- a/pkg/front_end/test/src/byte_store/test_all.dart
+++ /dev/null
@@ -1,24 +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:test_reflective_loader/test_reflective_loader.dart';
-
-import 'byte_store_test.dart' as byte_store_test;
-import 'cache_test.dart' as cache_test;
-import 'crc32_test.dart' as crc32_test;
-import 'file_byte_store_test.dart' as file_byte_store_test;
-import 'fletcher16_test.dart' as fletcher16_test;
-import 'protected_file_byte_store_test.dart' as protected_file_byte_store_test;
-
-/// Utility for manually running all tests.
-main() {
-  defineReflectiveSuite(() {
-    byte_store_test.main();
-    cache_test.main();
-    crc32_test.main();
-    file_byte_store_test.main();
-    fletcher16_test.main();
-    protected_file_byte_store_test.main();
-  }, name: 'byte_store');
-}
diff --git a/pkg/front_end/test/src/incremental/file_state_test.dart b/pkg/front_end/test/src/incremental/file_state_test.dart
deleted file mode 100644
index e9d8682..0000000
--- a/pkg/front_end/test/src/incremental/file_state_test.dart
+++ /dev/null
@@ -1,475 +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 'dart:async';
-
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/fasta/uri_translator_impl.dart';
-import 'package:front_end/src/incremental/file_state.dart';
-import 'package:kernel/target/targets.dart';
-import 'package:package_config/packages.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'mock_sdk.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(FileSystemStateTest);
-  });
-}
-
-@reflectiveTest
-class FileSystemStateTest {
-  final byteStore = new MemoryByteStore();
-  final fileSystem = new MemoryFileSystem(Uri.parse('org-dartlang-test:///'));
-  FileSystemState fsState;
-
-  Uri _coreUri;
-  List<Uri> _newFileUris = <Uri>[];
-
-  void setUp() {
-    var uriTranslator =
-        new UriTranslatorImpl(createSdkFiles(fileSystem), Packages.noPackages);
-    _coreUri = Uri.parse('dart:core');
-    expect(_coreUri, isNotNull);
-    fsState = new FileSystemState(byteStore, fileSystem,
-        new NoneTarget(new TargetFlags()), uriTranslator, <int>[], (uri) {
-      _newFileUris.add(uri);
-      return new Future.value();
-    });
-  }
-
-  test_apiSignature() async {
-    var path = '/a.dart';
-    var uri = writeFile(path, '');
-    FileState file = await fsState.getFile(uri);
-
-    List<int> lastSignature = file.apiSignature;
-
-    /// Assert that the given [newCode] has the same API signature as
-    /// the last computed.
-    Future<Null> assertSameSignature(String newCode) async {
-      writeFile(path, newCode);
-      await file.refresh();
-      List<int> newSignature = file.apiSignature;
-      expect(newSignature, lastSignature);
-    }
-
-    /// Assert that the given [newCode] does not have the same API signature as
-    /// the last computed, and update the last signature to the new one.
-    Future<Null> assertNotSameSignature(String newCode) async {
-      writeFile(path, newCode);
-      await file.refresh();
-      List<int> newSignature = file.apiSignature;
-      expect(newSignature, isNot(lastSignature));
-      lastSignature = newSignature;
-    }
-
-    await assertNotSameSignature('''
-var v = 1;
-foo() {
-  print(2);
-}
-bar() {
-  print(3);
-}
-baz() => 4;
-''');
-
-    // [S] Add comments.
-    await assertSameSignature('''
-var v = 1; // comment
-/// comment 1
-/// comment 2
-foo() {
-  print(2);
-}
-bar() {
-  print(3);
-}
-/**
- *  Comment
- */
-baz() => 4;
-''');
-
-    // [S] Remove comments.
-    await assertSameSignature('''
-var v = 1;
-foo() {
-  print(2);
-}
-bar() {
-  print(3);
-}
-baz() => 4;
-''');
-
-    // [NS] Change the top-level variable initializer.
-    await assertNotSameSignature('''
-var v = 11;
-foo() {
-  print(2);
-}
-bar() {
-  print(3);
-}
-baz() => 4;
-''');
-
-    // [S] Change in a block function body.
-    await assertSameSignature('''
-var v = 11;
-foo() {
-  print(22);
-}
-bar() {
-  print(33);
-}
-baz() => 4;
-''');
-
-    // [NS] Change in an expression function body.
-    await assertNotSameSignature('''
-var v = 11;
-foo() {
-  print(22);
-}
-bar() {
-  print(33);
-}
-baz() => 44;
-''');
-  }
-
-  test_gc() async {
-    var a = writeFile('/a.dart', '');
-    var b = writeFile('/b.dart', '');
-    var c = writeFile('/c.dart', 'import "a.dart";');
-    var d = writeFile('/d.dart', 'import "b.dart";');
-    var e = writeFile('/e.dart', r'''
-import "c.dart";
-import "d.dart";
-''');
-
-    var eFile = await fsState.getFile(e);
-
-    // The root and four files.
-    expect(fsState.fileUris, contains(e));
-    expect(fsState.fileUris, contains(a));
-    expect(fsState.fileUris, contains(b));
-    expect(fsState.fileUris, contains(c));
-    expect(fsState.fileUris, contains(d));
-
-    // No changes after GC.
-    expect(fsState.gc(e), isEmpty);
-    expect(fsState.fileUris, contains(e));
-    expect(fsState.fileUris, contains(a));
-    expect(fsState.fileUris, contains(b));
-    expect(fsState.fileUris, contains(c));
-    expect(fsState.fileUris, contains(d));
-
-    // Update e.dart so that it does not reference c.dart anymore.
-    // Then GC removes both c.dart and a.dart it references.
-    writeFile('/e.dart', r'''
-import "d.dart";
-''');
-    await eFile.refresh();
-    {
-      var gcFiles = fsState.gc(e);
-      expect(gcFiles.map((file) => file.uri), unorderedEquals([a, c]));
-    }
-    expect(fsState.fileUris, contains(e));
-    expect(fsState.fileUris, isNot(contains(a)));
-    expect(fsState.fileUris, contains(b));
-    expect(fsState.fileUris, isNot(contains(c)));
-    expect(fsState.fileUris, contains(d));
-  }
-
-  test_getFile() async {
-    var a = writeFile('/a.dart', '');
-    var b = writeFile('/b.dart', '');
-    var c = writeFile('/c.dart', '');
-    var d = writeFile('/d.dart', r'''
-import "a.dart";
-export "b.dart";
-part "c.dart";
-''');
-
-    FileState aFile = await fsState.getFile(a);
-    FileState bFile = await fsState.getFile(b);
-    FileState cFile = await fsState.getFile(c);
-    FileState dFile = await fsState.getFile(d);
-
-    expect(dFile.fileUri, d);
-    expect(dFile.exists, isTrue);
-    _assertImportedUris(dFile, [a, _coreUri]);
-    expect(dFile.importedLibraries, contains(aFile));
-    expect(dFile.exportedLibraries, contains(bFile));
-    expect(dFile.partFiles, contains(cFile));
-
-    expect(aFile.fileUri, a);
-    expect(aFile.exists, isTrue);
-    _assertImportedUris(aFile, [_coreUri]);
-    expect(aFile.exportedLibraries, isEmpty);
-    expect(aFile.partFiles, isEmpty);
-
-    expect(bFile.fileUri, b);
-    expect(bFile.exists, isTrue);
-    _assertImportedUris(bFile, [_coreUri]);
-    expect(bFile.exportedLibraries, isEmpty);
-    expect(bFile.partFiles, isEmpty);
-  }
-
-  test_hasMixinApplication_false() async {
-    writeFile('/a.dart', r'''
-class A {}
-class B extends Object with A {}
-''');
-    var uri = writeFile('/test.dart', r'''
-import 'a.dart';
-class T1 extends A {}
-class T2 extends B {}
-''');
-    FileState file = await fsState.getFile(uri);
-    expect(file.hasMixinApplication, isFalse);
-  }
-
-  test_hasMixinApplication_true_class() async {
-    var uri = writeFile('/test.dart', r'''
-class A {}
-class B extends Object with A {}
-''');
-    FileState file = await fsState.getFile(uri);
-    expect(file.hasMixinApplication, isTrue);
-  }
-
-  test_hasMixinApplication_true_named() async {
-    var uri = writeFile('/test.dart', r'''
-class A {}
-class B = Object with A;
-''');
-    FileState file = await fsState.getFile(uri);
-    expect(file.hasMixinApplication, isTrue);
-  }
-
-  test_hasMixinApplicationLibrary_false() async {
-    var partUri = writeFile('/part.dart', r'''
-part of test;
-class A {}
-''');
-    var libUri = writeFile('/test.dart', r'''
-library test;
-part 'part.dart';
-class B extends A {}
-''');
-
-    FileState part = await fsState.getFile(partUri);
-    FileState lib = await fsState.getFile(libUri);
-
-    expect(part.hasMixinApplication, isFalse);
-    expect(lib.hasMixinApplication, isFalse);
-    expect(lib.hasMixinApplicationLibrary, isFalse);
-  }
-
-  test_hasMixinApplicationLibrary_true_inDefiningUnit() async {
-    var partUri = writeFile('/part.dart', r'''
-part of test;
-class A {}
-''');
-    var libUri = writeFile('/test.dart', r'''
-library test;
-part 'part.dart';
-class B extends Object with A {}
-''');
-
-    FileState part = await fsState.getFile(partUri);
-    FileState lib = await fsState.getFile(libUri);
-
-    expect(part.hasMixinApplication, isFalse);
-    expect(lib.hasMixinApplication, isTrue);
-    expect(lib.hasMixinApplicationLibrary, isTrue);
-  }
-
-  test_hasMixinApplicationLibrary_true_inPart() async {
-    var partUri = writeFile('/part.dart', r'''
-part of test;
-class A {}
-class B extends Object with A {}
-''');
-    var libUri = writeFile('/test.dart', r'''
-library test;
-part 'part.dart';
-class C {}
-''');
-
-    FileState part = await fsState.getFile(partUri);
-    FileState lib = await fsState.getFile(libUri);
-
-    expect(part.hasMixinApplication, isTrue);
-    expect(lib.hasMixinApplication, isFalse);
-    expect(lib.hasMixinApplicationLibrary, isTrue);
-  }
-
-  test_lineStarts() async {
-    var uri = writeFile('/a.dart', '000\n1111\r\n22\n');
-    FileState file = await fsState.getFile(uri);
-    expect(file.lineStarts, [0, 4, 10, 13]);
-  }
-
-  test_newFileListener() async {
-    var a = writeFile('/a.dart', '');
-    var b = writeFile('/b.dart', '');
-    var c = writeFile('/c.dart', r'''
-import 'a.dart';
-''');
-
-    FileState cFile = await fsState.getFile(c);
-
-    // c.dart uses c.dart and a.dart, but not b.dart yet.
-    expect(_newFileUris, contains(c));
-    expect(_newFileUris, contains(a));
-    expect(_newFileUris, isNot(contains(b)));
-    _newFileUris.clear();
-
-    // Update c.dart to use b.dart too.
-    writeFile('/c.dart', r'''
-import 'a.dart';
-import 'b.dart';
-''');
-    await cFile.refresh();
-
-    // b.dart is the only new file.
-    expect(_newFileUris, [b]);
-  }
-
-  test_topologicalOrder_cycleBeforeTarget() async {
-    var aUri = _writeFileDirectives('/a.dart');
-    var bUri = _writeFileDirectives('/b.dart', imports: ['c.dart']);
-    var cUri = _writeFileDirectives('/c.dart', imports: ['b.dart']);
-    var dUri = _writeFileDirectives('/d.dart', imports: ['a.dart', 'b.dart']);
-
-    FileState core = await fsState.getFile(_coreUri);
-    FileState a = await fsState.getFile(aUri);
-    FileState b = await fsState.getFile(bUri);
-    FileState c = await fsState.getFile(cUri);
-    FileState d = await fsState.getFile(dUri);
-
-    List<LibraryCycle> cycles = d.topologicalOrder;
-    expect(cycles, hasLength(4));
-
-    expect(cycles[0].libraries, contains(core));
-    expect(cycles[1].libraries, unorderedEquals([a]));
-    expect(cycles[2].libraries, unorderedEquals([b, c]));
-    expect(cycles[3].libraries, unorderedEquals([d]));
-
-    expect(cycles[0].directDependencies, isEmpty);
-    expect(cycles[1].directDependencies, unorderedEquals([cycles[0]]));
-    expect(cycles[2].directDependencies, unorderedEquals([cycles[0]]));
-    expect(cycles[3].directDependencies,
-        unorderedEquals([cycles[0], cycles[1], cycles[2]]));
-
-    expect(cycles[0].directUsers,
-        unorderedEquals([cycles[1], cycles[2], cycles[3]]));
-    expect(cycles[1].directUsers, unorderedEquals([cycles[3]]));
-    expect(cycles[2].directUsers, unorderedEquals([cycles[3]]));
-    expect(cycles[3].directUsers, isEmpty);
-  }
-
-  test_topologicalOrder_cycleBeforeTarget_export() async {
-    var aUri = _writeFileDirectives('/a.dart');
-    var bUri = _writeFileDirectives('/b.dart', exports: ['c.dart']);
-    var cUri = _writeFileDirectives('/c.dart', imports: ['b.dart']);
-    var dUri = _writeFileDirectives('/d.dart', imports: ['a.dart', 'b.dart']);
-
-    FileState core = await fsState.getFile(_coreUri);
-    FileState a = await fsState.getFile(aUri);
-    FileState b = await fsState.getFile(bUri);
-    FileState c = await fsState.getFile(cUri);
-    FileState d = await fsState.getFile(dUri);
-
-    List<LibraryCycle> order = d.topologicalOrder;
-    expect(order, hasLength(4));
-    expect(order[0].libraries, contains(core));
-    expect(order[1].libraries, unorderedEquals([a]));
-    expect(order[2].libraries, unorderedEquals([b, c]));
-    expect(order[3].libraries, unorderedEquals([d]));
-  }
-
-  test_topologicalOrder_cycleWithTarget() async {
-    var aUri = _writeFileDirectives('/a.dart');
-    var bUri = _writeFileDirectives('/b.dart', imports: ['c.dart']);
-    var cUri = _writeFileDirectives('/c.dart', imports: ['a.dart', 'b.dart']);
-
-    FileState core = await fsState.getFile(_coreUri);
-    FileState a = await fsState.getFile(aUri);
-    FileState b = await fsState.getFile(bUri);
-    FileState c = await fsState.getFile(cUri);
-
-    List<LibraryCycle> order = c.topologicalOrder;
-    expect(order, hasLength(3));
-    expect(order[0].libraries, contains(core));
-    expect(order[1].libraries, unorderedEquals([a]));
-    expect(order[2].libraries, unorderedEquals([b, c]));
-  }
-
-  test_transitiveFiles() async {
-    var a = writeFile('/a.dart', "");
-    var b = writeFile('/b.dart', "");
-    var c = writeFile('/c.dart', "import 'b.dart';");
-
-    FileState aFile = await fsState.getFile(a);
-    FileState bFile = await fsState.getFile(b);
-    FileState cFile = await fsState.getFile(c);
-
-    // Only c.dart and b.dart are in the transitive closure.
-    expect(cFile.transitiveFiles, contains(cFile));
-    expect(cFile.transitiveFiles, contains(bFile));
-    expect(cFile.transitiveFiles, isNot(contains(aFile)));
-    expect(bFile.transitiveFiles, isNot(contains(aFile)));
-
-    // Import a.dart into b.dart, changes c.dart transitive closure.
-    writeFile('/b.dart', "import 'a.dart';");
-    await bFile.refresh();
-    expect(cFile.transitiveFiles, contains(cFile));
-    expect(cFile.transitiveFiles, contains(bFile));
-    expect(cFile.transitiveFiles, contains(aFile));
-    expect(bFile.transitiveFiles, contains(aFile));
-
-    // Stop importing a.dart into b.dart, changes c.dart transitive closure.
-    writeFile('/b.dart', "");
-    await bFile.refresh();
-    expect(cFile.transitiveFiles, contains(cFile));
-    expect(cFile.transitiveFiles, contains(bFile));
-    expect(cFile.transitiveFiles, isNot(contains(aFile)));
-    expect(bFile.transitiveFiles, isNot(contains(aFile)));
-  }
-
-  /// Write the given [text] of the file with the given [path] into the
-  /// virtual filesystem.  Return the URI of the file.
-  Uri writeFile(String path, String text) {
-    Uri uri = Uri.parse('org-dartlang-test://$path');
-    fileSystem.entityForUri(uri).writeAsStringSync(text);
-    return uri;
-  }
-
-  void _assertImportedUris(FileState file, List<Uri> expectedUris) {
-    Iterable<Uri> importedUris = _toUris(file.importedLibraries);
-    expect(importedUris, unorderedEquals(expectedUris));
-  }
-
-  Iterable<Uri> _toUris(List<FileState> files) {
-    return files.map((f) => f.uri);
-  }
-
-  Uri _writeFileDirectives(String path,
-      {List<String> imports: const [], List<String> exports: const []}) {
-    return writeFile(path, '''
-${imports.map((uri) => 'import "$uri";').join('\n')}
-${exports.map((uri) => 'export "$uri";').join('\n')}
-''');
-  }
-}
diff --git a/pkg/front_end/test/src/incremental/format_test.dart b/pkg/front_end/test/src/incremental/format_test.dart
deleted file mode 100644
index 10bb5ce..0000000
--- a/pkg/front_end/test/src/incremental/format_test.dart
+++ /dev/null
@@ -1,92 +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 'dart:typed_data';
-
-import 'package:front_end/src/incremental/format.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(FormatTest);
-  });
-}
-
-@reflectiveTest
-class FormatTest {
-  void test_UnlinkedCombinator_isShow_false() {
-    Uint8List bytes = new UnlinkedCombinatorBuilder(
-        isShow: false, names: ['aaa', 'bbb', 'ccc']).toBytes();
-
-    var combinator = new UnlinkedCombinator(bytes);
-    expect(combinator.isShow, isFalse);
-    expect(combinator.names, ['aaa', 'bbb', 'ccc']);
-  }
-
-  void test_UnlinkedCombinator_isShow_true() {
-    Uint8List bytes = new UnlinkedCombinatorBuilder(
-        isShow: true, names: ['aaa', 'bbb', 'ccc']).toBytes();
-
-    var combinator = new UnlinkedCombinator(bytes);
-    expect(combinator.isShow, isTrue);
-    expect(combinator.names, ['aaa', 'bbb', 'ccc']);
-  }
-
-  void test_UnlinkedNamespaceDirective() {
-    Uint8List bytes = new UnlinkedNamespaceDirectiveBuilder(
-        uri: 'package:foo/foo.dart',
-        combinators: [
-          new UnlinkedCombinatorBuilder(isShow: true, names: ['aaa']),
-          new UnlinkedCombinatorBuilder(isShow: false, names: ['bbb', 'ccc'])
-        ]).toBytes();
-
-    var directive = new UnlinkedNamespaceDirective(bytes);
-    expect(directive.uri, 'package:foo/foo.dart');
-    expect(directive.combinators, hasLength(2));
-    expect(directive.combinators[0].isShow, isTrue);
-    expect(directive.combinators[0].names, ['aaa']);
-    expect(directive.combinators[1].isShow, isFalse);
-    expect(directive.combinators[1].names, ['bbb', 'ccc']);
-  }
-
-  void test_UnlinkedUnit() {
-    Uint8List bytes = new UnlinkedUnitBuilder(apiSignature: [
-      0,
-      1,
-      2,
-      3,
-      4
-    ], imports: [
-      new UnlinkedNamespaceDirectiveBuilder(uri: 'a.dart')
-    ], exports: [
-      new UnlinkedNamespaceDirectiveBuilder(uri: 'b.dart')
-    ], parts: [
-      'p1.dart',
-      'p2.dart',
-    ], hasMixinApplication: true)
-        .toBytes();
-
-    var unit = new UnlinkedUnit(bytes);
-    expect(unit.apiSignature, [0, 1, 2, 3, 4]);
-
-    expect(unit.imports, hasLength(1));
-    expect(unit.imports[0].uri, 'a.dart');
-
-    expect(unit.exports, hasLength(1));
-    expect(unit.exports[0].uri, 'b.dart');
-
-    expect(unit.parts, ['p1.dart', 'p2.dart']);
-
-    expect(unit.hasMixinApplication, isTrue);
-  }
-
-  void test_UnlinkedUnit_hasMixinApplication_false() {
-    Uint8List bytes =
-        new UnlinkedUnitBuilder(hasMixinApplication: false).toBytes();
-
-    var unit = new UnlinkedUnit(bytes);
-    expect(unit.hasMixinApplication, isFalse);
-  }
-}
diff --git a/pkg/front_end/test/src/incremental/kernel_driver_test.dart b/pkg/front_end/test/src/incremental/kernel_driver_test.dart
deleted file mode 100644
index 2769682..0000000
--- a/pkg/front_end/test/src/incremental/kernel_driver_test.dart
+++ /dev/null
@@ -1,1052 +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 'dart:async';
-
-import 'package:front_end/src/api_prototype/byte_store.dart';
-import 'package:front_end/src/api_prototype/compiler_options.dart';
-import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/api_prototype/summary_generator.dart';
-import 'package:front_end/src/base/performance_logger.dart';
-import 'package:front_end/src/base/processed_options.dart';
-import 'package:front_end/src/fasta/kernel/utils.dart';
-import 'package:front_end/src/fasta/uri_translator_impl.dart';
-import 'package:front_end/src/incremental/kernel_driver.dart';
-import 'package:kernel/ast.dart';
-import 'package:kernel/binary/ast_from_binary.dart';
-import 'package:kernel/target/targets.dart';
-import 'package:kernel/text/ast_to_text.dart';
-import 'package:kernel/verifier.dart';
-import 'package:package_config/src/packages_impl.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'mock_sdk.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(KernelDriverTest);
-  });
-}
-
-@reflectiveTest
-class KernelDriverTest {
-  /// Virtual filesystem for testing.
-  final fileSystem = new MemoryFileSystem(Uri.parse('org-dartlang-test:///'));
-
-  /// The object under test.
-  KernelDriver driver;
-
-  void setUp() {
-    _createDriver();
-  }
-
-  test_getKernel_chain() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, 'var a = 1;');
-    Uri bUri = writeFile(bPath, r'''
-import 'a.dart';
-var b = a;
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-import 'b.dart';
-var c1 = a;
-var c2 = b;
-''');
-
-    {
-      KernelResult result = await driver.getKernel(cUri);
-      _assertKernelResult(result, cUri,
-          includes: [aUri, bUri, Uri.parse('dart:core')]);
-      expect(_getLibraryText(result.libraryResult.library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::int c1 = a::a;
-static field core::int c2 = b::b;
-''');
-    }
-
-    // Update b.dart and recompile c.dart
-    writeFile(bPath, r'''
-import 'a.dart';
-var b = 1.2;
-''');
-    driver.invalidate(bUri);
-    {
-      KernelResult result = await driver.getKernel(cUri);
-      _assertKernelResult(result, cUri,
-          includes: [aUri, bUri, Uri.parse('dart:core')]);
-      expect(_getLibraryText(result.libraryResult.library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::int c1 = a::a;
-static field core::double c2 = b::b;
-''');
-    }
-  }
-
-  test_getKernel_cycle() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, 'var a = 1;');
-    Uri bUri = writeFile(bPath, r'''
-import 'c.dart';
-var b1 = c1;
-var b2 = c2;
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-import 'b.dart';
-var c1 = a;
-var c2 = b1;
-''');
-
-    {
-      KernelResult result = await driver.getKernel(cUri);
-      // b.dart and c.dart form a cycle.
-      // We still get c.dart as the library, and b.dart in dependencies.
-      _assertKernelResult(result, cUri,
-          includes: [aUri, bUri, Uri.parse('dart:core')]);
-      expect(_getLibraryText(result.libraryResult.library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::int c1 = a::a;
-static field core::int c2 = b::b1;
-''');
-    }
-
-    // Update a.dart and recompile c.dart
-    writeFile(aPath, r'''
-var a = 1.2;
-''');
-    driver.invalidate(aUri);
-    {
-      KernelResult result = await driver.getKernel(cUri);
-      _assertKernelResult(result, cUri,
-          includes: [aUri, bUri, Uri.parse('dart:core')]);
-      expect(_getLibraryText(result.libraryResult.library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::double c1 = a::a;
-static field core::double c2 = b::b1;
-''');
-    }
-  }
-
-  test_getKernelSequence_chain() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, 'var a = 1;');
-    Uri bUri = writeFile(bPath, r'''
-import 'a.dart';
-var b = a;
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-import 'b.dart';
-var c1 = a;
-var c2 = b;
-void main() {}
-''');
-
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(cUri);
-      _assertLibraryUris(result,
-          includes: [aUri, bUri, cUri, Uri.parse('dart:core')]);
-      Library library = _getLibrary(result, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::int c1 = a::a;
-static field core::int c2 = b::b;
-static method main() → void {}
-''');
-    }
-
-    // Update b.dart and recompile c.dart
-    writeFile(bPath, r'''
-import 'a.dart';
-var b = 1.2;
-''');
-    driver.invalidate(bUri);
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(cUri);
-      _assertLibraryUris(result,
-          includes: [aUri, bUri, cUri, Uri.parse('dart:core')]);
-      Library library = _getLibrary(result, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field core::int c1 = a::a;
-static field core::double c2 = b::b;
-static method main() → void {}
-''');
-    }
-  }
-
-  test_getKernelSequence_export() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    String dPath = '/test/lib/d.dart';
-    writeFile(aPath, 'class A {}');
-    Uri bUri = writeFile(bPath, 'export "a.dart";');
-    Uri cUri = writeFile(cPath, 'export "b.dart";');
-    Uri dUri = writeFile(dPath, r'''
-import 'c.dart';
-A a;
-''');
-
-    KernelSequenceResult result = await driver.getKernelSequence(dUri);
-    Library library = _getLibrary(result, dUri);
-    expect(_getLibraryText(_getLibrary(result, bUri)), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-additionalExports = (a::A)
-
-''');
-    expect(_getLibraryText(_getLibrary(result, cUri)), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-additionalExports = (a::A)
-
-''');
-    expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-
-static field a::A a;
-''');
-  }
-
-  test_getKernelSequence_export_cycle() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    writeFile(aPath, 'export "b.dart"; class A {}');
-    writeFile(bPath, 'export "a.dart"; class B {}');
-    Uri cUri = writeFile(cPath, r'''
-import 'b.dart';
-A a;
-B b;
-''');
-
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(cUri);
-      Library library = _getLibrary(result, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field a::A a;
-static field b::B b;
-''');
-    }
-
-    // Update c.dart and compile.
-    // We should load the cycle [a.dart, b.dart] from the byte store.
-    // This tests that we compute export scopes after loading.
-    writeFile(cPath, r'''
-import 'b.dart';
-A a;
-B b;
-int c;
-''');
-    driver.invalidate(cUri);
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(cUri);
-      Library library = _getLibrary(result, cUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-import "./b.dart" as b;
-import "dart:core" as core;
-
-static field a::A a;
-static field b::B b;
-static field core::int c;
-''');
-    }
-  }
-
-  test_getKernelSequence_export_hideWithLocal() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    writeFile(aPath, 'class A {} class B {}');
-    writeFile(bPath, 'export "a.dart"; class B {}');
-    Uri cUri = writeFile(cPath, r'''
-import 'b.dart';
-A a;
-B b;
-''');
-
-    KernelSequenceResult result = await driver.getKernelSequence(cUri);
-    Library library = _getLibrary(result, cUri);
-    expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-import "./b.dart" as b;
-
-static field a::A a;
-static field b::B b;
-''');
-  }
-
-  test_getKernelSequence_recompileMixin() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-
-    Uri aUri = writeFile(aPath, r'''
-import 'b.dart';
-main() {
-  new B().foo();
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-import 'c.dart';
-class B extends Object with C {}
-''');
-    Uri cUri = writeFile(cPath, r'''
-class C {
-  void foo() {
-    print(0);
-  }
-}
-''');
-
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(aUri);
-      _assertLibraryUris(result,
-          includes: [aUri, bUri, cUri, Uri.parse('dart:core')]);
-    }
-
-    // Update c.dart and compute the delta.
-    // Includes: c.dart, b.dart and a.dart files.
-    // Compiled: c.dart (changed) and b.dart (has mixin), but not a.dart file.
-    writeFile(cPath, r'''
-class C {
-  void foo() {
-    print(1);
-  }
-}
-''');
-    driver.invalidate(cUri);
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(aUri);
-      _assertLibraryUris(result,
-          includes: [aUri, bUri, cUri, Uri.parse('dart:core')]);
-      // Compiled: c.dart (changed), and b.dart (has mixin).
-      _assertCompiledUris(includes: [cUri, bUri], excludes: [aUri]);
-    }
-  }
-
-  test_getKernelSequence_redirectingConstructor() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    writeFile(aPath, r'''
-class A {
-  factory A() = B;
-}
-
-class B implements A {
-  B();
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-import 'a.dart';
-var a = new A();
-''');
-
-    // Initially "new A()" is resolved to "new B()".
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(bUri);
-      Library library = _getLibrary(result, bUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-
-static field a::A a = new a::B::•();
-''');
-    }
-
-    // Update b.dart and recompile.
-    // We should not lose information about redirecting constructors.
-    // Som "new A()" should still be resolved to "new B()".
-    writeFile(bPath, r'''
-import 'a.dart';
-var a2 = new A();
-''');
-    driver.invalidate(bUri);
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(bUri);
-      Library library = _getLibrary(result, bUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "./a.dart" as a;
-
-static field a::A a2 = new a::B::•();
-''');
-    }
-  }
-
-  test_getKernelSequence_typedef() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    writeFile(aPath, 'typedef int F<T>(T x);');
-    Uri bUri = writeFile(bPath, r'''
-import 'a.dart';
-F<String> f;
-''');
-
-    KernelSequenceResult result = await driver.getKernelSequence(bUri);
-    Library library = _getLibrary(result, bUri);
-    expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-
-static field (core::String) → core::int f;
-''');
-  }
-
-  test_getKernelSequence_typedef_storeReference() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    writeFile(aPath, 'typedef int F();');
-    writeFile(bPath, r'''
-import 'a.dart';
-F f;
-''');
-    Uri cUri = writeFile(cPath, r'''
-import 'b.dart';
-var fc = f;
-''');
-
-    // Compile first time, b.dart should store F typedef reference.
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(cUri);
-      Library library = _getLibrary(result, cUri);
-      expect((library.fields[0].type as FunctionType).typedef.name, 'F');
-    }
-
-    // Update c.dart and recompile using the serialized b.dart kernel.
-    // We should be able to read the F typedef reference.
-    {
-      writeFile(cPath, r'''
-import 'b.dart';
-var fc2 = f;
-''');
-      driver.invalidate(cUri);
-      KernelSequenceResult result = await driver.getKernelSequence(cUri);
-      Library library = _getLibrary(result, cUri);
-      expect((library.fields[0].type as FunctionType).typedef.name, 'F');
-    }
-  }
-
-  test_getKernelSequence_typeEnvironment() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    Uri aUri = writeFile(aPath, 'class A {}');
-
-    KernelSequenceResult result = await driver.getKernelSequence(aUri);
-    expect(result.types.coreTypes.intClass, isNotNull);
-    expect(result.types.hierarchy, isNotNull);
-  }
-
-  test_getKernelSequence_useSdkOutline() async {
-    List<int> sdkOutlineBytes = await _computeSdkOutlineBytes();
-
-    // Configure the driver to use the SDK outline.
-    _createDriver(sdkOutlineBytes: sdkOutlineBytes);
-
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    Uri aUri = writeFile(aPath, r'''
-int getValue() {
-  return 1;
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-import 'dart:async';
-import 'a.dart';
-var a = 1;
-Future<String> b;
-''');
-
-    KernelSequenceResult result = await driver.getKernelSequence(bUri);
-
-    // SDK libraries were not compiled.
-    _assertCompiledUris(
-        includes: [bUri],
-        excludes: [Uri.parse('dart:core'), Uri.parse('dart:async')]);
-    _assertLibraryUris(result, includes: [aUri, bUri]);
-
-    // The types of top-level variables are resolved.
-    var library = _getLibrary(result, bUri);
-    expect(library.fields[0].type.toString(), 'dart.core::int');
-    expect(library.fields[1].type.toString(),
-        'dart.async::Future<dart.core::String>');
-
-    {
-      // Update a.dart and recompile.
-      writeFile(aPath, r'''
-int getValue() {
-  return 2;
-}
-''');
-      driver.invalidate(aUri);
-      var kernelResult = await driver.getKernelSequence(bUri);
-      var allLibraries = kernelResult.results
-          .map((c) => c.libraryResults.map((result) => result.library))
-          .expand((libs) => libs)
-          .toList();
-
-      // The result does not include SDK libraries.
-      _assertCompiledUris(
-          includes: [aUri],
-          excludes: [Uri.parse('dart:core'), Uri.parse('dart:async')]);
-      _assertLibraryUris(result, includes: [aUri, bUri]);
-
-      // The types of top-level variables are resolved.
-      var library = _getLibrary(result, bUri);
-      expect(library.fields[0].type.toString(), 'dart.core::int');
-      expect(library.fields[1].type.toString(),
-          'dart.async::Future<dart.core::String>');
-
-      // We should be able to serialize the libraries without SDK.
-      var component = new Component(
-          nameRoot: kernelResult.nameRoot, libraries: allLibraries);
-      serializeComponent(component,
-          filter: (library) => !library.importUri.isScheme('dart'));
-    }
-
-    // Ask dart:core, should be served from the outline.
-    {
-      var dartCoreUri = Uri.parse('dart:core');
-      var kernelResult = await driver.getKernelSequence(dartCoreUri);
-      bool hasDartCore = false;
-      for (var libraryResult in kernelResult.results) {
-        for (var libResult in libraryResult.libraryResults) {
-          if (libResult.library.importUri == dartCoreUri) {
-            hasDartCore = true;
-            break;
-          }
-        }
-      }
-      expect(hasDartCore, isTrue);
-    }
-  }
-
-  test_limitedStore_exportDependencies() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, 'class A {}');
-    var bUri = writeFile(bPath, 'export "a.dart";');
-    Uri cUri = writeFile(cPath, r'''
-import 'b.dart';
-A a;
-''');
-
-    // Compile all libraries initially.
-    await driver.getKernelSequence(cUri);
-
-    // Update c.dart and compile.
-    // When we load "b", we should correctly read its exports.
-    writeFile(cPath, r'''
-import 'b.dart';
-A a2;
-''');
-    driver.invalidate(cUri);
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(cUri);
-      Library library = _getLibrary(result, cUri);
-
-      Library getDepLib(Library lib, int index) {
-        return lib.dependencies[index].importedLibraryReference.asLibrary;
-      }
-
-      var b = getDepLib(library, 0);
-      var a = getDepLib(b, 0);
-      expect(b.importUri, bUri);
-      expect(a.importUri, aUri);
-    }
-  }
-
-  test_limitedStore_memberReferences() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    writeFile(aPath, r'''
-int topField = 0;
-int get topGetter => 0;
-int topFunction({p}) => 0;
-
-abstract class I {
-  int interfaceField;
-  int get interfaceGetter;
-  int interfaceMethod();
-}
-
-class A implements I {
-  static int staticField;
-  static int get staticGetter => 0;
-  static int staticMethod() => 0;
-
-  int instanceField;
-  int get instanceGetter => 0;
-  int instanceMethod() => 0;
-
-  int interfaceField;
-  int get interfaceGetter => 0;
-  int interfaceMethod() => 0;
-
-  A();
-  A.named();
-}
-''');
-    Uri bUri = writeFile(bPath, r'''
-import 'a.dart';
-
-class B extends A {
-  B() : super();
-  B.named() : super.named();
-
-  void foo() {
-    super.instanceMethod();
-    instanceMethod();
-
-    super.interfaceField;
-    super.interfaceField = 0;
-    super.interfaceGetter;
-    super.interfaceMethod();
-  }
-
-  int instanceMethod() => 0;
-
-  int interfaceField;
-  int get interfaceGetter => 0;
-  int interfaceMethod() => 0;
-}
-
-main() {
-  topField;
-  topField = 0;
-  var v1 = topGetter;
-  var v2 = topFunction(p: 0);
-
-  A.staticField;
-  A.staticField = 0;
-  var v3 = A.staticGetter;
-  var v4 = A.staticMethod();
-
-  var a = new A();
-
-  a.instanceField;
-  a.instanceField = 0;
-  var v5 = a.instanceGetter;
-  var v6 = a.instanceMethod();
-
-  a.interfaceField;
-  a.interfaceField = 0;
-  var v7 = a.interfaceGetter;
-  var v8 = a.interfaceMethod();
-}
-''');
-
-    KernelSequenceResult result = await driver.getKernelSequence(bUri);
-
-    Component component = new Component(
-        nameRoot: result.nameRoot, libraries: _allLibraries(result));
-
-    String initialKernelText;
-    List<int> bytes;
-    {
-      Library initialLibrary = _getLibraryFromComponent(component, bUri);
-      initialKernelText = _getLibraryText(initialLibrary);
-
-      bytes = serializeComponent(component,
-          filter: (library) => library.importUri == bUri);
-
-      // Remove b.dart from the component.
-      // So, the component is now ready for re-adding the library.
-      component.mainMethod = null;
-      component.libraries.remove(initialLibrary);
-      component.root.removeChild(initialLibrary.importUri.toString());
-    }
-
-    // Load b.dart from bytes using the initial name root, so that
-    // serialized canonical names can be linked to corresponding nodes.
-    Library loadedLibrary;
-    {
-      var componentForLoading = new Component(nameRoot: component.root);
-      var reader = new BinaryBuilder(bytes);
-      reader.readComponent(componentForLoading);
-      loadedLibrary = _getLibraryFromComponent(componentForLoading, bUri);
-    }
-
-    // Add the library into the component.
-    component.libraries.add(loadedLibrary);
-    loadedLibrary.parent = component;
-    component.mainMethod = loadedLibrary.procedures
-        .firstWhere((procedure) => procedure.name.name == 'main');
-
-    expect(_getLibraryText(loadedLibrary), initialKernelText);
-    verifyComponent(component);
-  }
-
-  test_updatePackageSourceUsingFileUri() async {
-    _createDriver(packages: {'test': _folderUri('/test/lib')});
-
-    writeFile('/test/.packages', 'test:lib/');
-    Uri aFileUri = writeFile('/test/bin/a.dart', r'''
-import 'package:test/b.dart';
-var a = b;
-''');
-    Uri bFileUri = writeFile('/test/lib/b.dart', 'var b = 1;');
-    Uri bPackageUri = Uri.parse('package:test/b.dart');
-
-    // Compute the initial state.
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(aFileUri);
-      Library library = _getLibrary(result, aFileUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "package:test/b.dart" as b;
-
-static field core::int a = b::b;
-''');
-    }
-
-    // Update b.dart and use file URI to invalidate it.
-    // The delta is recomputed even though b.dart is used with the package URI.
-    writeFile('/test/lib/b.dart', 'var b = 1.2;');
-    driver.invalidate(bFileUri);
-    {
-      KernelSequenceResult result = await driver.getKernelSequence(aFileUri);
-      _assertLibraryUris(result, includes: [aFileUri, bPackageUri]);
-      Library library = _getLibrary(result, aFileUri);
-      expect(_getLibraryText(library), r'''
-library;
-import self as self;
-import "dart:core" as core;
-import "package:test/b.dart" as b;
-
-static field core::double a = b::b;
-''');
-    }
-  }
-
-  test_updatePart() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String libPath = '/test/lib/test.dart';
-    String partPath = '/test/lib/bar.dart';
-    Uri libUri = writeFile(libPath, r'''
-library foo;
-part 'bar.dart';
-var a = 1;
-var c = b;
-void main() {}
-''');
-    Uri partUri = writeFile(partPath, r'''
-part of foo;
-var b = 2;
-var d = a;
-''');
-
-    // Check the initial state - types flow between the part and the library.
-    KernelSequenceResult result = await driver.getKernelSequence(libUri);
-    Library library = _getLibrary(result, libUri);
-    expect(_getLibraryText(library), r'''
-library foo;
-import self as self;
-import "dart:core" as core;
-
-static field core::int a = 1;
-static field core::int c = self::b;
-static field core::int b = 2 /* from org-dartlang-test:///test/lib/bar.dart */;
-static field core::int d = self::a /* from org-dartlang-test:///test/lib/bar.dart */;
-static method main() → void {}
-''');
-
-    // Update [b] in the part, the type is changed in the part and library.
-    {
-      writeFile(partPath, r'''
-part of foo;
-var b = 2.3;
-var d = a;
-''');
-      driver.invalidate(partUri);
-      KernelSequenceResult result = await driver.getKernelSequence(libUri);
-      Library library = _getLibrary(result, libUri);
-      expect(_getLibraryText(library), r'''
-library foo;
-import self as self;
-import "dart:core" as core;
-
-static field core::int a = 1;
-static field core::double c = self::b;
-static field core::double b = 2.3 /* from org-dartlang-test:///test/lib/bar.dart */;
-static field core::int d = self::a /* from org-dartlang-test:///test/lib/bar.dart */;
-static method main() → void {}
-''');
-    }
-
-    // Update [a] in the library, the type is changed in the part and library.
-    {
-      writeFile(libPath, r'''
-library foo;
-part 'bar.dart';
-var a = 'aaa';
-var c = b;
-void main() {}
-''');
-      driver.invalidate(libUri);
-      KernelSequenceResult result = await driver.getKernelSequence(libUri);
-      Library library = _getLibrary(result, libUri);
-      expect(_getLibraryText(library), r'''
-library foo;
-import self as self;
-import "dart:core" as core;
-
-static field core::String a = "aaa";
-static field core::double c = self::b;
-static field core::double b = 2.3 /* from org-dartlang-test:///test/lib/bar.dart */;
-static field core::String d = self::a /* from org-dartlang-test:///test/lib/bar.dart */;
-static method main() → void {}
-''');
-    }
-  }
-
-  test_watch() async {
-    writeFile('/test/.packages', 'test:lib/');
-    String aPath = '/test/lib/a.dart';
-    String bPath = '/test/lib/b.dart';
-    String cPath = '/test/lib/c.dart';
-    Uri aUri = writeFile(aPath, '');
-    Uri bUri = writeFile(bPath, '');
-    Uri cUri = writeFile(cPath, r'''
-import 'a.dart';
-''');
-
-    var usedFiles = <Uri>[];
-    _createDriver(fileAddedFn: (Uri uri) {
-      usedFiles.add(uri);
-      return new Future.value();
-    });
-
-    {
-      await driver.getKernelSequence(cUri);
-      // We use at least c.dart and a.dart now.
-      expect(usedFiles, contains(cUri));
-      expect(usedFiles, contains(aUri));
-      usedFiles.clear();
-    }
-
-    // Update c.dart to reference also b.dart file.
-    writeFile(cPath, r'''
-import 'a.dart';
-import 'b.dart';
-''');
-    driver.invalidate(cUri);
-    {
-      await driver.getKernelSequence(cUri);
-      // The only new file is b.dart now.
-      expect(usedFiles, [bUri]);
-      usedFiles.clear();
-    }
-  }
-
-  /// Write the given [text] of the file with the given [path] into the
-  /// virtual filesystem.  Return the URI of the file.
-  Uri writeFile(String path, String text) {
-    Uri uri = Uri.parse('org-dartlang-test://$path');
-    fileSystem.entityForUri(uri).writeAsStringSync(text);
-    return uri;
-  }
-
-  List<Library> _allLibraries(KernelSequenceResult result) {
-    return result.results
-        .map((cycle) => cycle.libraryResults.map((result) => result.library))
-        .expand((libraries) => libraries)
-        .toList();
-  }
-
-  void _assertCompiledUris(
-      {Iterable<Uri> includes: const [], Iterable<Uri> excludes: const []}) {
-    var compiledCycles = driver.test.compiledCycles;
-    Set<Uri> compiledUris = compiledCycles
-        .map((cycle) => cycle.libraries.map((file) => file.uri))
-        .expand((uris) => uris)
-        .toSet();
-    for (var shouldInclude in includes) {
-      expect(compiledUris, contains(shouldInclude));
-    }
-    for (var shouldExclude in excludes) {
-      expect(compiledUris, isNot(contains(shouldExclude)));
-    }
-  }
-
-  void _assertKernelResult(KernelResult result, Uri libraryUri,
-      {List<Uri> includes: const [], List<Uri> excludes: const []}) {
-    expect(result.libraryResult?.library, isNotNull);
-    expect(result.libraryResult.library.importUri, libraryUri);
-
-    List<Uri> dependencyUris = [];
-    for (var library in result.dependencies) {
-      dependencyUris.add(library.importUri);
-    }
-    for (var shouldInclude in includes) {
-      expect(dependencyUris, contains(shouldInclude));
-    }
-    for (var shouldExclude in excludes) {
-      expect(dependencyUris, isNot(contains(shouldExclude)));
-    }
-  }
-
-  void _assertLibraryUris(KernelSequenceResult result,
-      {List<Uri> includes: const [], List<Uri> excludes: const []}) {
-    Map<Uri, Source> uriToSource = {};
-    List<Uri> libraryUris = [];
-    for (LibraryCycleResult cycleResult in result.results) {
-      uriToSource.addAll(cycleResult.uriToSource);
-      for (var result in cycleResult.libraryResults) {
-        libraryUris.add(result.library.importUri);
-      }
-    }
-    for (var shouldInclude in includes) {
-      expect(libraryUris, contains(shouldInclude));
-      var shouldIncludeFileUri = _resolveUriToFileUri(shouldInclude);
-      expect(uriToSource.keys, contains(shouldIncludeFileUri));
-    }
-    for (var shouldExclude in excludes) {
-      expect(libraryUris, isNot(contains(shouldExclude)));
-      var shouldExcludeFileUri = _resolveUriToFileUri(shouldExclude);
-      expect(uriToSource.keys, isNot(contains(shouldExcludeFileUri)));
-    }
-  }
-
-  Future<List<int>> _computeSdkOutlineBytes() async {
-    var options = new CompilerOptions()
-      ..fileSystem = fileSystem
-      ..sdkRoot = Uri.parse('org-dartlang-test:///sdk/')
-      ..compileSdk = true
-      ..strongMode = true
-      ..target = new NoneTarget(new TargetFlags(strongMode: true));
-    var inputs = [Uri.parse('dart:core')];
-    return summaryFor(inputs, options);
-  }
-
-  /// Create new [KernelDriver] instance and put it into the [driver] field.
-  void _createDriver(
-      {List<int> sdkOutlineBytes,
-      Map<String, Uri> packages,
-      KernelDriverFileAddedFn fileAddedFn}) {
-    var uriTranslator = new UriTranslatorImpl(
-        createSdkFiles(fileSystem), new MapPackages(packages));
-
-    var options = new CompilerOptions()
-      ..logger = new PerformanceLog(null)
-      ..fileSystem = fileSystem
-      ..byteStore = new MemoryByteStore()
-      ..strongMode = true
-      ..target = new NoneTarget(new TargetFlags(strongMode: true));
-
-    driver = new KernelDriver(new ProcessedOptions(options: options),
-        uriTranslator, new KernelErrorListener(),
-        sdkOutlineBytes: sdkOutlineBytes, fileAddedFn: fileAddedFn);
-  }
-
-  Library _getLibrary(KernelSequenceResult result, Uri uri) {
-    for (var cycleResult in result.results) {
-      for (var result in cycleResult.libraryResults) {
-        if (result.library.importUri == uri) return result.library;
-      }
-    }
-    fail('No library found with URI "$uri"');
-  }
-
-  Library _getLibraryFromComponent(Component component, Uri uri) {
-    for (var library in component.libraries) {
-      if (library.importUri == uri) return library;
-    }
-    fail('No library found with URI "$uri"');
-  }
-
-  String _getLibraryText(Library library) {
-    StringBuffer buffer = new StringBuffer();
-    new Printer(buffer, syntheticNames: new NameSystem())
-        .writeLibraryFile(library);
-    return buffer.toString();
-  }
-
-  /// Resolve the given `dart` or `package` [inputUri] into the corresponding
-  /// file URI, or return the same URI if it is already a file URI.
-  Uri _resolveUriToFileUri(Uri inputUri) {
-    var translator = driver.uriTranslator;
-    var outputUri = translator.translate(inputUri) ?? inputUri;
-    return outputUri;
-  }
-
-  /// Return the [Uri] for the given Posix [path].
-  static Uri _folderUri(String path) {
-    if (!path.endsWith('/')) path += '/';
-    return Uri.parse('org-dartlang-test://$path');
-  }
-}
diff --git a/pkg/front_end/test/src/incremental/mock_sdk.dart b/pkg/front_end/test/src/incremental/mock_sdk.dart
deleted file mode 100644
index 1cbbc83..0000000
--- a/pkg/front_end/test/src/incremental/mock_sdk.dart
+++ /dev/null
@@ -1,333 +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:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/base/libraries_specification.dart';
-
-final _ASYNC = r'''
-library dart.async;
-
-class Future<T> {
-  factory Future(computation()) => null;
-  factory Future.delayed(Duration duration, [T computation()]) => null;
-  factory Future.microtask(FutureOr<T> computation()) => null;
-  factory Future.value([value]) => null;
-
-  static Future<List<T>> wait<T>(Iterable<Future<T>> futures) => null;
-  Future<R> then<R>(FutureOr<R> onValue(T value)) => null;
-
-  Future<T> whenComplete(action());
-}
-
-
-class FutureOr<T> {}
-class Stream<T> {}
-abstract class StreamIterator<T> {}
-
-abstract class Completer<T> {
-  factory Completer() => null;
-  factory Completer.sync() => null;
-  Future<T> get future;
-  void complete([FutureOr<T> value]);
-  void completeError(Object error, [StackTrace stackTrace]);
-  bool get isCompleted;
-}
-
-class _StreamIterator<T> implements StreamIterator<T> {
-  T get current;
-  Future<bool> moveNext();
-  Future cancel();
-}
-
-class _AsyncStarStreamController<T> {
-  Stream<T> get stream;
-  bool add(T event);
-  bool addStream(Stream<T> stream);
-  void addError(Object error, StackTrace stackTrace);
-  close();
-}
-
-Object _asyncStackTraceHelper(Function async_op) { }
-Function _asyncThenWrapperHelper(continuation) {}
-Function _asyncErrorWrapperHelper(continuation) {}
-Future _awaitHelper(
-    object, Function thenCallback, Function errorCallback, var awaiter) {}
-''';
-
-final _CORE = r'''
-library dart.core;
-import 'dart:_internal';
-import 'dart:async';
-
-class Object {
-  const Object();
-  bool operator ==(other) => identical(this, other);
-  String toString() => 'a string';
-  int get hashCode => 0;
-  Type get runtimeType => null;
-  dynamic noSuchMethod(Invocation invocation) => null;
-}
-
-class Null {}
-
-class Symbol {
-  const factory Symbol(String name) {
-    return null;
-  }
-}
-
-class Type {}
-
-abstract class Comparable<T> {
-  int compareTo(T other);
-}
-
-abstract class Pattern {}
-
-abstract class String implements Comparable<String>, Pattern {
-  external factory String.fromCharCodes(Iterable<int> charCodes,
-                                        [int start = 0, int end]);
-  String operator +(String other) => null;
-  bool get isEmpty => false;
-  bool get isNotEmpty => false;
-  int get length => 0;
-  String substring(int len) => null;
-  String toLowerCase();
-  String toUpperCase();
-  List<int> get codeUnits;
-}
-
-abstract class RegExp implements Pattern {
-  external factory RegExp(String source);
-}
-
-class Function {}
-class Invocation {}
-class StackTrace {}
-
-class bool extends Object {
-  external const factory bool.fromEnvironment(String name,
-                                              {bool defaultValue: false});
-}
-
-abstract class num implements Comparable<num> {
-  bool operator ==(Object other);
-  bool operator <(num other);
-  bool operator <=(num other);
-  bool operator >(num other);
-  bool operator >=(num other);
-  num operator +(num other);
-  num operator -(num other);
-  num operator *(num other);
-  num operator /(num other);
-  int operator ^(int other);
-  int operator |(int other);
-  int operator <<(int other);
-  int operator >>(int other);
-  int operator ~/(num other);
-  num operator %(num other);
-  int operator ~();
-  num operator -();
-  int toInt();
-  double toDouble();
-  num abs();
-  int round();
-}
-
-abstract class int extends num {
-  external const factory int.fromEnvironment(String name, {int defaultValue});
-
-  bool get isNegative;
-  bool get isEven => false;
-
-  int operator &(int other);
-  int operator |(int other);
-  int operator ^(int other);
-  int operator ~();
-  int operator <<(int shiftAmount);
-  int operator >>(int shiftAmount);
-
-  int operator -();
-
-  external static int parse(String source,
-                            { int radix,
-                              int onError(String source) });
-}
-
-abstract class double extends num {
-  static const double NAN = 0.0 / 0.0;
-  static const double INFINITY = 1.0 / 0.0;
-  static const double NEGATIVE_INFINITY = -INFINITY;
-  static const double MIN_POSITIVE = 5e-324;
-  static const double MAX_FINITE = 1.7976931348623157e+308;
-
-  double remainder(num other);
-  double operator +(num other);
-  double operator -(num other);
-  double operator *(num other);
-  double operator %(num other);
-  double operator /(num other);
-  int operator ~/(num other);
-  double operator -();
-  double abs();
-  double get sign;
-  int round();
-  int floor();
-  int ceil();
-  int truncate();
-  double roundToDouble();
-  double floorToDouble();
-  double ceilToDouble();
-  double truncateToDouble();
-  external static double parse(String source,
-                               [double onError(String source)]);
-}
-
-class Iterator<E> {
-  bool moveNext();
-  E get current;
-}
-
-abstract class Iterable<E> {
-  Iterator<E> get iterator;
-  bool get isEmpty;
-  E get first;
-
-  Iterable<R> map<R>(R f(E e));
-
-  R fold<R>(R initialValue, R combine(R previousValue, E element));
-
-  Iterable<T> expand<T>(Iterable<T> f(E element));
-
-  Iterable<E> where(bool test(E element));
-
-  void forEach(void f(E element));
-
-  List<E> toList();
-}
-
-class List<E> implements Iterable<E> {
-  List();
-  factory List.from(Iterable elements, {bool growable: true}) => null;
-  void add(E value) {}
-  void addAll(Iterable<E> iterable) {}
-  E operator [](int index) => null;
-  void operator []=(int index, E value) {}
-  Iterator<E> get iterator => null;
-  void clear() {}
-
-  bool get isEmpty => false;
-  E get first => null;
-  E get last => null;
-
-  R fold<R>(R initialValue, R combine(R previousValue, E element)) => null;
-}
-
-class Map<K, V> extends Object {
-  V operator [](K key) => null;
-  void operator []=(K key, V value) {}
-  Iterable<K> get keys => null;
-  int get length;
-  Iterable<V> get values;
-}
-
-class Duration implements Comparable<Duration> {}
-
-external bool identical(Object a, Object b);
-
-void print(Object o) {}
-
-abstract class _SyncIterable<T> implements Iterable<T> {}
-
-class _SyncIterator<T> implements Iterator<T> {
-  T _current;
-  Iterable<T> _yieldEachIterable;
-}
-
-class _InvocationMirror {
-  _InvocationMirror._withoutType(
-      String _functionName, List<Type> _typeArguments,
-      List _positionalArguments, Map<Symbol, dynamic>_namedArguments,
-      bool _isSuperInvocation);
-}
-
-class _CompileTimeError {
-  final String _errorMsg;
-  _CompileTimeError(this._errorMsg);
-}
-
-class _ConstantExpressionError {
-  const _ConstantExpressionError();
-  external _throw(error);
-}
-
-class _DuplicatedFieldInitializerError {
-  _DuplicatedFieldInitializerError(String name);
-}
-
-class AbstractClassInstantiationError {
-  AbstractClassInstantiationError(String className);
-}
-
-class FallThroughError {
-  FallThroughError();
-  FallThroughError._create(String url, int line);
-}
-''';
-
-/// Create SDK libraries which are used by Fasta to perform kernel generation.
-/// The root of the SDK is `org-dartlang-test:///sdk`, it will contain a
-/// libraries specification file at `lib/libraries.json`.
-///
-/// Returns the [TargetLibrariesSpecification] whose contents are in
-/// libraries.json.
-TargetLibrariesSpecification createSdkFiles(MemoryFileSystem fileSystem) {
-  Map<String, LibraryInfo> dartLibraries = {};
-  void addSdkLibrary(String name, String contents) {
-    String path = '$name/$name.dart';
-    Uri uri = Uri.parse('org-dartlang-test:///sdk/lib/$path');
-    fileSystem.entityForUri(uri).writeAsStringSync(contents);
-    dartLibraries[name] = new LibraryInfo(name, uri, const []);
-  }
-
-  fileSystem
-      .entityForUri(Uri.parse('org-dartlang-test:///sdk/'))
-      .createDirectory();
-
-  addSdkLibrary('core', _CORE);
-  addSdkLibrary('async', _ASYNC);
-
-  addSdkLibrary('collection', 'library dart.collection;');
-  addSdkLibrary('convert', 'library dart.convert;');
-  addSdkLibrary('developer', 'library dart.developer;');
-  addSdkLibrary('io', 'library dart.io;');
-  addSdkLibrary('cli', 'library dart.cli;');
-  addSdkLibrary('isolate', 'library dart.isolate;');
-  addSdkLibrary('math', '''
-library dart.math;
-external double sin(num radians);
-''');
-  addSdkLibrary('mirrors', 'library dart.mirrors;');
-  addSdkLibrary('nativewrappers', 'library dart.nativewrappers;');
-  addSdkLibrary('profiler', 'library dart.profiler;');
-  addSdkLibrary('typed_data', 'library dart.typed_data;');
-  addSdkLibrary('_builtin', 'library dart._builtin;');
-  addSdkLibrary('_vmservice', 'library dart._vmservice;');
-  addSdkLibrary('vmservice_io', 'library dart.vmservice_io;');
-  addSdkLibrary('_internal', '''
-library dart._internal;
-class Symbol {}
-class ExternalName {
-  final String name;
-  const ExternalName(this.name);
-}
-''');
-
-  var targetSpec = new TargetLibrariesSpecification(null, dartLibraries);
-  var spec = new LibrariesSpecification({'none': targetSpec, 'vm': targetSpec});
-
-  Uri uri = Uri.parse('org-dartlang-test:///sdk/lib/libraries.json');
-  fileSystem.entityForUri(uri).writeAsStringSync(spec.toJsonString(uri));
-  return targetSpec;
-}
diff --git a/pkg/front_end/test/src/incremental/test_all.dart b/pkg/front_end/test/src/incremental/test_all.dart
deleted file mode 100644
index 3e611d9..0000000
--- a/pkg/front_end/test/src/incremental/test_all.dart
+++ /dev/null
@@ -1,18 +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:test_reflective_loader/test_reflective_loader.dart';
-
-import 'file_state_test.dart' as file_state;
-import 'format_test.dart' as format;
-import 'kernel_driver_test.dart' as kernel_driver;
-
-/// Utility for manually running all tests.
-main() {
-  defineReflectiveSuite(() {
-    file_state.main();
-    format.main();
-    kernel_driver.main();
-  }, name: 'incremental');
-}
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.outline.expect b/pkg/front_end/testcases/DeltaBlue.dart.outline.expect
index 38bd492..65edda0 100644
--- a/pkg/front_end/testcases/DeltaBlue.dart.outline.expect
+++ b/pkg/front_end/testcases/DeltaBlue.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class DeltaBlue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::DeltaBlue
     ;
   method run() → void
     ;
@@ -11,7 +11,7 @@
 class Strength extends core::Object {
   final field core::int value;
   final field core::String name;
-  const constructor •(core::int value, core::String name) → void
+  const constructor •(core::int value, core::String name) → self::Strength
     ;
   method nextWeaker() → self::Strength
     ;
@@ -26,7 +26,7 @@
 }
 abstract class Constraint extends core::Object {
   final field self::Strength strength;
-  const constructor •(self::Strength strength) → void
+  const constructor •(self::Strength strength) → self::Constraint
     ;
   abstract method isSatisfied() → core::bool;
   abstract method markUnsatisfied() → void;
@@ -50,7 +50,7 @@
 abstract class UnaryConstraint extends self::Constraint {
   final field self::Variable myOutput;
   field core::bool satisfied;
-  constructor •(self::Variable myOutput, self::Strength strength) → void
+  constructor •(self::Variable myOutput, self::Strength strength) → self::UnaryConstraint
     ;
   method addToGraph() → void
     ;
@@ -72,13 +72,13 @@
     ;
 }
 class StayConstraint extends self::UnaryConstraint {
-  constructor •(self::Variable v, self::Strength str) → void
+  constructor •(self::Variable v, self::Strength str) → self::StayConstraint
     ;
   method execute() → void
     ;
 }
 class EditConstraint extends self::UnaryConstraint {
-  constructor •(self::Variable v, self::Strength str) → void
+  constructor •(self::Variable v, self::Strength str) → self::EditConstraint
     ;
   method isInput() → core::bool
     ;
@@ -89,7 +89,7 @@
   field self::Variable v1;
   field self::Variable v2;
   field core::int direction;
-  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → void
+  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → self::BinaryConstraint
     ;
   method chooseMethod(core::int mark) → void
     ;
@@ -115,7 +115,7 @@
 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) → void
+  constructor •(self::Variable src, self::Variable scale, self::Variable offset, self::Variable dest, self::Strength strength) → self::ScaleConstraint
     ;
   method addToGraph() → void
     ;
@@ -129,7 +129,7 @@
     ;
 }
 class EqualityConstraint extends self::BinaryConstraint {
-  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → void
+  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → self::EqualityConstraint
     ;
   method execute() → void
     ;
@@ -142,7 +142,7 @@
   field core::bool stay;
   field core::int value;
   final field core::String name;
-  constructor •(core::String name, core::int value) → void
+  constructor •(core::String name, core::int value) → self::Variable
     ;
   method addConstraint(self::Constraint c) → void
     ;
@@ -151,7 +151,7 @@
 }
 class Planner extends core::Object {
   field core::int currentMark;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Planner
     ;
   method incrementalAdd(self::Constraint c) → void
     ;
@@ -172,7 +172,7 @@
 }
 class Plan extends core::Object {
   field core::List<self::Constraint> list;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Plan
     ;
   method addConstraint(self::Constraint c) → void
     ;
diff --git a/pkg/front_end/testcases/accessors.dart.direct.expect b/pkg/front_end/testcases/accessors.dart.direct.expect
index 4f83131..9d3bdd4 100644
--- a/pkg/front_end/testcases/accessors.dart.direct.expect
+++ b/pkg/front_end/testcases/accessors.dart.direct.expect
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set onlySetter(dynamic value) → void {
@@ -39,7 +39,7 @@
   }
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   get onlySetter() → core::String
diff --git a/pkg/front_end/testcases/accessors.dart.direct.transformed.expect b/pkg/front_end/testcases/accessors.dart.direct.transformed.expect
index 342baaf..c6c025f 100644
--- a/pkg/front_end/testcases/accessors.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/accessors.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set onlySetter(dynamic value) → void {
@@ -25,7 +25,7 @@
   }
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   get onlySetter() → core::String
diff --git a/pkg/front_end/testcases/accessors.dart.outline.expect b/pkg/front_end/testcases/accessors.dart.outline.expect
index e8ed7db..5e345ad 100644
--- a/pkg/front_end/testcases/accessors.dart.outline.expect
+++ b/pkg/front_end/testcases/accessors.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   set onlySetter(dynamic value) → void
     ;
@@ -13,7 +13,7 @@
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   get onlySetter() → core::String
     ;
diff --git a/pkg/front_end/testcases/annotation_on_enum_values.dart.direct.expect b/pkg/front_end/testcases/annotation_on_enum_values.dart.direct.expect
index 246f4cb..d0e40c2 100644
--- a/pkg/front_end/testcases/annotation_on_enum_values.dart.direct.expect
+++ b/pkg/front_end/testcases/annotation_on_enum_values.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Fisk<T extends core::Object = dynamic> extends core::Object {
   final field self::Fisk::T x;
-  const constructor fisk(self::Fisk::T x) → void
+  const constructor fisk(self::Fisk::T x) → self::Fisk<self::Fisk::T>
     : self::Fisk::x = x, super core::Object::•()
     ;
 }
@@ -17,7 +17,7 @@
   @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) → void
+  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
diff --git a/pkg/front_end/testcases/annotation_on_enum_values.dart.direct.transformed.expect b/pkg/front_end/testcases/annotation_on_enum_values.dart.direct.transformed.expect
index 246f4cb..d0e40c2 100644
--- a/pkg/front_end/testcases/annotation_on_enum_values.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/annotation_on_enum_values.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Fisk<T extends core::Object = dynamic> extends core::Object {
   final field self::Fisk::T x;
-  const constructor fisk(self::Fisk::T x) → void
+  const constructor fisk(self::Fisk::T x) → self::Fisk<self::Fisk::T>
     : self::Fisk::x = x, super core::Object::•()
     ;
 }
@@ -17,7 +17,7 @@
   @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) → void
+  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
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
index 02c5c32..319403e 100644
--- a/pkg/front_end/testcases/annotation_on_enum_values.dart.outline.expect
+++ b/pkg/front_end/testcases/annotation_on_enum_values.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class Fisk<T extends core::Object = dynamic> extends core::Object {
   final field self::Fisk::T x;
-  const constructor fisk(self::Fisk::T x) → void
+  const constructor fisk(self::Fisk::T x) → self::Fisk<self::Fisk::T>
     ;
 }
 class Foo extends core::Object {
@@ -14,7 +14,7 @@
   static const field self::Foo bar = const self::Foo::•(0, "Foo.bar");
   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) → void
+  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
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
index 2c026ab..5d8249c 100644
--- a/pkg/front_end/testcases/annotation_on_enum_values.dart.strong.expect
+++ b/pkg/front_end/testcases/annotation_on_enum_values.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class Fisk<T extends core::Object = dynamic> extends core::Object {
   final field self::Fisk::T x;
-  const constructor fisk(self::Fisk::T x) → void
+  const constructor fisk(self::Fisk::T x) → self::Fisk<self::Fisk::T>
     : self::Fisk::x = x, super core::Object::•()
     ;
 }
@@ -17,7 +17,7 @@
   @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) → void
+  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
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
index 2c026ab..5d8249c 100644
--- 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
@@ -4,7 +4,7 @@
 
 class Fisk<T extends core::Object = dynamic> extends core::Object {
   final field self::Fisk::T x;
-  const constructor fisk(self::Fisk::T x) → void
+  const constructor fisk(self::Fisk::T x) → self::Fisk<self::Fisk::T>
     : self::Fisk::x = x, super core::Object::•()
     ;
 }
@@ -17,7 +17,7 @@
   @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) → void
+  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
diff --git a/pkg/front_end/testcases/annotation_top.dart.direct.expect b/pkg/front_end/testcases/annotation_top.dart.direct.expect
index 69d3ebe..3498e81 100644
--- a/pkg/front_end/testcases/annotation_top.dart.direct.expect
+++ b/pkg/front_end/testcases/annotation_top.dart.direct.expect
@@ -11,14 +11,14 @@
 @self::A::•(3)
 typedef F2 = () → void;
 class A extends core::Object {
-  const constructor •(core::int value) → void
+  const constructor •(core::int value) → self::A
     : super core::Object::•()
     ;
 }
 @self::a
 @self::A::•(2)
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/annotation_top.dart.direct.transformed.expect b/pkg/front_end/testcases/annotation_top.dart.direct.transformed.expect
index 69d3ebe..3498e81 100644
--- a/pkg/front_end/testcases/annotation_top.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/annotation_top.dart.direct.transformed.expect
@@ -11,14 +11,14 @@
 @self::A::•(3)
 typedef F2 = () → void;
 class A extends core::Object {
-  const constructor •(core::int value) → void
+  const constructor •(core::int value) → self::A
     : super core::Object::•()
     ;
 }
 @self::a
 @self::A::•(2)
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/annotation_top.dart.outline.expect b/pkg/front_end/testcases/annotation_top.dart.outline.expect
index 234cc3b..6839b80 100644
--- a/pkg/front_end/testcases/annotation_top.dart.outline.expect
+++ b/pkg/front_end/testcases/annotation_top.dart.outline.expect
@@ -5,11 +5,11 @@
 typedef F1 = () → void;
 typedef F2 = () → void;
 class A extends core::Object {
-  const constructor •(core::int value) → void
+  const constructor •(core::int value) → self::A
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static const field core::Object a;
diff --git a/pkg/front_end/testcases/annotation_top.dart.strong.expect b/pkg/front_end/testcases/annotation_top.dart.strong.expect
index 69d3ebe..3498e81 100644
--- a/pkg/front_end/testcases/annotation_top.dart.strong.expect
+++ b/pkg/front_end/testcases/annotation_top.dart.strong.expect
@@ -11,14 +11,14 @@
 @self::A::•(3)
 typedef F2 = () → void;
 class A extends core::Object {
-  const constructor •(core::int value) → void
+  const constructor •(core::int value) → self::A
     : super core::Object::•()
     ;
 }
 @self::a
 @self::A::•(2)
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/annotation_top.dart.strong.transformed.expect b/pkg/front_end/testcases/annotation_top.dart.strong.transformed.expect
index 69d3ebe..3498e81 100644
--- a/pkg/front_end/testcases/annotation_top.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/annotation_top.dart.strong.transformed.expect
@@ -11,14 +11,14 @@
 @self::A::•(3)
 typedef F2 = () → void;
 class A extends core::Object {
-  const constructor •(core::int value) → void
+  const constructor •(core::int value) → self::A
     : super core::Object::•()
     ;
 }
 @self::a
 @self::A::•(2)
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.direct.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.direct.expect
index fad5955..a437f1e 100644
--- a/pkg/front_end/testcases/annotation_variable_declaration.dart.direct.expect
+++ b/pkg/front_end/testcases/annotation_variable_declaration.dart.direct.expect
@@ -4,15 +4,15 @@
 
 typedef hest_t = ({@self::foo dynamic named}) → dynamic;
 class Bar extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar
     : super core::Object::•()
     ;
-  const constructor named(dynamic x) → void
+  const constructor named(dynamic x) → self::Bar
     : super core::Object::•()
     ;
 }
 class Baz extends core::Object {
-  constructor •(@self::foo dynamic constructorFormal) → void
+  constructor •(@self::foo dynamic constructorFormal) → self::Baz
     : super core::Object::•()
     ;
   static factory bazFactory(@self::foo dynamic factoryFormal) → self::Baz
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.direct.transformed.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.direct.transformed.expect
index fad5955..a437f1e 100644
--- a/pkg/front_end/testcases/annotation_variable_declaration.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/annotation_variable_declaration.dart.direct.transformed.expect
@@ -4,15 +4,15 @@
 
 typedef hest_t = ({@self::foo dynamic named}) → dynamic;
 class Bar extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar
     : super core::Object::•()
     ;
-  const constructor named(dynamic x) → void
+  const constructor named(dynamic x) → self::Bar
     : super core::Object::•()
     ;
 }
 class Baz extends core::Object {
-  constructor •(@self::foo dynamic constructorFormal) → void
+  constructor •(@self::foo dynamic constructorFormal) → self::Baz
     : super core::Object::•()
     ;
   static factory bazFactory(@self::foo dynamic factoryFormal) → self::Baz
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.outline.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.outline.expect
index 6382194..3eb241b 100644
--- a/pkg/front_end/testcases/annotation_variable_declaration.dart.outline.expect
+++ b/pkg/front_end/testcases/annotation_variable_declaration.dart.outline.expect
@@ -4,13 +4,13 @@
 
 typedef hest_t = ({named: dynamic}) → dynamic;
 class Bar extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar
     ;
-  const constructor named(dynamic x) → void
+  const constructor named(dynamic x) → self::Bar
     ;
 }
 class Baz extends core::Object {
-  constructor •(dynamic constructorFormal) → void
+  constructor •(dynamic constructorFormal) → self::Baz
     ;
   static factory bazFactory(dynamic factoryFormal) → self::Baz
     ;
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.expect
index 0f617ed..b848b38 100644
--- a/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.expect
@@ -4,15 +4,15 @@
 
 typedef hest_t = ({@self::foo dynamic named}) → dynamic;
 class Bar extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar
     : super core::Object::•()
     ;
-  const constructor named(dynamic x) → void
+  const constructor named(dynamic x) → self::Bar
     : super core::Object::•()
     ;
 }
 class Baz extends core::Object {
-  constructor •(@self::foo dynamic constructorFormal) → void
+  constructor •(@self::foo dynamic constructorFormal) → self::Baz
     : super core::Object::•()
     ;
   static factory bazFactory(@self::foo dynamic factoryFormal) → self::Baz
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
index 0f617ed..b848b38 100644
--- a/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.transformed.expect
@@ -4,15 +4,15 @@
 
 typedef hest_t = ({@self::foo dynamic named}) → dynamic;
 class Bar extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar
     : super core::Object::•()
     ;
-  const constructor named(dynamic x) → void
+  const constructor named(dynamic x) → self::Bar
     : super core::Object::•()
     ;
 }
 class Baz extends core::Object {
-  constructor •(@self::foo dynamic constructorFormal) → void
+  constructor •(@self::foo dynamic constructorFormal) → self::Baz
     : super core::Object::•()
     ;
   static factory bazFactory(@self::foo dynamic factoryFormal) → self::Baz
diff --git a/pkg/front_end/testcases/argument.dart.direct.expect b/pkg/front_end/testcases/argument.dart.direct.expect
index 3eb116b..74df666 100644
--- a/pkg/front_end/testcases/argument.dart.direct.expect
+++ b/pkg/front_end/testcases/argument.dart.direct.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 abstract class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Foo extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super self::Base::•()
     ;
 }
 class Bar extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Base::•()
     ;
 }
 class Baz extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/argument.dart.direct.transformed.expect b/pkg/front_end/testcases/argument.dart.direct.transformed.expect
index 3eb116b..74df666 100644
--- a/pkg/front_end/testcases/argument.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/argument.dart.direct.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 abstract class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Foo extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super self::Base::•()
     ;
 }
 class Bar extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Base::•()
     ;
 }
 class Baz extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/argument.dart.outline.expect b/pkg/front_end/testcases/argument.dart.outline.expect
index 1e18667..6d36e8f 100644
--- a/pkg/front_end/testcases/argument.dart.outline.expect
+++ b/pkg/front_end/testcases/argument.dart.outline.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 abstract class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     ;
 }
 class Foo extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
 }
 class Bar extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     ;
 }
 class Baz extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     ;
 }
 static method foo(dynamic x) → void
diff --git a/pkg/front_end/testcases/argument.dart.strong.expect b/pkg/front_end/testcases/argument.dart.strong.expect
index 3eb116b..74df666 100644
--- a/pkg/front_end/testcases/argument.dart.strong.expect
+++ b/pkg/front_end/testcases/argument.dart.strong.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 abstract class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Foo extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super self::Base::•()
     ;
 }
 class Bar extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Base::•()
     ;
 }
 class Baz extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/argument.dart.strong.transformed.expect b/pkg/front_end/testcases/argument.dart.strong.transformed.expect
index 3eb116b..74df666 100644
--- a/pkg/front_end/testcases/argument.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/argument.dart.strong.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 abstract class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Foo extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super self::Base::•()
     ;
 }
 class Bar extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Base::•()
     ;
 }
 class Baz extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/argument_mismatch.dart.direct.expect b/pkg/front_end/testcases/argument_mismatch.dart.direct.expect
index df4ee91..9f5b485 100644
--- a/pkg/front_end/testcases/argument_mismatch.dart.direct.expect
+++ b/pkg/front_end/testcases/argument_mismatch.dart.direct.expect
@@ -4,9 +4,14 @@
 // Try removing the extra positional arguments.
 //   /*@warning=MethodNotFound*/ foo(null);
 //                                  ^
-// pkg/front_end/testcases/argument_mismatch.dart:7:29: Warning: Found this candidate, but the arguments don't match.
+// pkg/front_end/testcases/argument_mismatch.dart:7:29: Context: Found this candidate, but the arguments don't match.
 // /*@context=CandidateFound*/ foo() {}
 //                             ^^^
+//
+// pkg/front_end/testcases/argument_mismatch.dart:10:34: Warning: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   /*@warning=MethodNotFound*/ foo(null);
+//                                  ^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/async_nested.dart.direct.expect b/pkg/front_end/testcases/async_nested.dart.direct.expect
index 8c2f3ea4..b1f76d3 100644
--- a/pkg/front_end/testcases/async_nested.dart.direct.expect
+++ b/pkg/front_end/testcases/async_nested.dart.direct.expect
@@ -6,7 +6,7 @@
 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]) → void
+  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(", ")}]>";
diff --git a/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect b/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect
index da3a56f..0dc1f7d 100644
--- a/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 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]) → void
+  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(", ")}]>";
diff --git a/pkg/front_end/testcases/async_nested.dart.outline.expect b/pkg/front_end/testcases/async_nested.dart.outline.expect
index f191aa2..1511915 100644
--- a/pkg/front_end/testcases/async_nested.dart.outline.expect
+++ b/pkg/front_end/testcases/async_nested.dart.outline.expect
@@ -5,7 +5,7 @@
 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]) → void
+  constructor •(core::String name, [core::List<self::Node> nested]) → self::Node
     ;
   method toString() → core::String
     ;
diff --git a/pkg/front_end/testcases/async_nested.dart.strong.expect b/pkg/front_end/testcases/async_nested.dart.strong.expect
index 02e249a..d207e896 100644
--- a/pkg/front_end/testcases/async_nested.dart.strong.expect
+++ b/pkg/front_end/testcases/async_nested.dart.strong.expect
@@ -6,7 +6,7 @@
 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]) → void
+  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}(", ")}]>";
diff --git a/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect b/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect
index 39cfaaf..f173dfc7 100644
--- a/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 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]) → void
+  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}(", ")}]>";
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
index e33f013..218527b 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
@@ -55,7 +55,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → dynamic
@@ -68,7 +68,7 @@
        ^";
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → dynamic
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.transformed.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.transformed.expect
index 6c9d767..074ed34 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.transformed.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → dynamic
@@ -28,7 +28,7 @@
        ^";
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → dynamic
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.outline.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.outline.expect
index 062086d..a9bb871 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.outline.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.outline.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   set a(dynamic #synthetic) → dynamic
     ;
@@ -23,7 +23,7 @@
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   set a(dynamic #synthetic) → 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
index 07155ae..67c1c60 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
@@ -59,7 +59,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → void
@@ -72,7 +72,7 @@
        ^";
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → void
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
index de4fa240..2e2e6ab 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → void
@@ -32,7 +32,7 @@
        ^";
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   set a(dynamic #synthetic) → void
diff --git a/pkg/front_end/testcases/bad_store.dart.direct.expect b/pkg/front_end/testcases/bad_store.dart.direct.expect
index 2acd12e..20204fb 100644
--- a/pkg/front_end/testcases/bad_store.dart.direct.expect
+++ b/pkg/front_end/testcases/bad_store.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/bad_store.dart.direct.transformed.expect b/pkg/front_end/testcases/bad_store.dart.direct.transformed.expect
index 2acd12e..20204fb 100644
--- a/pkg/front_end/testcases/bad_store.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bad_store.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/bad_store.dart.outline.expect b/pkg/front_end/testcases/bad_store.dart.outline.expect
index 41c648c..9c57266 100644
--- a/pkg/front_end/testcases/bad_store.dart.outline.expect
+++ b/pkg/front_end/testcases/bad_store.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field dynamic field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
 }
 static method identity(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/bad_store.dart.strong.expect b/pkg/front_end/testcases/bad_store.dart.strong.expect
index 9d63dac..0c5ebe9 100644
--- a/pkg/front_end/testcases/bad_store.dart.strong.expect
+++ b/pkg/front_end/testcases/bad_store.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/bad_store.dart.strong.transformed.expect b/pkg/front_end/testcases/bad_store.dart.strong.transformed.expect
index 9d63dac..0c5ebe9 100644
--- a/pkg/front_end/testcases/bad_store.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bad_store.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/bug30695.dart.direct.expect b/pkg/front_end/testcases/bug30695.dart.direct.expect
index db1bcbd..5967a02 100644
--- a/pkg/front_end/testcases/bug30695.dart.direct.expect
+++ b/pkg/front_end/testcases/bug30695.dart.direct.expect
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/bug30695.dart:11:3: Warning: Can't declare a member that conflicts with an inherited one.
 //   foo() => 42;
 //   ^
-// pkg/front_end/testcases/bug30695.dart:6:7: Warning: This is the inherited member.
+// pkg/front_end/testcases/bug30695.dart:6:7: Context: This is the inherited member.
 //   var foo = 42;
 //       ^
 
@@ -13,12 +13,12 @@
 
 class A extends core::Object {
   field dynamic foo = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   method foo() → dynamic
diff --git a/pkg/front_end/testcases/bug30695.dart.direct.transformed.expect b/pkg/front_end/testcases/bug30695.dart.direct.transformed.expect
index b07b4f4..72bc890 100644
--- a/pkg/front_end/testcases/bug30695.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bug30695.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field dynamic foo = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   method foo() → dynamic
diff --git a/pkg/front_end/testcases/bug30695.dart.outline.expect b/pkg/front_end/testcases/bug30695.dart.outline.expect
index 2f3f34e..cf6badd 100644
--- a/pkg/front_end/testcases/bug30695.dart.outline.expect
+++ b/pkg/front_end/testcases/bug30695.dart.outline.expect
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/bug30695.dart:11:3: Warning: Can't declare a member that conflicts with an inherited one.
 //   foo() => 42;
 //   ^
-// pkg/front_end/testcases/bug30695.dart:6:7: Warning: This is the inherited member.
+// pkg/front_end/testcases/bug30695.dart:6:7: Context: This is the inherited member.
 //   var foo = 42;
 //       ^
 
@@ -13,11 +13,11 @@
 
 class A extends core::Object {
   field dynamic foo;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/bug30695.dart.strong.expect b/pkg/front_end/testcases/bug30695.dart.strong.expect
index 1375e22..d03c5e3 100644
--- a/pkg/front_end/testcases/bug30695.dart.strong.expect
+++ b/pkg/front_end/testcases/bug30695.dart.strong.expect
@@ -3,7 +3,7 @@
 // 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: Error: This is the inherited member.
+// pkg/front_end/testcases/bug30695.dart:6:7: Context: This is the inherited member.
 //   var foo = 42;
 //       ^
 
@@ -19,12 +19,12 @@
 
 class A extends core::Object {
   field core::int foo = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   method foo() → dynamic
diff --git a/pkg/front_end/testcases/bug31124.dart.direct.expect b/pkg/front_end/testcases/bug31124.dart.direct.expect
index 559f7d8..90dd470 100644
--- a/pkg/front_end/testcases/bug31124.dart.direct.expect
+++ b/pkg/front_end/testcases/bug31124.dart.direct.expect
@@ -8,7 +8,7 @@
 // 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: Error: Previous declaration of 'a'.
+// pkg/front_end/testcases/bug31124.dart:1:5: Context: Previous declaration of 'a'.
 // var a = () => 'b';a();
 //     ^
 
diff --git a/pkg/front_end/testcases/bug31124.dart.outline.expect b/pkg/front_end/testcases/bug31124.dart.outline.expect
index ef07e67..6634364 100644
--- a/pkg/front_end/testcases/bug31124.dart.outline.expect
+++ b/pkg/front_end/testcases/bug31124.dart.outline.expect
@@ -8,7 +8,7 @@
 // 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: Error: Previous declaration of 'a'.
+// pkg/front_end/testcases/bug31124.dart:1:5: Context: Previous declaration of 'a'.
 // var a = () => 'b';a();
 //     ^
 
diff --git a/pkg/front_end/testcases/bug31124.dart.strong.expect b/pkg/front_end/testcases/bug31124.dart.strong.expect
index 559f7d8..90dd470 100644
--- a/pkg/front_end/testcases/bug31124.dart.strong.expect
+++ b/pkg/front_end/testcases/bug31124.dart.strong.expect
@@ -8,7 +8,7 @@
 // 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: Error: Previous declaration of 'a'.
+// pkg/front_end/testcases/bug31124.dart:1:5: Context: Previous declaration of 'a'.
 // var a = () => 'b';a();
 //     ^
 
diff --git a/pkg/front_end/testcases/bug32426.dart.direct.expect b/pkg/front_end/testcases/bug32426.dart.direct.expect
index 1e86267..c8ce03b 100644
--- a/pkg/front_end/testcases/bug32426.dart.direct.expect
+++ b/pkg/front_end/testcases/bug32426.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method call() → void;
 }
 class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call([core::int x = null]) → void {}
diff --git a/pkg/front_end/testcases/bug32426.dart.direct.transformed.expect b/pkg/front_end/testcases/bug32426.dart.direct.transformed.expect
index 1e86267..c8ce03b 100644
--- a/pkg/front_end/testcases/bug32426.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bug32426.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method call() → void;
 }
 class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call([core::int x = null]) → void {}
diff --git a/pkg/front_end/testcases/bug32426.dart.outline.expect b/pkg/front_end/testcases/bug32426.dart.outline.expect
index f4a907d..a6d026f 100644
--- a/pkg/front_end/testcases/bug32426.dart.outline.expect
+++ b/pkg/front_end/testcases/bug32426.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   abstract method call() → void;
 }
 class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method call([core::int x]) → void
     ;
diff --git a/pkg/front_end/testcases/bug32426.dart.strong.expect b/pkg/front_end/testcases/bug32426.dart.strong.expect
index 4c681bf..fe47689 100644
--- a/pkg/front_end/testcases/bug32426.dart.strong.expect
+++ b/pkg/front_end/testcases/bug32426.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method call() → void;
 }
 class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call([core::int x = null]) → void {}
diff --git a/pkg/front_end/testcases/bug32426.dart.strong.transformed.expect b/pkg/front_end/testcases/bug32426.dart.strong.transformed.expect
index 4c681bf..fe47689 100644
--- a/pkg/front_end/testcases/bug32426.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug32426.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method call() → void;
 }
 class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call([core::int x = null]) → void {}
diff --git a/pkg/front_end/testcases/bug32629.dart.direct.expect b/pkg/front_end/testcases/bug32629.dart.direct.expect
index 2269f15..e05c341 100644
--- a/pkg/front_end/testcases/bug32629.dart.direct.expect
+++ b/pkg/front_end/testcases/bug32629.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef Reducer<S extends core::Object = dynamic> = (S, dynamic) → S;
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method call(dynamic a, dynamic b) → dynamic {
diff --git a/pkg/front_end/testcases/bug32629.dart.direct.transformed.expect b/pkg/front_end/testcases/bug32629.dart.direct.transformed.expect
index 2269f15..e05c341 100644
--- a/pkg/front_end/testcases/bug32629.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bug32629.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef Reducer<S extends core::Object = dynamic> = (S, dynamic) → S;
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method call(dynamic a, dynamic b) → dynamic {
diff --git a/pkg/front_end/testcases/bug32629.dart.outline.expect b/pkg/front_end/testcases/bug32629.dart.outline.expect
index fd95657..cde3d8d 100644
--- a/pkg/front_end/testcases/bug32629.dart.outline.expect
+++ b/pkg/front_end/testcases/bug32629.dart.outline.expect
@@ -4,7 +4,7 @@
 
 typedef Reducer<S extends core::Object = dynamic> = (S, dynamic) → S;
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method call(dynamic a, dynamic b) → dynamic
     ;
diff --git a/pkg/front_end/testcases/bug32866.dart.direct.expect b/pkg/front_end/testcases/bug32866.dart.direct.expect
index 0e88c2a..f62f9f6 100644
--- a/pkg/front_end/testcases/bug32866.dart.direct.expect
+++ b/pkg/front_end/testcases/bug32866.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get f() → core::String;
 }
 class A extends core::Object implements self::B {
   final field dynamic f;
-  constructor •(dynamic f) → void
+  constructor •(dynamic f) → self::A
     : self::A::f = f, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/bug32866.dart.direct.transformed.expect b/pkg/front_end/testcases/bug32866.dart.direct.transformed.expect
index 0e88c2a..f62f9f6 100644
--- a/pkg/front_end/testcases/bug32866.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bug32866.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get f() → core::String;
 }
 class A extends core::Object implements self::B {
   final field dynamic f;
-  constructor •(dynamic f) → void
+  constructor •(dynamic f) → self::A
     : self::A::f = f, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/bug32866.dart.outline.expect b/pkg/front_end/testcases/bug32866.dart.outline.expect
index f524935..0b51724 100644
--- a/pkg/front_end/testcases/bug32866.dart.outline.expect
+++ b/pkg/front_end/testcases/bug32866.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract get f() → core::String;
 }
 class A extends core::Object implements self::B {
   final field dynamic f;
-  constructor •(dynamic f) → void
+  constructor •(dynamic f) → self::A
     ;
 }
 static field dynamic a;
diff --git a/pkg/front_end/testcases/bug32866.dart.strong.expect b/pkg/front_end/testcases/bug32866.dart.strong.expect
index a8afb38..4428936 100644
--- a/pkg/front_end/testcases/bug32866.dart.strong.expect
+++ b/pkg/front_end/testcases/bug32866.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  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) → void
+  constructor •(core::String f) → self::A
     : self::A::f = f, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/bug32866.dart.strong.transformed.expect b/pkg/front_end/testcases/bug32866.dart.strong.transformed.expect
index a8afb38..4428936 100644
--- a/pkg/front_end/testcases/bug32866.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug32866.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  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) → void
+  constructor •(core::String f) → self::A
     : self::A::f = f, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/bug33099.dart.outline.expect b/pkg/front_end/testcases/bug33099.dart.outline.expect
index 9d360a0..9e86057 100644
--- a/pkg/front_end/testcases/bug33099.dart.outline.expect
+++ b/pkg/front_end/testcases/bug33099.dart.outline.expect
@@ -4,11 +4,11 @@
 import "dart:mirrors" as mir;
 
 class _FailingTest extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::_FailingTest
     ;
 }
 class MyTest extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::MyTest
     ;
   method foo() → void
     ;
@@ -16,7 +16,7 @@
 abstract class _MyTest2&Object&MyTest = core::Object with self::MyTest {
 }
 class MyTest2 extends self::_MyTest2&Object&MyTest {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::MyTest2
     ;
 }
 static const field self::_FailingTest failingTest;
diff --git a/pkg/front_end/testcases/bug33099.dart.strong.expect b/pkg/front_end/testcases/bug33099.dart.strong.expect
index 4119f1c..1231cff 100644
--- a/pkg/front_end/testcases/bug33099.dart.strong.expect
+++ b/pkg/front_end/testcases/bug33099.dart.strong.expect
@@ -4,12 +4,12 @@
 import "dart:mirrors" as mir;
 
 class _FailingTest extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::_FailingTest
     : super core::Object::•()
     ;
 }
 class MyTest extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::MyTest
     : super core::Object::•()
     ;
   @self::failingTest
@@ -18,7 +18,7 @@
 abstract class _MyTest2&Object&MyTest = core::Object with self::MyTest {
 }
 class MyTest2 extends self::_MyTest2&Object&MyTest {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::MyTest2
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/bug33099.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33099.dart.strong.transformed.expect
index 072ae37..cee5445 100644
--- a/pkg/front_end/testcases/bug33099.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug33099.dart.strong.transformed.expect
@@ -4,12 +4,12 @@
 import "dart:mirrors" as mir;
 
 class _FailingTest extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::_FailingTest
     : super core::Object::•()
     ;
 }
 class MyTest extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::MyTest
     : super core::Object::•()
     ;
   @self::failingTest
@@ -23,7 +23,7 @@
   method foo() → void {}
 }
 class MyTest2 extends self::_MyTest2&Object&MyTest {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::MyTest2
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/bug33206.dart.direct.expect b/pkg/front_end/testcases/bug33206.dart.direct.expect
index 45898a6..504c440 100644
--- a/pkg/front_end/testcases/bug33206.dart.direct.expect
+++ b/pkg/front_end/testcases/bug33206.dart.direct.expect
@@ -6,14 +6,14 @@
 class X extends core::Object {
   final field dynamic x;
   final field dynamic y;
-  constructor •(dynamic x, dynamic y) → void
+  constructor •(dynamic x, dynamic y) → self::X
     : self::X::x = x, self::X::y = y, super core::Object::•()
     ;
   method toString() → dynamic
     return "X(${this.{self::X::x}}, ${this.{self::X::y}})";
 }
 class Y extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y
     : super core::Object::•()
     ;
   method f(dynamic _) → dynamic {}
diff --git a/pkg/front_end/testcases/bug33206.dart.direct.transformed.expect b/pkg/front_end/testcases/bug33206.dart.direct.transformed.expect
index b5f9c88..94af5a5 100644
--- a/pkg/front_end/testcases/bug33206.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bug33206.dart.direct.transformed.expect
@@ -6,14 +6,14 @@
 class X extends core::Object {
   final field dynamic x;
   final field dynamic y;
-  constructor •(dynamic x, dynamic y) → void
+  constructor •(dynamic x, dynamic y) → self::X
     : self::X::x = x, self::X::y = y, super core::Object::•()
     ;
   method toString() → dynamic
     return "X(${this.{self::X::x}}, ${this.{self::X::y}})";
 }
 class Y extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y
     : super core::Object::•()
     ;
   method f(dynamic _) → dynamic {}
diff --git a/pkg/front_end/testcases/bug33206.dart.outline.expect b/pkg/front_end/testcases/bug33206.dart.outline.expect
index bc0040e..ecb824e 100644
--- a/pkg/front_end/testcases/bug33206.dart.outline.expect
+++ b/pkg/front_end/testcases/bug33206.dart.outline.expect
@@ -6,13 +6,13 @@
 class X extends core::Object {
   final field dynamic x;
   final field dynamic y;
-  constructor •(dynamic x, dynamic y) → void
+  constructor •(dynamic x, dynamic y) → self::X
     ;
   method toString() → dynamic
     ;
 }
 class Y extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y
     ;
   method f(dynamic _) → dynamic
     ;
diff --git a/pkg/front_end/testcases/bug33206.dart.strong.expect b/pkg/front_end/testcases/bug33206.dart.strong.expect
index 027b1f8..77e20c5 100644
--- a/pkg/front_end/testcases/bug33206.dart.strong.expect
+++ b/pkg/front_end/testcases/bug33206.dart.strong.expect
@@ -6,14 +6,14 @@
 class X extends core::Object {
   final field dynamic x;
   final field dynamic y;
-  constructor •(dynamic x, dynamic y) → void
+  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 •() → void
+  synthetic constructor •() → self::Y
     : super core::Object::•()
     ;
   method f(dynamic _) → dynamic {}
diff --git a/pkg/front_end/testcases/bug33206.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33206.dart.strong.transformed.expect
index 072c2fe..62903f9 100644
--- a/pkg/front_end/testcases/bug33206.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug33206.dart.strong.transformed.expect
@@ -6,14 +6,14 @@
 class X extends core::Object {
   final field dynamic x;
   final field dynamic y;
-  constructor •(dynamic x, dynamic y) → void
+  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 •() → void
+  synthetic constructor •() → self::Y
     : super core::Object::•()
     ;
   method f(dynamic _) → dynamic {}
diff --git a/pkg/front_end/testcases/bug33298.dart.direct.expect b/pkg/front_end/testcases/bug33298.dart.direct.expect
index e89e403..c9a8e28 100644
--- a/pkg/front_end/testcases/bug33298.dart.direct.expect
+++ b/pkg/front_end/testcases/bug33298.dart.direct.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method call(self::B::T t) → self::B::T
     return t;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call<T extends core::Object = dynamic>(self::C::call::T t) → self::C::call::T
diff --git a/pkg/front_end/testcases/bug33298.dart.direct.transformed.expect b/pkg/front_end/testcases/bug33298.dart.direct.transformed.expect
index e89e403..c9a8e28 100644
--- a/pkg/front_end/testcases/bug33298.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bug33298.dart.direct.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method call(self::B::T t) → self::B::T
     return t;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call<T extends core::Object = dynamic>(self::C::call::T t) → self::C::call::T
diff --git a/pkg/front_end/testcases/bug33298.dart.outline.expect b/pkg/front_end/testcases/bug33298.dart.outline.expect
index 215a8e2..ed25402 100644
--- a/pkg/front_end/testcases/bug33298.dart.outline.expect
+++ b/pkg/front_end/testcases/bug33298.dart.outline.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method call(core::String s) → core::String
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
   method call(self::B::T t) → self::B::T
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method call<T extends core::Object = dynamic>(self::C::call::T t) → self::C::call::T
     ;
diff --git a/pkg/front_end/testcases/bug33298.dart.strong.expect b/pkg/front_end/testcases/bug33298.dart.strong.expect
index 5c96b04..7e67d70 100644
--- a/pkg/front_end/testcases/bug33298.dart.strong.expect
+++ b/pkg/front_end/testcases/bug33298.dart.strong.expect
@@ -10,21 +10,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call<T extends core::Object = dynamic>(self::C::call::T t) → self::C::call::T
diff --git a/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
index a14fb51..d874875 100644
--- a/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call<T extends core::Object = dynamic>(self::C::call::T t) → self::C::call::T
diff --git a/pkg/front_end/testcases/call.dart.outline.expect b/pkg/front_end/testcases/call.dart.outline.expect
index b38eff5..7a1cd9c 100644
--- a/pkg/front_end/testcases/call.dart.outline.expect
+++ b/pkg/front_end/testcases/call.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class Callable extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Callable
     ;
   method call(dynamic x) → dynamic
     ;
 }
 class CallableGetter extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::CallableGetter
     ;
   get call() → dynamic
     ;
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.expect
index 245a701..d5ad6ef 100644
--- a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.expect
+++ b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic f = new self::C::_circular(null);
-  constructor _circular(dynamic f) → void
+  constructor _circular(dynamic f) → self::C
     : self::C::f = f, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.transformed.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.transformed.expect
index 245a701..d5ad6ef 100644
--- a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic f = new self::C::_circular(null);
-  constructor _circular(dynamic f) → void
+  constructor _circular(dynamic f) → self::C
     : self::C::f = f, super core::Object::•()
     ;
 }
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
index 9bdea4e..b093152 100644
--- a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.outline.expect
+++ b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic f;
-  constructor _circular(dynamic f) → void
+  constructor _circular(dynamic f) → self::C
     ;
 }
 static field dynamic x;
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
index 47de836..4dd15b2 100644
--- a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.expect
+++ b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.expect
@@ -18,7 +18,7 @@
 
 class C extends core::Object {
   field self::C f = new self::C::_circular(null);
-  constructor _circular(self::C f) → void
+  constructor _circular(self::C f) → self::C
     : self::C::f = f, super core::Object::•()
     ;
 }
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
index 1d27680..7ec754c 100644
--- 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
@@ -11,7 +11,7 @@
 
 class C extends core::Object {
   field self::C f = new self::C::_circular(null);
-  constructor _circular(self::C f) → void
+  constructor _circular(self::C f) → self::C
     : self::C::f = f, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/classes.dart.direct.expect b/pkg/front_end/testcases/classes.dart.direct.expect
index 8cb3ab3..7687edb 100644
--- a/pkg/front_end/testcases/classes.dart.direct.expect
+++ b/pkg/front_end/testcases/classes.dart.direct.expect
@@ -5,7 +5,7 @@
 class A extends core::Object {
   final field core::int x;
   final field core::int y;
-  constructor •(core::int y) → void
+  constructor •(core::int y) → self::A
     : self::A::y = y, self::A::x = 42, super core::Object::•()
     ;
   method method() → dynamic {
@@ -15,7 +15,7 @@
   }
 }
 class B extends self::A {
-  constructor •(dynamic x) → void
+  constructor •(dynamic x) → self::B
     : super self::A::•(x)
     ;
   method method() → dynamic {
diff --git a/pkg/front_end/testcases/classes.dart.direct.transformed.expect b/pkg/front_end/testcases/classes.dart.direct.transformed.expect
index 8cb3ab3..7687edb 100644
--- a/pkg/front_end/testcases/classes.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/classes.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 class A extends core::Object {
   final field core::int x;
   final field core::int y;
-  constructor •(core::int y) → void
+  constructor •(core::int y) → self::A
     : self::A::y = y, self::A::x = 42, super core::Object::•()
     ;
   method method() → dynamic {
@@ -15,7 +15,7 @@
   }
 }
 class B extends self::A {
-  constructor •(dynamic x) → void
+  constructor •(dynamic x) → self::B
     : super self::A::•(x)
     ;
   method method() → dynamic {
diff --git a/pkg/front_end/testcases/classes.dart.outline.expect b/pkg/front_end/testcases/classes.dart.outline.expect
index 1366d1b..6900eb7 100644
--- a/pkg/front_end/testcases/classes.dart.outline.expect
+++ b/pkg/front_end/testcases/classes.dart.outline.expect
@@ -5,13 +5,13 @@
 class A extends core::Object {
   final field core::int x;
   final field core::int y;
-  constructor •(core::int y) → void
+  constructor •(core::int y) → self::A
     ;
   method method() → dynamic
     ;
 }
 class B extends self::A {
-  constructor •(dynamic x) → void
+  constructor •(dynamic x) → self::B
     ;
   method method() → dynamic
     ;
diff --git a/pkg/front_end/testcases/closure.dart.direct.expect b/pkg/front_end/testcases/closure.dart.direct.expect
index edc6bf4..3d9b113 100644
--- a/pkg/front_end/testcases/closure.dart.direct.expect
+++ b/pkg/front_end/testcases/closure.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class Foo extends core::Object {
   field dynamic _field = new self::Bar::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/closure.dart.direct.transformed.expect b/pkg/front_end/testcases/closure.dart.direct.transformed.expect
index edc6bf4..3d9b113 100644
--- a/pkg/front_end/testcases/closure.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/closure.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class Foo extends core::Object {
   field dynamic _field = new self::Bar::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/closure.dart.outline.expect b/pkg/front_end/testcases/closure.dart.outline.expect
index 6048306..3fcc86f 100644
--- a/pkg/front_end/testcases/closure.dart.outline.expect
+++ b/pkg/front_end/testcases/closure.dart.outline.expect
@@ -4,11 +4,11 @@
 
 class Foo extends core::Object {
   field dynamic _field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
 }
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     ;
 }
 static method useCallback(dynamic callback) → dynamic
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.expect
index 0e2fda7..7c45077 100644
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.expect
+++ b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.expect
@@ -7,7 +7,7 @@
 // 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: Error: Previous declaration of 'A'.
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:16:7: Context: Previous declaration of 'A'.
 // class A {
 //       ^
 
@@ -26,12 +26,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.transformed.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.transformed.expect
index a2f8868..df8e79d 100644
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.transformed.expect
@@ -13,12 +13,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
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
index c818405..0091954 100644
--- 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
@@ -7,7 +7,7 @@
 // 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: Error: Previous declaration of 'A'.
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:16:7: Context: Previous declaration of 'A'.
 // class A {
 //       ^
 
@@ -16,11 +16,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::A
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  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
index 0e2fda7..7c45077 100644
--- 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
@@ -7,7 +7,7 @@
 // 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: Error: Previous declaration of 'A'.
+// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:16:7: Context: Previous declaration of 'A'.
 // class A {
 //       ^
 
@@ -26,12 +26,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
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
index a2f8868..df8e79d 100644
--- 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
@@ -13,12 +13,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
index 44960a5..1ab4754 100644
--- a/pkg/front_end/testcases/compile.status
+++ b/pkg/front_end/testcases/compile.status
@@ -11,6 +11,7 @@
 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
 external_import: RuntimeError # Expected -- test uses import which doesn't exist.
 fallthrough: Fail # Missing FallThroughError.
 function_type_recovery: Fail
@@ -31,13 +32,14 @@
 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.
 optional: Fail # Unnecessary default values.
 rasta/abstract_constructor: Fail
 rasta/bad_constructor_redirection: Fail
 rasta/bad_continue: Fail
 rasta/bad_default_constructor: Fail # Compile-time error destroys program.
-rasta/bad_explicit_super_constructor: Fail
+rasta/bad_explicit_super_constructor: RuntimeError
 rasta/bad_implicit_super_constructor: Fail
 rasta/bad_interpolation: Fail
 rasta/bad_redirection: Fail
@@ -58,12 +60,12 @@
 rasta/issue_000001: Fail
 rasta/issue_000031: Fail
 rasta/issue_000032: Fail
-rasta/issue_000034: Fail
+rasta/issue_000034: RuntimeError
 rasta/issue_000035: Fail
 rasta/issue_000035a: Fail
 rasta/issue_000036: Fail
 rasta/issue_000039: Fail
-rasta/issue_000041: Fail
+rasta/issue_000041: RuntimeError
 rasta/issue_000042: Fail
 rasta/issue_000043: Fail
 rasta/issue_000044: Fail
@@ -102,6 +104,7 @@
 regress/issue_32972: RuntimeError
 regress/issue_33452: RuntimeError # Test has an intentional error
 regress/issue_34225: RuntimeError
+regress/issue_34563: RuntimeError # Test execution after recovery
 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
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.direct.expect b/pkg/front_end/testcases/constructor_const_inference.dart.direct.expect
index 00cffbc..b3c195b 100644
--- a/pkg/front_end/testcases/constructor_const_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/constructor_const_inference.dart.direct.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class _Y<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::_Y<self::_Y::T>
     : super core::Object::•()
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
   field self::_Y<self::A::T> x;
-  constructor •(self::_Y<self::A::T> x) → void
+  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 •() → void
+  constructor •() → self::B<self::B::T>
     : super self::A::•(const self::_Y::•<dynamic>())
     ;
 }
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/constructor_const_inference.dart.direct.transformed.expect
index 00cffbc..b3c195b 100644
--- a/pkg/front_end/testcases/constructor_const_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/constructor_const_inference.dart.direct.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class _Y<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::_Y<self::_Y::T>
     : super core::Object::•()
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
   field self::_Y<self::A::T> x;
-  constructor •(self::_Y<self::A::T> x) → void
+  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 •() → void
+  constructor •() → self::B<self::B::T>
     : super self::A::•(const self::_Y::•<dynamic>())
     ;
 }
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.outline.expect b/pkg/front_end/testcases/constructor_const_inference.dart.outline.expect
index 0e89f88..071faac 100644
--- a/pkg/front_end/testcases/constructor_const_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/constructor_const_inference.dart.outline.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class _Y<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::_Y<self::_Y::T>
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
   field self::_Y<self::A::T> x;
-  constructor •(self::_Y<self::A::T> x) → void
+  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 •() → void
+  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
index 0ec23a5..4bf80e9 100644
--- a/pkg/front_end/testcases/constructor_const_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_const_inference.dart.strong.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class _Y<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  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) → void
+  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 •() → void
+  constructor •() → self::B<self::B::T>
     : super self::A::•(const self::_Y::•<core::Null>())
     ;
 }
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
index 0ec23a5..4bf80e9 100644
--- a/pkg/front_end/testcases/constructor_const_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_const_inference.dart.strong.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class _Y<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  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) → void
+  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 •() → void
+  constructor •() → self::B<self::B::T>
     : super self::A::•(const self::_Y::•<core::Null>())
     ;
 }
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.direct.expect b/pkg/front_end/testcases/constructor_cycle.dart.direct.expect
index b589a24..a2ba137 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.direct.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.direct.expect
@@ -27,16 +27,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor foo() → void
+  constructor foo() → self::A
     : this self::A::bar()
     ;
-  constructor bar() → void
+  constructor bar() → self::A
     : this self::A::foo()
     ;
-  constructor baz() → void
+  constructor baz() → self::A
     : this self::A::foo()
     ;
-  constructor •() → void
+  constructor •() → self::A
     : this self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect
index 765d352..89c1886 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect
@@ -15,16 +15,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor foo() → void
+  constructor foo() → self::A
     : this self::A::bar()
     ;
-  constructor bar() → void
+  constructor bar() → self::A
     : this self::A::foo()
     ;
-  constructor baz() → void
+  constructor baz() → self::A
     : this self::A::foo()
     ;
-  constructor •() → void
+  constructor •() → self::A
     : this self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.outline.expect b/pkg/front_end/testcases/constructor_cycle.dart.outline.expect
index 7e53021..6151174 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.outline.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor foo() → void
+  constructor foo() → self::A
     ;
-  constructor bar() → void
+  constructor bar() → self::A
     ;
-  constructor baz() → void
+  constructor baz() → self::A
     ;
-  constructor •() → void
+  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
index b589a24..a2ba137 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.strong.expect
@@ -27,16 +27,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor foo() → void
+  constructor foo() → self::A
     : this self::A::bar()
     ;
-  constructor bar() → void
+  constructor bar() → self::A
     : this self::A::foo()
     ;
-  constructor baz() → void
+  constructor baz() → self::A
     : this self::A::foo()
     ;
-  constructor •() → void
+  constructor •() → self::A
     : this self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect
index 765d352..89c1886 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect
@@ -15,16 +15,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor foo() → void
+  constructor foo() → self::A
     : this self::A::bar()
     ;
-  constructor bar() → void
+  constructor bar() → self::A
     : this self::A::foo()
     ;
-  constructor baz() → void
+  constructor baz() → self::A
     : this self::A::foo()
     ;
-  constructor •() → void
+  constructor •() → self::A
     : this self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/constructor_function_types.dart b/pkg/front_end/testcases/constructor_function_types.dart
new file mode 100644
index 0000000..3facfed
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_function_types.dart
@@ -0,0 +1,26 @@
+// 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.
+
+class A {
+  A();
+}
+
+class B {
+  B(int x, double y, String s);
+}
+
+class C<T> {
+  C();
+}
+
+class D<T, S> {
+  D(T x, S y);
+}
+
+void main() {
+  new A();
+  new B(0, 3.14, "foo");
+  new C();
+  new D<Object, int>(null, 3);
+}
diff --git a/pkg/front_end/testcases/constructor_function_types.dart.direct.expect b/pkg/front_end/testcases/constructor_function_types.dart.direct.expect
new file mode 100644
index 0000000..8dfce02
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_function_types.dart.direct.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_function_types.dart.direct.transformed.expect b/pkg/front_end/testcases/constructor_function_types.dart.direct.transformed.expect
new file mode 100644
index 0000000..8dfce02
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_function_types.dart.direct.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_function_types.dart.outline.expect b/pkg/front_end/testcases/constructor_function_types.dart.outline.expect
new file mode 100644
index 0000000..21f7069
--- /dev/null
+++ b/pkg/front_end/testcases/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/constructor_function_types.dart.strong.expect b/pkg/front_end/testcases/constructor_function_types.dart.strong.expect
new file mode 100644
index 0000000..8dfce02
--- /dev/null
+++ b/pkg/front_end/testcases/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/constructor_function_types.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_function_types.dart.strong.transformed.expect
new file mode 100644
index 0000000..8dfce02
--- /dev/null
+++ b/pkg/front_end/testcases/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/constructor_initializer_invalid.dart
new file mode 100644
index 0000000..3ce86d2
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_initializer_invalid.dart
@@ -0,0 +1,17 @@
+// 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.
+
+class C1 { int f; C1() : ; }
+class C2 { int f; C2() : f; }
+class C3 { int f; C3() : f++; }
+
+main() {
+  var c1 = new C1();
+  c1.toString();
+  var c2 = new C2();
+  c2.toString();
+  var c3 = new C3();
+  c3.toString();
+}
+
diff --git a/pkg/front_end/testcases/constructor_initializer_invalid.dart.direct.expect b/pkg/front_end/testcases/constructor_initializer_invalid.dart.direct.expect
new file mode 100644
index 0000000..6b42a4b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_initializer_invalid.dart.direct.expect
@@ -0,0 +1,72 @@
+// Formatted problems:
+//
+// 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++; }
+//                          ^
+
+// Unhandled errors:
+//
+// 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++; }
+//                          ^
+
+library;
+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.direct.transformed.expect b/pkg/front_end/testcases/constructor_initializer_invalid.dart.direct.transformed.expect
new file mode 100644
index 0000000..8d747d5
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_initializer_invalid.dart.direct.transformed.expect
@@ -0,0 +1,52 @@
+// Unhandled errors:
+//
+// 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++; }
+//                          ^
+
+library;
+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
new file mode 100644
index 0000000..407b220
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_initializer_invalid.dart.outline.expect
@@ -0,0 +1,37 @@
+// Formatted problems:
+//
+// 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++; }
+//                          ^
+
+library;
+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
new file mode 100644
index 0000000..5e45093
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_initializer_invalid.dart.strong.expect
@@ -0,0 +1,72 @@
+// Formatted problems:
+//
+// 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++; }
+//                          ^
+
+// Unhandled errors:
+//
+// 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++; }
+//                          ^
+
+library;
+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
new file mode 100644
index 0000000..bfe868c
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_initializer_invalid.dart.strong.transformed.expect
@@ -0,0 +1,52 @@
+// Unhandled errors:
+//
+// 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++; }
+//                          ^
+
+library;
+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/covariant_generic.dart.outline.expect b/pkg/front_end/testcases/covariant_generic.dart.outline.expect
index ca50348..0014cd5 100644
--- a/pkg/front_end/testcases/covariant_generic.dart.outline.expect
+++ b/pkg/front_end/testcases/covariant_generic.dart.outline.expect
@@ -8,7 +8,7 @@
   final field (self::Foo::T) → void callbackField;
   field self::Foo::T mutableField;
   field (self::Foo::T) → void mutableCallbackField;
-  constructor •(self::Foo::T finalField, (self::Foo::T) → void callbackField) → void
+  constructor •(self::Foo::T finalField, (self::Foo::T) → void callbackField) → self::Foo<self::Foo::T>
     ;
   method method(self::Foo::T x) → void
     ;
diff --git a/pkg/front_end/testcases/cycles.dart.direct.expect b/pkg/front_end/testcases/cycles.dart.direct.expect
index ca01a6a..d2e8cdf 100644
--- a/pkg/front_end/testcases/cycles.dart.direct.expect
+++ b/pkg/front_end/testcases/cycles.dart.direct.expect
@@ -31,22 +31,22 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/cycles.dart.direct.transformed.expect b/pkg/front_end/testcases/cycles.dart.direct.transformed.expect
index 4f1f53a..435c417 100644
--- a/pkg/front_end/testcases/cycles.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/cycles.dart.direct.transformed.expect
@@ -17,22 +17,22 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/cycles.dart.outline.expect b/pkg/front_end/testcases/cycles.dart.outline.expect
index 1c9d1e5..3aaceb9 100644
--- a/pkg/front_end/testcases/cycles.dart.outline.expect
+++ b/pkg/front_end/testcases/cycles.dart.outline.expect
@@ -17,19 +17,19 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart b/pkg/front_end/testcases/duplicated_bad_prefix.dart
new file mode 100644
index 0000000..ad31de6
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_bad_prefix.dart
@@ -0,0 +1,17 @@
+// 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 'duplicated_bad_prefix_lib1.dart' as dupe;
+import 'duplicated_bad_prefix_lib2.dart' as dupe;
+
+class Dupe {}
+
+class Dupe {}
+
+class C {
+  Dupe.a b;
+  dupe.C d;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.expect
new file mode 100644
index 0000000..d719c00
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.expect
@@ -0,0 +1,46 @@
+// Formatted problems:
+//
+// 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:1: 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;
+//   ^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
+// class Dupe {}
+//       ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Dupe#1 extends core::Object {
+  synthetic constructor •() → self::Dupe#1
+    : super core::Object::•()
+    ;
+}
+class Dupe extends 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 {}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.transformed.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.transformed.expect
new file mode 100644
index 0000000..7d25f05
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.transformed.expect
@@ -0,0 +1,25 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
+// class Dupe {}
+//       ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Dupe#1 extends core::Object {
+  synthetic constructor •() → self::Dupe#1
+    : super core::Object::•()
+    ;
+}
+class Dupe extends 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 {}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.outline.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.outline.expect
new file mode 100644
index 0000000..008c2df
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_bad_prefix.dart.outline.expect
@@ -0,0 +1,35 @@
+// Formatted problems:
+//
+// 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:1: 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;
+// ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Dupe#1 extends core::Object {
+  synthetic constructor •() → self::Dupe#1
+    ;
+}
+class Dupe extends core::Object {
+}
+class C extends core::Object {
+  field invalid-type b;
+  field invalid-type d;
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.expect
new file mode 100644
index 0000000..997fe58
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.expect
@@ -0,0 +1,58 @@
+// Formatted problems:
+//
+// 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:1: 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;
+//   ^^^^^^
+
+// Unhandled errors:
+//
+// 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:13:3: Error: Type 'Dupe.a' not found.
+//   Dupe.a b;
+//   ^
+//
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:1: 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;
+//   ^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Dupe#1 extends core::Object {
+  synthetic constructor •() → self::Dupe#1
+    : super core::Object::•()
+    ;
+}
+class Dupe extends 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 {}
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
new file mode 100644
index 0000000..9238d49
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.transformed.expect
@@ -0,0 +1,37 @@
+// Unhandled errors:
+//
+// 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:13:3: Error: Type 'Dupe.a' not found.
+//   Dupe.a b;
+//   ^
+//
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:1: 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;
+//   ^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Dupe#1 extends core::Object {
+  synthetic constructor •() → self::Dupe#1
+    : super core::Object::•()
+    ;
+}
+class Dupe extends 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 {}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart b/pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart
new file mode 100644
index 0000000..14a6172
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class C {}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart b/pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart
new file mode 100644
index 0000000..14a6172
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class C {}
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.direct.expect b/pkg/front_end/testcases/duplicated_declarations.dart.direct.expect
index df7e42f..b9314b1 100644
--- a/pkg/front_end/testcases/duplicated_declarations.dart.direct.expect
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.direct.expect
@@ -3,63 +3,63 @@
 // pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
 // typedef Typedef = Object Function();
 //         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Error: Previous declaration of 'Typedef'.
+// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Context: Previous declaration of 'Typedef'.
 // typedef Typedef = void Function();
 //         ^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
 // typedef Object OldTypedef();
 //                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Error: Previous declaration of 'OldTypedef'.
+// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Context: Previous declaration of 'OldTypedef'.
 // typedef void OldTypedef();
 //              ^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
 // var field = "2nd";
 //     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Error: Previous declaration of 'field'.
+// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Context: Previous declaration of 'field'.
 // var field = "1st";
 //     ^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
 // main() {
 // ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Error: Previous declaration of 'main'.
+// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Context: Previous declaration of 'main'.
 // main() {
 // ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
 //   C(a, b);
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Error: Previous declaration of ''.
+// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Context: Previous declaration of 'C'.
 //   C(a);
 //   ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
 //   var field = "2nd";
 //       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Error: Previous declaration of 'field'.
+// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Context: Previous declaration of 'field'.
 //   var field = "1st";
 //       ^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
 //   m() {
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Error: Previous declaration of 'm'.
+// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Context: Previous declaration of 'm'.
 //   m() {
 //   ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
 //   static s() {
 //          ^
-// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Error: Previous declaration of 's'.
+// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Context: Previous declaration of 's'.
 //   static s() {
 //          ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
 // class C {
 //       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Error: Previous declaration of 'C'.
+// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Context: Previous declaration of 'C'.
 // class C {
 //       ^
 //
@@ -70,44 +70,44 @@
 // pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
 //   a,
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Error: Previous declaration of 'a'.
+// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Context: Previous declaration of 'a'.
 //   a,
 //   ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
 // enum Enum {
 //      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Error: Previous declaration of 'Enum'.
+// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Context: Previous declaration of 'Enum'.
 // enum Enum {
 //      ^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
 //   _name,
 //   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of '_name'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of '_name' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
 //   index,
 //   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'index'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'index' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
 //   toString,
 //   ^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'toString'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'toString' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
 //   values,
 //   ^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'values'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'values' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: Type 'C' not found.
 // class Sub extends C {
@@ -172,7 +172,7 @@
 // main() {
 // ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
 //   C(a, b);
 //   ^
 //
@@ -231,13 +231,13 @@
 typedef Typedef = () → void;
 typedef OldTypedef = () → void;
 class C#1 extends core::Object {
-  constructor _() → void
+  constructor _() → self::C#1
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field dynamic field;
-  constructor •(dynamic a) → void
+  constructor •(dynamic a) → self::C
     : super core::Object::•()
     ;
   method m() → dynamic {
@@ -252,8 +252,8 @@
                 ^";
 }
 class Sub extends core::Object {
-  constructor •() → void
-    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+  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();
@@ -265,7 +265,7 @@
   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) → void
+  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
@@ -278,7 +278,7 @@
   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) → void
+  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
@@ -291,7 +291,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.direct.transformed.expect b/pkg/front_end/testcases/duplicated_declarations.dart.direct.transformed.expect
index f583777..34e2e71 100644
--- a/pkg/front_end/testcases/duplicated_declarations.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.direct.transformed.expect
@@ -16,7 +16,7 @@
 // main() {
 // ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
 //   C(a, b);
 //   ^
 //
@@ -75,13 +75,13 @@
 typedef Typedef = () → void;
 typedef OldTypedef = () → void;
 class C#1 extends core::Object {
-  constructor _() → void
+  constructor _() → self::C#1
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field dynamic field;
-  constructor •(dynamic a) → void
+  constructor •(dynamic a) → self::C
     : super core::Object::•()
     ;
   method m() → dynamic {
@@ -96,8 +96,8 @@
                 ^";
 }
 class Sub extends core::Object {
-  constructor •() → void
-    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+  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();
@@ -109,7 +109,7 @@
   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) → void
+  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
@@ -122,7 +122,7 @@
   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) → void
+  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
@@ -135,7 +135,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect b/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect
index aa488b8..0920552 100644
--- a/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect
@@ -3,63 +3,63 @@
 // pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
 // typedef Typedef = Object Function();
 //         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Error: Previous declaration of 'Typedef'.
+// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Context: Previous declaration of 'Typedef'.
 // typedef Typedef = void Function();
 //         ^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
 // typedef Object OldTypedef();
 //                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Error: Previous declaration of 'OldTypedef'.
+// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Context: Previous declaration of 'OldTypedef'.
 // typedef void OldTypedef();
 //              ^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
 // var field = "2nd";
 //     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Error: Previous declaration of 'field'.
+// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Context: Previous declaration of 'field'.
 // var field = "1st";
 //     ^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
 // main() {
 // ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Error: Previous declaration of 'main'.
+// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Context: Previous declaration of 'main'.
 // main() {
 // ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
 //   C(a, b);
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Error: Previous declaration of ''.
+// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Context: Previous declaration of 'C'.
 //   C(a);
 //   ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
 //   var field = "2nd";
 //       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Error: Previous declaration of 'field'.
+// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Context: Previous declaration of 'field'.
 //   var field = "1st";
 //       ^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
 //   m() {
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Error: Previous declaration of 'm'.
+// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Context: Previous declaration of 'm'.
 //   m() {
 //   ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
 //   static s() {
 //          ^
-// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Error: Previous declaration of 's'.
+// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Context: Previous declaration of 's'.
 //   static s() {
 //          ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
 // class C {
 //       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Error: Previous declaration of 'C'.
+// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Context: Previous declaration of 'C'.
 // class C {
 //       ^
 //
@@ -70,44 +70,44 @@
 // pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
 //   a,
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Error: Previous declaration of 'a'.
+// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Context: Previous declaration of 'a'.
 //   a,
 //   ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
 // enum Enum {
 //      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Error: Previous declaration of 'Enum'.
+// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Context: Previous declaration of 'Enum'.
 // enum Enum {
 //      ^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
 //   _name,
 //   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of '_name'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of '_name' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
 //   index,
 //   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'index'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'index' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
 //   toString,
 //   ^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'toString'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'toString' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
 //   values,
 //   ^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'values'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'values' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: Type 'C' not found.
 // class Sub extends C {
@@ -120,12 +120,12 @@
 typedef Typedef = () → void;
 typedef OldTypedef = () → void;
 class C#1 extends core::Object {
-  constructor _() → void
+  constructor _() → self::C#1
     ;
 }
 class C extends core::Object {
   field dynamic field;
-  constructor •(dynamic a) → void
+  constructor •(dynamic a) → self::C
     ;
   method m() → dynamic
     ;
@@ -135,7 +135,7 @@
     ;
 }
 class Sub extends core::Object {
-  constructor •() → void
+  constructor •() → self::Sub
     ;
   method m() → dynamic
     ;
@@ -147,7 +147,7 @@
   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) → void
+  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
@@ -160,7 +160,7 @@
   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) → void
+  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
@@ -173,7 +173,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect b/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect
index 7e56c2c..210b653 100644
--- a/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect
@@ -3,63 +3,63 @@
 // pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
 // typedef Typedef = Object Function();
 //         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Error: Previous declaration of 'Typedef'.
+// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Context: Previous declaration of 'Typedef'.
 // typedef Typedef = void Function();
 //         ^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
 // typedef Object OldTypedef();
 //                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Error: Previous declaration of 'OldTypedef'.
+// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Context: Previous declaration of 'OldTypedef'.
 // typedef void OldTypedef();
 //              ^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
 // var field = "2nd";
 //     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Error: Previous declaration of 'field'.
+// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Context: Previous declaration of 'field'.
 // var field = "1st";
 //     ^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
 // main() {
 // ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Error: Previous declaration of 'main'.
+// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Context: Previous declaration of 'main'.
 // main() {
 // ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
 //   C(a, b);
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Error: Previous declaration of ''.
+// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Context: Previous declaration of 'C'.
 //   C(a);
 //   ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
 //   var field = "2nd";
 //       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Error: Previous declaration of 'field'.
+// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Context: Previous declaration of 'field'.
 //   var field = "1st";
 //       ^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
 //   m() {
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Error: Previous declaration of 'm'.
+// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Context: Previous declaration of 'm'.
 //   m() {
 //   ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
 //   static s() {
 //          ^
-// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Error: Previous declaration of 's'.
+// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Context: Previous declaration of 's'.
 //   static s() {
 //          ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
 // class C {
 //       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Error: Previous declaration of 'C'.
+// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Context: Previous declaration of 'C'.
 // class C {
 //       ^
 //
@@ -70,44 +70,44 @@
 // pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
 //   a,
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Error: Previous declaration of 'a'.
+// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Context: Previous declaration of 'a'.
 //   a,
 //   ^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
 // enum Enum {
 //      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Error: Previous declaration of 'Enum'.
+// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Context: Previous declaration of 'Enum'.
 // enum Enum {
 //      ^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
 //   _name,
 //   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of '_name'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of '_name' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
 //   index,
 //   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'index'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'index' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
 //   toString,
 //   ^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'toString'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'toString' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
 //   values,
 //   ^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Error: Previous declaration of 'values'.
+// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'values' is implied by this definition.
 // enum AnotherEnum {
-//      ^^^^^^
+//      ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: Type 'C' not found.
 // class Sub extends C {
@@ -172,7 +172,7 @@
 // main() {
 // ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: '' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
 //   C(a, b);
 //   ^
 //
@@ -224,11 +224,6 @@
 // class Sub extends C {
 //                   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:58: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:59:16: Error: Superclass has no method named 'm'.
 //   m() => super.m();
 //                ^
@@ -240,13 +235,13 @@
 typedef Typedef = () → void;
 typedef OldTypedef = () → void;
 class C#1 extends core::Object {
-  constructor _() → void
+  constructor _() → self::C#1
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field dynamic field;
-  constructor •(dynamic a) → void
+  constructor •(dynamic a) → self::C
     : super core::Object::•()
     ;
   method m() → dynamic {
@@ -261,8 +256,11 @@
                 ^";
 }
 class Sub extends core::Object {
-  constructor •() → void
-    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+  constructor •() → self::Sub
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:58: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();
@@ -274,7 +272,7 @@
   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) → void
+  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
@@ -287,7 +285,7 @@
   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) → void
+  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
@@ -300,7 +298,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect
index b9f36ee..6ff96e9 100644
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect
+++ b/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect
@@ -13,7 +13,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static method m({core::int a = 0}) → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.transformed.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.transformed.expect
index e95737c..e65bd84 100644
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static method m({core::int a = 0}) → 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
index 63f7075..8b09143 100644
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.outline.expect
+++ b/pkg/front_end/testcases/duplicated_named_args_3.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   static method m({core::int a}) → 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
index b9f36ee..6ff96e9 100644
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
+++ b/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
@@ -13,7 +13,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static method m({core::int a = 0}) → 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
index e95737c..e65bd84 100644
--- 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static method m({core::int a = 0}) → dynamic {}
diff --git a/pkg/front_end/testcases/escape.dart.direct.expect b/pkg/front_end/testcases/escape.dart.direct.expect
index 136725f..389e93a 100644
--- a/pkg/front_end/testcases/escape.dart.direct.expect
+++ b/pkg/front_end/testcases/escape.dart.direct.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator ==(dynamic x) → dynamic
@@ -23,7 +23,7 @@
 }
 class X extends core::Object implements self::A, self::B {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/escape.dart.direct.transformed.expect b/pkg/front_end/testcases/escape.dart.direct.transformed.expect
index 136725f..389e93a 100644
--- a/pkg/front_end/testcases/escape.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/escape.dart.direct.transformed.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator ==(dynamic x) → dynamic
@@ -23,7 +23,7 @@
 }
 class X extends core::Object implements self::A, self::B {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/escape.dart.outline.expect b/pkg/front_end/testcases/escape.dart.outline.expect
index 6ba7f6a..e98ed5f 100644
--- a/pkg/front_end/testcases/escape.dart.outline.expect
+++ b/pkg/front_end/testcases/escape.dart.outline.expect
@@ -4,23 +4,23 @@
 
 class A extends core::Object {
   field dynamic field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends core::Object {
   field dynamic field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   operator ==(dynamic x) → dynamic
     ;
 }
 class X extends core::Object implements self::A, self::B {
   field dynamic field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     ;
 }
 static method useAsA(self::A object) → void
diff --git a/pkg/front_end/testcases/expression/class_invalid_static.expression.yaml.expect b/pkg/front_end/testcases/expression/class_invalid_static.expression.yaml.expect
index d60b2fc..87c35ef 100644
--- a/pkg/front_end/testcases/expression/class_invalid_static.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_invalid_static.expression.yaml.expect
@@ -2,4 +2,4 @@
   Method not found: 'doit_with_this'. (@0)
 }
 static method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#doit_with_this, 32, const <dart.core::Type>[], dart.core::List::unmodifiable<dynamic>(<dynamic>[3]), dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})));
+  return invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:1: Error: Method not found: 'doit_with_this'.\ndoit_with_this(3)\n^^^^^^^^^^^^^^";
diff --git a/pkg/front_end/testcases/expression/class_invalid_static_capture.expression.yaml.expect b/pkg/front_end/testcases/expression/class_invalid_static_capture.expression.yaml.expect
index 6208070..e99f6e5 100644
--- a/pkg/front_end/testcases/expression/class_invalid_static_capture.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_invalid_static_capture.expression.yaml.expect
@@ -4,5 +4,5 @@
 }
 static method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
   return () → dynamic {
-    return (throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#x, 33, const <dart.core::Type>[], const <dynamic>[], dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})))).+(throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#y, 33, const <dart.core::Type>[], const <dynamic>[], dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{}))));
+    return invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:13: Error: Getter not found: 'x'.\n() { return x + y; }\n            ^".+(invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:17: Error: Getter not found: 'y'.\n() { return x + y; }\n                ^");
   };
diff --git a/pkg/front_end/testcases/expression/class_invalid_static_getter.expression.yaml.expect b/pkg/front_end/testcases/expression/class_invalid_static_getter.expression.yaml.expect
index 1a79f8a..d6cebf1 100644
--- a/pkg/front_end/testcases/expression/class_invalid_static_getter.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_invalid_static_getter.expression.yaml.expect
@@ -2,4 +2,4 @@
   Getter not found: 'z'. (@0)
 }
 static method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#z, 33, const <dart.core::Type>[], const <dynamic>[], dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})));
+  return invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:1: Error: Getter not found: 'z'.\nz\n^";
diff --git a/pkg/front_end/testcases/expression/class_invalid_static_setter.expression.yaml.expect b/pkg/front_end/testcases/expression/class_invalid_static_setter.expression.yaml.expect
index 8480ea2..ed90dcd 100644
--- a/pkg/front_end/testcases/expression/class_invalid_static_setter.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_invalid_static_setter.expression.yaml.expect
@@ -2,4 +2,4 @@
   Setter not found: 'z'. (@0)
 }
 static method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#z, 34, const <dart.core::Type>[], dart.core::List::unmodifiable<dynamic>(<dynamic>[2]), dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})));
+  return invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:1: Error: Setter not found: 'z'.\nz = 2\n^";
diff --git a/pkg/front_end/testcases/expression/class_static2.expression.yaml.expect b/pkg/front_end/testcases/expression/class_static2.expression.yaml.expect
index af61daf..66f7f4b 100644
--- a/pkg/front_end/testcases/expression/class_static2.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_static2.expression.yaml.expect
@@ -2,4 +2,4 @@
   Method not found: 'doit_with_this'. (@0)
 }
 static method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#doit_with_this, 32, const <dart.core::Type>[], dart.core::List::unmodifiable<dynamic>(<dynamic>[2]), dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})));
+  return invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:1: Error: Method not found: 'doit_with_this'.\ndoit_with_this(2)\n^^^^^^^^^^^^^^";
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 7bc3bc9..c3a224a 100644
--- a/pkg/front_end/testcases/expression/class_static3.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_static3.expression.yaml.expect
@@ -2,7 +2,7 @@
   Getter not found: 'staticVar'. (@12)
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return #lib1::globalVar.{dart.core::num::+}((throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#staticVar, 33, const <dart.core::Type>[], const <dynamic>[], dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})))) 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/invalid.expression.yaml.expect b/pkg/front_end/testcases/expression/invalid.expression.yaml.expect
index cc26db7..9be599f 100644
--- a/pkg/front_end/testcases/expression/invalid.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/invalid.expression.yaml.expect
@@ -2,7 +2,6 @@
   Can't find ')' to match '('. (@4)
   Expected an identifier, but got '*'. (@0)
   Method not found: 'foo'. (@1)
-  Getter not found: ''. (@0)
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return (throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#, 33, const <dart.core::Type>[], const <dynamic>[], dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})))).*(throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#foo, 32, const <dart.core::Type>[], dart.core::List::unmodifiable<dynamic>(<dynamic>[3]), dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{}))));
+  return invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:1: Error: This couldn't be parsed.\n*foo(3,\n^".*(invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:2: Error: Method not found: 'foo'.\n*foo(3,\n ^^^");
diff --git a/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml.expect b/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml.expect
index b82b038..70b6f04 100644
--- a/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml.expect
@@ -2,4 +2,4 @@
   Method not found: 'Random'. (@4)
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#Random, 32, const <dart.core::Type>[], const <dynamic>[], dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})));
+  return invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:5: Error: Method not found: 'Random'.\nnew Random()\n    ^^^^^^";
diff --git a/pkg/front_end/testcases/expression/lib_nonreference.expression.yaml.expect b/pkg/front_end/testcases/expression/lib_nonreference.expression.yaml.expect
index 4c7dfed..b7f2398 100644
--- a/pkg/front_end/testcases/expression/lib_nonreference.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/lib_nonreference.expression.yaml.expect
@@ -2,4 +2,4 @@
   Method not found: 'acos'. (@0)
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#acos, 32, const <dart.core::Type>[], dart.core::List::unmodifiable<dynamic>(<dynamic>[1.0]), dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})));
+  return invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:1: Error: Method not found: 'acos'.\nacos(1.0)\n^^^^";
diff --git a/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect b/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect
index eac7e10..4c65195 100644
--- a/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect
@@ -3,4 +3,4 @@
   Too many positional arguments: 0 allowed, but 1 found. (@13)
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#Directory, 32, const <dart.core::Type>[], dart.core::List::unmodifiable<dynamic>(<dynamic>["test"]), dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})));
+  return invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:5: Error: Method not found: 'Directory'.\nnew Directory(\"test\")\n    ^^^^^^^^^";
diff --git a/pkg/front_end/testcases/expressions.dart.strong.expect b/pkg/front_end/testcases/expressions.dart.strong.expect
index 264936d..4b86fde 100644
--- a/pkg/front_end/testcases/expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/expressions.dart.strong.expect
@@ -4,12 +4,6 @@
 //     print(int?.toString());
 //                ^^^^^^^^
 
-// Unhandled errors:
-//
-// pkg/front_end/testcases/expressions.dart:74:16: Error: Method not found: 'int.toString'.
-//     print(int?.toString());
-//                ^^^^^^^^
-
 library;
 import self as self;
 import "dart:core" as core;
@@ -81,7 +75,9 @@
   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(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>{}))));
+    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) {
diff --git a/pkg/front_end/testcases/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/expressions.dart.strong.transformed.expect
index aa3ea16..65212a2 100644
--- a/pkg/front_end/testcases/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/expressions.dart.strong.transformed.expect
@@ -1,9 +1,3 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/expressions.dart:74:16: Error: Method not found: 'int.toString'.
-//     print(int?.toString());
-//                ^^^^^^^^
-
 library;
 import self as self;
 import "dart:core" as core;
@@ -75,7 +69,9 @@
   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(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>{}))));
+    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) {
diff --git a/pkg/front_end/testcases/future_or_test.dart.direct.expect b/pkg/front_end/testcases/future_or_test.dart.direct.expect
index ea64edd..6006dfc 100644
--- a/pkg/front_end/testcases/future_or_test.dart.direct.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.direct.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -12,7 +12,7 @@
 }
 class B extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method bar() → asy::Future<dynamic> async 
@@ -20,7 +20,7 @@
 }
 class C extends core::Object {
   field self::B b = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method baz() → asy::Future<core::int> async 
diff --git a/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
index 0d5c28b..1461a82 100644
--- a/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -12,7 +12,7 @@
 }
 class B extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method bar() → asy::Future<dynamic> /* originally async */ {
@@ -45,7 +45,7 @@
 }
 class C extends core::Object {
   field self::B b = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method baz() → asy::Future<core::int> /* originally async */ {
diff --git a/pkg/front_end/testcases/future_or_test.dart.outline.expect b/pkg/front_end/testcases/future_or_test.dart.outline.expect
index e69e132..d5d8729 100644
--- a/pkg/front_end/testcases/future_or_test.dart.outline.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.outline.expect
@@ -4,21 +4,21 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method foo() → dynamic
     ;
 }
 class B extends core::Object {
   field self::A a;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method bar() → asy::Future<dynamic>
     ;
 }
 class C extends core::Object {
   field self::B b;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method baz() → asy::Future<core::int>
     ;
diff --git a/pkg/front_end/testcases/future_or_test.dart.strong.expect b/pkg/front_end/testcases/future_or_test.dart.strong.expect
index 253d160..0406605 100644
--- a/pkg/front_end/testcases/future_or_test.dart.strong.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.strong.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -12,7 +12,7 @@
 }
 class B extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method bar() → asy::Future<dynamic> async 
@@ -20,7 +20,7 @@
 }
 class C extends core::Object {
   field self::B b = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method baz() → asy::Future<core::int> async 
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
index 1618bf5..5ee7d6b 100644
--- a/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -12,7 +12,7 @@
 }
 class B extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method bar() → asy::Future<dynamic> /* originally async */ {
@@ -45,7 +45,7 @@
 }
 class C extends core::Object {
   field self::B b = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method baz() → asy::Future<core::int> /* originally async */ {
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.expect b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.expect
index e086d53..f090f06 100644
--- a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.expect
+++ b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static const field dynamic constField = 87;
-  const constructor •(dynamic x) → void
+  const constructor •(dynamic x) → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.transformed.expect b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.transformed.expect
index e086d53..f090f06 100644
--- a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static const field dynamic constField = 87;
-  const constructor •(dynamic x) → void
+  const constructor •(dynamic x) → self::C
     : super core::Object::•()
     ;
 }
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
index ad0b9c4..8e3f873 100644
--- 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static const field dynamic constField;
-  const constructor •(dynamic x) → void
+  const constructor •(dynamic x) → self::C
     ;
 }
 static const field dynamic constTopLevelField;
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
index c4b4907..2a08350 100644
--- 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static const field core::int constField = 87;
-  const constructor •(dynamic x) → void
+  const constructor •(dynamic x) → self::C
     : super core::Object::•()
     ;
 }
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
index c4b4907..2a08350 100644
--- 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static const field core::int constField = 87;
-  const constructor •(dynamic x) → void
+  const constructor •(dynamic x) → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/implicit_new.dart.direct.expect b/pkg/front_end/testcases/implicit_new.dart.direct.expect
index 8e0c23c..d2fd4b41 100644
--- a/pkg/front_end/testcases/implicit_new.dart.direct.expect
+++ b/pkg/front_end/testcases/implicit_new.dart.direct.expect
@@ -13,21 +13,21 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   operator +(dynamic other) → dynamic
     return null;
 }
 class Bar extends core::Object {
-  constructor named() → void
+  constructor named() → self::Bar
     : super core::Object::•()
     ;
   operator +(dynamic other) → dynamic
     return null;
 }
 class IndexTester extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::IndexTester
     : super core::Object::•()
     ;
   operator [](dynamic _) → dynamic
diff --git a/pkg/front_end/testcases/implicit_new.dart.direct.transformed.expect b/pkg/front_end/testcases/implicit_new.dart.direct.transformed.expect
index 4262af7..5a42d71 100644
--- a/pkg/front_end/testcases/implicit_new.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/implicit_new.dart.direct.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   operator +(dynamic other) → dynamic
     return null;
 }
 class Bar extends core::Object {
-  constructor named() → void
+  constructor named() → self::Bar
     : super core::Object::•()
     ;
   operator +(dynamic other) → dynamic
     return null;
 }
 class IndexTester extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::IndexTester
     : super core::Object::•()
     ;
   operator [](dynamic _) → dynamic
diff --git a/pkg/front_end/testcases/implicit_new.dart.outline.expect b/pkg/front_end/testcases/implicit_new.dart.outline.expect
index ed008b8..1553a2d 100644
--- a/pkg/front_end/testcases/implicit_new.dart.outline.expect
+++ b/pkg/front_end/testcases/implicit_new.dart.outline.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
   operator +(dynamic other) → dynamic
     ;
 }
 class Bar extends core::Object {
-  constructor named() → void
+  constructor named() → self::Bar
     ;
   operator +(dynamic other) → dynamic
     ;
 }
 class IndexTester extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::IndexTester
     ;
   operator [](dynamic _) → dynamic
     ;
diff --git a/pkg/front_end/testcases/implicit_new.dart.strong.expect b/pkg/front_end/testcases/implicit_new.dart.strong.expect
index 721c891..1ca7013 100644
--- a/pkg/front_end/testcases/implicit_new.dart.strong.expect
+++ b/pkg/front_end/testcases/implicit_new.dart.strong.expect
@@ -8,36 +8,26 @@
 //   prefix.Bar();
 //          ^^^
 
-// Unhandled errors:
-//
-// 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();
-//          ^^^
-
 library;
 import self as self;
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   operator +(dynamic other) → dynamic
     return null;
 }
 class Bar extends core::Object {
-  constructor named() → void
+  constructor named() → self::Bar
     : super core::Object::•()
     ;
   operator +(dynamic other) → dynamic
     return null;
 }
 class IndexTester extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::IndexTester
     : super core::Object::•()
     ;
   operator [](dynamic _) → dynamic
@@ -45,8 +35,12 @@
   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>{})));
+  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;
diff --git a/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect b/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect
index 0cdd17e..4a56e31 100644
--- a/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect
@@ -1,33 +1,23 @@
-// Unhandled errors:
-//
-// 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();
-//          ^^^
-
 library;
 import self as self;
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   operator +(dynamic other) → dynamic
     return null;
 }
 class Bar extends core::Object {
-  constructor named() → void
+  constructor named() → self::Bar
     : super core::Object::•()
     ;
   operator +(dynamic other) → dynamic
     return null;
 }
 class IndexTester extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::IndexTester
     : super core::Object::•()
     ;
   operator [](dynamic _) → dynamic
@@ -35,8 +25,12 @@
   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>{})));
+  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;
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.direct.expect b/pkg/front_end/testcases/implicit_scope_test.dart.direct.expect
index ef5e29a..c4b1074 100644
--- a/pkg/front_end/testcases/implicit_scope_test.dart.direct.expect
+++ b/pkg/front_end/testcases/implicit_scope_test.dart.direct.expect
@@ -4,7 +4,7 @@
 import "package:expect/expect.dart" as exp;
 
 class ImplicitScopeTest extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ImplicitScopeTest
     : super core::Object::•()
     ;
   static method alwaysTrue() → core::bool {
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.direct.transformed.expect b/pkg/front_end/testcases/implicit_scope_test.dart.direct.transformed.expect
index ef5e29a..c4b1074 100644
--- a/pkg/front_end/testcases/implicit_scope_test.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/implicit_scope_test.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "package:expect/expect.dart" as exp;
 
 class ImplicitScopeTest extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ImplicitScopeTest
     : super core::Object::•()
     ;
   static method alwaysTrue() → core::bool {
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.outline.expect b/pkg/front_end/testcases/implicit_scope_test.dart.outline.expect
index 932d094..f9c385c 100644
--- a/pkg/front_end/testcases/implicit_scope_test.dart.outline.expect
+++ b/pkg/front_end/testcases/implicit_scope_test.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class ImplicitScopeTest extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ImplicitScopeTest
     ;
   static method alwaysTrue() → core::bool
     ;
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.strong.expect b/pkg/front_end/testcases/implicit_scope_test.dart.strong.expect
index 53674fd..f74eec3 100644
--- a/pkg/front_end/testcases/implicit_scope_test.dart.strong.expect
+++ b/pkg/front_end/testcases/implicit_scope_test.dart.strong.expect
@@ -4,7 +4,7 @@
 import "package:expect/expect.dart" as exp;
 
 class ImplicitScopeTest extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ImplicitScopeTest
     : super core::Object::•()
     ;
   static method alwaysTrue() → core::bool {
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
index 53674fd..f74eec3 100644
--- a/pkg/front_end/testcases/implicit_scope_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/implicit_scope_test.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "package:expect/expect.dart" as exp;
 
 class ImplicitScopeTest extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ImplicitScopeTest
     : super core::Object::•()
     ;
   static method alwaysTrue() → core::bool {
diff --git a/pkg/front_end/testcases/implicit_this.dart.direct.expect b/pkg/front_end/testcases/implicit_this.dart.direct.expect
index a599fbe..44a14d4 100644
--- a/pkg/front_end/testcases/implicit_this.dart.direct.expect
+++ b/pkg/front_end/testcases/implicit_this.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m() → dynamic {
@@ -14,7 +14,7 @@
   }
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method testD() → dynamic {
diff --git a/pkg/front_end/testcases/implicit_this.dart.direct.transformed.expect b/pkg/front_end/testcases/implicit_this.dart.direct.transformed.expect
index a599fbe..44a14d4 100644
--- a/pkg/front_end/testcases/implicit_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/implicit_this.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m() → dynamic {
@@ -14,7 +14,7 @@
   }
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method testD() → dynamic {
diff --git a/pkg/front_end/testcases/implicit_this.dart.outline.expect b/pkg/front_end/testcases/implicit_this.dart.outline.expect
index a4b1533..a586749 100644
--- a/pkg/front_end/testcases/implicit_this.dart.outline.expect
+++ b/pkg/front_end/testcases/implicit_this.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method m() → dynamic
     ;
@@ -11,7 +11,7 @@
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method testD() → dynamic
     ;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml
index e441068..9e236c1 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml
@@ -13,16 +13,16 @@
   - entry: main.dart
     sources:
       main.dart: |
-        import "package:dummy/b.dart";
+        import "package:example/b.dart";
         main() {
           print("hello");
           b();
         }
-      b.dart: |
+      pkg/example/b.dart: |
         b() {
           print("b");
         }
-      .packages: dummy:${outDirUri}
+      .packages: example:pkg/example
     expectedLibraryCount: 2
   - entry: main.dart
     # TODO(jensj): For now we don't initialize from dill when a package was
@@ -36,4 +36,4 @@
           print("hello");
         }
       .packages:
-    expectedLibraryCount: 1
\ No newline at end of file
+    expectedLibraryCount: 1
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml
index b6954ee..85937b6 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml
@@ -26,7 +26,7 @@
             print("Foo!");
           }
         }
-      .packages: mypackage:${outDirUri}mypackage
+      .packages: mypackage:mypackage
     expectedLibraryCount: 2
   - entry: main.dart
     invalidate:
@@ -42,7 +42,7 @@
             print("Foo!");
           }
         }
-      .packages: mypackage:${outDirUri}mypackage
+      .packages: mypackage:mypackage
     expectedLibraryCount: 1
     expectInitializeFromDill: true
   - entry: main.dart
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml
index e7811bd..1d8be7f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml
@@ -8,56 +8,56 @@
 type: newworld
 strong: false
 worlds:
-  - entry: "package:dummy/main.dart"
+  - entry: "package:example/main.dart"
     sources:
-      main.dart: |
+      pkg/example/main.dart: |
         part "b.dart";
         main() {
           print("hello");
           b();
         }
-      b.dart: |
+      pkg/example/b.dart: |
         part of "main.dart";
         b() {
           print("b1");
         }
-      .packages: dummy:${outDirUri}
+      .packages: example:pkg/example
     expectedLibraryCount: 1
-  - entry: "package:dummy/main.dart"
+  - entry: "package:example/main.dart"
     invalidate:
-      - b.dart
+      - pkg/example/b.dart
     expectedInvalidatedUri:
-      - "package:dummy/b.dart"
+      - "package:example/b.dart"
     sources:
-      main.dart: |
+      pkg/example/main.dart: |
         part "b.dart";
         main() {
           print("hello");
           b();
         }
-      b.dart: |
+      pkg/example/b.dart: |
         part of "main.dart";
         b() {
           print("b2");
         }
-      .packages: dummy:${outDirUri}
+      .packages: example:pkg/example
     expectedLibraryCount: 1
-  - entry: "package:dummy/main.dart"
+  - entry: "package:example/main.dart"
     invalidate:
-      - "package:dummy/b.dart"
+      - "package:example/b.dart"
     expectedInvalidatedUri:
-      - "package:dummy/b.dart"
+      - "package:example/b.dart"
     sources:
-      main.dart: |
+      pkg/example/main.dart: |
         part "b.dart";
         main() {
           print("hello");
           b();
         }
-      b.dart: |
+      pkg/example/b.dart: |
         part of "main.dart";
         b() {
           print("b3");
         }
-      .packages: dummy:${outDirUri}
+      .packages: example:pkg/example
     expectedLibraryCount: 1
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_as_file.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_as_file.yaml
index e2c631e..eae0ae4 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_as_file.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_as_file.yaml
@@ -5,20 +5,20 @@
 # Test that invalidating a part of a package works with file URI.
 
 type: basic
-entry: "package:dummy/main.dart"
+entry: "package:example/main.dart"
 strong: false
 invalidate:
-  - b.dart
+  - pkg/example/b.dart
 sources:
-  main.dart: |
+  pkg/example/main.dart: |
     part "b.dart";
     main() {
       print("hello");
       b();
     }
-  b.dart: |
+  pkg/example/b.dart: |
     part of "main.dart";
     b() {
       print("b1");
     }
-  .packages: dummy:${outDirUri}
+  .packages: example:pkg/example
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_as_package.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_as_package.yaml
index 90d13ac..19816ca 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_as_package.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_as_package.yaml
@@ -5,20 +5,20 @@
 # Test that invalidating a part of a package works with package URI.
 
 type: basic
-entry: "package:dummy/main.dart"
+entry: "package:example/main.dart"
 strong: false
 invalidate:
-  - "package:dummy/b.dart"
+  - "package:example/b.dart"
 sources:
-  main.dart: |
+  pkg/example/main.dart: |
     part "b.dart";
     main() {
       print("hello");
       b();
     }
-  b.dart: |
+  pkg/example/b.dart: |
     part of "main.dart";
     b() {
       print("b1");
     }
-  .packages: dummy:${outDirUri}
+  .packages: example:pkg/example
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/strongmode_mixins_2.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/strongmode_mixins_2.yaml
index b82c820..61d783f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/strongmode_mixins_2.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/strongmode_mixins_2.yaml
@@ -12,13 +12,13 @@
 sources:
   a.dart: |
     import 'b.dart';
-    class A extends Object with B<C>, D<Object> {}
+    class A extends Object with B<C>, D {}
   b.dart: |
-    abstract class B<ChildType extends Object> extends Object {
+    mixin B<ChildType extends Object> {
       ChildType get child => null;
       set child(ChildType value) {}
     }
 
-    class C extends Object {}
+    class C {}
 
-    abstract class D<T extends Object> extends Object with B<T> {}
\ No newline at end of file
+    mixin D<T extends Object> on B<T> {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml
index 471546a..7bb3ab1 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml
@@ -13,7 +13,7 @@
   - entry: main.dart
     sources:
       main.dart: |
-        import "package:dummy/b.dart";
+        import "package:example/b.dart";
         main() {
           print("hello");
           b();
@@ -30,7 +30,7 @@
         b() {
           a();
         }
-      .packages: dummy:${outDirUri}package_0.1.0
+      .packages: example:package_0.1.0
     expectedLibraryCount: 3
   - entry: main.dart
     # TODO(jensj): For now we don't initialize from dill when a package was
@@ -40,7 +40,7 @@
     expectInitializeFromDill: false
     sources:
       main.dart: |
-        import "package:dummy/b.dart";
+        import "package:example/b.dart";
         main() {
           print("hello");
           b();
@@ -61,5 +61,5 @@
         b() {
           print("hello from v0.1.1");
         }
-      .packages: dummy:${outDirUri}package_0.1.1
-    expectedLibraryCount: 2
\ No newline at end of file
+      .packages: example:package_0.1.1
+    expectedLibraryCount: 2
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml
index fcf5918..00cd03f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml
@@ -13,7 +13,7 @@
   - entry: main.dart
     sources:
       main.dart: |
-        import "package:dummy/b.dart";
+        import "package:example/b.dart";
         main() {
           print("hello");
           b();
@@ -30,7 +30,7 @@
         b() {
           a();
         }
-      .packages: dummy:${outDirUri}package_0.1.0
+      .packages: example:package_0.1.0
     expectedLibraryCount: 3
   - entry: main.dart
     invalidate:
@@ -39,7 +39,7 @@
     expectInitializeFromDill: false
     sources:
       main.dart: |
-        import "package:dummy/b.dart";
+        import "package:example/b.dart";
         main() {
           print("hello");
           b();
@@ -60,5 +60,5 @@
         b() {
           print("hello from v0.1.1");
         }
-      .packages: dummy:${outDirUri}package_0.1.1
-    expectedLibraryCount: 2
\ No newline at end of file
+      .packages: example:package_0.1.1
+    expectedLibraryCount: 2
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml
index 1af84c1..1c79496 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml
@@ -13,7 +13,7 @@
   - entry: main.dart
     sources:
       main.dart: |
-        import "package:dummy/b.dart";
+        import "package:example/b.dart";
         main() {
           print("hello");
           b();
@@ -30,7 +30,7 @@
         b() {
           a();
         }
-      .packages: dummy:${outDirUri}package_0.1.0
+      .packages: example:package_0.1.0
     expectedLibraryCount: 3
   - entry: main.dart
     worldType: updated
@@ -43,5 +43,5 @@
         b() {
           print("hello from v0.1.1");
         }
-      .packages: dummy:${outDirUri}package_0.1.1
-    expectedLibraryCount: 2
\ No newline at end of file
+      .packages: example:package_0.1.1
+    expectedLibraryCount: 2
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml
index b59c18e..c7a7491 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml
@@ -12,7 +12,7 @@
   - entry: main.dart
     sources:
       main.dart: |
-        import "package:dummy/b.dart";
+        import "package:example/b.dart";
         main() {
           print("hello");
           b();
@@ -21,7 +21,7 @@
         b() {
           print("hello from package");
         }
-      .packages: dummy:${outDirUri}package
+      .packages: example:package
     expectedLibraryCount: 2
   - entry: main.dart
     worldType: updated
diff --git a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect
index 8f3319f..6cc9547 100644
--- a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect
@@ -17,12 +17,12 @@
 import "dart:core" as core;
 
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 abstract class D<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::D::T t) → void
+  constructor •(self::D::T t) → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.transformed.expect
index 4624781..34e2a90 100644
--- a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 abstract class D<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::D::T t) → void
+  constructor •(self::D::T t) → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
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 09b40a0..fbf1880 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 •() → void
+  synthetic constructor •() → self::C
     ;
 }
 abstract class D<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::D::T t) → void
+  constructor •(self::D::T t) → self::D<self::D::T>
     ;
 }
 static method test() → void
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.direct.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.direct.expect
index a90d65d..94d8628 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.direct.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor expressionOnly() → void
+  constructor expressionOnly() → self::C
     : assert(self::f<dynamic>()), super core::Object::•()
     ;
-  constructor expressionAndMessage() → void
+  constructor expressionAndMessage() → self::C
     : assert(self::f<dynamic>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.direct.transformed.expect
index a90d65d..94d8628 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.direct.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor expressionOnly() → void
+  constructor expressionOnly() → self::C
     : assert(self::f<dynamic>()), super core::Object::•()
     ;
-  constructor expressionAndMessage() → void
+  constructor expressionAndMessage() → self::C
     : assert(self::f<dynamic>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
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 5121bf1..d89f3fb 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.outline.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor expressionOnly() → void
+  constructor expressionOnly() → self::C
     ;
-  constructor expressionAndMessage() → void
+  constructor expressionAndMessage() → self::C
     ;
 }
 static method f<T extends core::Object = dynamic>() → self::f::T
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 f87c11c..be425b0 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.strong.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor expressionOnly() → void
+  constructor expressionOnly() → self::C
     : assert(self::f<core::bool>()), super core::Object::•()
     ;
-  constructor expressionAndMessage() → void
+  constructor expressionAndMessage() → self::C
     : assert(self::f<core::bool>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
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 f87c11c..be425b0 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,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor expressionOnly() → void
+  constructor expressionOnly() → self::C
     : assert(self::f<core::bool>()), super core::Object::•()
     ;
-  constructor expressionAndMessage() → void
+  constructor expressionAndMessage() → self::C
     : assert(self::f<core::bool>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.direct.expect b/pkg/front_end/testcases/inference/assign_local.dart.direct.expect
index 35d51d7..e6d03ee 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/assign_local.dart.direct.transformed.expect
index 35d51d7..e6d03ee 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super self::A::•()
     ;
 }
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 43446c8..af03c8b 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → void
+  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 5eaea0d..fa3c621 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super self::A::•()
     ;
 }
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 5eaea0d..fa3c621 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/async_await.dart.direct.expect b/pkg/front_end/testcases/inference/async_await.dart.direct.expect
index ba01988..18f91dd 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.direct.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 abstract class MyFuture extends core::Object implements asy::Future<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::MyFuture
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
index d797b5d..7e5db5d 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 abstract class MyFuture extends core::Object implements asy::Future<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::MyFuture
     : super core::Object::•()
     ;
 }
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 4bf45e5..8642f8d 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.outline.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 abstract class MyFuture extends core::Object implements asy::Future<core::int> {
-  synthetic constructor •() → void
+  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 0865e85..89f497e 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.strong.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 abstract class MyFuture extends core::Object implements asy::Future<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::MyFuture
     : super core::Object::•()
     ;
 }
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 e437f50..beac918 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
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 abstract class MyFuture extends core::Object implements asy::Future<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::MyFuture
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.direct.expect b/pkg/front_end/testcases/inference/bug30251.dart.direct.expect
index b7f6d44..963af4d 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → void
+  constructor •(core::int p) → self::C
     : self::C::x = self::f<dynamic>(1.+(p)), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30251.dart.direct.transformed.expect
index b7f6d44..963af4d 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → void
+  constructor •(core::int p) → self::C
     : self::C::x = self::f<dynamic>(1.+(p)), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.outline.expect b/pkg/front_end/testcases/inference/bug30251.dart.outline.expect
index a19f31b..8afecf1 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → void
+  constructor •(core::int p) → self::C
     ;
 }
 static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.strong.expect b/pkg/front_end/testcases/inference/bug30251.dart.strong.expect
index cb2070c..2159bd5 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → void
+  constructor •(core::int p) → self::C
     : self::C::x = self::f<core::int>(1.{core::num::+}(p)), super core::Object::•()
     ;
 }
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 cb2070c..2159bd5 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → void
+  constructor •(core::int p) → self::C
     : self::C::x = self::f<core::int>(1.{core::num::+}(p)), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.direct.expect b/pkg/front_end/testcases/inference/bug30620.dart.direct.expect
index 11677c0..acfcfa6 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/bug30620.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30620.dart.direct.transformed.expect
index 11677c0..acfcfa6 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.outline.expect b/pkg/front_end/testcases/inference/bug30620.dart.outline.expect
index 61d0542..0bc257f 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30620.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     ;
   operator ==(core::Object other) → core::bool
     ;
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.strong.expect b/pkg/front_end/testcases/inference/bug30620.dart.strong.expect
index b299931..7c997a1 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30620.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool
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 b299931..7c997a1 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.direct.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.direct.expect
index 35648da..738dc94 100644
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.direct.transformed.expect
index 35648da..738dc94 100644
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool
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 61d0542..0bc257f 100644
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     ;
   operator ==(core::Object other) → core::bool
     ;
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 ec87ef4..9bc7bc0 100644
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool
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 ec87ef4..9bc7bc0 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.direct.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.direct.expect
index 239e30e..ca08463 100644
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool {
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.direct.transformed.expect
index 239e30e..ca08463 100644
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool {
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 61d0542..0bc257f 100644
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     ;
   operator ==(core::Object other) → core::bool
     ;
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 4d95231..e457cd0 100644
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool {
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 4d95231..e457cd0 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::String foo;
-  constructor •(core::String foo) → void
+  constructor •(core::String foo) → self::A
     : self::A::foo = foo, super core::Object::•()
     ;
   operator ==(core::Object other) → core::bool {
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.direct.expect b/pkg/front_end/testcases/inference/bug30624.dart.direct.expect
index eeedbaf..18bd73b 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::E>
     : super core::Object::•()
     ;
   method barA([(self::C::E, self::C::E) → core::int cmp = null]) → void {
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30624.dart.direct.transformed.expect
index eeedbaf..18bd73b 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::E>
     : super core::Object::•()
     ;
   method barA([(self::C::E, self::C::E) → core::int cmp = null]) → void {
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.outline.expect b/pkg/front_end/testcases/inference/bug30624.dart.outline.expect
index ff60989..b89bd19 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::E>
     ;
   method barA([(self::C::E, self::C::E) → core::int cmp]) → void
     ;
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.strong.expect b/pkg/front_end/testcases/inference/bug30624.dart.strong.expect
index 9a5f732..30ffb21 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::E>
     : super core::Object::•()
     ;
   method barA([(self::C::E, self::C::E) → core::int cmp = null]) → void {
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 9a5f732..30ffb21 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::E>
     : super core::Object::•()
     ;
   method barA([(self::C::E, self::C::E) → core::int cmp = null]) → void {
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.direct.expect b/pkg/front_end/testcases/inference/bug31132.dart.direct.expect
index 29a4ab76..31ec243 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/bug31132.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends self::B {
   field dynamic z = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug31132.dart.direct.transformed.expect
index 29a4ab76..31ec243 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug31132.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends self::B {
   field dynamic z = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.outline.expect b/pkg/front_end/testcases/inference/bug31132.dart.outline.expect
index 85e0a99..25d15a1 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug31132.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends self::B {
   field dynamic z;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static method test(self::B x) → void
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.strong.expect b/pkg/front_end/testcases/inference/bug31132.dart.strong.expect
index 0aa0ff6..c2d334d 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug31132.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends self::B {
   field dynamic z = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 0aa0ff6..c2d334d 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug31132.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends self::B {
   field dynamic z = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart.direct.expect b/pkg/front_end/testcases/inference/call_corner_cases.dart.direct.expect
index bf4efd4..5941e27 100644
--- a/pkg/front_end/testcases/inference/call_corner_cases.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method call() → core::int
     return 0;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get call() → self::A
@@ -19,7 +19,7 @@
 class D extends core::Object {
   field self::A fieldA = new self::A::•();
   field self::B fieldB = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   get getA() → self::A
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/call_corner_cases.dart.direct.transformed.expect
index bf4efd4..5941e27 100644
--- a/pkg/front_end/testcases/inference/call_corner_cases.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method call() → core::int
     return 0;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get call() → self::A
@@ -19,7 +19,7 @@
 class D extends core::Object {
   field self::A fieldA = new self::A::•();
   field self::B fieldB = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   get getA() → self::A
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 523519b..dfaccdc 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,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method call() → core::int
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   get call() → self::A
     ;
@@ -17,7 +17,7 @@
 class D extends core::Object {
   field self::A fieldA;
   field self::B fieldB;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   get getA() → self::A
     ;
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 3ed3a13..a8a3081 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
@@ -13,14 +13,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method call() → core::int
     return 0;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get call() → self::A
@@ -29,7 +29,7 @@
 class D extends core::Object {
   field self::A fieldA = new self::A::•();
   field self::B fieldB = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   get getA() → self::A
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 1c713e2..abc7cbc 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method call() → core::int
     return 0;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get call() → self::A
@@ -19,7 +19,7 @@
 class D extends core::Object {
   field self::A fieldA = new self::A::•();
   field self::B fieldB = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   get getA() → self::A
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.expect
index 93409b0..19abeae 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class ActionDispatcher<P extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P>
     : super core::Object::•()
     ;
   method call([self::ActionDispatcher::P value = null]) → void {}
 }
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 class FooActions extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::FooActions
     : super core::Object::•()
     ;
   get foo() → self::ActionDispatcher<self::Bar>
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.transformed.expect
index 93409b0..19abeae 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class ActionDispatcher<P extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P>
     : super core::Object::•()
     ;
   method call([self::ActionDispatcher::P value = null]) → void {}
 }
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 class FooActions extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::FooActions
     : super core::Object::•()
     ;
   get foo() → self::ActionDispatcher<self::Bar>
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 309e3d2..186f5b0 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
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class ActionDispatcher<P extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P>
     ;
   method call([self::ActionDispatcher::P value]) → void
     ;
 }
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     ;
 }
 class FooActions extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::FooActions
     ;
   get foo() → self::ActionDispatcher<self::Bar>
     ;
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 aa889bc..d25caeb 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
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class ActionDispatcher<P extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P>
     : super core::Object::•()
     ;
   method call([generic-covariant-impl self::ActionDispatcher::P value = null]) → void {}
 }
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 class FooActions extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::FooActions
     : super core::Object::•()
     ;
   get foo() → self::ActionDispatcher<self::Bar>
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 aa889bc..d25caeb 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
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class ActionDispatcher<P extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P>
     : super core::Object::•()
     ;
   method call([generic-covariant-impl self::ActionDispatcher::P value = null]) → void {}
 }
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 class FooActions extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::FooActions
     : super core::Object::•()
     ;
   get foo() → self::ActionDispatcher<self::Bar>
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect
index 708cd81..d03e49e 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect
@@ -23,13 +23,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.transformed.expect
index 011cb62..8f3be84 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.transformed.expect
@@ -13,13 +13,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  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 3c9369a..1cb6512 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
@@ -13,12 +13,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract method f(dynamic x) → dynamic;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  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 708cd81..d03e49e 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
@@ -23,13 +23,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  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 011cb62..8f3be84 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
@@ -13,13 +13,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.expect
index d942073..84ea8fc 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::C::T> x) → void
+  constructor •(core::List<self::C::T> x) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.transformed.expect
index d942073..84ea8fc 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::C::T> x) → void
+  constructor •(core::List<self::C::T> x) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
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 dafb078..87b2782 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::C::T> x) → void
+  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 f11d58d..80f6174 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::C::T> x) → void
+  constructor •(core::List<self::C::T> x) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
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 f11d58d..80f6174 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::C::T> x) → void
+  constructor •(core::List<self::C::T> x) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.expect
index 569ad5d..ae8c8ce 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.expect
@@ -4,37 +4,37 @@
 
 class I1 extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
 }
 class I2 extends self::I1 {
   field core::int y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super self::I1::•()
     ;
 }
 class A extends core::Object {
   final field self::I1 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   final field self::I2 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C1
     : super core::Object::•()
     ;
   get a() → dynamic
     return null;
 }
 class C2 extends core::Object implements self::B, self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C2
     : super core::Object::•()
     ;
   get a() → dynamic
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.transformed.expect
index 569ad5d..ae8c8ce 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.transformed.expect
@@ -4,37 +4,37 @@
 
 class I1 extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
 }
 class I2 extends self::I1 {
   field core::int y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super self::I1::•()
     ;
 }
 class A extends core::Object {
   final field self::I1 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   final field self::I2 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C1
     : super core::Object::•()
     ;
   get a() → dynamic
     return null;
 }
 class C2 extends core::Object implements self::B, self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C2
     : super core::Object::•()
     ;
   get a() → dynamic
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 a51a200..55ed953 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
@@ -14,7 +14,7 @@
 // Change to a subtype of test::I1.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Error: This is the overridden method ('a').
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is the overridden method ('a').
 //   final I1 a = null;
 //            ^
 //
@@ -22,7 +22,7 @@
 // Change to a subtype of test::I2.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Error: This is the overridden method ('a').
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is the overridden method ('a').
 //   final I2 a = null;
 //            ^
 //
@@ -30,7 +30,7 @@
 // Change to a subtype of test::I2.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Error: This is the overridden method ('a').
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is the overridden method ('a').
 //   final I2 a = null;
 //            ^
 //
@@ -38,7 +38,7 @@
 // Change to a subtype of test::I1.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Error: This is the overridden method ('a').
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is the overridden method ('a').
 //   final I1 a = null;
 //            ^
 
@@ -80,37 +80,37 @@
 
 class I1 extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
 }
 class I2 extends self::I1 {
   field core::int y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super self::I1::•()
     ;
 }
 class A extends core::Object {
   final field self::I1 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   final field self::I2 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C1
     : super core::Object::•()
     ;
   get a() → dynamic
     return null;
 }
 class C2 extends core::Object implements self::B, self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C2
     : super core::Object::•()
     ;
   get a() → dynamic
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.expect
index a94ba90..e3d2868 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.expect
@@ -4,44 +4,44 @@
 
 class I1 extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
 }
 class I2 extends core::Object {
   field core::int y = null;
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I3
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
   final field self::I1 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   final field self::I2 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C1
     : super core::Object::•()
     ;
   get a() → self::I3
     return null;
 }
 class C2 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C2
     : super core::Object::•()
     ;
   get a() → dynamic
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.transformed.expect
index a94ba90..e3d2868 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.transformed.expect
@@ -4,44 +4,44 @@
 
 class I1 extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
 }
 class I2 extends core::Object {
   field core::int y = null;
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I3
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
   final field self::I1 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   final field self::I2 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C1
     : super core::Object::•()
     ;
   get a() → self::I3
     return null;
 }
 class C2 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C2
     : super core::Object::•()
     ;
   get a() → dynamic
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 920dfc8..d347006 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
@@ -9,7 +9,7 @@
 // Change to a subtype of test::I1.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Error: This is the overridden method ('a').
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is the overridden method ('a').
 //   final I1 a = null;
 //            ^
 //
@@ -17,7 +17,7 @@
 // Change to a subtype of test::I2.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Error: This is the overridden method ('a').
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is the overridden method ('a').
 //   final I2 a = null;
 //            ^
 
@@ -44,44 +44,44 @@
 
 class I1 extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
 }
 class I2 extends core::Object {
   field core::int y = null;
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I3
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
   final field self::I1 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   final field self::I2 a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C1
     : super core::Object::•()
     ;
   get a() → self::I3
     return null;
 }
 class C2 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C2
     : super core::Object::•()
     ;
   get a() → dynamic
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.expect
index 9a717b9..60b38f6 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class Foo<T extends self::A = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.transformed.expect
index 9a717b9..60b38f6 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class Foo<T extends self::A = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
 }
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 53339a4..b232ffd 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,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class Foo<T extends self::A = self::A> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
 }
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 53339a4..b232ffd 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,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class Foo<T extends self::A = self::A> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.expect
index e4269a9..67e376b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
-  constructor •(self::C::T t) → void
+  constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.transformed.expect
index e4269a9..67e376b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
-  constructor •(self::C::T t) → void
+  constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
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 09066dc..9fb1ff1 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
@@ -11,7 +11,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → void
+  constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
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 d63a39e..1df375d 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → void
+  constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.expect
index 872f905..4cad6f5 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.expect
@@ -4,17 +4,17 @@
 
 typedef F<T extends core::Object = dynamic> = () → T;
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class C<T extends self::A = dynamic> extends core::Object {
-  constructor •(() → self::C::T f) → void
+  constructor •(() → self::C::T f) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
 class NotA extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::NotA
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.transformed.expect
index 872f905..4cad6f5 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.transformed.expect
@@ -4,17 +4,17 @@
 
 typedef F<T extends core::Object = dynamic> = () → T;
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class C<T extends self::A = dynamic> extends core::Object {
-  constructor •(() → self::C::T f) → void
+  constructor •(() → self::C::T f) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
 class NotA extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::NotA
     : super core::Object::•()
     ;
 }
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 68d5644..6ab45c4 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
@@ -4,17 +4,17 @@
 
 typedef F<T extends core::Object = dynamic> = () → T;
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class C<T extends self::A = self::A> extends core::Object {
-  constructor •(() → self::C::T f) → void
+  constructor •(() → self::C::T f) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
 class NotA extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::NotA
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.expect
index dc33b93..0eb5ed3 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   final field self::C::T t;
-  const constructor •(self::C::T t) → void
+  const constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.transformed.expect
index dc33b93..0eb5ed3 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   final field self::C::T t;
-  const constructor •(self::C::T t) → void
+  const constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
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 88d450f..acaa923 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   final field self::C::T t;
-  const constructor •(self::C::T t) → void
+  const constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
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 88d450f..acaa923 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   final field self::C::T t;
-  const constructor •(self::C::T t) → void
+  const constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.expect
index b141829..ffe3403 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class C<T extends core::num = dynamic> extends core::Object {
   final field self::C::T x;
-  const constructor •(self::C::T x) → void
+  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 •() → void
+  const constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.transformed.expect
index b141829..ffe3403 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class C<T extends core::num = dynamic> extends core::Object {
   final field self::C::T x;
-  const constructor •(self::C::T x) → void
+  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 •() → void
+  const constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
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 f90d5a7..eb8ade1 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
@@ -4,12 +4,12 @@
 
 class C<T extends core::num = core::num> extends core::Object {
   final field self::C::T x;
-  const constructor •(self::C::T x) → void
+  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 •() → void
+  const constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
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 f90d5a7..eb8ade1 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
@@ -4,12 +4,12 @@
 
 class C<T extends core::num = core::num> extends core::Object {
   final field self::C::T x;
-  const constructor •(self::C::T x) → void
+  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 •() → void
+  const constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.expect
index 740c1dd..be85931 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::C::T> list) → void
+  constructor •(core::List<self::C::T> list) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.transformed.expect
index 740c1dd..be85931 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::C::T> list) → void
+  constructor •(core::List<self::C::T> list) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
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 4eeaeb3..17be81e 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::C::T> list) → void
+  constructor •(core::List<self::C::T> list) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
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 4eeaeb3..17be81e 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::C::T> list) → void
+  constructor •(core::List<self::C::T> list) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.expect
index 2f2411b..e84c59d 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
-  constructor _() → void
+  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> {
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.transformed.expect
index 2f2411b..e84c59d 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
-  constructor _() → void
+  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> {
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 1d034f2..defe1a8 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
@@ -11,7 +11,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T t = null;
-  constructor _() → void
+  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> {
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 14fa331..a6b5644 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T t = null;
-  constructor _() → void
+  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> {
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.expect
index 5fbdc88..0e2824f0 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   field self::A<self::A::T> f = new self::A::•<dynamic>();
-  constructor •() → void
+  constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory factory<T extends core::Object = dynamic>() → self::A<self::A::factory::T>
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.transformed.expect
index 5fbdc88..0e2824f0 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   field self::A<self::A::T> f = new self::A::•<dynamic>();
-  constructor •() → void
+  constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory factory<T extends core::Object = dynamic>() → self::A<self::A::factory::T>
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 2b26179..1a10614 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory factory<T extends core::Object = dynamic>() → self::A<self::A::factory::T>
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 2b26179..1a10614 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory factory<T extends core::Object = dynamic>() → self::A<self::A::factory::T>
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.expect
index 16daec8..3aaa8b1 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
-  constructor named(core::List<self::C::T> t) → void
+  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.transformed.expect
index 16daec8..3aaa8b1 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
-  constructor named(core::List<self::C::T> t) → void
+  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
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 e62e839..c0aa117 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
@@ -4,7 +4,7 @@
 
 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) → void
+  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
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 e62e839..c0aa117 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
@@ -4,7 +4,7 @@
 
 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) → void
+  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.expect
index 7fbdfc2..4761f0f 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
-  constructor •() → void
+  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> {
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.transformed.expect
index 7fbdfc2..4761f0f 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t = null;
-  constructor •() → void
+  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> {
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 d2511f2..a35e74f 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T t = null;
-  constructor •() → void
+  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> {
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 d2511f2..a35e74f 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T t = null;
-  constructor •() → void
+  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> {
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.expect
index a985558..0dd3c05 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.expect
@@ -4,10 +4,10 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
-  constructor •(self::C::T t) → void
+  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) → void
+  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
     : this self::C::•(t.[](0))
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.transformed.expect
index a985558..0dd3c05 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.transformed.expect
@@ -4,10 +4,10 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
-  constructor •(self::C::T t) → void
+  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) → void
+  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
     : this self::C::•(t.[](0))
     ;
 }
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 9ea221c..6a307ee 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
@@ -4,10 +4,10 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → void
+  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) → void
+  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
     : this self::C::•(t.{core::List::[]}(0))
     ;
 }
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 9ea221c..6a307ee 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
@@ -4,10 +4,10 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → void
+  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) → void
+  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
     : this self::C::•(t.{core::List::[]}(0))
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.expect
index 4683180..8b7170d 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.expect
@@ -11,7 +11,7 @@
 }
 class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   field self::CImpl::T t;
-  constructor •(self::CImpl::T t) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.transformed.expect
index 4683180..8b7170d 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.transformed.expect
@@ -11,7 +11,7 @@
 }
 class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   field self::CImpl::T t;
-  constructor •(self::CImpl::T t) → void
+  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 4ff0a8c..8b92733a 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
@@ -11,7 +11,7 @@
 }
 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) → void
+  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.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.transformed.expect
index 4d782c8..b20065f 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
@@ -11,7 +11,7 @@
 }
 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) → void
+  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_to_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.expect
index 47f9df0..2efa6f7 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.expect
@@ -11,7 +11,7 @@
 }
 class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   field self::CImpl::T t;
-  constructor _(self::CImpl::T t) → void
+  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>
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.transformed.expect
index 47f9df0..2efa6f7 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.transformed.expect
@@ -11,7 +11,7 @@
 }
 class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   field self::CImpl::T t;
-  constructor _(self::CImpl::T t) → void
+  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>
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 018e8a0..579d4cf 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
@@ -11,7 +11,7 @@
 }
 class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
   field self::CImpl::T t;
-  constructor _(self::CImpl::T t) → void
+  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>
     ;
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 ede1a6e..dcbaf5d 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
@@ -11,7 +11,7 @@
 }
 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) → void
+  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>
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 2840887..f7dc7a6 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
@@ -11,7 +11,7 @@
 }
 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) → void
+  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>
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.expect
index 24bc890..c5caad7 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Clonable<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Clonable<self::Clonable::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 {
   field self::Pair::T t;
   field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → void
+  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 _() → void
+  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>
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.transformed.expect
index 24bc890..c5caad7 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Clonable<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Clonable<self::Clonable::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 {
   field self::Pair::T t;
   field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → void
+  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 _() → void
+  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>
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 c4053e2..a3489bf 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
@@ -17,17 +17,17 @@
 import "dart:core" as core;
 
 class Clonable<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Clonable<self::Clonable::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) → void
+  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 _() → void
+  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>
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 33b8e13..512ffbc 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
@@ -10,17 +10,17 @@
 import "dart:core" as core;
 
 class Clonable<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Clonable<self::Clonable::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) → void
+  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 _() → void
+  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>
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.expect
index af3546f..65cb4b4 100644
--- a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.expect
@@ -5,7 +5,7 @@
 class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   field self::Pair::T t;
   field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → void
+  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>
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.transformed.expect
index af3546f..65cb4b4 100644
--- a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
   field self::Pair::T t;
   field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → void
+  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>
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 52a04f7..43824f3 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
@@ -5,7 +5,7 @@
 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) → void
+  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>
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 52a04f7..43824f3 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
@@ -5,7 +5,7 @@
 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) → void
+  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>
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.expect
index 015c282..d203d4e 100644
--- a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   final field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.transformed.expect
index 015c282..d203d4e 100644
--- a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   final field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → dynamic
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 a17cf91..4e0da98 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
@@ -4,7 +4,7 @@
 // Change to a subtype of dart.core::int.
 //   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
 //                                                 ^
-// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:9:13: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:9:13: Context: This is the overridden method ('x').
 //   final int x = 2;
 //             ^
 
@@ -21,12 +21,12 @@
 
 class A extends core::Object {
   final field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.expect
index e5d7297..247c481 100644
--- a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.expect
@@ -7,7 +7,7 @@
   static field dynamic y = 3;
   field dynamic x2 = null;
   field dynamic y2 = 3;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.transformed.expect
index e5d7297..247c481 100644
--- a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
   static field dynamic y = 3;
   field dynamic x2 = null;
   field dynamic y2 = 3;
-  synthetic constructor •() → void
+  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 6bdbf8c..888ea82 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
@@ -7,7 +7,7 @@
   static field core::int y = 3;
   field dynamic x2 = null;
   field core::int y2 = 3;
-  synthetic constructor •() → void
+  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.transformed.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.strong.transformed.expect
index 6bdbf8c..888ea82 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
@@ -7,7 +7,7 @@
   static field core::int y = 3;
   field dynamic x2 = null;
   field core::int y2 = 3;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 14e65f8..7289b38 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
@@ -5,7 +5,7 @@
 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) → void
+  constructor •((self::A::T) → self::A::T x) → self::A<self::A::T>
     : self::A::x = x, super core::Object::•()
     ;
 }
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 14e65f8..7289b38 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
@@ -5,7 +5,7 @@
 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) → void
+  constructor •((self::A::T) → self::A::T x) → self::A<self::A::T>
     : self::A::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.expect
index 95f7601..9a63601 100644
--- a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get foo() → core::Iterable<core::String>;
 }
 class B extends core::Object implements self::A {
   final field dynamic foo = const <dynamic>[];
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.transformed.expect
index 95f7601..9a63601 100644
--- a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get foo() → core::Iterable<core::String>;
 }
 class B extends core::Object implements self::A {
   final field dynamic foo = const <dynamic>[];
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
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 872d11c..65ee9d5 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 •() → void
+  synthetic constructor •() → self::A
     ;
   abstract get foo() → core::Iterable<core::String>;
 }
 class B extends core::Object implements self::A {
   final field dynamic foo;
-  synthetic constructor •() → void
+  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 f7a8373..97ebeda 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,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
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 f7a8373..97ebeda 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,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.expect
index 38617da..b08a49b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
-  const constructor named(core::List<core::String> l) → void
+  const constructor named(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
 @self::Foo::•(const <dynamic>[])
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 @self::Foo::named(const <dynamic>[])
 class Baz extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.transformed.expect
index 38617da..b08a49b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
-  const constructor named(core::List<core::String> l) → void
+  const constructor named(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
 @self::Foo::•(const <dynamic>[])
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 @self::Foo::named(const <dynamic>[])
 class Baz extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super core::Object::•()
     ;
 }
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 6b3d243..459d870 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     ;
-  const constructor named(core::List<core::String> l) → void
+  const constructor named(core::List<core::String> l) → self::Foo
     ;
 }
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     ;
 }
 class Baz extends core::Object {
-  synthetic constructor •() → void
+  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 010338c..9ebf851 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,22 +3,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
-  const constructor named(core::List<core::String> l) → void
+  const constructor named(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
 @self::Foo::•(const <core::String>[])
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 @self::Foo::named(const <core::String>[])
 class Baz extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super core::Object::•()
     ;
 }
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 010338c..9ebf851 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,22 +3,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
-  const constructor named(core::List<core::String> l) → void
+  const constructor named(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
 @self::Foo::•(const <core::String>[])
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 @self::Foo::named(const <core::String>[])
 class Baz extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.expect
index 56934bc..7687ebe 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
@@ -11,7 +11,7 @@
   @self::Foo::•(const <dynamic>[])
   field dynamic x = null;
   @self::Foo::•(const <dynamic>[])
-  constructor •() → void
+  constructor •() → self::Bar
     : super core::Object::•()
     ;
   @self::Foo::•(const <dynamic>[])
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.transformed.expect
index 56934bc..7687ebe 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
@@ -11,7 +11,7 @@
   @self::Foo::•(const <dynamic>[])
   field dynamic x = null;
   @self::Foo::•(const <dynamic>[])
-  constructor •() → void
+  constructor •() → self::Bar
     : super core::Object::•()
     ;
   @self::Foo::•(const <dynamic>[])
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 692f1c1..b4da95f 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,12 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     ;
 }
 abstract class Bar extends core::Object {
   field dynamic x;
-  constructor •() → void
+  constructor •() → self::Bar
     ;
   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 32a28d4..242be1c 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
@@ -11,7 +11,7 @@
   @self::Foo::•(const <core::String>[])
   field dynamic x = null;
   @self::Foo::•(const <core::String>[])
-  constructor •() → void
+  constructor •() → self::Bar
     : super core::Object::•()
     ;
   @self::Foo::•(const <core::String>[])
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 32a28d4..242be1c 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
@@ -11,7 +11,7 @@
   @self::Foo::•(const <core::String>[])
   field dynamic x = null;
   @self::Foo::•(const <core::String>[])
-  constructor •() → void
+  constructor •() → self::Bar
     : super core::Object::•()
     ;
   @self::Foo::•(const <core::String>[])
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.expect
index c7a86c1..fef9dfe 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.transformed.expect
index c7a86c1..fef9dfe 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
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 ad9295e..30bd2d7 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,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     ;
 }
 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 e4d43d3..4136905 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
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 e4d43d3..4136905 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
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 ad9295e..30bd2d7 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,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     ;
 }
 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 70f1ea3..d5e20ee 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
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 70f1ea3..d5e20ee 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.expect
index a0385be..610a4e6 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(dynamic l) → void
+  const constructor •(dynamic l) → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.transformed.expect
index a0385be..610a4e6 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(dynamic l) → void
+  const constructor •(dynamic l) → self::Foo
     : super core::Object::•()
     ;
 }
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 1df9385..ee6307ed 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,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(dynamic l) → void
+  const constructor •(dynamic l) → self::Foo
     ;
 }
 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 eac77b2..8947a5f 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(dynamic l) → void
+  const constructor •(dynamic l) → self::Foo
     : super core::Object::•()
     ;
 }
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 eac77b2..8947a5f 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(dynamic l) → void
+  const constructor •(dynamic l) → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.expect
index 9d2c6e3..7a9bc053 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m(@self::Foo::•(const <dynamic>[]) dynamic x) → void {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.transformed.expect
index 9d2c6e3..7a9bc053 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m(@self::Foo::•(const <dynamic>[]) dynamic x) → void {}
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 573892a..308106e 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,11 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  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 7775e23..42e6f96 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,12 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m(@self::Foo::•(const <core::String>[]) dynamic x) → void {}
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 7775e23..42e6f96 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,12 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m(@self::Foo::•(const <core::String>[]) dynamic x) → void {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.expect
index 9163b9d..e33e87f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.transformed.expect
index 9163b9d..e33e87f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
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 ad9295e..30bd2d7 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,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     ;
 }
 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 90d59e7..502e69f 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
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 90d59e7..502e69f 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.expect
index 4ad6c42..0d71de2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.expect
@@ -4,17 +4,17 @@
 
 typedef F<T extends core::Object = dynamic> = () → void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   method m<T extends core::Object = dynamic>() → void {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.transformed.expect
index 4ad6c42..0d71de2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.transformed.expect
@@ -4,17 +4,17 @@
 
 typedef F<T extends core::Object = dynamic> = () → void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   method m<T extends core::Object = dynamic>() → void {}
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 bc221a6..a850d9b 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
@@ -4,15 +4,15 @@
 
 typedef F<T extends core::Object = dynamic> = () → void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     ;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method m<T extends core::Object = dynamic>() → void
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.expect
index d94bf7a..96c9a5c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.transformed.expect
index d94bf7a..96c9a5c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
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 ad9295e..30bd2d7 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,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     ;
 }
 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 657f6f6..a438561 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
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 657f6f6..a438561 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,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.expect
index b644cd1..96a26e4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.expect
@@ -5,7 +5,7 @@
 @self::Foo::•(const <dynamic>[])
 typedef F = () → void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.transformed.expect
index b644cd1..96a26e4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 @self::Foo::•(const <dynamic>[])
 typedef F = () → void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
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 ff720b7..bd6a29f 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
@@ -4,7 +4,7 @@
 
 typedef F = () → void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     ;
 }
 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 848f2f0..dfedff2 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
@@ -5,7 +5,7 @@
 @self::Foo::•(const <core::String>[])
 typedef F = () → void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
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 848f2f0..dfedff2 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
@@ -5,7 +5,7 @@
 @self::Foo::•(const <core::String>[])
 typedef F = () → void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → void
+  const constructor •(core::List<core::String> l) → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.expect
index 93b9a23..d64cebd 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.expect
@@ -5,10 +5,10 @@
 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]]) → void
+  constructor •([core::List<core::int> x = const <dynamic>[1]]) → self::Foo
     : self::Foo::x = x, super core::Object::•()
     ;
-  constructor named([core::List<core::int> x = const <dynamic>[1]]) → void
+  constructor named([core::List<core::int> x = const <dynamic>[1]]) → self::Foo
     : self::Foo::x = null, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.transformed.expect
index 93b9a23..d64cebd 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.transformed.expect
@@ -5,10 +5,10 @@
 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]]) → void
+  constructor •([core::List<core::int> x = const <dynamic>[1]]) → self::Foo
     : self::Foo::x = x, super core::Object::•()
     ;
-  constructor named([core::List<core::int> x = const <dynamic>[1]]) → void
+  constructor named([core::List<core::int> x = const <dynamic>[1]]) → self::Foo
     : self::Foo::x = null, super core::Object::•()
     ;
 }
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 40bcf29..a211ade 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
@@ -5,10 +5,10 @@
 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]]) → void
+  constructor •([core::List<core::int> x = const <core::int>[1]]) → self::Foo
     : self::Foo::x = x, super core::Object::•()
     ;
-  constructor named([core::List<core::int> x = const <core::int>[1]]) → void
+  constructor named([core::List<core::int> x = const <core::int>[1]]) → self::Foo
     : self::Foo::x = null, super core::Object::•()
     ;
 }
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 40bcf29..a211ade 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
@@ -5,10 +5,10 @@
 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]]) → void
+  constructor •([core::List<core::int> x = const <core::int>[1]]) → self::Foo
     : self::Foo::x = x, super core::Object::•()
     ;
-  constructor named([core::List<core::int> x = const <core::int>[1]]) → void
+  constructor named([core::List<core::int> x = const <core::int>[1]]) → self::Foo
     : self::Foo::x = null, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.expect
index bd69c63..b6183be 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B<core::int> b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → void
+  constructor •(self::B::T x) → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.transformed.expect
index bd69c63..b6183be 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B<core::int> b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → void
+  constructor •(self::B::T x) → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
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 6c7e70c..d63d15a 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
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B<core::int> b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → void
+  constructor •(self::B::T x) → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
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 8227e66..dbeb264 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
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B<core::int> b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → void
+  constructor •(self::B::T x) → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.expect
index 771832d..a8ecab3 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::A::T x) → void
+  constructor •(self::A::T x) → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
index 771832d..a8ecab3 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::A::T x) → void
+  constructor •(self::A::T x) → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 f9d3fb9..6216a0d 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::A::T x) → void
+  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 c52cb1b..ec108ae 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::A::T x) → void
+  constructor •(self::A::T x) → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 c52cb1b..ec108ae 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::A::T x) → void
+  constructor •(self::A::T x) → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.expect
index 58dbf9c..2c7378c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class F0 extends core::Object {
-  constructor •(core::List<core::int> a) → void
+  constructor •(core::List<core::int> a) → self::F0
     : super core::Object::•() {}
 }
 class F1 extends core::Object {
-  constructor •({core::List<core::int> a = null}) → void
+  constructor •({core::List<core::int> a = null}) → self::F1
     : super core::Object::•() {}
 }
 class F2 extends core::Object {
-  constructor •(core::Iterable<core::int> a) → void
+  constructor •(core::Iterable<core::int> a) → self::F2
     : super core::Object::•() {}
 }
 class F3 extends core::Object {
-  constructor •(core::Iterable<core::Iterable<core::int>> a) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<core::int>> a = null}) → self::F4
     : super core::Object::•() {}
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.transformed.expect
index 58dbf9c..2c7378c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class F0 extends core::Object {
-  constructor •(core::List<core::int> a) → void
+  constructor •(core::List<core::int> a) → self::F0
     : super core::Object::•() {}
 }
 class F1 extends core::Object {
-  constructor •({core::List<core::int> a = null}) → void
+  constructor •({core::List<core::int> a = null}) → self::F1
     : super core::Object::•() {}
 }
 class F2 extends core::Object {
-  constructor •(core::Iterable<core::int> a) → void
+  constructor •(core::Iterable<core::int> a) → self::F2
     : super core::Object::•() {}
 }
 class F3 extends core::Object {
-  constructor •(core::Iterable<core::Iterable<core::int>> a) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<core::int>> a = null}) → self::F4
     : super core::Object::•() {}
 }
 static method test() → void {
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 f2e2c5c..5216da9 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
@@ -55,23 +55,23 @@
 import "dart:core" as core;
 
 class F0 extends core::Object {
-  constructor •(core::List<core::int> a) → void
+  constructor •(core::List<core::int> a) → self::F0
     : super core::Object::•() {}
 }
 class F1 extends core::Object {
-  constructor •({core::List<core::int> a = null}) → void
+  constructor •({core::List<core::int> a = null}) → self::F1
     : super core::Object::•() {}
 }
 class F2 extends core::Object {
-  constructor •(core::Iterable<core::int> a) → void
+  constructor •(core::Iterable<core::int> a) → self::F2
     : super core::Object::•() {}
 }
 class F3 extends core::Object {
-  constructor •(core::Iterable<core::Iterable<core::int>> a) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<core::int>> a = null}) → self::F4
     : super core::Object::•() {}
 }
 static method test() → void {
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 9e6ac81..37f1cb7 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
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class F0 extends core::Object {
-  constructor •(core::List<core::int> a) → void
+  constructor •(core::List<core::int> a) → self::F0
     : super core::Object::•() {}
 }
 class F1 extends core::Object {
-  constructor •({core::List<core::int> a = null}) → void
+  constructor •({core::List<core::int> a = null}) → self::F1
     : super core::Object::•() {}
 }
 class F2 extends core::Object {
-  constructor •(core::Iterable<core::int> a) → void
+  constructor •(core::Iterable<core::int> a) → self::F2
     : super core::Object::•() {}
 }
 class F3 extends core::Object {
-  constructor •(core::Iterable<core::Iterable<core::int>> a) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<core::int>> a = null}) → self::F4
     : super core::Object::•() {}
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.expect
index 8e6cf96..b53e773 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class F3<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
     : super core::Object::•() {}
 }
 static method main() → void {
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.transformed.expect
index 8e6cf96..b53e773 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class F3<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
     : super core::Object::•() {}
 }
 static method main() → void {
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 3cb6605..925d667 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class F3<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
     : super core::Object::•() {}
 }
 static method main() → void {
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 3cb6605..925d667 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class F3<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
     : super core::Object::•() {}
 }
 static method main() → void {
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.expect
index 6ee04ff..9af9d65 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class F0<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::F0::T> a) → void
+  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}) → void
+  constructor •({core::List<self::F1::T> a = null}) → 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) → void
+  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) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
     : super core::Object::•() {}
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.transformed.expect
index 6ee04ff..9af9d65 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class F0<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::F0::T> a) → void
+  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}) → void
+  constructor •({core::List<self::F1::T> a = null}) → 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) → void
+  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) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
     : super core::Object::•() {}
 }
 static method test() → void {
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 bc0d5a9..f17e324 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
@@ -55,23 +55,23 @@
 import "dart:core" as core;
 
 class F0<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::F0::T> a) → void
+  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}) → void
+  constructor •({core::List<self::F1::T> a = null}) → 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) → void
+  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) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
     : super core::Object::•() {}
 }
 static method test() → void {
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 1e39c77..98b578f 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
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class F0<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::List<self::F0::T> a) → void
+  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}) → void
+  constructor •({core::List<self::F1::T> a = null}) → 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) → void
+  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) → void
+  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}) → void
+  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
     : super core::Object::•() {}
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.expect
index 2f9e241..c462d74 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.expect
@@ -5,47 +5,47 @@
 class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
   field self::A::S x;
   field self::A::T y;
-  constructor •(self::A::S x, self::A::T y) → void
+  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) → void
+  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) → void
+  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) → void
+  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) → void
+  constructor •(self::C::S a) → self::C<self::C::S>
     : super self::B::•(a, a)
     ;
-  constructor named(self::C::S a) → void
+  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) → void
+  constructor •(self::D::T a) → self::D<self::D::S, self::D::T>
     : super self::B::•(a, 3)
     ;
-  constructor named(self::D::T a) → void
+  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) → void
+  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}) → void
+  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>
     : 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]) → void
+  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>
     : super self::A::•(a, b)
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.transformed.expect
index 2f9e241..c462d74 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.transformed.expect
@@ -5,47 +5,47 @@
 class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
   field self::A::S x;
   field self::A::T y;
-  constructor •(self::A::S x, self::A::T y) → void
+  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) → void
+  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) → void
+  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) → void
+  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) → void
+  constructor •(self::C::S a) → self::C<self::C::S>
     : super self::B::•(a, a)
     ;
-  constructor named(self::C::S a) → void
+  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) → void
+  constructor •(self::D::T a) → self::D<self::D::S, self::D::T>
     : super self::B::•(a, 3)
     ;
-  constructor named(self::D::T a) → void
+  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) → void
+  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}) → void
+  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>
     : 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]) → void
+  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>
     : super self::A::•(a, b)
     ;
 }
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 5c41272..5120a62 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
@@ -132,47 +132,47 @@
 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) → void
+  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) → void
+  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) → void
+  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) → void
+  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) → void
+  constructor •(self::C::S a) → self::C<self::C::S>
     : super self::B::•(a, a)
     ;
-  constructor named(self::C::S a) → void
+  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) → void
+  constructor •(self::D::T a) → self::D<self::D::S, self::D::T>
     : super self::B::•(a, 3)
     ;
-  constructor named(self::D::T a) → void
+  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) → void
+  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}) → void
+  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>
     : 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]) → void
+  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>
     : super self::A::•(a, b)
     ;
 }
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 9f54e17..7b39416 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
@@ -5,47 +5,47 @@
 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) → void
+  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) → void
+  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) → void
+  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) → void
+  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) → void
+  constructor •(self::C::S a) → self::C<self::C::S>
     : super self::B::•(a, a)
     ;
-  constructor named(self::C::S a) → void
+  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) → void
+  constructor •(self::D::T a) → self::D<self::D::S, self::D::T>
     : super self::B::•(a, 3)
     ;
-  constructor named(self::D::T a) → void
+  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) → void
+  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}) → void
+  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>
     : 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]) → void
+  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>
     : super self::A::•(a, b)
     ;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.expect
index c243444..dd7f148 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.expect
@@ -5,14 +5,14 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static get assertCOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void
@@ -28,7 +28,7 @@
 }
 abstract class G<T extends core::Object = dynamic> extends core::Object {
   field (core::List<(self::DartType) → void>) → (self::DartType) → void assertAOf = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G<self::G::T>
     : super core::Object::•()
     ;
   abstract get assertDOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.transformed.expect
index c243444..dd7f148 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.transformed.expect
@@ -5,14 +5,14 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static get assertCOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void
@@ -28,7 +28,7 @@
 }
 abstract class G<T extends core::Object = dynamic> extends core::Object {
   field (core::List<(self::DartType) → void>) → (self::DartType) → void assertAOf = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G<self::G::T>
     : super core::Object::•()
     ;
   abstract get assertDOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void;
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 de41535..831cc39 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
@@ -5,14 +5,14 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static get assertCOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void
@@ -28,7 +28,7 @@
 }
 abstract class G<T extends core::Object = dynamic> extends core::Object {
   field (core::List<(self::DartType) → void>) → (self::DartType) → void assertAOf = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G<self::G::T>
     : super core::Object::•()
     ;
   abstract get assertDOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void;
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 de41535..831cc39 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
@@ -5,14 +5,14 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static get assertCOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void
@@ -28,7 +28,7 @@
 }
 abstract class G<T extends core::Object = dynamic> extends core::Object {
   field (core::List<(self::DartType) → void>) → (self::DartType) → void assertAOf = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G<self::G::T>
     : super core::Object::•()
     ;
   abstract get assertDOf() → (core::List<(self::DartType) → void>) → (self::DartType) → void;
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.direct.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.direct.expect
index d6018e5..9a43ee8 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method foo(core::int x) → core::int
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.direct.transformed.expect
index d6018e5..9a43ee8 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method foo(core::int x) → core::int
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 7ae4070..98fb899 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
   method foo(core::int x) → core::int
     ;
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 d424341..0af7ce5 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method foo(core::int x) → core::int
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 3d83647..53e0e8d 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method foo(core::int x) → core::int
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.expect
index 01196f3..d0d0305 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.transformed.expect
index 01196f3..d0d0305 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
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 1a319e3..cd397c0 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     ;
 }
 static method f<T extends core::Object = dynamic>() → self::f::T
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 ebfd78a..f6900f6 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<core::int>(), super core::Object::•()
     ;
 }
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 ebfd78a..f6900f6 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<core::int>(), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.expect
index 9057cb2..d1361ce 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class C extends core::Object implements self::B {
   final field dynamic x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → core::int;
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.transformed.expect
index 9057cb2..d1361ce 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class C extends core::Object implements self::B {
   final field dynamic x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → core::int;
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 a7c7685..e84a002 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
@@ -4,11 +4,11 @@
 
 class C extends core::Object implements self::B {
   final field dynamic x;
-  constructor •() → void
+  constructor •() → self::C
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract get x() → core::int;
 }
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 e060b43..7aed82a 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
@@ -4,12 +4,12 @@
 
 class C extends core::Object implements self::B {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<core::int>(), super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → core::int;
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 e060b43..7aed82a 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
@@ -4,12 +4,12 @@
 
 class C extends core::Object implements self::B {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<core::int>(), super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → core::int;
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.expect
index 01196f3..d0d0305 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.transformed.expect
index 01196f3..d0d0305 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
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 1a319e3..cd397c0 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     ;
 }
 static method f<T extends core::Object = dynamic>() → self::f::T
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 ebfd78a..f6900f6 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<core::int>(), super core::Object::•()
     ;
 }
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 ebfd78a..f6900f6 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x;
-  constructor •() → void
+  constructor •() → self::C
     : self::C::x = self::f<core::int>(), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.expect
index f3969cb..c44f390 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → void
+  constructor •(core::int p) → self::C
     : self::C::x = self::f<dynamic>(p), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.transformed.expect
index f3969cb..c44f390 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → void
+  constructor •(core::int p) → self::C
     : self::C::x = self::f<dynamic>(p), super core::Object::•()
     ;
 }
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 a19f31b..8afecf1 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,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → void
+  constructor •(core::int p) → self::C
     ;
 }
 static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
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 e0950da..ba559bd 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,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → void
+  constructor •(core::int p) → self::C
     : self::C::x = self::f<core::int>(p), super core::Object::•()
     ;
 }
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 e0950da..ba559bd 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,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → void
+  constructor •(core::int p) → self::C
     : self::C::x = self::f<core::int>(p), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.expect b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.expect
index a520339..fc3e684 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x = self::C::_x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static get _x() → core::int
diff --git a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.transformed.expect
index a520339..fc3e684 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x = self::C::_x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static get _x() → core::int
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 00d0f7e..19b6413 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x = self::C::_x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static get _x() → core::int
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 00d0f7e..19b6413 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x = self::C::_x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static get _x() → core::int
diff --git a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.expect b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.expect
index c0d8691..2703900 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x = self::y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.transformed.expect
index c0d8691..2703900 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x = self::y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 284721c..c393636 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x = self::y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 284721c..c393636 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field core::int x = self::y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/future_then.dart.direct.expect b/pkg/front_end/testcases/inference/future_then.dart.direct.expect
index 44f0631..cfd8dd1 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
index f27ed38..03c48f1 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 3865b48..9dafc68 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.strong.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 8b41d75..825398c 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect
index f756aa6..0562f3d 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
index 20ee8d1..1cc8a8e 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 e596eb7..953c503 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 7927f17..cb1a4a6 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect
index 3055eeb..0c40e13 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
index c6d3766..8cd5c68 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 8ccd2b2..a1acdca 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 775141b..b4751a9 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect
index ea9288e..548c657 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
index 8f4e8ca..d40ae51 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 51169ac..662a7ba 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 dacc8a3..3f092a7 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect
index c36c9cb..7a57c7c 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
index a617678..23e837c 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 4da5a6e..39c10f6 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 b1614ca..47d5575 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect
index 5bf638a..8154732 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
index 925090f..dae1e9c 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 51ead0d..1618804 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 a13a479..8472b47 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect
index acb4972..855c641 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
index d719f9c..ba20264 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 00aa8c3..fdccecc 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 b5a19f3..cfd6b66 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect
index 183c863..fa75da0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
index 083fe97..657b8b4 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 dc09b6ed..1931fb0 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 b0dbd8f..7eb72e5 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect
index a07382c..39a96fa 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
index b30a646..54f4fa3 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 ee71917..35cb9ed 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 e855e8b..3331857 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect
index 7e64461..c9c25f1 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
index 17b81d3..8fb6e84 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 2a51ccc..6b63e40 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 b567ae6..139c97a 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect
index c6a744d..58758f0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
index ab4a584..2f89209 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 e9f502a..4133c8f 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 5bd9628..bd14f16 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect
index 0615459..dc495b1 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
index 70cb5cb..64afa1c 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 4a1b6d5..5845323 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 03e6d37..1000fe0 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect
index 86006fe..3974383 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
index 35c1205..7058eae 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b0fa0d6..9215c9e 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 7b7ff73..1afa5aa 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 c1cd7d1..a3ab9d0 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect
index 408a87b..e299b22 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect
index 408a87b..e299b22 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 2b9a12e..39c6654 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 c8c5654..ec22073 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
@@ -11,9 +11,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 cb35f21..d32175c 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect
index 6d6d090..3ae9246 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect
index 6d6d090..3ae9246 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 2b9a12e..39c6654 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 8c60a46..be1ed22 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
@@ -11,9 +11,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 9f06517..4cd8622 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect
index fab1bd1..f16597f 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect
index fab1bd1..f16597f 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 b369931..d220b5d 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 64a5480..fbb110e 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
@@ -11,9 +11,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 dbc1f64..7cf0b1c 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → void
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect
index 73eda84..c3b32e1 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(dynamic x) → void
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
index d241179..189e6d1 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(dynamic x) → void
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 67eb302..94398e9 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(dynamic x) → void
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 9c411e0..52ada11 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(dynamic x) → void
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 7e67e3e..f45920f 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(dynamic x) → void
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect
index 5813341..9d69fdf 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(dynamic x) → void
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
index 22664e5..b6ba5d5 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(dynamic x) → void
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 67eb302..94398e9 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value(dynamic x) → void
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 009b806..7f53671 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(dynamic x) → void
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 2364ba5..b2fa7ea 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value(dynamic x) → void
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect
index 06bf63e..10ef430 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
index 4679555..b44f1b5 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 e0c10ee..e3920ef 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value([dynamic x]) → void
+  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 dade3e7..55da4f8 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
@@ -11,9 +11,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 f9f9cc1..f3bccc5 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect
index df02c93..5e8dad7e 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
index ffc06b6..761ce57 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 e0c10ee..e3920ef 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value([dynamic x]) → void
+  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 f004a8c..9c03551 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 a28d6f1..87ce379 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect
index 02133a2..cd608cc 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
index 79133de..2a4b758 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 46b6924..f0aa066 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value([dynamic x]) → void
+  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 5b56228..76241fa 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
@@ -11,9 +11,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 7ee244a..ef7b284 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect
index 4959b52..d34e608 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
index 46d0456..a207d39 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(dynamic invocation) → dynamic
     return null;
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 46b6924..f0aa066 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     ;
-  constructor value([dynamic x]) → void
+  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T>
     ;
   method noSuchMethod(dynamic invocation) → dynamic
     ;
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 79238fb..db12040 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
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 df0ef2e..0100e34 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
@@ -4,9 +4,9 @@
 import "dart:async" as asy;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → void
+  constructor •() → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
-  constructor value([dynamic x = null]) → void
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
     : super core::Object::•() {}
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.expect
index 98a18c5..cf2b682 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
index 89b8af9..58c7e21 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 5c21b43..eef0789 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 0b7e49c..2d452ee 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
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 1bc6ed6..dd2c304 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
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.expect
index a5cecb5..3259450 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.expect
@@ -4,17 +4,17 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
index 7bc149c..a8cd981 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
@@ -4,17 +4,17 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
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 fbafd9f..4d89361 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
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends self::A {
-  synthetic constructor •() → void
+  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 f804a74..56ab63d 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
@@ -4,17 +4,17 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
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 e202cf1..160256c 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
@@ -4,17 +4,17 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
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 74cc102..1b93d99 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo<T extends core::Pattern = core::Pattern> extends core::Object {
-  synthetic constructor •() → void
+  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
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 5d38e23..5ce58e8 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
@@ -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.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 import 'dart:math';
@@ -21,23 +21,22 @@
   printDouble(/*@typeArgs=double*/ min(1.0, 2.0));
 
   // No help for user-defined functions from num->num->num.
-  printInt(/*info:DOWN_CAST_IMPLICIT*/ myMax(1, 2));
+  printInt(myMax(1, 2));
   printInt(myMax(1, 2) as int);
 
-  // Mixing int and double means return type is num.
   printInt(
-      /*@typeArgs=int*/ max(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
+      /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
   printInt(
-      /*@typeArgs=int*/ min(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
+      /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
   printDouble(
-      /*@typeArgs=double*/ max(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
+      /*@typeArgs=double*/ max(1, 2.0));
   printDouble(
-      /*@typeArgs=double*/ min(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
+      /*@typeArgs=double*/ min(1, 2.0));
 
   // Types other than int and double are not accepted.
   printInt(/*@typeArgs=int*/ min(
-      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hi",
-      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "there"));
+      /*@error=ArgumentTypeNotAssignable*/ "hi",
+      /*@error=ArgumentTypeNotAssignable*/ "there"));
 }
 
 main() {}
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 107dc5a3..5191245 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
@@ -1,34 +1,24 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:29:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
 // Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-//       /*@typeArgs=int*/ max(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
-//                                                                       ^
+//       /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
+//                                                                     ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:31:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
 // Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-//       /*@typeArgs=int*/ min(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
-//                                                                       ^
+//       /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
+//                                                                     ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:33:71: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::double'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::double'.
-//       /*@typeArgs=double*/ max(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
-//                                                                       ^
-//
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:35:71: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::double'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::double'.
-//       /*@typeArgs=double*/ min(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
-//                                                                       ^
-//
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
 // Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-//       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hi",
-//                                              ^
+//       /*@error=ArgumentTypeNotAssignable*/ "hi",
+//                                            ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:40:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
 // Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-//       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "there"));
-//                                              ^
+//       /*@error=ArgumentTypeNotAssignable*/ "there"));
+//                                            ^
 
 library test;
 import self as self;
@@ -48,28 +38,22 @@
   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 dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:29:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
+  self::printInt(math::max<core::int>(1, let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
 Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-      /*@typeArgs=int*/ max(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
-                                                                      ^" in let final dynamic #t2 = 2.0 in null));
-  self::printInt(math::min<core::int>(1, let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:31:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
+      /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
+                                                                    ^" in let final dynamic #t2 = 2.0 in null));
+  self::printInt(math::min<core::int>(1, let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
 Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-      /*@typeArgs=int*/ min(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
-                                                                      ^" in let final dynamic #t4 = 2.0 in null));
-  self::printDouble(math::max<core::double>(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:33:71: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::double'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::double'.
-      /*@typeArgs=double*/ max(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
-                                                                      ^" in let final dynamic #t6 = 1 in null, 2.0));
-  self::printDouble(math::min<core::double>(let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:35:71: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::double'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::double'.
-      /*@typeArgs=double*/ min(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
-                                                                      ^" in let final dynamic #t8 = 1 in null, 2.0));
-  self::printInt(math::min<core::int>(let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+      /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
+                                                                    ^" in let final dynamic #t4 = 2.0 in null));
+  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 dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
 Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hi\",
-                                             ^" in let final dynamic #t10 = "hi" in null, let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:40:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+      /*@error=ArgumentTypeNotAssignable*/ \"hi\",
+                                           ^" in let final dynamic #t6 = "hi" in null, let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
 Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"there\"));
-                                             ^" in let final dynamic #t12 = "there" in null));
+      /*@error=ArgumentTypeNotAssignable*/ \"there\"));
+                                           ^" in let final dynamic #t8 = "there" in null));
 }
 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 a006e9e..a4fa81e 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
@@ -16,28 +16,22 @@
   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<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:29:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
+  self::printInt(math::max<core::int>(1, let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
 Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-      /*@typeArgs=int*/ max(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
-                                                                      ^" in let final core::double #t2 = 2.0 in null));
-  self::printInt(math::min<core::int>(1, let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:31:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
+      /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
+                                                                    ^" in let final core::double #t2 = 2.0 in null));
+  self::printInt(math::min<core::int>(1, let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
 Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-      /*@typeArgs=int*/ min(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
-                                                                      ^" in let final core::double #t4 = 2.0 in null));
-  self::printDouble(math::max<core::double>(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:33:71: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::double'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::double'.
-      /*@typeArgs=double*/ max(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
-                                                                      ^" in let final core::int #t6 = 1 in null, 2.0));
-  self::printDouble(math::min<core::double>(let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:35:71: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::double'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::double'.
-      /*@typeArgs=double*/ min(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
-                                                                      ^" in let final core::int #t8 = 1 in null, 2.0));
-  self::printInt(math::min<core::int>(let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+      /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
+                                                                    ^" in let final core::double #t4 = 2.0 in null));
+  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<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
 Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hi\",
-                                             ^" in let final core::String #t10 = "hi" in null, let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:40:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
+      /*@error=ArgumentTypeNotAssignable*/ \"hi\",
+                                           ^" in let final core::String #t6 = "hi" in null, let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
 Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
-      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"there\"));
-                                             ^" in let final core::String #t12 = "there" in null));
+      /*@error=ArgumentTypeNotAssignable*/ \"there\"));
+                                           ^" in let final core::String #t8 = "there" in null));
 }
 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 a521d4f..cc08449 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
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
 // /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
 //                                                                ^
-// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Error: This is the overridden method ('m').
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: This is the overridden method ('m').
 //   T m<T>(T x) => x;
 //     ^
 //
@@ -11,7 +11,7 @@
 // Change to a subtype of test::C::m::T.
 // /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
 //                                                                ^
-// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Error: This is the overridden method ('m').
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: This is the overridden method ('m').
 //   T m<T>(T x) => x;
 //     ^
 //
@@ -39,14 +39,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method m(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect
index b77c625..d819cdc 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect
@@ -3,14 +3,14 @@
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Warning: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
 //   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
 //                                              ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Warning: This is the overridden method ('m').
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Context: This is the overridden method ('m').
 //   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
 //                        ^
 //
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Warning: Declared type variables of 'D::g' doesn't match those on overridden method 'C::g'.
 //   T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
 //                                              ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Warning: This is the overridden method ('g').
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
 //   dynamic g(int x) => x;
 //           ^
 
@@ -19,7 +19,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m(dynamic x) → dynamic
@@ -28,7 +28,7 @@
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method m<T extends core::Object = dynamic>(self::D::m::T x) → self::D::m::T
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.transformed.expect
index f688995..9cd9ef8 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m(dynamic x) → dynamic
@@ -12,7 +12,7 @@
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method m<T extends core::Object = dynamic>(self::D::m::T x) → self::D::m::T
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 c5fed39..a010490 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
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
 //   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
 //                                              ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Error: This is the overridden method ('m').
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Context: This is the overridden method ('m').
 //   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
 //                        ^
 //
@@ -11,14 +11,14 @@
 // Change to a supertype of dynamic (or, for a covariant parameter, a subtype).
 //           T /*@error=OverrideTypeMismatchParameter*/ x) =>
 //                                                      ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Error: This is the overridden method ('m').
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Context: This is the overridden method ('m').
 //   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
 //                        ^
 //
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Error: Declared type variables of 'D::g' doesn't match those on overridden method 'C::g'.
 //   T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
 //                                              ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Error: This is the overridden method ('g').
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
 //   dynamic g(int x) => x;
 //           ^
 //
@@ -26,7 +26,7 @@
 // Change to a supertype of dart.core::int (or, for a covariant parameter, a subtype).
 //           T /*@error=OverrideTypeMismatchParameter*/ x) =>
 //                                                      ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Error: This is the overridden method ('g').
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
 //   dynamic g(int x) => x;
 //           ^
 
@@ -55,7 +55,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m(dynamic x) → dynamic
@@ -64,7 +64,7 @@
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method m<T extends core::Object = dynamic>(self::D::m::T x) → self::D::m::T
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.expect
index 0f57adc..1f86d32 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.expect
@@ -4,13 +4,13 @@
 
 typedef F<V extends core::Object = dynamic> = (V) → void;
 class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(dynamic x) → dynamic {}
 }
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.transformed.expect
index 0f57adc..1f86d32 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.transformed.expect
@@ -4,13 +4,13 @@
 
 typedef F<V extends core::Object = dynamic> = (V) → void;
 class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(dynamic x) → dynamic {}
 }
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
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 9e57aaf..b9c4222 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
@@ -4,13 +4,13 @@
 
 typedef F<V extends core::Object = dynamic> = (V) → void;
 class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(self::C::f::U x) → (self::C::f::U) → void {}
 }
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
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 9e57aaf..b9c4222 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
@@ -4,13 +4,13 @@
 
 typedef F<V extends core::Object = dynamic> = (V) → void;
 class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(self::C::f::U x) → (self::C::f::U) → void {}
 }
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.expect
index 17d6815..08648c6 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.expect
@@ -4,14 +4,14 @@
 
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(dynamic g) → dynamic
     return null;
 }
 abstract class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.transformed.expect
index 17d6815..08648c6 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.transformed.expect
@@ -4,14 +4,14 @@
 
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(dynamic g) → dynamic
     return null;
 }
 abstract class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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;
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 d201593..c1d63d6 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
@@ -4,14 +4,14 @@
 
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(() → core::List<self::C::f::U> g) → void
     return null;
 }
 abstract class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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;
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 d201593..c1d63d6 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
@@ -4,14 +4,14 @@
 
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(() → core::List<self::C::f::U> g) → void
     return null;
 }
 abstract class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.expect
index 4b020dd..57033a4 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.expect
@@ -4,13 +4,13 @@
 
 typedef F<V extends core::Object = dynamic> = () → V;
 class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(dynamic x) → dynamic {}
 }
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.transformed.expect
index 4b020dd..57033a4 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.transformed.expect
@@ -4,13 +4,13 @@
 
 typedef F<V extends core::Object = dynamic> = () → V;
 class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(dynamic x) → dynamic {}
 }
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
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 53feefd..c9c76f5 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
@@ -4,13 +4,13 @@
 
 typedef F<V extends core::Object = dynamic> = () → V;
 class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(self::C::f::U x) → () → self::C::f::U {}
 }
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
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 53feefd..c9c76f5 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
@@ -4,13 +4,13 @@
 
 typedef F<V extends core::Object = dynamic> = () → V;
 class C<T extends core::Object = dynamic> extends self::D<self::C::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::D::•()
     ;
   method f<U extends core::Object = dynamic>(self::C::f::U x) → () → self::C::f::U {}
 }
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.expect
index 5f8ac38..b797686 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.expect
@@ -4,7 +4,7 @@
 import "dart:math" as math;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.transformed.expect
index 5f8ac38..b797686 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:math" as math;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
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 fe2ca89..635109b 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
@@ -36,7 +36,7 @@
 import "dart:math" as math;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
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 3d46d45..cd564cf 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
@@ -4,7 +4,7 @@
 import "dart:math" as math;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.expect
index 65e0f43..29528fb 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method m<S extends core::Object = dynamic>(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.transformed.expect
index 65e0f43..29528fb 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method m<S extends core::Object = dynamic>(dynamic x) → dynamic
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 b58c879..6641267 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method m<S extends core::Object = dynamic>(self::D::m::S x) → self::D::m::S
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 b58c879..6641267 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method m<S extends core::Object = dynamic>(self::D::m::S x) → self::D::m::S
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 1c5bf35..da47f03 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
@@ -5,13 +5,13 @@
 
 class Trace extends core::Object {
   field core::List<self::Frame> frames = <self::Frame>[];
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Trace
     : super core::Object::•()
     ;
 }
 class Frame extends core::Object {
   field core::String location = "";
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Frame
     : super core::Object::•()
     ;
 }
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 1c5bf35..da47f03 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
@@ -5,13 +5,13 @@
 
 class Trace extends core::Object {
   field core::List<self::Frame> frames = <self::Frame>[];
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Trace
     : super core::Object::•()
     ;
 }
 class Frame extends core::Object {
   field core::String location = "";
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Frame
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.expect
index bf38d28..690aad1 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class C<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::E>
     : super core::Object::•()
     ;
   method sort([(self::C::E, self::C::E) → core::int compare = null]) → void {
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.transformed.expect
index bf38d28..690aad1 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class C<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::E>
     : super core::Object::•()
     ;
   method sort([(self::C::E, self::C::E) → core::int compare = null]) → void {
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 dcee7af..2205855 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class C<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::E>
     ;
   method sort([(self::C::E, self::C::E) → core::int compare]) → void
     ;
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 12798a4..69d3ccf 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class C<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::E>
     : super core::Object::•()
     ;
   method sort([(self::C::E, self::C::E) → core::int compare = null]) → void {
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 12798a4..69d3ccf 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class C<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::E>
     : super core::Object::•()
     ;
   method sort([(self::C::E, self::C::E) → core::int compare = null]) → void {
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.expect
index a69e1d2..b9f3f55 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   operator []=(dynamic index, dynamic value) → dynamic {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.transformed.expect
index a69e1d2..b9f3f55 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   operator []=(dynamic index, dynamic value) → dynamic {}
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 77a8eb9..431131a 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 •() → void
+  synthetic constructor •() → self::C
     ;
   operator []=(dynamic index, dynamic value) → dynamic
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   operator []=(dynamic index, dynamic value) → void
     ;
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   operator []=(dynamic index, dynamic value) → dynamic
     ;
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 bc47488..ba7aef9 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  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 bc47488..ba7aef9 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  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.direct.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.direct.expect
index 1394b9b..5ffc002 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator []=(core::int index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator []=(core::int index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   operator []=(core::int index, dynamic value) → dynamic {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.direct.transformed.expect
index 1394b9b..5ffc002 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator []=(core::int index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator []=(core::int index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   operator []=(core::int index, dynamic value) → 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 d841119..e1dc0dc 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,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   operator []=(core::int index, dynamic value) → dynamic
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   operator []=(core::int index, dynamic value) → void
     ;
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   operator []=(core::int index, dynamic value) → 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 d1c866b..587faf3 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,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator []=(core::int index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator []=(core::int index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   operator []=(core::int index, dynamic value) → void {}
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 d1c866b..587faf3 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,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator []=(core::int index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator []=(core::int index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   operator []=(core::int index, dynamic value) → void {}
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.expect
index 0b3aca2..f09f568 100644
--- a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.transformed.expect
index 0b3aca2..f09f568 100644
--- a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  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 •() → void
+  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 bf668f7..1e5b585 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 •() → void
+  synthetic constructor •() → self::A
     ;
   get x() → dynamic
     ;
@@ -12,7 +12,7 @@
 }
 class B extends core::Object {
   field dynamic x;
-  synthetic constructor •() → void
+  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 adb834a..4ab5075 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get x() → core::int
@@ -12,7 +12,7 @@
 }
 class B extends core::Object {
   field core::int x = 0;
-  synthetic constructor •() → void
+  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 adb834a..4ab5075 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get x() → core::int
@@ -12,7 +12,7 @@
 }
 class B extends core::Object {
   field core::int x = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.expect
index c5a8995..a0aab3a 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.transformed.expect
index c5a8995..a0aab3a 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   method test() → void {
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 ca2db03..6ffdc2b 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,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -19,12 +19,12 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Test extends core::Object {
   field self::B member;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   method test() → void
     ;
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 06514fa..84f6b47 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   method test() → void {
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 06514fa..84f6b47 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.expect
index 8a46541..41103fb 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   method test() → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   method test() → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   method test3() → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect
index 8a46541..41103fb 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   method test() → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   method test() → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   method test3() → void {
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 49618ca..865d1dd 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
@@ -4,21 +4,21 @@
 
 class Test1 extends core::Object {
   field core::int t;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     ;
   method test() → void
     ;
 }
 class Test2 extends core::Object {
   field core::num t;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     ;
   method test() → void
     ;
 }
 class Test3 extends core::Object {
   field core::double t;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     ;
   method test3() → void
     ;
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 dd244e6..6316d7b 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   method test() → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   method test() → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   method test3() → void {
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 dd244e6..6316d7b 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   method test() → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   method test() → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   method test3() → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.expect
index a8ccc13..9411634 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.transformed.expect
index a8ccc13..9411634 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
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 8286554..b6e46f4 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,15 +3,15 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -23,11 +23,11 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   operator [](self::Index i) → self::B
     ;
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 62bd534..6dd75dd7 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
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 62bd534..6dd75dd7 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.expect
index ed16eaa..9e45673 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
@@ -39,7 +39,7 @@
   operator []=(self::Index i, self::B v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.transformed.expect
index ed16eaa..9e45673 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
@@ -39,7 +39,7 @@
   operator []=(self::Index i, self::B v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
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 1d2a695..35db856 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,15 +3,15 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -23,11 +23,11 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     ;
   operator [](self::Index i) → self::B
     ;
@@ -35,7 +35,7 @@
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   method test() → void
     ;
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 6b4c7fe..bf2a14d 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
@@ -39,7 +39,7 @@
   operator []=(self::Index i, self::B v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
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 6b4c7fe..bf2a14d 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
@@ -39,7 +39,7 @@
   operator []=(self::Index i, self::B v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.expect
index ac3de09..d1af2b7 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.transformed.expect
index ac3de09..d1af2b7 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
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 8286554..b6e46f4 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,15 +3,15 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -23,11 +23,11 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   operator [](self::Index i) → self::B
     ;
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 81add7c..9cc4643 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
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 81add7c..9cc4643 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.expect
index e94bc2f..5540464 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,7 +21,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.transformed.expect
index e94bc2f..5540464 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,7 +21,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 7db001d..59620a1 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,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -19,7 +19,7 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static method f<T extends core::Object = dynamic>() → self::f::T
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 917a5ff..0d482b4 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,7 +21,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 917a5ff..0d482b4 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,7 +21,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.expect
index 519248d..4ffb6d3 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.transformed.expect
index 519248d..4ffb6d3 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
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 c483408..f40880f 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,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -19,12 +19,12 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Test extends core::Object {
   field self::B member;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   static method test(self::Test t) → void
     ;
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 84dd210..7e29252 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
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 84dd210..7e29252 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.expect
index 5513712..c97ac01 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.transformed.expect
index 5513712..c97ac01 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
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 c483408..f40880f 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,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -19,12 +19,12 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Test extends core::Object {
   field self::B member;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   static method test(self::Test t) → void
     ;
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 abecc5d..0570c30 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
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 abecc5d..0570c30 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.expect
index 8cb10cf..c4cb694 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect
index 8cb10cf..c4cb694 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
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 45f7015..eaa82b5 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
@@ -4,21 +4,21 @@
 
 class Test1 extends core::Object {
   field core::int prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     ;
   static method test(self::Test1 t) → void
     ;
 }
 class Test2 extends core::Object {
   field core::num prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     ;
   static method test(self::Test2 t) → void
     ;
 }
 class Test3 extends core::Object {
   field core::double prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     ;
   static method test3(self::Test3 t) → void
     ;
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 7b5b877..8320b4b 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
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 7b5b877..8320b4b 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.expect
index a4ec9d8..0bd4ce8 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,18 +21,18 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.transformed.expect
index a4ec9d8..0bd4ce8 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,18 +21,18 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
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 8aa62bc..1f7cf9f 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,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -19,16 +19,16 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Base extends core::Object {
   field self::B member;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   method test() → void
     ;
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 609bc691..b621997 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,18 +21,18 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
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 609bc691..b621997 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,18 +21,18 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.expect
index 051210b..0c7a80c 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.expect
@@ -6,12 +6,12 @@
   field core::int intProp = null;
   field core::num numProp = null;
   field core::double doubleProp = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super self::Base::•()
     ;
   method test() → void {
@@ -23,7 +23,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super self::Base::•()
     ;
   method test() → void {
@@ -41,7 +41,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super self::Base::•()
     ;
   method test3() → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.transformed.expect
index 051210b..0c7a80c 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.transformed.expect
@@ -6,12 +6,12 @@
   field core::int intProp = null;
   field core::num numProp = null;
   field core::double doubleProp = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super self::Base::•()
     ;
   method test() → void {
@@ -23,7 +23,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super self::Base::•()
     ;
   method test() → void {
@@ -41,7 +41,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super self::Base::•()
     ;
   method test3() → void {
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 592fa68..c58784f 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
@@ -6,23 +6,23 @@
   field core::int intProp;
   field core::num numProp;
   field core::double doubleProp;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     ;
   method test() → void
     ;
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     ;
   method test() → void
     ;
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     ;
   method test3() → void
     ;
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 6156050..b7331a5 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
@@ -6,12 +6,12 @@
   field core::int intProp = null;
   field core::num numProp = null;
   field core::double doubleProp = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super self::Base::•()
     ;
   method test() → void {
@@ -23,7 +23,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super self::Base::•()
     ;
   method test() → void {
@@ -41,7 +41,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super self::Base::•()
     ;
   method test3() → void {
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 6156050..b7331a5 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
@@ -6,12 +6,12 @@
   field core::int intProp = null;
   field core::num numProp = null;
   field core::double doubleProp = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super self::Base::•()
     ;
   method test() → void {
@@ -23,7 +23,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super self::Base::•()
     ;
   method test() → void {
@@ -41,7 +41,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super self::Base::•()
     ;
   method test3() → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.expect
index adcdb5f..2253586 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.transformed.expect
index adcdb5f..2253586 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
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 45f7015..eaa82b5 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
@@ -4,21 +4,21 @@
 
 class Test1 extends core::Object {
   field core::int prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     ;
   static method test(self::Test1 t) → void
     ;
 }
 class Test2 extends core::Object {
   field core::num prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     ;
   static method test(self::Test2 t) → void
     ;
 }
 class Test3 extends core::Object {
   field core::double prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     ;
   static method test3(self::Test3 t) → void
     ;
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 2b56047..b9366a9 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
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 2b56047..b9366a9 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -17,7 +17,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -36,7 +36,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.expect
index aac5dbd..46e31be 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.transformed.expect
index aac5dbd..46e31be 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 d17dc17..e9f2ede 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 d17dc17..e9f2ede 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.expect
index 02325a0..06616e3 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   static field self::B staticVariable = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -22,7 +22,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.transformed.expect
index 02325a0..06616e3 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   static field self::B staticVariable = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -22,7 +22,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 dca7f38..7e312ee 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
   static field self::B staticVariable;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -20,7 +20,7 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static field self::B topLevelVariable;
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 5199214..e1a50e1 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,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   static field self::B staticVariable = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -22,7 +22,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 5199214..e1a50e1 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,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   static field self::B staticVariable = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -22,7 +22,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.expect b/pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.expect
index 001ba76..fe48a15 100644
--- a/pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → core::int
diff --git a/pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.transformed.expect
index 001ba76..fe48a15 100644
--- a/pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → core::int
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 13a93a6..a3d0601 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → core::int
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 13a93a6..a3d0601 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → core::int
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.expect
index 347b333..b847473 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.expect
@@ -6,7 +6,7 @@
   field dynamic x = null;
   field dynamic y = 2;
   field dynamic z = "hi";
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
@@ -15,7 +15,7 @@
   field dynamic y = 3;
   field dynamic z = null;
   field dynamic w = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.transformed.expect
index 347b333..b847473 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   field dynamic x = null;
   field dynamic y = 2;
   field dynamic z = "hi";
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
@@ -15,7 +15,7 @@
   field dynamic y = 3;
   field dynamic z = null;
   field dynamic w = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
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 9eca0a5..7a3091d 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
@@ -23,7 +23,7 @@
   field dynamic x = null;
   field core::int y = 2;
   field core::String z = "hi";
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
@@ -32,7 +32,7 @@
   field core::int y = 3;
   field core::String z = null;
   field core::int w = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
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 6aedf65..b755212 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
@@ -6,7 +6,7 @@
   field dynamic x = null;
   field core::int y = 2;
   field core::String z = "hi";
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
@@ -15,7 +15,7 @@
   field core::int y = 3;
   field core::String z = null;
   field core::int w = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.expect
index 08cf7fa..651dbc3 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.expect
@@ -4,13 +4,13 @@
 
 class A extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field dynamic x = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.transformed.expect
index 08cf7fa..651dbc3 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.transformed.expect
@@ -4,13 +4,13 @@
 
 class A extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field dynamic x = 0;
-  synthetic constructor •() → void
+  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 880acbe..03923d9 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 •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends core::Object {
   field dynamic x;
-  synthetic constructor •() → void
+  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 86a7e29..cedf5e1 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
@@ -4,13 +4,13 @@
 
 class A extends core::Object implements self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field core::int x = 0;
-  synthetic constructor •() → void
+  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 86a7e29..cedf5e1 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
@@ -4,13 +4,13 @@
 
 class A extends core::Object implements self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field core::int x = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.expect
index d3f0a00..6657368 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → dynamic;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract get x() → core::int;
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.transformed.expect
index d3f0a00..6657368 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.transformed.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → dynamic;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract get x() → core::int;
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 fa89fb8..41317cd 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
@@ -4,16 +4,16 @@
 
 class A extends core::Object implements self::B {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract get x() → dynamic;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   abstract get x() → core::int;
 }
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 047eb54..4b35f0e 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
@@ -4,18 +4,18 @@
 
 class A extends core::Object implements self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract get x() → core::int;
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 047eb54..4b35f0e 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
@@ -4,18 +4,18 @@
 
 class A extends core::Object implements self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract get x() → core::int;
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.expect
index b5f0be8..67fa407 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract set x(dynamic value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.transformed.expect
index b5f0be8..67fa407 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.transformed.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract set x(dynamic value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
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 265db2d..9de155a 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
@@ -4,16 +4,16 @@
 
 class A extends core::Object implements self::B {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract set x(dynamic value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   abstract set x(core::int value) → void;
 }
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 314011d..94de153 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
@@ -4,18 +4,18 @@
 
 class A extends core::Object implements self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
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 314011d..94de153 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
@@ -4,18 +4,18 @@
 
 class A extends core::Object implements self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.expect
index df402bc..34995f9 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   abstract get x() → core::double;
 }
 class E extends self::A implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::A::•()
     ;
 }
 class F extends self::A implements self::C {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::A::•()
     ;
 }
 class G extends self::A implements self::D {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super self::A::•()
     ;
 }
 class H extends self::C implements self::D {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::H
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.transformed.expect
index df402bc..34995f9 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.transformed.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   abstract get x() → core::double;
 }
 class E extends self::A implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::A::•()
     ;
 }
 class F extends self::A implements self::C {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::A::•()
     ;
 }
 class G extends self::A implements self::D {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super self::A::•()
     ;
 }
 class H extends self::C implements self::D {
   field dynamic x = null;
-  synthetic constructor •() → void
+  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 d43ea54..c55fa65 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
@@ -3,43 +3,43 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract get x() → core::int;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract get x() → core::int;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   abstract get x() → core::num;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   abstract get x() → core::double;
 }
 class E extends self::A implements self::B {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 class F extends self::A implements self::C {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     ;
 }
 class G extends self::A implements self::D {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     ;
 }
 class H extends self::C implements self::D {
   field dynamic x;
-  synthetic constructor •() → void
+  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 983f71c..ea30e70 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
@@ -19,7 +19,7 @@
 // Change to a subtype of dart.core::int.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is the overridden method ('x').
 //   int get x;
 //           ^
 //
@@ -27,7 +27,7 @@
 // Change to a subtype of dart.core::num.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is the overridden method ('x').
 //   num get x;
 //           ^
 //
@@ -35,7 +35,7 @@
 // Change to a subtype of dart.core::int.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is the overridden method ('x').
 //   int get x;
 //           ^
 //
@@ -43,7 +43,7 @@
 // Change to a subtype of dart.core::double.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is the overridden method ('x').
 //   double get x;
 //              ^
 //
@@ -51,7 +51,7 @@
 // Change to a subtype of dart.core::num.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is the overridden method ('x').
 //   num get x;
 //           ^
 //
@@ -59,7 +59,7 @@
 // Change to a subtype of dart.core::double.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is the overridden method ('x').
 //   double get x;
 //              ^
 
@@ -115,50 +115,50 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   abstract get x() → core::double;
 }
 class E extends self::A implements self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::A::•()
     ;
 }
 class F extends self::A implements self::C {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::A::•()
     ;
 }
 class G extends self::A implements self::D {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super self::A::•()
     ;
 }
 class H extends self::C implements self::D {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::H
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.expect
index e345b97..651b972 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract get x() → core::int;
 }
 class C extends self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.transformed.expect
index e345b97..651b972 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract get x() → core::int;
 }
 class C extends self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  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 06c65d5..07bf8f9 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 •() → void
+  synthetic constructor •() → self::A
     ;
   abstract get x() → core::num;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract get x() → core::int;
 }
 class C extends self::B {
   field dynamic x;
-  synthetic constructor •() → void
+  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 3c4ae25..f9b40cd 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract get x() → core::int;
 }
 class C extends self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  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 3c4ae25..f9b40cd 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract get x() → core::int;
 }
 class C extends self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.expect
index d80578b..0ca493c 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.expect
@@ -4,7 +4,7 @@
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> z = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   abstract get x() → core::List<self::A::T>;
@@ -14,7 +14,7 @@
   field dynamic x = null;
   field dynamic y = null;
   field dynamic z = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.transformed.expect
index d80578b..0ca493c 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> z = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   abstract get x() → core::List<self::A::T>;
@@ -14,7 +14,7 @@
   field dynamic x = null;
   field dynamic y = null;
   field dynamic z = null;
-  synthetic constructor •() → void
+  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 bb96bee..71b6a0a 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
@@ -4,7 +4,7 @@
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> z;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
   abstract get x() → core::List<self::A::T>;
   abstract set y(core::List<self::A::T> value) → void;
@@ -13,7 +13,7 @@
   field dynamic x;
   field dynamic y;
   field dynamic z;
-  synthetic constructor •() → void
+  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 0a8975f..c395f30 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
@@ -4,7 +4,7 @@
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field core::List<self::A::T> z = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   abstract get x() → core::List<self::A::T>;
@@ -14,7 +14,7 @@
   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 •() → void
+  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 0a8975f..c395f30 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
@@ -4,7 +4,7 @@
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field core::List<self::A::T> z = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   abstract get x() → core::List<self::A::T>;
@@ -14,7 +14,7 @@
   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 •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.expect
index e32aaba..960b613 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → core::int
@@ -17,25 +17,25 @@
 }
 class C extends self::A {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
 class D extends self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::B::•()
     ;
 }
 class E extends core::Object implements self::A {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
@@ -43,7 +43,7 @@
 }
 class G extends self::_G&Object&B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.transformed.expect
index 3a9c949..e510049 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → core::int
@@ -17,25 +17,25 @@
 }
 class C extends self::A {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
 class D extends self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::B::•()
     ;
 }
 class E extends core::Object implements self::A {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
@@ -48,7 +48,7 @@
 }
 class G extends self::_G&Object&B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
 }
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 1228829..d6798da 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,41 +3,41 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract get x() → core::int;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   get x() → core::int
     ;
 }
 class C extends self::A {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::B {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::Object implements self::A {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 class F extends core::Object implements self::B {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
 }
 class G extends self::_G&Object&B {
   field dynamic x;
-  synthetic constructor •() → void
+  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 bc12de8..a4e97f8 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,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → core::int
@@ -17,25 +17,25 @@
 }
 class C extends self::A {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
 class D extends self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::B::•()
     ;
 }
 class E extends core::Object implements self::A {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
@@ -43,7 +43,7 @@
 }
 class G extends self::_G&Object&B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
 }
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 1669c26..ff2dee7 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,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → core::int
@@ -17,25 +17,25 @@
 }
 class C extends self::A {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
 class D extends self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::B::•()
     ;
 }
 class E extends core::Object implements self::A {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
@@ -48,7 +48,7 @@
 }
 class G extends self::_G&Object&B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.expect
index 47d371a..b453e92 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.expect
@@ -3,38 +3,38 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   set x(core::int value) → void {}
 }
 class C extends self::A {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
 class D extends self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::B::•()
     ;
 }
 class E extends core::Object implements self::A {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
@@ -42,7 +42,7 @@
 }
 class G extends self::_G&Object&B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.transformed.expect
index 174b0fe..c535525 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.transformed.expect
@@ -3,38 +3,38 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   set x(core::int value) → void {}
 }
 class C extends self::A {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
 class D extends self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::B::•()
     ;
 }
 class E extends core::Object implements self::A {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
@@ -46,7 +46,7 @@
 }
 class G extends self::_G&Object&B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
 }
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 bf71555..30994a5 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,41 +3,41 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract set x(core::int value) → void;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   set x(core::int value) → void
     ;
 }
 class C extends self::A {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::B {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::Object implements self::A {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 class F extends core::Object implements self::B {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
 }
 class G extends self::_G&Object&B {
   field dynamic x;
-  synthetic constructor •() → void
+  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 13ed540..3f84d31 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,38 +3,38 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   set x(core::int value) → void {}
 }
 class C extends self::A {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
 class D extends self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::B::•()
     ;
 }
 class E extends core::Object implements self::A {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
@@ -42,7 +42,7 @@
 }
 class G extends self::_G&Object&B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
 }
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 97edcbc..4d2a045 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,38 +3,38 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   set x(core::int value) → void {}
 }
 class C extends self::A {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
 class D extends self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::B::•()
     ;
 }
 class E extends core::Object implements self::A {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
@@ -46,7 +46,7 @@
 }
 class G extends self::_G&Object&B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_static.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_static.dart.direct.expect
index 3ae2bbb..a742a6d 100644
--- a/pkg/front_end/testcases/inference/infer_field_static.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_field_static.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   static get x() → core::int
@@ -11,13 +11,13 @@
 }
 class B extends self::A {
   static field dynamic x = self::f();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::A {
   static field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_static.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_static.dart.direct.transformed.expect
index 3ae2bbb..a742a6d 100644
--- a/pkg/front_end/testcases/inference/infer_field_static.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_static.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   static get x() → core::int
@@ -11,13 +11,13 @@
 }
 class B extends self::A {
   static field dynamic x = self::f();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::A {
   static field dynamic x = null;
-  synthetic constructor •() → void
+  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 1e1996d..a9eb1ec 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 •() → void
+  synthetic constructor •() → self::A
     ;
   static get x() → core::int
     ;
 }
 class B extends self::A {
   static field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends self::A {
   static field dynamic x;
-  synthetic constructor •() → void
+  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 3ae2bbb..a742a6d 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   static get x() → core::int
@@ -11,13 +11,13 @@
 }
 class B extends self::A {
   static field dynamic x = self::f();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::A {
   static field dynamic x = null;
-  synthetic constructor •() → void
+  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 3ae2bbb..a742a6d 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   static get x() → core::int
@@ -11,13 +11,13 @@
 }
 class B extends self::A {
   static field dynamic x = self::f();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::A {
   static field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.expect
index 84b8120b..18097da 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
@@ -11,7 +11,7 @@
 }
 class B extends self::A {
   final field dynamic x;
-  constructor •(dynamic x) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.transformed.expect
index 84b8120b..18097da 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
@@ -11,7 +11,7 @@
 }
 class B extends self::A {
   final field dynamic x;
-  constructor •(dynamic x) → void
+  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 e843722..96dbb50 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract get x() → core::int;
   set x(core::double value) → void
@@ -11,7 +11,7 @@
 }
 class B extends self::A {
   final field dynamic x;
-  constructor •(dynamic x) → void
+  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 f27336bc..97ca47c 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
@@ -11,7 +11,7 @@
 }
 class B extends self::A {
   final field core::int x;
-  constructor •(core::int x) → void
+  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 f27336bc..97ca47c 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
@@ -11,7 +11,7 @@
 }
 class B extends self::A {
   final field core::int x;
-  constructor •(core::int x) → void
+  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.direct.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.direct.expect
index 607a12e..28bd84b 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 class B extends self::A {
   final field dynamic x;
-  constructor •(dynamic x) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.direct.transformed.expect
index 607a12e..28bd84b 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 class B extends self::A {
   final field dynamic x;
-  constructor •(dynamic x) → void
+  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 965bc44..11b26c0 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 •() → void
+  synthetic constructor •() → self::A
     ;
   abstract get x() → core::int;
 }
 class B extends self::A {
   final field dynamic x;
-  constructor •(dynamic x) → void
+  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 b2351c8..cb590b2 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 class B extends self::A {
   final field core::int x;
-  constructor •(core::int x) → void
+  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 b2351c8..cb590b2 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 class B extends self::A {
   final field core::int x;
-  constructor •(core::int x) → void
+  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.direct.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.expect
index 1e77979..d9bfe67 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(core::double value) → void {}
 }
 class B extends self::A {
   final field dynamic x;
-  constructor •(dynamic x) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.transformed.expect
index 1e77979..d9bfe67 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(core::double value) → void {}
 }
 class B extends self::A {
   final field dynamic x;
-  constructor •(dynamic x) → void
+  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 8c26438..b2085f3 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 •() → void
+  synthetic constructor •() → self::A
     ;
   set x(core::double value) → void
     ;
 }
 class B extends self::A {
   final field dynamic x;
-  constructor •(dynamic x) → void
+  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 9054ebc..dad58c5 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(core::double value) → void {}
 }
 class B extends self::A {
   final field core::double x;
-  constructor •(core::double x) → void
+  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 9054ebc..dad58c5 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(core::double value) → void {}
 }
 class B extends self::A {
   final field core::double x;
-  constructor •(core::double x) → void
+  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.direct.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect
index 6859457..c1990f1 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect
@@ -14,14 +14,14 @@
 
 class A extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → self::B
     return null;
 }
 class B extends self::A {
-  constructor •(dynamic ignore) → void
+  constructor •(dynamic ignore) → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.transformed.expect
index 8876de4..9c6ee49 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.transformed.expect
@@ -4,14 +4,14 @@
 
 class A extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → self::B
     return null;
 }
 class B extends self::A {
-  constructor •(dynamic ignore) → void
+  constructor •(dynamic ignore) → self::B
     : super self::A::•()
     ;
 }
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 2d9e2de..144cd0f 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
@@ -68,36 +68,30 @@
 //   j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
 //                                                          ^
 
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Error: Getter not found: 'x'.
-// var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
-//                                                             ^
-//
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Getter not found: 'x'.
-//   /*error:UNDEFINED_IDENTIFIER*/ x
-//                                  ^
-
 library test;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → self::B
     return null;
 }
 class B extends self::A {
-  constructor •(dynamic ignore) → void
+  constructor •(dynamic ignore) → self::B
     : super self::A::•()
     ;
 }
 static field self::A a = new self::A::•();
-static field self::B 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 core::List<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 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:61: Error: Getter not found: 'x'.
+var /*@topType=B*/ 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'.
+  /*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;
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index 579e8e2..4707ec5 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -1,33 +1,27 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Error: Getter not found: 'x'.
-// var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
-//                                                             ^
-//
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Getter not found: 'x'.
-//   /*error:UNDEFINED_IDENTIFIER*/ x
-//                                  ^
-
 library test;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → self::B
     return null;
 }
 class B extends self::A {
-  constructor •(dynamic ignore) → void
+  constructor •(dynamic ignore) → self::B
     : super self::A::•()
     ;
 }
 static field self::A a = new self::A::•();
-static field self::B 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 core::List<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 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:61: Error: Getter not found: 'x'.
+var /*@topType=B*/ 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'.
+  /*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 core::int #t2 = #t1.{self::A::x} = 3 in #t1;
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.expect
index a7633e5..0c29668 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.expect
@@ -4,13 +4,13 @@
 
 class A extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   field dynamic x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.transformed.expect
index a7633e5..0c29668 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.transformed.expect
@@ -4,13 +4,13 @@
 
 class A extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   field dynamic x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
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 b8aaf798..2ec593c 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,13 +4,13 @@
 
 class A extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   field dynamic x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
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 b8aaf798..2ec593c 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,13 +4,13 @@
 
 class A extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   field dynamic x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.expect
index 51c4c9f..59b1886 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.expect
@@ -4,13 +4,13 @@
 
 class A extends core::Object {
   final field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   final field dynamic x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.transformed.expect
index 51c4c9f..59b1886 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.transformed.expect
@@ -4,13 +4,13 @@
 
 class A extends core::Object {
   final field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   final field dynamic x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
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 bbcf3a6..00c2d9a 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,13 +4,13 @@
 
 class A extends core::Object {
   final field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   final field dynamic x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
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 bbcf3a6..00c2d9a 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,13 +4,13 @@
 
 class A extends core::Object {
   final field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   final field dynamic x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.expect
index 9dcf842..b941bf6 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.expect
@@ -5,7 +5,7 @@
 
 class B extends core::Object {
   static field dynamic y = inf::A::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.transformed.expect
index 9dcf842..b941bf6 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 
 class B extends core::Object {
   static field dynamic y = inf::A::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : 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 3480785..04a0cbb 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
@@ -5,7 +5,7 @@
 
 class B extends core::Object {
   static field core::int y = inf::A::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : 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 3480785..04a0cbb 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
@@ -5,7 +5,7 @@
 
 class B extends core::Object {
   static field core::int y = inf::A::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.expect
index d731588..b2d87e2 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.transformed.expect
index d731588..b2d87e2 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 cb3b662..8aca87e 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 cb3b662..8aca87e 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.expect
index 598ac7e..73d5704 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.expect
@@ -5,7 +5,7 @@
 
 class B extends core::Object {
   static field dynamic y = inf::A::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.transformed.expect
index 598ac7e..73d5704 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 
 class B extends core::Object {
   static field dynamic y = inf::A::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : 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 7090357..394d994 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
@@ -17,7 +17,7 @@
 
 class B extends core::Object {
   static field core::int y = inf::A::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : 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 e4ef88d..72a6817 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
@@ -5,7 +5,7 @@
 
 class B extends core::Object {
   static field core::int y = inf::A::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.expect
index d731588..b2d87e2 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.transformed.expect
index d731588..b2d87e2 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → void
+  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 cb3b662..8aca87e 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static field core::int x = 2;
-  synthetic constructor •() → void
+  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 cb3b662..8aca87e 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.expect
index 4b95c54..75d1692 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.transformed.expect
index 4b95c54..75d1692 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
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 bd07f13..5346e26 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
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 bd07f13..5346e26 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.expect
index 2641064..550bac7 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.transformed.expect
index 2641064..550bac7 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
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 58dcecf..07c895a 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
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 58dcecf..07c895a 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.expect
index e4e7bd1..cca0705 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.transformed.expect
index e4e7bd1..cca0705 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
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 10a9999..2eacb46 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
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 10a9999..2eacb46 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.expect
index bfa9057..d96161e 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.transformed.expect
index bfa9057..d96161e 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
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 da75fda..0ad7439 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
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 da75fda..0ad7439 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
diff --git a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.expect
index 1ee8980..3d410db 100644
--- a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(core::double value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract get x() → dynamic;
diff --git a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.transformed.expect
index 1ee8980..3d410db 100644
--- a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(core::double value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract get x() → 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 1dc024f..35c511d 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,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract set x(core::double value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract get x() → 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 a3c7415..1bb410b 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,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(core::double value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract get x() → core::double;
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 a3c7415..1bb410b 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,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(core::double value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract get x() → core::double;
diff --git a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.expect
index 90c449e..69eff1f1 100644
--- a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get x() → dynamic
     return self::f();
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → dynamic;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract get x() → core::int;
diff --git a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.transformed.expect
index 90c449e..69eff1f1 100644
--- a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get x() → dynamic
     return self::f();
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → dynamic;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract get x() → core::int;
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 07f08b7..a346b2f 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,18 +3,18 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   get x() → dynamic
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract get x() → dynamic;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   abstract get x() → core::int;
 }
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 643f30d..3d7f3cb 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,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get x() → core::int
     return self::f() as{TypeError} core::int;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract get x() → core::int;
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 643f30d..3d7f3cb 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,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get x() → core::int
     return self::f() as{TypeError} core::int;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract get x() → core::int;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract get x() → core::int;
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 517d849..23e767ca 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Resource extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Resource
     : super core::Object::•()
     ;
 }
 class Folder extends self::Resource {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Folder
     : super self::Resource::•()
     ;
 }
 class Foo<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::Foo::T t) → void
+  constructor •(self::Foo::T t) → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
 }
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 517d849..23e767ca 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Resource extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Resource
     : super core::Object::•()
     ;
 }
 class Folder extends self::Resource {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Folder
     : super self::Resource::•()
     ;
 }
 class Foo<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::Foo::T t) → void
+  constructor •(self::Foo::T t) → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
index e5b0d6e..45294a7 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
@@ -7,7 +7,7 @@
 // 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: Error: Previous use of 'g'.
+// 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();
 //                                                                          ^
 
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 12d4a27..360c490 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
@@ -7,13 +7,7 @@
 // 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: Error: Previous use of 'g'.
-//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-//                                                                          ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Method not found: 'g'.
+// 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();
 //                                                                          ^
 
@@ -23,7 +17,9 @@
 
 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 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();
+                                                                         ^";
   {
     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;
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 dc3bf25..7159770 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
@@ -1,16 +1,12 @@
-// Unhandled errors:
-//
-// 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();
-//                                                                          ^
-
 library test;
 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 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();
+                                                                         ^";
   {
     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;
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.expect
index d4ee51b..901ba43 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.expect
@@ -4,13 +4,13 @@
 
 typedef F = () → core::int;
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method x(() → core::int value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract method x(() → dynamic value) → void;
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.transformed.expect
index d4ee51b..901ba43 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.transformed.expect
@@ -4,13 +4,13 @@
 
 typedef F = () → core::int;
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method x(() → core::int value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract method x(() → dynamic value) → void;
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 4ee1701..4f4c2fa 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
@@ -4,12 +4,12 @@
 
 typedef F = () → core::int;
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract method x(() → core::int value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract method x(() → dynamic value) → void;
 }
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 dd7fcd8..fd1195c 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
@@ -4,13 +4,13 @@
 
 typedef F = () → core::int;
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method x(() → core::int value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract method x(() → dynamic value) → void;
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 dd7fcd8..fd1195c 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
@@ -4,13 +4,13 @@
 
 typedef F = () → core::int;
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method x(() → core::int value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract method x(() → dynamic value) → void;
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.expect
index 25d9b0f..eb809e8 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.expect
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Warning: The method 'C::f' has more required arguments than those of overridden method 'B::f'.
 //   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
 //                                                             ^
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Warning: This is the overridden method ('f').
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
 //   int f(int x);
 //       ^
 
@@ -12,7 +12,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method f(core::int x, core::int y) → core::int;
@@ -20,7 +20,7 @@
   abstract method h(core::int x, {core::int y = null}) → core::int;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract method f(core::int x) → core::int;
@@ -28,7 +28,7 @@
   abstract method h(core::int x) → core::int;
 }
 abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract method f(dynamic x, dynamic y) → dynamic;
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.transformed.expect
index 80a5e2b..ce0baed 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method f(core::int x, core::int y) → core::int;
@@ -11,7 +11,7 @@
   abstract method h(core::int x, {core::int y = null}) → core::int;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract method f(core::int x) → core::int;
@@ -19,7 +19,7 @@
   abstract method h(core::int x) → core::int;
 }
 abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract method f(dynamic x, dynamic y) → dynamic;
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 b2900dc..68ab1aa 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,7 +3,7 @@
 // pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Warning: The method 'C::f' has more required arguments than those of overridden method 'B::f'.
 //   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
 //                                                             ^
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Warning: This is the overridden method ('f').
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
 //   int f(int x);
 //       ^
 
@@ -12,21 +12,21 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  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 class B extends core::Object {
-  synthetic constructor •() → void
+  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 class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   abstract method f(dynamic x, dynamic y) → dynamic;
   abstract method g(dynamic x, [dynamic y]) → 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 09b21ca..27e8464 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
@@ -18,7 +18,7 @@
 // pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Error: The method 'C::f' has more required arguments than those of overridden method 'B::f'.
 //   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
 //                                                             ^
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Error: This is the overridden method ('f').
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
 //   int f(int x);
 //       ^
 
@@ -48,7 +48,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method f(core::int x, core::int y) → core::int;
@@ -56,7 +56,7 @@
   abstract method h(core::int x, {core::int y = null}) → core::int;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract method f(core::int x) → core::int;
@@ -64,7 +64,7 @@
   abstract method h(core::int x) → core::int;
 }
 abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract method f(core::int x, dynamic y) → core::int;
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.expect
index 1ae97da..b4be5c0 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
   set foo(dynamic x) → dynamic {}
 }
 class D extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.transformed.expect
index 1ae97da..b4be5c0 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
   set foo(dynamic x) → dynamic {}
 }
 class D extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  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 df2c93c..1b88745 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 •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
   set foo(core::int x) → void {}
 }
 class D extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  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 df2c93c..1b88745 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 •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
   set foo(core::int x) → void {}
 }
 class D extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.expect
index 30425c7..6288aaf 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
   set foo(dynamic x) → dynamic {}
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set foo(core::int x) → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.transformed.expect
index 30425c7..6288aaf 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
   set foo(dynamic x) → dynamic {}
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set foo(core::int x) → 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 a6997bd..688faaf 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,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
   set foo(core::int x) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set foo(core::int x) → void {}
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 a6997bd..688faaf 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,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
   set foo(core::int x) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set foo(core::int x) → void {}
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.expect b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.expect
index 2d0c29c..a8cfd10 100644
--- a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → void
+  constructor •() → self::A
     : super core::Object::•()
     ;
   operator ~() → core::int
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.transformed.expect
index 2d0c29c..a8cfd10 100644
--- a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → void
+  constructor •() → self::A
     : super core::Object::•()
     ;
   operator ~() → core::int
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 1fbb9c3c..8dd709e 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → void
+  constructor •() → self::A
     : super core::Object::•()
     ;
   operator ~() → core::int
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 1fbb9c3c..8dd709e 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → void
+  constructor •() → self::A
     : super core::Object::•()
     ;
   operator ~() → core::int
diff --git a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.expect
index 712d6e6..24beb1d 100644
--- a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static set foo(core::int x) → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.transformed.expect
index 712d6e6..24beb1d 100644
--- a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static set foo(core::int x) → 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 d0beffa..e12c95b 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   static set foo(core::int x) → 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 21fab5d..6f68db4 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static set foo(core::int x) → void {}
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 21fab5d..6f68db4 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static set foo(core::int x) → void {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.expect
index bbf939b..db7fb96 100644
--- a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::double;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(dynamic value) → void;
diff --git a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.transformed.expect
index bbf939b..db7fb96 100644
--- a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::double;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(dynamic value) → void;
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 a185568..e80537c 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,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract get x() → core::double;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract set x(dynamic value) → void;
 }
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 6682a11..849953f 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,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::double;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(core::double value) → void;
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 6682a11..849953f 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,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::double;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(core::double value) → void;
diff --git a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.expect
index 9c6ea0a..0c5bffd 100644
--- a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract set x(dynamic value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
diff --git a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.transformed.expect
index 9c6ea0a..0c5bffd 100644
--- a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract set x(dynamic value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
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 d5cc7f3..47cd14e 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,18 +3,18 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   set x(dynamic value) → void
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract set x(dynamic value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   abstract set x(core::int value) → void;
 }
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 4332580..d58802b 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,19 +3,19 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(core::int value) → void {}
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
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 4332580..d58802b 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,19 +3,19 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(core::int value) → void {}
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract set x(core::int value) → void;
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.expect
index ddb9de6..ff7d7dc 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.expect
@@ -4,13 +4,13 @@
 
 typedef F = () → core::int;
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(() → core::int value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(() → dynamic value) → void;
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.transformed.expect
index ddb9de6..ff7d7dc 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.transformed.expect
@@ -4,13 +4,13 @@
 
 typedef F = () → core::int;
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(() → core::int value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(() → dynamic value) → void;
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 e8bf885..8b4da4e 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
@@ -4,12 +4,12 @@
 
 typedef F = () → core::int;
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract set x(() → core::int value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract set x(() → dynamic value) → void;
 }
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 d9e3fdf..af1aae0 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
@@ -4,13 +4,13 @@
 
 typedef F = () → core::int;
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(() → core::int value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(() → dynamic value) → void;
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 d9e3fdf..af1aae0 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
@@ -4,13 +4,13 @@
 
 typedef F = () → core::int;
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(() → core::int value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(() → dynamic value) → void;
diff --git a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.expect b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.expect
index 37b4a5d..a8e04fb 100644
--- a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(core::int i) → void {}
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   set x(core::Object o) → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.transformed.expect
index 37b4a5d..a8e04fb 100644
--- a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(core::int i) → void {}
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   set x(core::Object o) → dynamic {}
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 cc74a52..4afa24f 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,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   set x(core::int i) → void
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   set x(core::Object o) → 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 7024005..56f3147 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,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(core::int i) → void {}
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   set x(core::Object o) → void {}
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 7024005..56f3147 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,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(core::int i) → void {}
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   set x(core::Object o) → void {}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.expect
index b99e0c3..6029fc0 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static const field dynamic a3 = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.transformed.expect
index b99e0c3..6029fc0 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static const field dynamic a3 = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 766ab62..536b87f 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static const field dynamic a3 = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 766ab62..536b87f 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static const field dynamic a3 = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.expect
index a51abfe..3f90aff 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.expect
@@ -6,7 +6,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf::b1;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.transformed.expect
index a51abfe..3f90aff 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf::b1;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::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 9e64cd4..2cff8e9 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
@@ -6,7 +6,7 @@
 
 class A extends core::Object {
   static final field core::int a2 = inf::b1;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 9e64cd4..2cff8e9 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
@@ -6,7 +6,7 @@
 
 class A extends core::Object {
   static final field core::int a2 = inf::b1;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.expect
index 203f0f2..f814b99 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.expect
@@ -6,7 +6,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf::b1;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.transformed.expect
index 203f0f2..f814b99 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf::b1;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 3f00669..e0d7ab9 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
@@ -6,7 +6,7 @@
 
 class A extends core::Object {
   static final field core::int a2 = inf::b1;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 3f00669..e0d7ab9 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
@@ -6,7 +6,7 @@
 
 class A extends core::Object {
   static final field core::int a2 = inf::b1;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.expect
index 822e5cf..52c6c06 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.expect
@@ -5,7 +5,7 @@
 
 class T extends core::Object {
   static final field self::T foo = self::T::m1(self::T::m2(inf::m3("", "")));
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T
     : super core::Object::•()
     ;
   static method m1(core::String m) → self::T {
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.transformed.expect
index 822e5cf..52c6c06 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 
 class T extends core::Object {
   static final field self::T foo = self::T::m1(self::T::m2(inf::m3("", "")));
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T
     : super core::Object::•()
     ;
   static method m1(core::String m) → self::T {
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 822e5cf..52c6c06 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
@@ -5,7 +5,7 @@
 
 class T extends core::Object {
   static final field self::T foo = self::T::m1(self::T::m2(inf::m3("", "")));
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T
     : super core::Object::•()
     ;
   static method m1(core::String m) → self::T {
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 822e5cf..52c6c06 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
@@ -5,7 +5,7 @@
 
 class T extends core::Object {
   static final field self::T foo = self::T::m1(self::T::m2(inf::m3("", "")));
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T
     : super core::Object::•()
     ;
   static method m1(core::String m) → self::T {
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.expect
index 6a398b3..26d089c 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.transformed.expect
index 6a398b3..26d089c 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   get x() → 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 6b24c06..4d381de 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,12 +11,12 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   get x() → core::int
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 a825f30..966e4b4 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
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   get x() → core::int
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.expect
index d56d90f..1159f05 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   final field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.transformed.expect
index d56d90f..1159f05 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   final field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → 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 3d2ac1b..bb01fc3 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,12 +11,12 @@
 
 class A extends core::Object {
   final field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → core::int
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 46cd118..451094c 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
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   final field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → core::int
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.direct.expect
index b38889d..9239ef2 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.direct.expect
@@ -6,7 +6,7 @@
   field core::int x = 0;
   field core::int y = null;
   final field dynamic z = 42;
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.direct.transformed.expect
index b38889d..9239ef2 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   field core::int x = 0;
   field core::int y = null;
   final field dynamic z = 42;
-  synthetic constructor •() → void
+  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 bea0734..af78a18 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
@@ -23,7 +23,7 @@
   field core::int x = 0;
   field core::int y = null;
   final field core::int z = 42;
-  synthetic constructor •() → void
+  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.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
index e1d081e..3df085f 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
@@ -6,7 +6,7 @@
   field core::int x = 0;
   field core::int y = null;
   final field core::int z = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method test1() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.expect
index 2db852d..915ca9c 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.expect
@@ -4,14 +4,14 @@
 import "dart:core" as core;
 
 class C extends inf::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super inf::B::•()
     ;
   get x() → dynamic
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get x() → core::int
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.transformed.expect
index 2db852d..915ca9c 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.transformed.expect
@@ -4,14 +4,14 @@
 import "dart:core" as core;
 
 class C extends inf::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super inf::B::•()
     ;
   get x() → dynamic
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get x() → core::int
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 eed50dc..5da8202 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
@@ -11,14 +11,14 @@
 import "dart:core" as core;
 
 class C extends inf::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super inf::B::•()
     ;
   get x() → core::int
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get x() → core::int
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 c4a712c..fb30f31 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
@@ -4,14 +4,14 @@
 import "dart:core" as core;
 
 class C extends inf::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super inf::B::•()
     ;
   get x() → core::int
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get x() → core::int
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.expect
index cc75323..8459af2 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.expect
@@ -3,7 +3,7 @@
 import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
 
 class B extends test::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super test::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.transformed.expect
index cc75323..8459af2 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
 
 class B extends test::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super test::A::•()
     ;
 }
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 5e68253..8fd31d9 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
@@ -10,7 +10,7 @@
 import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
 
 class B extends test::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super test::A::•()
     ;
 }
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 cc75323..8459af2 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
@@ -3,7 +3,7 @@
 import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
 
 class B extends test::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super test::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.expect
index 10fb95d..927f51d 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.expect
@@ -5,12 +5,12 @@
 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 •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.transformed.expect
index 10fb95d..927f51d 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.transformed.expect
@@ -5,12 +5,12 @@
 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 •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → 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 61cebb7..ff997cc 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
@@ -17,12 +17,12 @@
 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 •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → core::int
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 7c184cf..03e0fca 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
@@ -5,12 +5,12 @@
 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 •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → core::int
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.expect
index b834ab4..ef150d9 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.expect
@@ -4,13 +4,13 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   field self::A::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
   field self::B::E y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.transformed.expect
index b834ab4..ef150d9 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.transformed.expect
@@ -4,13 +4,13 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   field self::A::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
   field self::B::E y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get x() → dynamic
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 93b9420..fb3dde7 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
@@ -11,13 +11,13 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::A::T x = null;
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get x() → self::B::E
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 412283f..561f5a2 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
@@ -4,13 +4,13 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::A::T x = null;
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get x() → self::B::E
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.expect
index d3df882..23fb83d 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.expect
@@ -3,25 +3,25 @@
 import "dart:core" as core;
 
 abstract class I<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
-  const constructor •() → void
+  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 class M extends core::Object {
   final field core::int y = 0;
-  synthetic constructor •() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get y() → core::int
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.transformed.expect
index d3df882..23fb83d 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.transformed.expect
@@ -3,25 +3,25 @@
 import "dart:core" as core;
 
 abstract class I<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
-  const constructor •() → void
+  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 class M extends core::Object {
   final field core::int y = 0;
-  synthetic constructor •() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get y() → core::int
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 2ad57bf..80d67c3 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,25 +10,25 @@
 import "dart:core" as core;
 
 abstract class I<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
-  const constructor •() → void
+  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 class M extends core::Object {
   final field core::int y = 0;
-  synthetic constructor •() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get y() → core::int
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 37a225e..4ab82e5 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
@@ -3,25 +3,25 @@
 import "dart:core" as core;
 
 abstract class I<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
-  const constructor •() → void
+  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 class M extends core::Object {
   final field core::int y = 0;
-  synthetic constructor •() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get y() → core::int
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.expect
index b9c1563..daa2859 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.expect
@@ -5,18 +5,18 @@
 
 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 •() → void
+  const constructor •() → self::A<self::A::E>
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
   final field core::int y = 0;
-  synthetic constructor •() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get y() → core::int
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.transformed.expect
index b9c1563..daa2859 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.transformed.expect
@@ -5,18 +5,18 @@
 
 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 •() → void
+  const constructor •() → self::A<self::A::E>
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
   final field core::int y = 0;
-  synthetic constructor •() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get y() → core::int
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 e7c2714..e44c5b7 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
@@ -12,18 +12,18 @@
 
 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 •() → void
+  const constructor •() → self::A<self::A::E>
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
   final field core::int y = 0;
-  synthetic constructor •() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get y() → core::int
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 aa3882c..6038c2c 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
@@ -5,18 +5,18 @@
 
 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 •() → void
+  const constructor •() → self::A<self::A::E>
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
   final field core::int y = 0;
-  synthetic constructor •() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
   get y() → core::int
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.expect
index 83c90ce..999c28e 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.expect
@@ -4,7 +4,7 @@
 import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
 abstract class I<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.transformed.expect
index 83c90ce..999c28e 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
 abstract class I<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>;
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 eae7652..f4868a4 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
@@ -11,7 +11,7 @@
 import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
 abstract class I<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>;
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 83c90ce..999c28e 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
@@ -4,7 +4,7 @@
 import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
 abstract class I<E extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.expect
index dafc844..1efa9f8 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   final field self::A::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.transformed.expect
index dafc844..1efa9f8 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   final field self::A::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → dynamic
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 3bc8090..8751e0d 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
@@ -4,7 +4,7 @@
 // Change to a subtype of dart.core::int.
 //   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
 //                                                 ^
-// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:9:11: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:9:11: Context: This is the overridden method ('x').
 //   final T x = null;
 //           ^
 
@@ -21,12 +21,12 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   final field self::A::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.expect
index 4c5fd78..4cb8f64 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class Foo extends core::Object {
   field core::int bar = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar<T extends core::Iterable<core::String> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
   method foo(self::Bar::T t) → void {
@@ -19,7 +19,7 @@
   }
 }
 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 •() → void
+  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
     : super core::Object::•()
     ;
   method foo(self::Baz::S t) → void {
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.transformed.expect
index 4c5fd78..4cb8f64 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class Foo extends core::Object {
   field core::int bar = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar<T extends core::Iterable<core::String> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
   method foo(self::Bar::T t) → void {
@@ -19,7 +19,7 @@
   }
 }
 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 •() → void
+  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
     : super core::Object::•()
     ;
   method foo(self::Baz::S t) → void {
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 c82d4fe..020af4b 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
@@ -30,12 +30,12 @@
 
 class Foo extends core::Object {
   field core::int bar = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar<T extends core::Iterable<core::String> = core::Iterable<core::String>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Bar::T t) → void {
@@ -48,7 +48,7 @@
   }
 }
 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 •() → void
+  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 {
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 c3336c2..08d6327 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
@@ -4,12 +4,12 @@
 
 class Foo extends core::Object {
   field core::int bar = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar<T extends core::Iterable<core::String> = core::Iterable<core::String>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Bar::T t) → void {
@@ -22,7 +22,7 @@
   }
 }
 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 •() → void
+  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 {
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.expect
index a243798..6137f92 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.expect
@@ -5,12 +5,12 @@
 
 class Foo extends core::Object {
   field core::int bar = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
   method foo(self::Bar::T t) → dynamic async {
@@ -20,7 +20,7 @@
   }
 }
 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 •() → void
+  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
     : super core::Object::•()
     ;
   method foo(self::Baz::S t) → dynamic async {
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
index 8c8c294..0893769 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
@@ -5,12 +5,12 @@
 
 class Foo extends core::Object {
   field core::int bar = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
   method foo(self::Bar::T t) → dynamic /* originally async */ {
@@ -69,7 +69,7 @@
   }
 }
 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 •() → void
+  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
     : super core::Object::•()
     ;
   method foo(self::Baz::S t) → dynamic /* originally async */ {
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 312b175..4fc4a13 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
@@ -5,17 +5,17 @@
 
 class Foo extends core::Object {
   field core::int bar;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
 }
 class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::T>
     ;
   method foo(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 •() → void
+  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
     ;
   method foo(self::Baz::S t) → 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 c7b0dde..d47a9c1 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
@@ -31,12 +31,12 @@
 
 class Foo extends core::Object {
   field core::int bar = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar<T extends asy::Stream<core::String> = asy::Stream<core::String>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Bar::T t) → dynamic async {
@@ -49,7 +49,7 @@
   }
 }
 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 •() → void
+  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 {
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 ac769ba..8cf054d 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
@@ -5,12 +5,12 @@
 
 class Foo extends core::Object {
   field core::int bar = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar<T extends asy::Stream<core::String> = asy::Stream<core::String>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Bar::T t) → dynamic /* originally async */ {
@@ -72,7 +72,7 @@
   }
 }
 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 •() → void
+  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 */ {
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.expect
index b05a44c..e441e9c 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field dynamic x = 1;
-  constructor •([dynamic x = "1"]) → void
+  constructor •([dynamic x = "1"]) → self::Foo
     : self::Foo::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.transformed.expect
index b05a44c..e441e9c 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field dynamic x = 1;
-  constructor •([dynamic x = "1"]) → void
+  constructor •([dynamic x = "1"]) → 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.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
index f4c80be..e19f20c 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
@@ -14,7 +14,7 @@
   constructor •([core::int x = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
-                                             ^" in let final dynamic #t2 = "1" in null]) → void
+                                             ^" in let final dynamic #t2 = "1" in null]) → 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 ef10cdb..15eee28 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
@@ -7,7 +7,7 @@
   constructor •([core::int x = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
-                                             ^" in let final core::String #t2 = "1" in null]) → void
+                                             ^" in let final core::String #t2 = "1" in null]) → 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.direct.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.direct.expect
index 6e0646b..a06caa5 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.direct.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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.direct.transformed.expect
index 6e0646b..a06caa5 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.direct.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 •() → void
+  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 9830b33..e18015e 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
@@ -5,7 +5,7 @@
 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 •() → void
+  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 9830b33..e18015e 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
@@ -5,7 +5,7 @@
 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 •() → void
+  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.direct.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.direct.expect
index 92326d3..dfdd9ae 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = self::x;
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.direct.transformed.expect
index 92326d3..dfdd9ae 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = self::x;
-  synthetic constructor •() → void
+  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 a66e974..d7234e9 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::String y = self::x;
-  synthetic constructor •() → void
+  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.transformed.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.strong.transformed.expect
index a66e974..d7234e9 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::String y = self::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.direct.expect
index ea5bd56..c7f53ab 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → void func) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.direct.transformed.expect
index ea5bd56..c7f53ab 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → void func) → void
+  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 1d09b6a..6b18a06 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) → void
+  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 8b9f2be..df6208e 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → void func) → void
+  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.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect
index 8b9f2be..df6208e 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → void func) → void
+  constructor •(() → void func) → self::C
     : super core::Object::•() {}
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.expect
index 49bd0c9..36eee2f 100644
--- a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.expect
@@ -5,7 +5,7 @@
 class A extends core::Object {
   field core::int a = null;
   field core::List<core::int> b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method m() → void {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.transformed.expect
index 49bd0c9..36eee2f 100644
--- a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 class A extends core::Object {
   field core::int a = null;
   field core::List<core::int> b = null;
-  synthetic constructor •() → void
+  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 41e75a0..9d1f932 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
@@ -5,7 +5,7 @@
 class A extends core::Object {
   field core::int a = null;
   field core::List<core::int> b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method m() → void {}
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 3912678..c1b56b7 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
@@ -5,7 +5,7 @@
 class A extends core::Object {
   field core::int a = null;
   field core::List<core::int> b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method m() → void {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.expect
index 6e12e92..96045ee 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator *(self::C other) → core::bool
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.transformed.expect
index 6e12e92..96045ee 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator *(self::C other) → core::bool
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 e3f488f..09299a3 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator *(self::C other) → core::bool
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 e3f488f..09299a3 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator *(self::C other) → core::bool
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.expect
index d1ae550..3df7290 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator *(self::C other) → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.transformed.expect
index d1ae550..3df7290 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator *(self::C other) → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 f4bad7c..02be490 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,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator *(self::C other) → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 f4bad7c..02be490 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,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator *(self::C other) → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.expect
index f22d693..146868d 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator [](core::int index) → core::bool
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.transformed.expect
index f22d693..146868d 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator [](core::int index) → core::bool
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 041d0fd..4cc5bda 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator [](core::int index) → core::bool
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 041d0fd..4cc5bda 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator [](core::int index) → core::bool
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.expect
index eb9f3f7..0222121 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator [](core::int index) → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.transformed.expect
index eb9f3f7..0222121 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator [](core::int index) → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 42314d5..d4e9d6b 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,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator [](core::int index) → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 42314d5..d4e9d6b 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,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator [](core::int index) → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.expect
index f706c4c..b269056 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator unary-() → core::bool
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.transformed.expect
index f706c4c..b269056 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator unary-() → core::bool
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 1cb1bde..2a6dd0b 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator unary-() → core::bool
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 1cb1bde..2a6dd0b 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator unary-() → core::bool
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.expect
index d9b94c2..2215c66 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator unary-() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.transformed.expect
index d9b94c2..2215c66 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator unary-() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 c64598e..613588e 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,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator unary-() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 c64598e..613588e 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,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   operator unary-() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.expect
index 75032d8..dfdf7a3 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method g() → core::bool
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.transformed.expect
index 75032d8..dfdf7a3 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method g() → core::bool
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 0743802..e7b3ed6 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method g() → core::bool
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 0743802..e7b3ed6 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method g() → core::bool
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.expect
index a3d8939..9ed9652 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method g() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.transformed.expect
index a3d8939..9ed9652 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method g() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 79e16c1..3c19b4c 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,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method g() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 79e16c1..3c19b4c 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,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method g() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.expect
index bb3c248..2966442 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method g() → core::bool
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.transformed.expect
index bb3c248..2966442 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method g() → core::bool
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 5ab65b6..8d26a6d 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method g() → core::bool
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 5ab65b6..8d26a6d 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method g() → core::bool
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.expect
index 9a8b19e..b45af60 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method g() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.transformed.expect
index 9a8b19e..b45af60 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method g() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 70ba254..a0ada8f 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,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method g() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 70ba254..a0ada8f 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,14 +3,14 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method g() → core::bool
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.expect
index 4332bc1..f91ac8f 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.expect
@@ -7,7 +7,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.transformed.expect
index 4332bc1..f91ac8f 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
   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) → void
+  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
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 261820d..290276b 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
@@ -7,7 +7,7 @@
   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) → void
+  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
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 261820d..290276b 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
@@ -7,7 +7,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.expect
index c0ae894..33f8ee3 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.expect
@@ -7,7 +7,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.transformed.expect
index c0ae894..33f8ee3 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
   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) → void
+  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
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 9a4f8b8..c8a8092 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
@@ -7,7 +7,7 @@
   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) → void
+  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
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 9a4f8b8..c8a8092 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
@@ -7,7 +7,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.expect
index 490371e..be8f7a1 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static final field dynamic f = (core::bool b) → dynamic => (core::int i) → dynamic => <dynamic, dynamic>{i: b};
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.transformed.expect
index 490371e..be8f7a1 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static final field dynamic f = (core::bool b) → dynamic => (core::int i) → dynamic => <dynamic, dynamic>{i: b};
-  synthetic constructor •() → void
+  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 c459ad5..6162611 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  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 c459ad5..6162611 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.expect
index aa8b441..4898b62 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static final field dynamic f = (core::bool b) → dynamic => b;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.transformed.expect
index aa8b441..4898b62 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static final field dynamic f = (core::bool b) → dynamic => b;
-  synthetic constructor •() → void
+  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 ae3f2bd..434644d 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static final field (core::bool) → core::bool f = (core::bool b) → core::bool => b;
-  synthetic constructor •() → void
+  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 ae3f2bd..434644d 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static final field (core::bool) → core::bool f = (core::bool b) → core::bool => b;
-  synthetic constructor •() → void
+  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.direct.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.direct.expect
index 540dd5f..711976d 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static final field dynamic f = (core::bool b) → dynamic => 1;
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.direct.transformed.expect
index 540dd5f..711976d 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static final field dynamic f = (core::bool b) → dynamic => 1;
-  synthetic constructor •() → void
+  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 d46f057..469e2ac 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static final field (core::bool) → core::int f = (core::bool b) → core::int => 1;
-  synthetic constructor •() → void
+  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 d46f057..469e2ac 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   static final field (core::bool) → core::int f = (core::bool b) → core::int => 1;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.expect
index 409a001..d095776 100644
--- a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.expect
@@ -4,18 +4,18 @@
 
 class I1 extends core::Object {
   final field dynamic x = self::y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get x() → core::int
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.transformed.expect
index 409a001..d095776 100644
--- a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.transformed.expect
@@ -4,18 +4,18 @@
 
 class I1 extends core::Object {
   final field dynamic x = self::y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get x() → core::int
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 a280f12..463eb9d 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,16 +4,16 @@
 
 class I1 extends core::Object {
   final field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     ;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     ;
   abstract get x() → core::num;
 }
 class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   get x() → core::int
     ;
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 cc07a53..b9af143 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
@@ -4,18 +4,18 @@
 
 class I1 extends core::Object {
   final field core::int x = self::y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get x() → core::int
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 cc07a53..b9af143 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
@@ -4,18 +4,18 @@
 
 class I1 extends core::Object {
   final field core::int x = self::y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get x() → core::int
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.expect
index eb85185..61f6a8c 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B<core::List<self::A::T>> b) → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.transformed.expect
index eb85185..61f6a8c 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B<core::List<self::A::T>> b) → void
+  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 •() → void
+  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 fdd5f51..f7a2720 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B<core::List<self::A::T>> b) → void
+  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 •() → void
+  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 c5b34ab..80c04a5 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B<core::List<self::A::T>> b) → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
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 c5b34ab..80c04a5 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B<core::List<self::A::T>> b) → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect
index 003db25..d407e0c 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
@@ -12,7 +12,7 @@
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.transformed.expect
index 003db25..d407e0c 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
@@ -12,7 +12,7 @@
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method test() → void {
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 425d634..117d4e6 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
     ;
@@ -11,7 +11,7 @@
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   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 5f9428d..16af23e 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
@@ -12,7 +12,7 @@
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method test() → void {
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 5f9428d..16af23e 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
@@ -12,7 +12,7 @@
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect
index 254d3c1..b968cb9 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.transformed.expect
index 254d3c1..b968cb9 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
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 2ec6364..ce9dfe1 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f<U extends core::Object = dynamic>(self::C::f::U x) → (self::C::T) → void
     ;
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 e9adaf2..7f6f096 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
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 e9adaf2..7f6f096 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.expect
index e7c62a1..b55b370 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.transformed.expect
index e7c62a1..b55b370 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 57b9777..aa9510c 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class B<T extends self::A<core::int> = self::A<core::int>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 57b9777..aa9510c 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class B<T extends self::A<core::int> = self::A<core::int>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.expect
index 38b7a42..c01d4ae 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.transformed.expect
index 38b7a42..c01d4ae 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
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 42ff84b..112ffea 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
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 42ff84b..112ffea 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.expect
index dfb57c4..cbbb55c 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.transformed.expect
index dfb57c4..cbbb55c 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
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 ad11219..9272b7b 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
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 ad11219..9272b7b 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect
index d78301f..d772694 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect
index d78301f..d772694 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 006a1e5..82c885b 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 006a1e5..82c885b 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.expect
index d78301f..d772694 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.transformed.expect
index d78301f..d772694 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 006a1e5..82c885b 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 006a1e5..82c885b 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.expect
index cbe8ecd..1d5a60e 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.transformed.expect
index cbe8ecd..1d5a60e 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 ab4b6a5..dd20b0e 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.transformed.expect
index ab4b6a5..dd20b0e 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.expect
index 83feed9..accd766 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.transformed.expect
index 83feed9..accd766 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
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 9efc5a7..27f7bc8 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
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 9efc5a7..27f7bc8 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.expect
index b4bf7c0..96f852d 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends self::A = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.transformed.expect
index b4bf7c0..96f852d 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends self::A = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
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 e97dd63..852e3da 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends self::A = self::A> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
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 e97dd63..852e3da 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends self::A = self::A> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.expect
index 5513c11..e89d29c 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
-  constructor •(self::C::T t) → void
+  constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.transformed.expect
index 5513c11..e89d29c 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
-  constructor •(self::C::T t) → void
+  constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
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 883eda4..9c807e8 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T t;
-  constructor •(self::C::T t) → void
+  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 a8b5a97..95c44af 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → void
+  constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
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 a8b5a97..95c44af 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → void
+  constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.expect
index 0216b64..9740119 100644
--- a/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(core::Object o) → void {
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.transformed.expect
index 0216b64..9740119 100644
--- a/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(core::Object o) → void {
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 abefdcc..10fde61 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,16 +3,16 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
   field self::A a;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method f(core::Object o) → void
     ;
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 0216b64..9740119 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,18 +3,18 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(core::Object o) → void {
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 0216b64..9740119 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,18 +3,18 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(core::Object o) → void {
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.expect
index faa9af9..dec508c 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.transformed.expect
index faa9af9..dec508c 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
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 100098d..dc872ca 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
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 100098d..dc872ca 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.expect
index 9812401..91902c1 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.transformed.expect
index 9812401..91902c1 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
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 03106b1..3861ee2 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
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 03106b1..3861ee2 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.expect
index ed2b11c..b676758 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.transformed.expect
index ed2b11c..b676758 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
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 62f476b..0d59836 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
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 62f476b..0d59836 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.expect
index eb7c958..ce9f3bd 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.transformed.expect
index eb7c958..ce9f3bd 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
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 ede5169..6071d71 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
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 ede5169..6071d71 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.expect
index b56f103..2b74a3c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.expect
@@ -1,26 +1,46 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
 abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.transformed.expect
index 985fb07..efe2831 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.transformed.expect
@@ -1,19 +1,29 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
@@ -23,7 +33,7 @@
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
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 43c1de6..d6a6b09 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
@@ -1,23 +1,33 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
     ;
 }
 class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1
     ;
 }
 abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  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 46148e92..f14a24e 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
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
 abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::String> {
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
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 149f1f7..b3431bb 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
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
@@ -23,7 +23,7 @@
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.expect
index afaa901..8806757 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.expect
@@ -1,26 +1,46 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
 abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.transformed.expect
index 76f85c6..c83593f 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.transformed.expect
@@ -1,19 +1,29 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
@@ -23,7 +33,7 @@
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
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 715d575..8ddb8d9 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
@@ -1,23 +1,33 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
     ;
 }
 class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1
     ;
 }
 abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  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 4df303d..00eadbe 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
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
 abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::int> {
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
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 49745bb..10ccc25 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
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
@@ -23,7 +23,7 @@
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.expect
index 8d308b9..fe9bccc 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.expect
@@ -1,26 +1,46 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
 abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.transformed.expect
index 4b68fa6..4079304 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.transformed.expect
@@ -1,19 +1,29 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
@@ -23,7 +33,7 @@
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
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 df1859b..1c545f2 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
@@ -1,23 +1,33 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M1 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
     ;
 }
 class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1
     ;
 }
 abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  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 661c0f5..d731a05 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
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
 abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::Comparable<dynamic>> {
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
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 b13c5c1..906bdda 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
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
@@ -23,7 +23,7 @@
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.expect
index b84a7e5e..62b8b77 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.expect
@@ -1,38 +1,74 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::X>
     : super core::Object::•()
     ;
 }
 class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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> {
 }
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
 class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M2
     : super self::M1::•()
     ;
 }
 abstract class _A&M2&M0 = self::M2 with self::M0<dynamic, dynamic> {
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M2::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.transformed.expect
index 2feb2bd..6a44e02 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.transformed.expect
@@ -1,14 +1,32 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::X>
     : super core::Object::•()
     ;
 }
 class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::J<self::J::X>
     : super core::Object::•()
     ;
 }
@@ -18,17 +36,17 @@
     ;
 }
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
 class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M2
     : super self::M1::•()
     ;
 }
@@ -38,7 +56,7 @@
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M2::•()
     ;
 }
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 6ea16975..2b6191b 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
@@ -1,33 +1,51 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
+// class A extends M2 with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::X>
     ;
 }
 class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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> {
 }
 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 •() → void
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
     ;
 }
 class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1
     ;
 }
 class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M2
     ;
 }
 abstract class _A&M2&M0 = self::M2 with self::M0<dynamic, dynamic> {
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → void
+  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 d395781..bde2a16 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
@@ -3,36 +3,36 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::X>
     : super core::Object::•()
     ;
 }
 class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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> {
 }
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
 class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M2
     : super self::M1::•()
     ;
 }
 abstract class _A&M2&M0 = self::M2 with self::M0<core::int, core::double> {
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M2::•()
     ;
 }
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 9173943..6dd6533 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::X>
     : super core::Object::•()
     ;
 }
 class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::J<self::J::X>
     : super core::Object::•()
     ;
 }
@@ -18,17 +18,17 @@
     ;
 }
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
 class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M2
     : super self::M1::•()
     ;
 }
@@ -38,7 +38,7 @@
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M2::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.expect
index 5328a92..88892c7 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.expect
@@ -1,31 +1,51 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
+// class A extends M2<int> with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
+// class A extends M2<int> with M0 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
+// class A extends M2<int> with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
+// class A extends M2<int> with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M2<self::M2::T>
     : super self::M1::•()
     ;
 }
 abstract class _A&M2&M0 = self::M2<core::int> with self::M0<dynamic> {
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M2::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.transformed.expect
index bcf0add..d155a9b 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.transformed.expect
@@ -1,24 +1,34 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
+// class A extends M2<int> with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
+// class A extends M2<int> with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M2<self::M2::T>
     : super self::M1::•()
     ;
 }
@@ -28,7 +38,7 @@
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M2::•()
     ;
 }
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 e08bdb7..b6d579f 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
@@ -1,27 +1,37 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
+// class A extends M2<int> with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
+// class A extends M2<int> with M0 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::X>
     ;
 }
 class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M0<self::M0::T>
     ;
 }
 class M1<T extends core::Object = dynamic> extends self::I<core::List<self::M1::T>> {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::M2<self::M2::T>
     ;
 }
 abstract class _A&M2&M0 = self::M2<core::int> with self::M0<dynamic> {
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → void
+  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 83ed933..c7a68c1 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
@@ -3,29 +3,29 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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>> {
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M2::•()
     ;
 }
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 274d765..32fe1c1 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
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M2<self::M2::T>
     : super self::M1::•()
     ;
 }
@@ -28,7 +28,7 @@
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M2::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.expect
index 99b8e77..e10dc53 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.expect
@@ -1,26 +1,46 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super self::I::•()
     ;
 }
 abstract class _A&M0&M1 = self::M0<core::int> with self::M1<dynamic> {
 }
 class A extends self::_A&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.transformed.expect
index f099c87..e79ea32 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.transformed.expect
@@ -1,19 +1,29 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super self::I::•()
     ;
 }
@@ -23,7 +33,7 @@
     ;
 }
 class A extends self::_A&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M0::•()
     ;
 }
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 faaabfd..e877a3c 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
@@ -1,23 +1,33 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::X>
     ;
 }
 class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M0<self::M0::T>
     ;
 }
 class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     ;
 }
 abstract class _A&M0&M1 = self::M0<core::int> with self::M1<dynamic> {
 }
 class A extends self::_A&M0&M1 {
-  synthetic constructor •() → void
+  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 2c2aa5c..b27aa2e 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
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super self::I::•()
     ;
 }
 abstract class _A&M0&M1 = self::M0<core::int> with self::M1<core::int> {
 }
 class A extends self::_A&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M0::•()
     ;
 }
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 701b84c..6bfe384 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
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super self::I::•()
     ;
 }
@@ -23,7 +23,7 @@
     ;
 }
 class A extends self::_A&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.expect
index 708e099..0407ee4 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.expect
@@ -1,24 +1,52 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M2<self::M2::T>
     : super self::I::•()
     ;
 }
@@ -27,7 +55,7 @@
 abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<dynamic> {
 }
 class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.transformed.expect
index 07fd39a..73a163a 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.transformed.expect
@@ -1,24 +1,38 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M2<self::M2::T>
     : super self::I::•()
     ;
 }
@@ -33,7 +47,7 @@
     ;
 }
 class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M0::•()
     ;
 }
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 d20ff99..dc07f79 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
@@ -1,21 +1,35 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// class A extends M0<int> with M1, M2 {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::X>
     ;
 }
 class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M0<self::M0::T>
     ;
 }
 class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     ;
 }
 class M2<T extends core::Object = dynamic> extends self::I<self::M2::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M2<self::M2::T>
     ;
 }
 abstract class _A&M0&M1 = self::M0<core::int> with self::M1<dynamic> {
@@ -23,7 +37,7 @@
 abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<dynamic> {
 }
 class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → void
+  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 cea7021..7f16875 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
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M2<self::M2::T>
     : super self::I::•()
     ;
 }
@@ -27,7 +27,7 @@
 abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<core::int> {
 }
 class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M0::•()
     ;
 }
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 d8aadbfc..b445d8d 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
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M2<self::M2::T>
     : super self::I::•()
     ;
 }
@@ -33,7 +33,7 @@
     ;
 }
 class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart
index bfa0a72..001083d 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart
@@ -12,6 +12,7 @@
 
 // M0 is inferred as M0<dynamic>
 // Error since class hierarchy is inconsistent
-class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
+class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+    extends Object with M0, M1<int> {}
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect
index 29c18e5..e6fbb26 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect
@@ -1,31 +1,39 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super self::I::•()
     ;
 }
@@ -34,7 +42,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int> {
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect
index 632df5b..c36278c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect
@@ -1,25 +1,29 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super self::I::•()
     ;
 }
@@ -34,7 +38,7 @@
     ;
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 8408785..f44b0a8 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
@@ -1,23 +1,27 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::M0<self::M0::T>
     ;
 }
 class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
@@ -25,7 +29,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int> {
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  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 29c18e5..e6fbb26 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
@@ -1,31 +1,39 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1<int> {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super self::I::•()
     ;
 }
@@ -34,7 +42,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int> {
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect
index baad424..1b5aced 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect
@@ -15,17 +15,17 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super self::I::•()
     ;
 }
@@ -34,7 +34,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
 }
 class A extends self::_A&Object&M0&M1 implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect
index 7287640..52bc459 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect
@@ -9,17 +9,17 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super self::I::•()
     ;
 }
@@ -34,7 +34,7 @@
     ;
 }
 class A extends self::_A&Object&M0&M1 implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 193de30..0ecc559 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
@@ -9,15 +9,15 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::M0<self::M0::T>
     ;
 }
 class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
@@ -25,7 +25,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
 }
 class A extends self::_A&Object&M0&M1 implements self::I<core::int> {
-  synthetic constructor •() → void
+  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 baad424..1b5aced 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
@@ -15,17 +15,17 @@
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super self::I::•()
     ;
 }
@@ -34,7 +34,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
 }
 class A extends self::_A&Object&M0&M1 implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart
index b733915..002c659 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart
@@ -12,6 +12,7 @@
 
 // M0 inferred as M0<String>
 // M1 inferred as M1<int>
-class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
+class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+    extends Object with M0, M1 {}
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect
index 87ea24c..27a0346 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect
@@ -1,31 +1,39 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super core::Object::•()
     ;
 }
@@ -34,7 +42,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect
index 9dee1ed..4f0d0dc 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect
@@ -1,25 +1,29 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super core::Object::•()
     ;
 }
@@ -34,7 +38,7 @@
     ;
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 53cd60a..9e822e9 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
@@ -1,23 +1,27 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
@@ -25,7 +29,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  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 87ea24c..27a0346 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
@@ -1,31 +1,39 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super core::Object::•()
     ;
 }
@@ -34,7 +42,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart
index 0c7aa07..ecff4ec 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart
@@ -16,6 +16,7 @@
 // U0 = List<U1>
 // U1 = List<U0>
 // which has no finite solution
-class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
+class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+    extends Object with M0, M1 {}
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect
index 037f589..0f2fae3 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect
@@ -1,31 +1,39 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super core::Object::•()
     ;
 }
@@ -34,7 +42,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect
index 55e34e4..87250ef 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect
@@ -1,25 +1,29 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super core::Object::•()
     ;
 }
@@ -34,7 +38,7 @@
     ;
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 f54fe8d..c18634f 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
@@ -1,23 +1,27 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
@@ -25,7 +29,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  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 037f589..0f2fae3 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
@@ -1,31 +1,39 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:38: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object with M0, M1 {}
-//                                      ^
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::M1<self::M1::T>
     : super core::Object::•()
     ;
 }
@@ -34,7 +42,7 @@
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
 }
 class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.expect
index 3526479..56fd49a 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.expect
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
   get v1() → self::Bar<self::Foo::T>
@@ -27,7 +27,7 @@
     return <dynamic, dynamic>{};
 }
 class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.transformed.expect
index 3526479..56fd49a 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
   get v1() → self::Bar<self::Foo::T>
@@ -27,7 +27,7 @@
     return <dynamic, dynamic>{};
 }
 class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  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 96fab41..737a958 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     ;
   get v1() → self::Bar<self::Foo::T>
     ;
@@ -26,7 +26,7 @@
     ;
 }
 class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar<self::Bar::T>
     ;
 }
 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 b943f9f..b3e0f8e 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
   get v1() → self::Bar<self::Foo::T>
@@ -27,7 +27,7 @@
     return <self::Foo::T, (self::Foo::T) → self::Foo::T>{};
 }
 class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  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 b943f9f..b3e0f8e 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
   get v1() → self::Bar<self::Foo::T>
@@ -27,7 +27,7 @@
     return <self::Foo::T, (self::Foo::T) → self::Foo::T>{};
 }
 class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.expect b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.expect
index dab4a13..3820a61 100644
--- a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.transformed.expect
index dab4a13..3820a61 100644
--- a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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 b5e6361..f835c21 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 •() → void
+  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 dab4a13..3820a61 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 •() → void
+  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 dab4a13..3820a61 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.expect b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.expect
index 68554e9..441493f 100644
--- a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.transformed.expect
index 68554e9..441493f 100644
--- a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
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 29f71f7..9f282f1 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method f() → core::int
     ;
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 1fc9581..393089c 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
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 1fc9581..393089c 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.expect b/pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.expect
index 4b22e8a..c95dc59 100644
--- a/pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.transformed.expect
index 4b22e8a..c95dc59 100644
--- a/pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 843c59a..b3a2501 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static method f(self::C c) → void
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 d8a523e..5e197d9 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 d8a523e..5e197d9 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 2123d29..bf42edb 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class NullEquality extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::NullEquality
     ;
   operator ==(core::Object other) → core::Null
     ;
 }
 class SubNullEquality extends self::NullEquality {
-  synthetic constructor •() → void
+  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 5f3bb3f..fe2d4a0 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class NullEquality extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::NullEquality
     : super core::Object::•()
     ;
   @core::override
@@ -11,7 +11,7 @@
     return null;
 }
 class SubNullEquality extends self::NullEquality {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::SubNullEquality
     : super self::NullEquality::•()
     ;
   method test() → void {
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 5f3bb3f..fe2d4a0 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,7 +3,7 @@
 import "dart:core" as core;
 
 class NullEquality extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::NullEquality
     : super core::Object::•()
     ;
   @core::override
@@ -11,7 +11,7 @@
     return null;
 }
 class SubNullEquality extends self::NullEquality {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::SubNullEquality
     : super self::NullEquality::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.expect
index b8a8312..2ec0b95 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor optional(([self::C::T]) → void func) → void
+  constructor optional(([self::C::T]) → void func) → self::C<self::C::T>
     : super core::Object::•() {}
-  constructor named(({x: self::C::T}) → void func) → void
+  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 {}
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.transformed.expect
index b8a8312..2ec0b95 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.transformed.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor optional(([self::C::T]) → void func) → void
+  constructor optional(([self::C::T]) → void func) → self::C<self::C::T>
     : super core::Object::•() {}
-  constructor named(({x: self::C::T}) → void func) → void
+  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 {}
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 08422b2..adfc05a 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
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor optional(([self::C::T]) → void func) → void
+  constructor optional(([self::C::T]) → void func) → self::C<self::C::T>
     ;
-  constructor named(({x: self::C::T}) → void func) → void
+  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 8ac8dc0..5d1cc0f 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
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor optional(([self::C::T]) → void func) → void
+  constructor optional(([self::C::T]) → void func) → self::C<self::C::T>
     : super core::Object::•() {}
-  constructor named(({x: self::C::T}) → void func) → void
+  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 {}
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 8ac8dc0..5d1cc0f 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
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor optional(([self::C::T]) → void func) → void
+  constructor optional(([self::C::T]) → void func) → self::C<self::C::T>
     : super core::Object::•() {}
-  constructor named(({x: self::C::T}) → void func) → void
+  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 {}
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.direct.expect
index 793b217..a252b52 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   abstract method bar() → void;
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.direct.transformed.expect
index 793b217..a252b52 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   abstract method bar() → void;
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 040b762..f224b46 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract method foo() → void;
 }
 abstract class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   abstract method bar() → void;
 }
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 0c5b98a..a8a5d1d 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   abstract method bar() → void;
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 0c5b98a..a8a5d1d 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,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   abstract method bar() → void;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.expect
index bf0bbce..2b18c7f 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.transformed.expect
index bf0bbce..2b18c7f 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 54fd2f2..704665f 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 54fd2f2..704665f 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.expect
index bf0bbce..2b18c7f 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.transformed.expect
index bf0bbce..2b18c7f 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 ce0e7d1..2c346f0 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 ce0e7d1..2c346f0 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.expect
index 7fd4435..6c7bfc8 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.transformed.expect
index 7fd4435..6c7bfc8 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 592da28..e390fd9 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,7 +16,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 cc1778f..0af35ab 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int x = 2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.expect
index 82372f9..5b5ae81 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.expect
@@ -4,25 +4,25 @@
 
 class A extends core::Object {
   field core::int x = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field self::A a = new self::A::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::B b = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
   field self::C c = new self::C::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.transformed.expect
index 82372f9..5b5ae81 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.transformed.expect
@@ -4,25 +4,25 @@
 
 class A extends core::Object {
   field core::int x = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field self::A a = new self::A::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::B b = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
   field self::C c = new self::C::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
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 b349989..0c20d71 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
@@ -4,25 +4,25 @@
 
 class A extends core::Object {
   field core::int x = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field self::A a = new self::A::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::B b = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
   field self::C c = new self::C::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
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 b349989..0c20d71 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
@@ -4,25 +4,25 @@
 
 class A extends core::Object {
   field core::int x = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field self::A a = new self::A::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::B b = new self::B::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
   field self::C c = new self::C::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.expect
index e9e9772..25b8252 100644
--- a/pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int field = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get getter() → core::int
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.transformed.expect
index e9e9772..25b8252 100644
--- a/pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int field = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get getter() → core::int
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 32aed55..2039f33 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   get getter() → core::int
     ;
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 5d01eef..194ddd1 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int field = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get getter() → core::int
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 5d01eef..194ddd1 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int field = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get getter() → core::int
diff --git a/pkg/front_end/testcases/inference/property_set.dart.direct.expect b/pkg/front_end/testcases/inference/property_set.dart.direct.expect
index f50e2b3..27f48700 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   set y(core::List<self::A::T> value) → void {}
diff --git a/pkg/front_end/testcases/inference/property_set.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/property_set.dart.direct.transformed.expect
index f50e2b3..27f48700 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   set y(core::List<self::A::T> value) → void {}
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 c3e10a3..f8ea57e 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::T> x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
   set y(core::List<self::A::T> value) → void
     ;
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 7dc30e5..c9ffbd9 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field core::List<self::A::T> x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   set y(generic-covariant-impl core::List<self::A::T> value) → void {}
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 7dc30e5..c9ffbd9 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
@@ -4,7 +4,7 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field core::List<self::A::T> x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   set y(generic-covariant-impl core::List<self::A::T> value) → void {}
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect
index 0a6b99f..32b943a 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(dynamic #synthetic) → void
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.transformed.expect
index 48cc6c8..6689f51 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(dynamic #synthetic) → void
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 c019f65..1f080fc 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   set x(dynamic #synthetic) → void
     ;
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 0b9f2cd..0c7ff74c 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
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(dynamic #synthetic) → void
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 c463475..1fc67b8 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set x(dynamic #synthetic) → void
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.expect
index 06e16af..1a2885a 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(core::double b) → void {
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.transformed.expect
index 06e16af..1a2885a 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(core::double b) → void {
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 2cc58d7..4798570 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(core::double b) → void {
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 2cc58d7..4798570 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(core::double b) → void {
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.expect
index 4b188010..2582978 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(core::int b) → void {
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.transformed.expect
index 4b188010..2582978 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(core::int b) → void {
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 8b98b06..beb87c4 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(core::int b) → void {
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 8b98b06..beb87c4 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(core::int b) → void {
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.expect
index fbd611f..41053f4 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(self::C::T b) → void {
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.transformed.expect
index fbd611f..41053f4 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = dynamic> extends core::Object {
   field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(self::C::T b) → void {
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 0f7e150..0a737f2 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(generic-covariant-impl self::C::T b) → void {
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 0f7e150..0a737f2 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::num = core::num> extends core::Object {
   generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method op(generic-covariant-impl self::C::T b) → void {
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.direct.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.direct.expect
index 7fe0689..e0cd00f 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::int value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   set x(core::int value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(dynamic value) → dynamic {}
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.direct.transformed.expect
index 7fe0689..e0cd00f 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::int value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   set x(core::int value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(dynamic value) → 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 29a3eb6..5052808 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,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   set x(core::int value) → dynamic
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   set x(core::int value) → void
     ;
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   set x(dynamic value) → 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 7e46a78..7e9ace6 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,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::int value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   set x(core::int value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(core::int value) → void {}
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 7e46a78..7e9ace6 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,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::int value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   set x(core::int value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(core::int value) → void {}
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.expect
index 1b6aeac..414add8 100644
--- a/pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static method f(core::String s) → core::int
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.transformed.expect
index 1b6aeac..414add8 100644
--- a/pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static method f(core::String s) → core::int
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 f39269c..a5d09a8 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static method f(core::String s) → core::int
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 f39269c..a5d09a8 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static method f(core::String s) → core::int
diff --git a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.expect b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.expect
index 1eda6bb..cadde27 100644
--- a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::List<core::num> x = <dynamic>[0];
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.transformed.expect
index 1eda6bb..cadde27 100644
--- a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::List<core::num> x = <dynamic>[0];
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 7e7ee84..0f4e3eb 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::List<core::num> x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static field core::List<core::num> y;
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 1dd089b..8ce1794 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::List<core::num> x = <core::num>[0];
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 1dd089b..8ce1794 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::List<core::num> x = <core::num>[0];
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.direct.expect b/pkg/front_end/testcases/inference/super_index_set.dart.direct.expect
index 0134a2a..4ce9e5d 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator []=(core::int x, core::String y) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   operator []=(core::Object x, core::Object y) → void {}
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_index_set.dart.direct.transformed.expect
index 0134a2a..4ce9e5d 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator []=(core::int x, core::String y) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   operator []=(core::Object x, core::Object y) → void {}
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 95d7070..77116ab 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator []=(core::int x, core::String y) → void
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   operator []=(core::Object x, core::Object y) → void
     ;
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 defc412..81b2549f 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator []=(core::int x, core::String y) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   operator []=(core::Object x, core::Object y) → void {}
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 defc412..81b2549f 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator []=(core::int x, core::String y) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   operator []=(core::Object x, core::Object y) → void {}
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.expect
index 22405f9..778ae64 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.expect
@@ -4,13 +4,13 @@
 import "dart:async" as asy;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   operator []=(core::Map<core::int, self::B::T> x, core::List<self::B::T> y) → void {}
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   operator []=(core::Object x, core::Object y) → void {}
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.transformed.expect
index 22405f9..778ae64 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.transformed.expect
@@ -4,13 +4,13 @@
 import "dart:async" as asy;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   operator []=(core::Map<core::int, self::B::T> x, core::List<self::B::T> y) → void {}
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   operator []=(core::Object x, core::Object y) → void {}
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 e45d970..d6e96c8 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
@@ -4,13 +4,13 @@
 import "dart:async" as asy;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
   operator []=(core::Map<core::int, self::B::T> x, core::List<self::B::T> y) → void
     ;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     ;
   operator []=(core::Object x, core::Object y) → void
     ;
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 94c942a..2cbc33d 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
@@ -4,13 +4,13 @@
 import "dart:async" as asy;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   operator []=(generic-covariant-impl core::Object x, generic-covariant-impl core::Object y) → void {}
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 94c942a..2cbc33d 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
@@ -4,13 +4,13 @@
 import "dart:async" as asy;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   operator []=(generic-covariant-impl core::Object x, generic-covariant-impl core::Object y) → void {}
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.direct.expect b/pkg/front_end/testcases/inference/super_initializer.dart.direct.expect
index f973b94..53ff637 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends self::B {
-  constructor •() → void
+  constructor •() → self::C
     : super self::B::•(self::f<dynamic>())
     ;
 }
 class B extends core::Object {
-  constructor •(core::int x) → void
+  constructor •(core::int x) → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_initializer.dart.direct.transformed.expect
index f973b94..53ff637 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends self::B {
-  constructor •() → void
+  constructor •() → self::C
     : super self::B::•(self::f<dynamic>())
     ;
 }
 class B extends core::Object {
-  constructor •(core::int x) → void
+  constructor •(core::int x) → self::B
     : super core::Object::•()
     ;
 }
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 e148d16..45ea299 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends self::B {
-  constructor •() → void
+  constructor •() → self::C
     ;
 }
 class B extends core::Object {
-  constructor •(core::int x) → void
+  constructor •(core::int x) → self::B
     ;
 }
 static method f<T extends core::Object = dynamic>() → self::f::T
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 c0a9963..259b742 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends self::B {
-  constructor •() → void
+  constructor •() → self::C
     : super self::B::•(self::f<core::int>())
     ;
 }
 class B extends core::Object {
-  constructor •(core::int x) → void
+  constructor •(core::int x) → self::B
     : super core::Object::•()
     ;
 }
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 c0a9963..259b742 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,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends self::B {
-  constructor •() → void
+  constructor •() → self::C
     : super self::B::•(self::f<core::int>())
     ;
 }
 class B extends core::Object {
-  constructor •(core::int x) → void
+  constructor •(core::int x) → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.expect
index 349bb55..54c17dc 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T t) → void
+  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 •() → void
+  constructor •() → self::C<self::C::U>
     : super self::B::•(self::f<dynamic>())
     ;
 }
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.transformed.expect
index 349bb55..54c17dc 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T t) → void
+  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 •() → void
+  constructor •() → self::C<self::C::U>
     : super self::B::•(self::f<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 c748dab..fae46ae 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T t) → void
+  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 •() → void
+  constructor •() → self::C<self::C::U>
     ;
 }
 static method f<T extends core::Object = dynamic>() → self::f::T
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 f357c51..5a07b9c 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T t) → void
+  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 •() → void
+  constructor •() → self::C<self::C::U>
     : super self::B::•(self::f<core::List<self::C::U>>())
     ;
 }
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 f357c51..5a07b9c 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T t) → void
+  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 •() → void
+  constructor •() → self::C<self::C::U>
     : super self::B::•(self::f<core::List<self::C::U>>())
     ;
 }
diff --git a/pkg/front_end/testcases/inference/super_method_invocation.dart.direct.expect b/pkg/front_end/testcases/inference/super_method_invocation.dart.direct.expect
index 8cab747..96ef81c 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_method_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_method_invocation.dart.direct.transformed.expect
index 8cab747..96ef81c 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 2b44b40..6a98115 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 •() → void
+  synthetic constructor •() → self::C
     ;
   method f() → core::int
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 ee81a01..e80bf31 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method g() → void {
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 ee81a01..e80bf31 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.expect
index 31245d1..8e95ed1 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.expect
@@ -4,24 +4,24 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method g(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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   method g(core::Object x) → self::E<asy::Future<self::C::U>>
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.transformed.expect
index 31245d1..8e95ed1 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.transformed.expect
@@ -4,24 +4,24 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method g(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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   method g(core::Object x) → self::E<asy::Future<self::C::U>>
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 0186853..42544c1 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
@@ -4,21 +4,21 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::T>
     ;
 }
 class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E<self::E::T>
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
   method g(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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     ;
   method g(core::Object x) → self::E<asy::Future<self::C::U>>
     ;
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 e6c9733..3c47c55 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
@@ -4,24 +4,24 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>
     return null;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → void
+  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>>
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 e6c9733..3c47c55 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
@@ -4,24 +4,24 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>
     return null;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → void
+  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>>
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_get.dart.direct.expect
index b924b6f..0620b0b 100644
--- a/pkg/front_end/testcases/inference/super_property_get.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_property_get.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field dynamic x = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_get.dart.direct.transformed.expect
index b924b6f..0620b0b 100644
--- a/pkg/front_end/testcases/inference/super_property_get.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field dynamic x = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 f50036c..85fa11e 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 •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 5b8b0df..2dfb475 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
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field core::int x = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method g() → void {
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 5b8b0df..2dfb475 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
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field core::int x = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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.direct.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.direct.expect
index 979a599..5a8878f 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field dynamic f = () → dynamic => 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.direct.transformed.expect
index 979a599..5a8878f 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field dynamic f = () → dynamic => 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 513c5d6..600003c 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 •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 7b98ac9..443bec8 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
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field () → core::int f = () → core::int => 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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.strong.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.strong.transformed.expect
index 7b98ac9..443bec8 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
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field () → core::int f = () → core::int => 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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.direct.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.direct.expect
index 6be1419..8a5e9c2 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class CallableClass extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::CallableClass
     : super core::Object::•()
     ;
   method call() → core::int
@@ -11,12 +11,12 @@
 }
 class C extends core::Object {
   field dynamic f = new self::CallableClass::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.direct.transformed.expect
index 6be1419..8a5e9c2 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class CallableClass extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::CallableClass
     : super core::Object::•()
     ;
   method call() → core::int
@@ -11,12 +11,12 @@
 }
 class C extends core::Object {
   field dynamic f = new self::CallableClass::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 3371811..1cb2b4d 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 •() → void
+  synthetic constructor •() → self::CallableClass
     ;
   method call() → core::int
     ;
 }
 class C extends core::Object {
   field dynamic f;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 8fa0de6..9127b67 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,7 +3,7 @@
 import "dart:core" as core;
 
 class CallableClass extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::CallableClass
     : super core::Object::•()
     ;
   method call() → core::int
@@ -11,12 +11,12 @@
 }
 class C extends core::Object {
   field self::CallableClass f = new self::CallableClass::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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.strong.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.strong.transformed.expect
index 8fa0de6..9127b67 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,7 +3,7 @@
 import "dart:core" as core;
 
 class CallableClass extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::CallableClass
     : super core::Object::•()
     ;
   method call() → core::int
@@ -11,12 +11,12 @@
 }
 class C extends core::Object {
   field self::CallableClass f = new self::CallableClass::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.expect
index a191aad..120a5be 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.expect
@@ -4,23 +4,23 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x = null;
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   get x() → self::E<asy::Future<self::C::U>>
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.transformed.expect
index a191aad..120a5be 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.transformed.expect
@@ -4,23 +4,23 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x = null;
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   get x() → self::E<asy::Future<self::C::U>>
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 5c18f14..5166d46 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
@@ -4,20 +4,20 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::T>
     ;
 }
 class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E<self::E::T>
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     ;
   get x() → self::E<asy::Future<self::C::U>>
     ;
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 91d89be..da8f484 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
@@ -4,23 +4,23 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   get x() → self::E<asy::Future<self::C::U>>
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 91d89be..da8f484 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
@@ -4,23 +4,23 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   get x() → self::E<asy::Future<self::C::U>>
diff --git a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.expect
index f878cdf..b002df5 100644
--- a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.transformed.expect
index f878cdf..b002df5 100644
--- a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 2b44b40..6a98115 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 •() → void
+  synthetic constructor •() → self::C
     ;
   method f() → core::int
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 71fd364..9ae5e9f 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method g() → void {
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 71fd364..9ae5e9f 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,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → core::int
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.expect
index df509d6..82217ec 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.expect
@@ -4,23 +4,23 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x = null;
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   get x() → self::E<asy::Future<self::C::U>>
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.transformed.expect
index df509d6..82217ec 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.transformed.expect
@@ -4,23 +4,23 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x = null;
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   get x() → self::E<asy::Future<self::C::U>>
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 aa354a1..f157db0 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
@@ -4,20 +4,20 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::T>
     ;
 }
 class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E<self::E::T>
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::D<self::B::T> x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     ;
   get x() → self::E<asy::Future<self::C::U>>
     ;
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 822c304..67484aa 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
@@ -4,23 +4,23 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   get x() → self::E<asy::Future<self::C::U>>
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 822c304..67484aa 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
@@ -4,23 +4,23 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   get x() → self::E<asy::Future<self::C::U>>
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.direct.expect b/pkg/front_end/testcases/inference/this_reference.dart.direct.expect
index bb11426..400f200 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f() → void {
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/this_reference.dart.direct.transformed.expect
index bb11426..400f200 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 26fb9e8..a387a4c 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 d2a5bd6..395a321 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f() → void {
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 d2a5bd6..395a321 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f() → void {
diff --git a/pkg/front_end/testcases/inference/try_catch.dart.direct.expect b/pkg/front_end/testcases/inference/try_catch.dart.direct.expect
index b39e7c9..93f3086 100644
--- a/pkg/front_end/testcases/inference/try_catch.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/try_catch.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/try_catch.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/try_catch.dart.direct.transformed.expect
index b39e7c9..93f3086 100644
--- a/pkg/front_end/testcases/inference/try_catch.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_catch.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
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 a8666ad..256d36b 100644
--- a/pkg/front_end/testcases/inference/try_catch.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/try_catch.dart.outline.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 static method test(() → void f) → void
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 98944f71..4e04e07 100644
--- a/pkg/front_end/testcases/inference/try_catch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/try_catch.dart.strong.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
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 98944f71..4e04e07 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,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/try_catch_finally.dart.direct.expect b/pkg/front_end/testcases/inference/try_catch_finally.dart.direct.expect
index f99d7ff..abb2f74 100644
--- a/pkg/front_end/testcases/inference/try_catch_finally.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/try_catch_finally.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/try_catch_finally.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/try_catch_finally.dart.direct.transformed.expect
index f99d7ff..abb2f74 100644
--- a/pkg/front_end/testcases/inference/try_catch_finally.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_catch_finally.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
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 a8666ad..256d36b 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,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 static method test(() → void f) → void
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 b68e248..0e79f65 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,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
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 b68e248..0e79f65 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,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.expect
index 6d36f68..85ad7c7 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends core::StackTrace {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::StackTrace::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.transformed.expect
index 6d36f68..85ad7c7 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends core::StackTrace {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::StackTrace::•()
     ;
 }
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 37019c2..1fc8319 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,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::StackTrace {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 static method test(() → void f) → void
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 0f2ef25..390e31c 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,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends core::StackTrace {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::StackTrace::•()
     ;
 }
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 0f2ef25..390e31c 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,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends core::StackTrace {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::StackTrace::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.direct.expect b/pkg/front_end/testcases/inference/type_cast.dart.direct.expect
index a69bbca..adf3531 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super self::A::•()
     ;
   method foo() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/type_cast.dart.direct.transformed.expect
index a69bbca..adf3531 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super self::A::•()
     ;
   method foo() → dynamic {}
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 626f607..6cb7e54 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
   method foo() → 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 cd505b4..289719f 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super self::A::•()
     ;
   method foo() → dynamic {}
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 cd505b4..289719f 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super self::A::•()
     ;
   method foo() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect
index 80fb1bd..fafdf1d 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect
@@ -25,7 +25,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.direct.transformed.expect
index 7b6dfaa..50d794f 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method test() → void {
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 5b2f1ca..9286df9 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method test() → void
     ;
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 f9ec341..d8ed4e6 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
@@ -47,7 +47,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.expect
index 75af777..bdd7979 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.transformed.expect
index 75af777..bdd7979 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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 89810b9..80ba6c8 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.transformed.expect
index 89810b9..80ba6c8 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.expect
index 7627c24..25a19cb 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.transformed.expect
index 7627c24..25a19cb 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.expect
index bbd32a9..79e526f 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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_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 bbd32a9..79e526f 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.expect
index 33065a8..3f4354e 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.transformed.expect
index 33065a8..3f4354e 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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 93ad8f7..183c40b 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.transformed.expect
index 93ad8f7..183c40b 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •(() → self::C::T x) → void
+  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_no_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.direct.expect
index 3f1628c..9fb7073 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → dynamic x) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.direct.transformed.expect
index 3f1628c..9fb7073 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → dynamic x) → void
+  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 eee08a4..b14a63e 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → dynamic x) → void
+  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.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.strong.transformed.expect
index eee08a4..b14a63e 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → dynamic x) → void
+  constructor •(() → dynamic x) → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.expect
index 3cdb4282..f304027 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.expect
@@ -8,10 +8,6 @@
 // pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Error: Expected an identifier, but got ')'.
 // var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
 //                                        ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Warning: Getter not found: ''.
-// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
-//                                        ^
 
 // Unhandled errors:
 //
@@ -28,7 +24,9 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(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>{})))).call(() → dynamic {
+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:40: Error: This couldn't be parsed.
+var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+                                       ^").call(() → dynamic {
   return 1;
 });
 static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.transformed.expect
index 1b87566..3b1f5af 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.transformed.expect
@@ -13,7 +13,9 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(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>{})))).call(() → dynamic {
+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:40: Error: This couldn't be parsed.
+var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+                                       ^").call(() → dynamic {
   return 1;
 });
 static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
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 03bbeef..c2f5ee2 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
@@ -8,10 +8,6 @@
 // pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Error: Expected an identifier, but got ')'.
 // var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
 //                                        ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Warning: Getter not found: ''.
-// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
-//                                        ^
 
 library test;
 import self as self;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.expect
index 461a75a..4565b79 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.expect
@@ -8,10 +8,6 @@
 // pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Error: Expected an identifier, but got ')'.
 // var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
 //                                    ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Warning: Getter not found: ''.
-// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
-//                                    ^
 
 // Unhandled errors:
 //
@@ -28,7 +24,9 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(core::int).>(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>{})))).call(() → dynamic {
+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:36: Error: This couldn't be parsed.
+var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+                                   ^").call(() → dynamic {
   return 1;
 });
 static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.transformed.expect
index 2af1d54..ddd2acd 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.transformed.expect
@@ -13,7 +13,9 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(core::int).>(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>{})))).call(() → dynamic {
+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:36: Error: This couldn't be parsed.
+var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+                                   ^").call(() → dynamic {
   return 1;
 });
 static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
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 88141c9..e272c4b 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
@@ -8,10 +8,6 @@
 // pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Error: Expected an identifier, but got ')'.
 // var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
 //                                    ^
-//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Warning: Getter not found: ''.
-// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
-//                                    ^
 
 library test;
 import self as self;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.expect
index acfcd08..dba4c95 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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>
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.transformed.expect
index acfcd08..dba4c95 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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>
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 1541ba0..64eb355 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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>
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 1541ba0..64eb355 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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>
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 cb76f4d..3db7bbe 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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>
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 cb76f4d..3db7bbe 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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>
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.expect
index e8f01e3..9e89962 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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>
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.transformed.expect
index e8f01e3..9e89962 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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>
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 cb76f4d..3db7bbe 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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>
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 cb76f4d..3db7bbe 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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>
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.expect
index 65b6c5b..6efb013 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(dynamic x) → core::double
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.transformed.expect
index 65b6c5b..6efb013 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(dynamic x) → core::double
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 a24ce84..0b09692 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(dynamic x) → core::double
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 a24ce84..0b09692 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(dynamic x) → core::double
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.expect
index 94629b4..7421b05 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.expect
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
   get v1() → self::Bar<self::Foo::T>
@@ -27,7 +27,7 @@
     return const <dynamic, dynamic>{};
 }
 class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.transformed.expect
index 94629b4..7421b05 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
   get v1() → self::Bar<self::Foo::T>
@@ -27,7 +27,7 @@
     return const <dynamic, dynamic>{};
 }
 class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
 }
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 96fab41..737a958 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     ;
   get v1() → self::Bar<self::Foo::T>
     ;
@@ -26,7 +26,7 @@
     ;
 }
 class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar<self::Bar::T>
     ;
 }
 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 29c327c..6bf0f4d 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
   get v1() → self::Bar<self::Foo::T>
@@ -27,7 +27,7 @@
     return const <core::Null, (core::Object) → core::Null>{};
 }
 class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
 }
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 29c327c..6bf0f4d 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
   get v1() → self::Bar<self::Foo::T>
@@ -27,7 +27,7 @@
     return const <core::Null, (core::Object) → core::Null>{};
 }
 class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.expect
index 8488c70..86fb1b2 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.transformed.expect
index 8488c70..86fb1b2 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
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 072ea33..6ee5860 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
     ;
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 6de5297..819f137 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
@@ -27,7 +27,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
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 08a2efb..475f95f 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
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.expect
index 06b6924..0201c42 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B<core::int> b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.transformed.expect
index 06b6924..0201c42 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B<core::int> b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → void
+  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 5f8f019..9a9cf46 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
@@ -4,11 +4,11 @@
 
 class A extends core::Object {
   field self::B<core::int> b;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → void
+  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 c3f1d56..2c80f49 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
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B<core::int> b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → void
+  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.strong.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.transformed.expect
index c3f1d56..2c80f49 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
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B<core::int> b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → void
+  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_2.dart.direct.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.expect
index de7183e..4be7f96 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::A::T x) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
index de7183e..4be7f96 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::A::T x) → void
+  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 2a7abc7..3151816 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::A::T x) → void
+  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 5f2c35d..053eb25 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::A::T x) → void
+  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.strong.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
index 5f2c35d..053eb25 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::A::T x) → void
+  constructor •(self::A::T x) → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.expect
index ae0c7e8..1645a4c 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   field dynamic x = null;
   field dynamic y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.transformed.expect
index ae0c7e8..1645a4c 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   field dynamic x = null;
   field dynamic y = null;
-  synthetic constructor •() → void
+  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 59276ba..26db017 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 •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
   field dynamic x;
   field dynamic y;
-  synthetic constructor •() → void
+  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 4722264..ec6e74e 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
@@ -29,14 +29,14 @@
 class A extends core::Object {
   field dynamic x = () → dynamic => new self::B::•().{self::B::x};
   field () → dynamic y = () → dynamic => new self::B::•().{self::B::x};
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   field dynamic x = null;
   field () → dynamic y = null;
-  synthetic constructor •() → void
+  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 9862ea2..2635fe5 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
@@ -17,14 +17,14 @@
 class A extends core::Object {
   field dynamic x = () → dynamic => new self::B::•().{self::B::x};
   field () → dynamic y = () → dynamic => new self::B::•().{self::B::x};
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   field dynamic x = null;
   field () → dynamic y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect
index 7b9d366..6475b01 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::A aField = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set aSetter(self::A value) → void {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.transformed.expect
index 7b9d366..6475b01 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::A aField = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set aSetter(self::A value) → void {}
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 19aaf1e..20915b0 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class C extends core::Object {
   field self::A aField;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   set aSetter(self::A value) → void
     ;
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 89f7813..bbe79c2 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,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::A aField = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set aSetter(self::A value) → void {}
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 89f7813..bbe79c2 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,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field self::A aField = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set aSetter(self::A value) → void {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.expect
index 8f2e22d..91ab457 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.expect
@@ -4,12 +4,12 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
index 1c7200b..c54ed4e 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
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 acae199..07214ac 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 static method f<T extends core::Object = dynamic>() → self::f::T
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 b31b52c..f1fd249 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
@@ -16,12 +16,12 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
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 ba7388f..642e30b 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
@@ -4,12 +4,12 @@
 import "dart:async" as asy;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.expect
index 6748909..fc8e5b5 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,27 +21,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
   operator [](core::int i) → self::A
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.transformed.expect
index 6748909..fc8e5b5 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,27 +21,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
   operator [](core::int i) → self::A
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 f45b9cb..40dbbce 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   operator +(core::int value) → self::C
     ;
@@ -11,7 +11,7 @@
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(core::int value) → self::E
     ;
@@ -19,23 +19,23 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     ;
   operator [](core::int i) → self::A
     ;
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 93d3e6a..2aaef17 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,27 +21,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
   operator [](core::int i) → self::A
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 93d3e6a..2aaef17 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,27 +21,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
   operator [](core::int i) → self::A
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.expect
index a47f9b9..c293859 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.transformed.expect
index a47f9b9..c293859 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   method test() → void {
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 ca2db03..6ffdc2b 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,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -19,12 +19,12 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Test extends core::Object {
   field self::B member;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   method test() → void
     ;
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 8338d42..534698e 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   method test() → void {
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 8338d42..534698e 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.expect
index 0a5df04..bb15472 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   method test() → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   method test() → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   method test3() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect
index 0a5df04..bb15472 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   method test() → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   method test() → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   method test3() → void {
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 49618ca..865d1dd 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
@@ -4,21 +4,21 @@
 
 class Test1 extends core::Object {
   field core::int t;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     ;
   method test() → void
     ;
 }
 class Test2 extends core::Object {
   field core::num t;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     ;
   method test() → void
     ;
 }
 class Test3 extends core::Object {
   field core::double t;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     ;
   method test3() → void
     ;
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 df44b13..9bcdb7d 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   method test() → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   method test() → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   method test3() → void {
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 df44b13..9bcdb7d 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   method test() → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   method test() → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   method test3() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.expect
index 6fd428b..8bac983 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.transformed.expect
index 6fd428b..8bac983 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
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 8286554..b6e46f4 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,15 +3,15 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -23,11 +23,11 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   operator [](self::Index i) → self::B
     ;
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 1bc265f..64b3d47 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
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 1bc265f..64b3d47 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.expect
index 5b671bb..67c11fe 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(self::F v) → self::C
@@ -17,7 +17,7 @@
     return null;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::E v) → self::D
@@ -26,27 +26,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::E::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.transformed.expect
index 5b671bb..67c11fe 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(self::F v) → self::C
@@ -17,7 +17,7 @@
     return null;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::E v) → self::D
@@ -26,27 +26,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::E::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
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 0a5efaa..edbf11b 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,11 +3,11 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   operator +(self::F v) → self::C
     ;
@@ -15,7 +15,7 @@
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::E v) → self::D
     ;
@@ -23,23 +23,23 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   operator [](self::Index i) → self::B
     ;
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 874ad18..626219f 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,12 +3,12 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(self::F v) → self::C
@@ -17,7 +17,7 @@
     return null;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::E v) → self::D
@@ -26,27 +26,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::E::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
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 874ad18..626219f 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,12 +3,12 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(self::F v) → self::C
@@ -17,7 +17,7 @@
     return null;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::E v) → self::D
@@ -26,27 +26,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::E::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.expect
index d613228..e769ffe 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
@@ -39,7 +39,7 @@
   operator []=(self::Index i, self::B v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.transformed.expect
index d613228..e769ffe 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
@@ -39,7 +39,7 @@
   operator []=(self::Index i, self::B v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
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 1d2a695..35db856 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,15 +3,15 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -23,11 +23,11 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     ;
   operator [](self::Index i) → self::B
     ;
@@ -35,7 +35,7 @@
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   method test() → void
     ;
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 d77ddb9..6f04638 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
@@ -39,7 +39,7 @@
   operator []=(self::Index i, self::B v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
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 d77ddb9..6f04638 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
@@ -39,7 +39,7 @@
   operator []=(self::Index i, self::B v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.expect
index 1610dd9..c6fb73b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Base<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base<self::Base::T, self::Base::U>
     : super core::Object::•()
     ;
   operator [](core::String s) → self::Base::T
@@ -14,7 +14,7 @@
   abstract method setValue(core::String s, self::Base::U v) → void;
 }
 abstract class Test1 extends self::Base<core::int, core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super self::Base::•()
     ;
   method test() → void {
@@ -29,7 +29,7 @@
   }
 }
 abstract class Test2 extends self::Base<core::int, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super self::Base::•()
     ;
   method test() → void {
@@ -47,7 +47,7 @@
   }
 }
 abstract class Test3 extends self::Base<core::int, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super self::Base::•()
     ;
   method test() → void {
@@ -63,7 +63,7 @@
   }
 }
 abstract class Test4 extends self::Base<core::num, core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test4
     : super self::Base::•()
     ;
   method test() → void {
@@ -78,7 +78,7 @@
   }
 }
 abstract class Test5 extends self::Base<core::num, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test5
     : super self::Base::•()
     ;
   method test() → void {
@@ -96,7 +96,7 @@
   }
 }
 abstract class Test6 extends self::Base<core::num, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test6
     : super self::Base::•()
     ;
   method test() → void {
@@ -112,7 +112,7 @@
   }
 }
 abstract class Test7 extends self::Base<core::double, core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test7
     : super self::Base::•()
     ;
   method test() → void {
@@ -127,7 +127,7 @@
   }
 }
 abstract class Test8 extends self::Base<core::double, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test8
     : super self::Base::•()
     ;
   method test() → void {
@@ -145,7 +145,7 @@
   }
 }
 abstract class Test9 extends self::Base<core::double, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test9
     : super self::Base::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.transformed.expect
index 1610dd9..c6fb73b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Base<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base<self::Base::T, self::Base::U>
     : super core::Object::•()
     ;
   operator [](core::String s) → self::Base::T
@@ -14,7 +14,7 @@
   abstract method setValue(core::String s, self::Base::U v) → void;
 }
 abstract class Test1 extends self::Base<core::int, core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super self::Base::•()
     ;
   method test() → void {
@@ -29,7 +29,7 @@
   }
 }
 abstract class Test2 extends self::Base<core::int, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super self::Base::•()
     ;
   method test() → void {
@@ -47,7 +47,7 @@
   }
 }
 abstract class Test3 extends self::Base<core::int, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super self::Base::•()
     ;
   method test() → void {
@@ -63,7 +63,7 @@
   }
 }
 abstract class Test4 extends self::Base<core::num, core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test4
     : super self::Base::•()
     ;
   method test() → void {
@@ -78,7 +78,7 @@
   }
 }
 abstract class Test5 extends self::Base<core::num, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test5
     : super self::Base::•()
     ;
   method test() → void {
@@ -96,7 +96,7 @@
   }
 }
 abstract class Test6 extends self::Base<core::num, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test6
     : super self::Base::•()
     ;
   method test() → void {
@@ -112,7 +112,7 @@
   }
 }
 abstract class Test7 extends self::Base<core::double, core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test7
     : super self::Base::•()
     ;
   method test() → void {
@@ -127,7 +127,7 @@
   }
 }
 abstract class Test8 extends self::Base<core::double, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test8
     : super self::Base::•()
     ;
   method test() → void {
@@ -145,7 +145,7 @@
   }
 }
 abstract class Test9 extends self::Base<core::double, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test9
     : super self::Base::•()
     ;
   method test() → void {
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 24d45db..43e0d64 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Base<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base<self::Base::T, self::Base::U>
     ;
   operator [](core::String s) → self::Base::T
     ;
@@ -13,55 +13,55 @@
   abstract method setValue(core::String s, self::Base::U v) → void;
 }
 abstract class Test1 extends self::Base<core::int, core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     ;
   method test() → void
     ;
 }
 abstract class Test2 extends self::Base<core::int, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     ;
   method test() → void
     ;
 }
 abstract class Test3 extends self::Base<core::int, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     ;
   method test() → void
     ;
 }
 abstract class Test4 extends self::Base<core::num, core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test4
     ;
   method test() → void
     ;
 }
 abstract class Test5 extends self::Base<core::num, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test5
     ;
   method test() → void
     ;
 }
 abstract class Test6 extends self::Base<core::num, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test6
     ;
   method test() → void
     ;
 }
 abstract class Test7 extends self::Base<core::double, core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test7
     ;
   method test() → void
     ;
 }
 abstract class Test8 extends self::Base<core::double, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test8
     ;
   method test() → void
     ;
 }
 abstract class Test9 extends self::Base<core::double, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test9
     ;
   method test() → void
     ;
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 8d562e5..5463d22 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
@@ -40,7 +40,7 @@
 import "dart:core" as core;
 
 abstract class Base<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base<self::Base::T, self::Base::U>
     : super core::Object::•()
     ;
   operator [](core::String s) → self::Base::T
@@ -51,7 +51,7 @@
   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 •() → void
+  synthetic constructor •() → self::Test1
     : super self::Base::•()
     ;
   method test() → void {
@@ -66,7 +66,7 @@
   }
 }
 abstract class Test2 extends self::Base<core::int, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super self::Base::•()
     ;
   method test() → void {
@@ -84,7 +84,7 @@
   }
 }
 abstract class Test3 extends self::Base<core::int, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super self::Base::•()
     ;
   method test() → void {
@@ -109,7 +109,7 @@
   }
 }
 abstract class Test4 extends self::Base<core::num, core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test4
     : super self::Base::•()
     ;
   method test() → void {
@@ -124,7 +124,7 @@
   }
 }
 abstract class Test5 extends self::Base<core::num, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test5
     : super self::Base::•()
     ;
   method test() → void {
@@ -142,7 +142,7 @@
   }
 }
 abstract class Test6 extends self::Base<core::num, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test6
     : super self::Base::•()
     ;
   method test() → void {
@@ -158,7 +158,7 @@
   }
 }
 abstract class Test7 extends self::Base<core::double, core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test7
     : super self::Base::•()
     ;
   method test() → void {
@@ -185,7 +185,7 @@
   }
 }
 abstract class Test8 extends self::Base<core::double, core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test8
     : super self::Base::•()
     ;
   method test() → void {
@@ -203,7 +203,7 @@
   }
 }
 abstract class Test9 extends self::Base<core::double, core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test9
     : super self::Base::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.expect
index f031580..ca8e893 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.transformed.expect
index f031580..ca8e893 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
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 8286554..b6e46f4 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,15 +3,15 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -23,11 +23,11 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   operator [](self::Index i) → self::B
     ;
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 494fe12..7c0f229 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
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 494fe12..7c0f229 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,17 +3,17 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Index
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -26,12 +26,12 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   operator [](self::Index i) → self::B
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.expect
index 62118c8..3b475c2 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Test1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::int;
@@ -20,7 +20,7 @@
   }
 }
 abstract class Test2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::int;
@@ -40,7 +40,7 @@
   }
 }
 abstract class Test3 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::int;
@@ -58,7 +58,7 @@
   }
 }
 abstract class Test4 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test4
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::num;
@@ -75,7 +75,7 @@
   }
 }
 abstract class Test5 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test5
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::num;
@@ -95,7 +95,7 @@
   }
 }
 abstract class Test6 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test6
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::num;
@@ -113,7 +113,7 @@
   }
 }
 abstract class Test7 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test7
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::double;
@@ -130,7 +130,7 @@
   }
 }
 abstract class Test8 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test8
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::double;
@@ -150,7 +150,7 @@
   }
 }
 abstract class Test9 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test9
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::double;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.transformed.expect
index 62118c8..3b475c2 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Test1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::int;
@@ -20,7 +20,7 @@
   }
 }
 abstract class Test2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::int;
@@ -40,7 +40,7 @@
   }
 }
 abstract class Test3 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::int;
@@ -58,7 +58,7 @@
   }
 }
 abstract class Test4 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test4
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::num;
@@ -75,7 +75,7 @@
   }
 }
 abstract class Test5 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test5
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::num;
@@ -95,7 +95,7 @@
   }
 }
 abstract class Test6 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test6
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::num;
@@ -113,7 +113,7 @@
   }
 }
 abstract class Test7 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test7
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::double;
@@ -130,7 +130,7 @@
   }
 }
 abstract class Test8 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test8
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::double;
@@ -150,7 +150,7 @@
   }
 }
 abstract class Test9 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test9
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::double;
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 cb25765..e48e9e6 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Test1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     ;
   abstract operator [](core::String s) → core::int;
   abstract operator []=(core::String s, core::int v) → void;
@@ -11,7 +11,7 @@
     ;
 }
 abstract class Test2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     ;
   abstract operator [](core::String s) → core::int;
   abstract operator []=(core::String s, core::num v) → void;
@@ -19,7 +19,7 @@
     ;
 }
 abstract class Test3 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     ;
   abstract operator [](core::String s) → core::int;
   abstract operator []=(core::String s, core::double v) → void;
@@ -27,7 +27,7 @@
     ;
 }
 abstract class Test4 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test4
     ;
   abstract operator [](core::String s) → core::num;
   abstract operator []=(core::String s, core::int v) → void;
@@ -35,7 +35,7 @@
     ;
 }
 abstract class Test5 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test5
     ;
   abstract operator [](core::String s) → core::num;
   abstract operator []=(core::String s, core::num v) → void;
@@ -43,7 +43,7 @@
     ;
 }
 abstract class Test6 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test6
     ;
   abstract operator [](core::String s) → core::num;
   abstract operator []=(core::String s, core::double v) → void;
@@ -51,7 +51,7 @@
     ;
 }
 abstract class Test7 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test7
     ;
   abstract operator [](core::String s) → core::double;
   abstract operator []=(core::String s, core::int v) → void;
@@ -59,7 +59,7 @@
     ;
 }
 abstract class Test8 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test8
     ;
   abstract operator [](core::String s) → core::double;
   abstract operator []=(core::String s, core::num v) → void;
@@ -67,7 +67,7 @@
     ;
 }
 abstract class Test9 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test9
     ;
   abstract operator [](core::String s) → core::double;
   abstract operator []=(core::String s, core::double v) → void;
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 aa0ec5f..913618b 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
@@ -40,7 +40,7 @@
 import "dart:core" as core;
 
 abstract class Test1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::int;
@@ -57,7 +57,7 @@
   }
 }
 abstract class Test2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::int;
@@ -77,7 +77,7 @@
   }
 }
 abstract class Test3 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::int;
@@ -104,7 +104,7 @@
   }
 }
 abstract class Test4 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test4
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::num;
@@ -121,7 +121,7 @@
   }
 }
 abstract class Test5 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test5
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::num;
@@ -141,7 +141,7 @@
   }
 }
 abstract class Test6 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test6
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::num;
@@ -159,7 +159,7 @@
   }
 }
 abstract class Test7 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test7
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::double;
@@ -188,7 +188,7 @@
   }
 }
 abstract class Test8 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test8
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::double;
@@ -208,7 +208,7 @@
   }
 }
 abstract class Test9 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test9
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → core::double;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.expect
index 552f176..8d92bc9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Test<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test<self::Test::T, self::Test::U>
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → self::Test::T;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.transformed.expect
index 552f176..8d92bc9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Test<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test<self::Test::T, self::Test::U>
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → self::Test::T;
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 49a438a..f14f72a 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Test<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test<self::Test::T, self::Test::U>
     ;
   abstract operator [](core::String s) → self::Test::T;
   abstract operator []=(core::String s, self::Test::U v) → void;
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 907b43b..c3edbb3 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
@@ -40,7 +40,7 @@
 import "dart:core" as core;
 
 abstract class Test<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test<self::Test::T, self::Test::U>
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → self::Test::T;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.expect
index c564570..73cabe2 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,7 +21,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.transformed.expect
index c564570..73cabe2 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,7 +21,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 7db001d..59620a1 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,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -19,7 +19,7 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static method f<T extends core::Object = dynamic>() → self::f::T
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 a6a2ebc..17865ed 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,7 +21,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 a6a2ebc..17865ed 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,7 +21,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.expect
index b065aea..25e51ee 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.transformed.expect
index b065aea..25e51ee 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  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 090f13d..19d362f 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f;
-  synthetic constructor •() → void
+  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 9b1a01f..2a5cd7b 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 9b1a01f..2a5cd7b 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.expect
index 45017e8..b286810 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → core::int
@@ -13,7 +13,7 @@
 }
 class B extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.transformed.expect
index 45017e8..b286810 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → core::int
@@ -13,7 +13,7 @@
 }
 class B extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  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 906ceea..4dafd7f 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   operator +(dynamic other) → core::int
     ;
@@ -12,7 +12,7 @@
 }
 class B extends core::Object {
   field self::A a;
-  synthetic constructor •() → void
+  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 d471225..e1ed53a 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
@@ -25,7 +25,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → core::int
@@ -35,7 +35,7 @@
 }
 class B extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect
index bc2c686..5cb53bf 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(dynamic other) → core::int
@@ -13,7 +13,7 @@
 }
 class B extends core::Object {
   field self::A a = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.expect
index a15f403..288eaf3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.transformed.expect
index a15f403..288eaf3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
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 c483408..f40880f 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,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -19,12 +19,12 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Test extends core::Object {
   field self::B member;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   static method test(self::Test t) → void
     ;
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 a310675..13cffcf 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
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 a310675..13cffcf 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.expect
index d006bf2..13020c3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.transformed.expect
index d006bf2..13020c3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
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 c483408..f40880f 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,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -19,12 +19,12 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Test extends core::Object {
   field self::B member;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   static method test(self::Test t) → void
     ;
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 1fb2336..7e404e5 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
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 1fb2336..7e404e5 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,13 +21,13 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super core::Object::•()
     ;
   static method test(self::Test t) → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.expect
index 59129cd..bfd029a 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect
index 59129cd..bfd029a 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
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 45f7015..eaa82b5 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
@@ -4,21 +4,21 @@
 
 class Test1 extends core::Object {
   field core::int prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     ;
   static method test(self::Test1 t) → void
     ;
 }
 class Test2 extends core::Object {
   field core::num prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     ;
   static method test(self::Test2 t) → void
     ;
 }
 class Test3 extends core::Object {
   field core::double prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     ;
   static method test3(self::Test3 t) → void
     ;
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 834d57b..795fa0c 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
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 834d57b..795fa0c 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.expect
index ee3089f..ac9ca97 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,18 +21,18 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.transformed.expect
index ee3089f..ac9ca97 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,18 +21,18 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
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 8aa62bc..1f7cf9f 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,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -19,16 +19,16 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class Base extends core::Object {
   field self::B member;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     ;
   method test() → void
     ;
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 bb277ea..86ab41f 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,18 +21,18 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
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 bb277ea..86ab41f 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -21,18 +21,18 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
   field self::B member = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test
     : super self::Base::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.expect
index 66e910a..f682b4c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.expect
@@ -6,12 +6,12 @@
   field core::int intProp = null;
   field core::num numProp = null;
   field core::double doubleProp = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super self::Base::•()
     ;
   method test() → void {
@@ -26,7 +26,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super self::Base::•()
     ;
   method test() → void {
@@ -44,7 +44,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super self::Base::•()
     ;
   method test3() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.transformed.expect
index 66e910a..f682b4c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.transformed.expect
@@ -6,12 +6,12 @@
   field core::int intProp = null;
   field core::num numProp = null;
   field core::double doubleProp = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super self::Base::•()
     ;
   method test() → void {
@@ -26,7 +26,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super self::Base::•()
     ;
   method test() → void {
@@ -44,7 +44,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super self::Base::•()
     ;
   method test3() → void {
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 592fa68..c58784f 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
@@ -6,23 +6,23 @@
   field core::int intProp;
   field core::num numProp;
   field core::double doubleProp;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     ;
   method test() → void
     ;
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     ;
   method test() → void
     ;
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     ;
   method test3() → void
     ;
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 73e1212..00dc6b8 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
@@ -6,12 +6,12 @@
   field core::int intProp = null;
   field core::num numProp = null;
   field core::double doubleProp = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super self::Base::•()
     ;
   method test() → void {
@@ -26,7 +26,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super self::Base::•()
     ;
   method test() → void {
@@ -44,7 +44,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super self::Base::•()
     ;
   method test3() → void {
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 73e1212..00dc6b8 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
@@ -6,12 +6,12 @@
   field core::int intProp = null;
   field core::num numProp = null;
   field core::double doubleProp = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super self::Base::•()
     ;
   method test() → void {
@@ -26,7 +26,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super self::Base::•()
     ;
   method test() → void {
@@ -44,7 +44,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super self::Base::•()
     ;
   method test3() → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.expect
index d268f79..fdf231c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.transformed.expect
index d268f79..fdf231c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
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 45f7015..eaa82b5 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
@@ -4,21 +4,21 @@
 
 class Test1 extends core::Object {
   field core::int prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     ;
   static method test(self::Test1 t) → void
     ;
 }
 class Test2 extends core::Object {
   field core::num prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     ;
   static method test(self::Test2 t) → void
     ;
 }
 class Test3 extends core::Object {
   field core::double prop;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     ;
   static method test3(self::Test3 t) → void
     ;
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 78c30db..717b63a 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
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 78c30db..717b63a 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
@@ -4,7 +4,7 @@
 
 class Test1 extends core::Object {
   field core::int prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test1
     : super core::Object::•()
     ;
   static method test(self::Test1 t) → void {
@@ -20,7 +20,7 @@
 }
 class Test2 extends core::Object {
   field core::num prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test2
     : super core::Object::•()
     ;
   static method test(self::Test2 t) → void {
@@ -39,7 +39,7 @@
 }
 class Test3 extends core::Object {
   field core::double prop = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Test3
     : super core::Object::•()
     ;
   static method test3(self::Test3 t) → void {
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.expect
index 5d4e0bc7..7a0f38a 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.transformed.expect
index 5d4e0bc7..7a0f38a 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 c96e2f4..e1e3bae 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 static field self::A a;
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 2fe641f..02a20bc 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 2fe641f..02a20bc 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   field core::int f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.expect
index 7aa35c1..2b4fd4f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   static field self::B staticVariable = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -22,7 +22,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.transformed.expect
index 7aa35c1..2b4fd4f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   static field self::B staticVariable = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -22,7 +22,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 dca7f38..7e312ee 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,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
   static field self::B staticVariable;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(self::C v) → self::A
     ;
@@ -20,7 +20,7 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static field self::B topLevelVariable;
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 153a008..67c4486 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,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   static field self::B staticVariable = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -22,7 +22,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 153a008..67c4486 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,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   static field self::B staticVariable = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   operator +(self::C v) → self::A
@@ -22,7 +22,7 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.expect
index 0d86ccf..30f357c 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
@@ -11,7 +11,7 @@
 }
 class B extends self::A {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.transformed.expect
index 0d86ccf..30f357c 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
@@ -11,7 +11,7 @@
 }
 class B extends self::A {
   field dynamic x = null;
-  synthetic constructor •() → void
+  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 6274d9f..5006f0f 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract get x() → core::int;
   abstract set x(core::double value) → void;
 }
 class B extends self::A {
   field dynamic x;
-  synthetic constructor •() → void
+  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 d0acf00..0643685 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
@@ -4,7 +4,7 @@
 // Change to a subtype of dart.core::double.
 //   var /*@topType=int*/ x;
 //                        ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is the overridden method ('x').
 //   void set x(double value);
 //            ^
 
@@ -20,7 +20,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::int;
@@ -28,7 +28,7 @@
 }
 class B extends self::A {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.expect
index ba4b43f..d397440 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(core::num value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract get x() → core::int;
 }
 class C extends self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.transformed.expect
index ba4b43f..d397440 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(core::num value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract get x() → core::int;
 }
 class C extends self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  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 34df48d..c425d73 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
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract set x(core::num value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract get x() → core::int;
 }
 class C extends self::B {
   field dynamic x;
-  synthetic constructor •() → void
+  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 501efd7..14bfe0d 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
@@ -4,7 +4,7 @@
 // Change to a subtype of dart.core::num.
 //   var /*@topType=int*/ x;
 //                        ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is the overridden method ('x').
 //   void set x(num value);
 //            ^
 
@@ -20,20 +20,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(core::num value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract get x() → core::int;
 }
 class C extends self::B {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.expect
index 370dc25..24c6ed9 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(core::int value) → void;
 }
 class C extends self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.transformed.expect
index 370dc25..24c6ed9 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(core::int value) → void;
 }
 class C extends self::B {
   field dynamic x = null;
-  synthetic constructor •() → void
+  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 bac8d1c..2d2fda0 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 •() → void
+  synthetic constructor •() → self::A
     ;
   abstract get x() → core::num;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   abstract set x(core::int value) → void;
 }
 class C extends self::B {
   field dynamic x;
-  synthetic constructor •() → void
+  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 1a3e8bf..eec7015 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(core::int value) → void;
 }
 class C extends self::B {
   field core::num x = null;
-  synthetic constructor •() → void
+  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 1a3e8bf..eec7015 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract get x() → core::num;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   abstract set x(core::int value) → void;
 }
 class C extends self::B {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.expect
index 097abf7..a60c839 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get c() → self::C
@@ -17,12 +17,12 @@
   set c(self::C value) → void {}
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.transformed.expect
index 097abf7..a60c839 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get c() → self::C
@@ -17,12 +17,12 @@
   set c(self::C value) → void {}
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 a21ef5e..b71ace2 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
@@ -4,11 +4,11 @@
 
 class A extends core::Object {
   field self::B b;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   get c() → self::C
     ;
@@ -16,11 +16,11 @@
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 b42ff08..1caa8a4 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
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get c() → self::C
@@ -17,12 +17,12 @@
   set c(self::C value) → void {}
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
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 b42ff08..1caa8a4 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
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field self::B b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get c() → self::C
@@ -17,12 +17,12 @@
   set c(self::C value) → void {}
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.expect
index 7e940c1..87d3eb2 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.expect
@@ -4,23 +4,23 @@
 
 class A extends core::Object {
   field self::B b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field self::C c = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.transformed.expect
index 7e940c1..87d3eb2 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.transformed.expect
@@ -4,23 +4,23 @@
 
 class A extends core::Object {
   field self::B b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field self::C c = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 ffe61a5..a614d4a 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
@@ -4,20 +4,20 @@
 
 class A extends core::Object {
   field self::B b;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends core::Object {
   field self::C c;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 80f34b9..d6a1de8 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
@@ -4,23 +4,23 @@
 
 class A extends core::Object {
   field self::B b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field self::C c = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
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 80f34b9..d6a1de8 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
@@ -4,23 +4,23 @@
 
 class A extends core::Object {
   field self::B b = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field self::C c = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.expect
index e431672..e8693e3 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.expect
@@ -5,7 +5,7 @@
 class A extends core::Object {
   field dynamic b = () → dynamic => self::x;
   field dynamic c = () → dynamic => self::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.transformed.expect
index e431672..e8693e3 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.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 •() → void
+  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 ec8e2e0..13d13cb 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 •() → void
+  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 97e21fd..cb12150 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
@@ -29,7 +29,7 @@
 class A extends core::Object {
   field dynamic b = () → dynamic => self::x;
   field () → dynamic c = () → dynamic => self::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 6485531..68e3c75 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
@@ -17,7 +17,7 @@
 class A extends core::Object {
   field dynamic b = () → dynamic => self::x;
   field () → dynamic c = () → dynamic => self::x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.expect
index 147a6a5..f8f9e8f 100644
--- a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f() → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   method f() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.transformed.expect
index 147a6a5..f8f9e8f 100644
--- a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f() → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   method f() → dynamic {}
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 7b617ff..ac467ff 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 •() → void
+  synthetic constructor •() → self::B
     ;
   method f() → void
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method f() → dynamic
     ;
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 9a42ff3..b39e8c5 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 •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f() → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  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 9a42ff3..b39e8c5 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 •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f() → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   method f() → void {}
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.expect
index 8d4f115..525f04b 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.expect
@@ -3,35 +3,35 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
   abstract method f(core::int i) → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract method f(core::Object o) → void;
 }
 abstract class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f(core::Object o) → void {}
 }
 abstract class E extends core::Object implements self::I2, self::I1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::E::•()
     ;
   method f(core::Object o) → void {}
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.transformed.expect
index 8d4f115..525f04b 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.transformed.expect
@@ -3,35 +3,35 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
   abstract method f(core::int i) → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract method f(core::Object o) → void;
 }
 abstract class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f(core::Object o) → void {}
 }
 abstract class E extends core::Object implements self::I2, self::I1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::E::•()
     ;
   method f(core::Object o) → void {}
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 c2021f7..cbba19d 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,31 +3,31 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     ;
   abstract method f(core::int i) → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     ;
   abstract method f(core::Object o) → void;
 }
 abstract class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method f(core::Object o) → void
     ;
 }
 abstract class E extends core::Object implements self::I2, self::I1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     ;
   method f(core::Object o) → void
     ;
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 eec2396..404c672 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,36 +3,36 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
   abstract method f(core::int i) → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract method f(core::Object o) → void;
 }
 abstract class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract forwarding-stub method f(core::Object o) → void;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f(core::Object o) → void {}
 }
 abstract class E extends core::Object implements self::I2, self::I1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::E::•()
     ;
   method f(core::Object o) → void {}
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 eec2396..404c672 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,36 +3,36 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
   abstract method f(core::int i) → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract method f(core::Object o) → void;
 }
 abstract class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   abstract forwarding-stub method f(core::Object o) → void;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f(core::Object o) → void {}
 }
 abstract class E extends core::Object implements self::I2, self::I1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::E::•()
     ;
   method f(core::Object o) → void {}
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.expect
index 2599105..19938fa 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,27 +21,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
   get target() → self::A
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.transformed.expect
index 2599105..19938fa 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,27 +21,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
   get target() → self::A
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 33e3444..5a6c5f7 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   operator +(core::int value) → self::C
     ;
@@ -11,7 +11,7 @@
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(core::int value) → self::E
     ;
@@ -19,23 +19,23 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     ;
   get target() → self::A
     ;
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 c050b0a..61f2824 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,27 +21,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
   get target() → self::A
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 c050b0a..61f2824 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,27 +21,27 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
   get target() → self::A
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.expect
index a0e3f31..f626bda 100644
--- a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int field = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get getter() → core::int
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.transformed.expect
index a0e3f31..f626bda 100644
--- a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int field = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get getter() → core::int
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 4ac3777..7c64dbc 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   get getter() → core::int
     ;
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 fecf831..56db9bc 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int field = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get getter() → core::int
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 fecf831..56db9bc 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::int field = 0;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get getter() → core::int
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.expect
index 6513a99..eb2b193 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,22 +21,22 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.transformed.expect
index 6513a99..eb2b193 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,22 +21,22 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
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 2642de0..a4277e4 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   operator +(core::int value) → self::C
     ;
@@ -11,7 +11,7 @@
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(core::int value) → self::E
     ;
@@ -19,19 +19,19 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     ;
 }
 static method f<T extends core::Object = dynamic>() → self::f::T
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 77baa37..0614d7a 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,22 +21,22 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
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 77baa37..0614d7a 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int value) → self::C
@@ -12,7 +12,7 @@
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator +(core::int value) → self::E
@@ -21,22 +21,22 @@
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.expect
index 65b823a..5fd35e9 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator [](core::int x) → core::num
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   operator [](core::Object x) → core::int
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.transformed.expect
index 65b823a..5fd35e9 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator [](core::int x) → core::num
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   operator [](core::Object x) → core::int
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 ee2a715..1f9dc25 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator [](core::int x) → core::num
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   operator [](core::Object x) → core::int
     ;
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 4f219d0..ac5ee20 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator [](core::int x) → core::num
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   operator [](core::Object x) → core::int
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 4f219d0..ac5ee20 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   operator [](core::int x) → core::num
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   operator [](core::Object x) → core::int
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.expect
index dd25816..b86486e 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.expect
@@ -4,24 +4,24 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   operator [](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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   operator [](core::Object x) → self::E<asy::Future<self::C::U>>
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.transformed.expect
index dd25816..b86486e 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.transformed.expect
@@ -4,24 +4,24 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   operator [](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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   operator [](core::Object x) → self::E<asy::Future<self::C::U>>
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 89cded9..4e092ba 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
@@ -4,21 +4,21 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::T>
     ;
 }
 class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E<self::E::T>
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
   operator [](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 •() → void
+  synthetic constructor •() → self::C<self::C::U>
     ;
   operator [](core::Object x) → self::E<asy::Future<self::C::U>>
     ;
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 262f007..641bd99 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
@@ -4,24 +4,24 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>
     return null;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   operator [](generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
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 262f007..641bd99 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
@@ -4,24 +4,24 @@
 import "dart:async" as asy;
 
 class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::T>
     : super self::D::•()
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>
     return null;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super self::B::•()
     ;
   operator [](generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.direct.expect b/pkg/front_end/testcases/inference_new/switch.dart.direct.expect
index e90c140..992aba0 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/switch.dart.direct.transformed.expect
index e90c140..992aba0 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
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 9cbe2f4..a1f4ba5 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C<self::C::T>
     ;
 }
 static method f<T extends core::Object = dynamic>() → self::f::T
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 5bb4779..4ad5b14 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
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 5bb4779..4ad5b14 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.expect
index cd980ee..cef6169 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.expect
@@ -3,45 +3,45 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   abstract method foo() → self::A;
 }
 abstract class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   abstract method foo() → self::B;
 }
 abstract class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
   abstract method foo() → core::Object;
 }
 abstract class G extends core::Object implements self::D, self::E, self::F {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
 }
 class H extends self::G {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::H
     : super self::G::•()
     ;
   method foo() → self::C
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.transformed.expect
index cd980ee..cef6169 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.transformed.expect
@@ -3,45 +3,45 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   abstract method foo() → self::A;
 }
 abstract class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   abstract method foo() → self::B;
 }
 abstract class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
   abstract method foo() → core::Object;
 }
 abstract class G extends core::Object implements self::D, self::E, self::F {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
 }
 class H extends self::G {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::H
     : super self::G::•()
     ;
   method foo() → self::C
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 bbf424f..8801b74 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,38 +3,38 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   abstract method foo() → self::A;
 }
 abstract class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   abstract method foo() → self::B;
 }
 abstract class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     ;
   abstract method foo() → core::Object;
 }
 abstract class G extends core::Object implements self::D, self::E, self::F {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     ;
 }
 class H extends self::G {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::H
     ;
   method foo() → self::C
     ;
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 35ad473..2432575 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,46 +3,46 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   abstract method foo() → self::A;
 }
 abstract class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   abstract method foo() → self::B;
 }
 abstract class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
   abstract method foo() → core::Object;
 }
 abstract class G extends core::Object implements self::D, self::E, self::F {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
   abstract forwarding-stub method foo() → self::B;
 }
 class H extends self::G {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::H
     : super self::G::•()
     ;
   method foo() → self::C
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 35ad473..2432575 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,46 +3,46 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   abstract method foo() → self::A;
 }
 abstract class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   abstract method foo() → self::B;
 }
 abstract class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
   abstract method foo() → core::Object;
 }
 abstract class G extends core::Object implements self::D, self::E, self::F {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
   abstract forwarding-stub method foo() → self::B;
 }
 class H extends self::G {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::H
     : super self::G::•()
     ;
   method foo() → self::C
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.expect
index f767cb7..dc6b102 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y, self::D::Z, self::D::W>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.transformed.expect
index f767cb7..dc6b102 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y, self::D::Z, self::D::W>
     : super core::Object::•()
     ;
 }
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 57cce0b..3733343 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
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 0d386e5..e94a17c 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
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y, self::D::Z, self::D::W>
     : super core::Object::•()
     ;
 }
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 0d386e5..e94a17c 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
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y, self::D::Z, self::D::W>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.expect
index 4a8c9a0..0587f95 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.expect
@@ -4,7 +4,7 @@
 import "dart:collection" as col;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.transformed.expect
index 4a8c9a0..0587f95 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:collection" as col;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic {
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 54cb769..6d52cfc 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 8c50708..4da975b 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
@@ -4,7 +4,7 @@
 import "dart:collection" as col;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic {
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 8c50708..4da975b 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
@@ -4,7 +4,7 @@
 import "dart:collection" as col;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.expect
index 39c01de..ce1b088 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.transformed.expect
index 39c01de..ce1b088 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → 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 265f85f..476334f 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  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 0d74fd8..4704d96 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
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 0d74fd8..4704d96 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.expect
index ee479f2..9fdf5a9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::U>
     : super core::Object::•()
     ;
   method fun() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.transformed.expect
index ee479f2..9fdf5a9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::U>
     : super core::Object::•()
     ;
   method fun() → 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 4de7478..e9b72c2 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 ee479f2..9fdf5a9 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::U>
     : super core::Object::•()
     ;
   method fun() → 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 ee479f2..9fdf5a9 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::U>
     : super core::Object::•()
     ;
   method fun() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.expect
index fa8a1cd..699b329 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.transformed.expect
index fa8a1cd..699b329 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → 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 265f85f..476334f 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  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 9da4319..3974c9a 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
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 9da4319..3974c9a 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.expect
index d8c6ef0..5047782 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.expect
@@ -4,12 +4,12 @@
 import "dart:collection" as col;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method fun() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.transformed.expect
index d8c6ef0..5047782 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 import "dart:collection" as col;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method fun() → dynamic {
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 5eaaf89..4649dbc 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  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 d8c6ef0..5047782 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
@@ -4,12 +4,12 @@
 import "dart:collection" as col;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method fun() → dynamic {
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 d8c6ef0..5047782 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
@@ -4,12 +4,12 @@
 import "dart:collection" as col;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method fun() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.expect
index 45a4ce3..cd26665 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.transformed.expect
index 45a4ce3..cd26665 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
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 4c18033..27aaad2 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  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 dca475f..5101af2 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends self::A<self::A::T> = self::A<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
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 dca475f..5101af2 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends self::A<self::A::T> = self::A<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.expect
index a1a10da..9a1633f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.transformed.expect
index a1a10da..9a1633f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → 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 ad8fcd8..5df48c3 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  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 a2b129b..8b677de 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → 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 a2b129b..8b677de 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.expect
index 02da85f..82f2df5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::U>
     : super core::Object::•()
     ;
   method fun() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
index 02da85f..82f2df5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::U>
     : super core::Object::•()
     ;
   method fun() → 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 73418c3..65c7e59 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 02da85f..82f2df5 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::U>
     : super core::Object::•()
     ;
   method fun() → 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 02da85f..82f2df5 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::U>
     : super core::Object::•()
     ;
   method fun() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.expect
index 939111c..3e6528c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.transformed.expect
index 939111c..3e6528c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → 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 ad8fcd8..5df48c3 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  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 d8117ee..282e860 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → 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 d8117ee..282e860 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.expect
index e707e98..a6c8d3d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.transformed.expect
index e707e98..a6c8d3d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → dynamic {
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 1796d4d..3392ba1 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  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 e707e98..a6c8d3d 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → dynamic {
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 e707e98..a6c8d3d 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.expect
index 64da62b..c4bb7fc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::X, self::C::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.transformed.expect
index 64da62b..c4bb7fc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::X, self::C::Y>
     : super core::Object::•()
     ;
 }
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 3eb7ec4..7499e8f 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::X, self::C::Y>
     ;
 }
 static field self::C<dynamic, dynamic> c;
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 db904c5..a08e371 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
@@ -3,7 +3,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::X, self::C::Y>
     : super core::Object::•()
     ;
 }
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 db904c5..a08e371 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
@@ -3,7 +3,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::X, self::C::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.expect
index 769b44d..caff641 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::X, self::C::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.transformed.expect
index 769b44d..caff641 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::X, self::C::Y>
     : super core::Object::•()
     ;
 }
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 17ae19a..a599fa3 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 df12d4d..f9cf2df 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
@@ -3,7 +3,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::X, self::C::Y>
     : super core::Object::•()
     ;
 }
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 df12d4d..f9cf2df 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
@@ -3,7 +3,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::X, self::C::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.expect
index 3f02fe8..49b30fe 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.expect
@@ -3,12 +3,12 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.transformed.expect
index 3f02fe8..49b30fe 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
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 d10f5b4..3df781b 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
@@ -3,11 +3,11 @@
 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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y>
     ;
 }
 class E<X extends (self::E::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E<self::E::X>
     ;
 }
 static field self::D<dynamic, dynamic> d;
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 484914d..4401dce 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
@@ -3,12 +3,12 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
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 484914d..4401dce 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
@@ -3,12 +3,12 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.expect
index d1dd2cb..9645a88 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.expect
@@ -3,12 +3,12 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.transformed.expect
index d1dd2cb..9645a88 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
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 638b8fc..511b35e 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
@@ -3,11 +3,11 @@
 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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y>
     ;
 }
 class E<X extends (self::E::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 4a12d44..a689115 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
@@ -3,12 +3,12 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
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 4a12d44..a689115 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
@@ -3,12 +3,12 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.expect
index 6c05a05..12387f5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X, self::F::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.transformed.expect
index 6c05a05..12387f5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.transformed.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X, self::F::Y>
     : super core::Object::•()
     ;
 }
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 5056d3f..026698c 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
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X, self::F::Y>
     ;
 }
 static field self::C<dynamic, dynamic> c;
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 9f14994..b1d29af 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
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X, self::F::Y>
     : super core::Object::•()
     ;
 }
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 9f14994..b1d29af 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
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X, self::F::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.expect
index f3ff161..0254060 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X, self::F::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.transformed.expect
index f3ff161..0254060 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.transformed.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X, self::F::Y>
     : super core::Object::•()
     ;
 }
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 59670f0..1136126 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
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 c158c43..376b3e8 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
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X, self::F::Y>
     : super core::Object::•()
     ;
 }
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 c158c43..376b3e8 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
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X, self::F::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.expect
index b4a02a0..616a6e6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.transformed.expect
index b4a02a0..616a6e6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.transformed.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X>
     : super core::Object::•()
     ;
 }
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 11e2058..fa98f27 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
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X, self::E::Y>
     ;
 }
 class F<X extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F<self::F::X>
     ;
 }
 static field self::D<dynamic, dynamic> d;
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 ef9bb81..295f48b 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
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X>
     : super core::Object::•()
     ;
 }
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 ef9bb81..295f48b 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
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.expect
index 30cbae9..930fee8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.transformed.expect
index 30cbae9..930fee8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.transformed.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X>
     : super core::Object::•()
     ;
 }
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 9cd5b0b..b439674 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
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X, self::E::Y>
     ;
 }
 class F<X extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 9579477..3484451 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
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X>
     : super core::Object::•()
     ;
 }
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 9579477..3484451 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
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::F<self::F::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.expect
index 8a75651..ae9cf1d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.transformed.expect
index 8a75651..ae9cf1d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y>
     : super core::Object::•()
     ;
 }
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 830d760..89a5873 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
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y>
     ;
 }
 static field self::C<dynamic, dynamic> c;
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 b12947d..4319346 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
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y>
     : super core::Object::•()
     ;
 }
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 b12947d..4319346 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
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.expect
index a5b5d59..5615bb0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.transformed.expect
index a5b5d59..5615bb0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y>
     : super core::Object::•()
     ;
 }
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 dbc3047..9596748 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
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 2e7c48b..3d8d59b 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
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y>
     : super core::Object::•()
     ;
 }
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 2e7c48b..3d8d59b 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
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::D<self::D::X, self::D::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.expect
index 8ab5904..d9386f5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.transformed.expect
index 8ab5904..d9386f5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 1cc5b2f..7013e1a 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 73b735f..7b8c23d 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 73b735f..7b8c23d 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.expect
index 27905d6..d963c8d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.transformed.expect
index 27905d6..d963c8d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 1cc5b2f..7013e1a 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 122f608..5471b49 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  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.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.transformed.expect
index 122f608..5471b49 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.expect
index 5072d9a..df69640 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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]) → void
+  constructor •([self::B::T x = null]) → self::B<self::B::T, self::B::S>
     : super self::A::•() {}
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.transformed.expect
index 5072d9a..df69640 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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]) → void
+  constructor •([self::B::T x = null]) → self::B<self::B::T, self::B::S>
     : super self::A::•() {}
 }
 static method main() → dynamic {
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 25e2d3a..1e69463 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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]) → void
+  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 2851c1c..9b71682 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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]) → void
+  constructor •([self::B::T x = null]) → self::B<self::B::T, self::B::S>
     : super self::A::•() {}
 }
 static method main() → dynamic {
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 2851c1c..9b71682 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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]) → void
+  constructor •([self::B::T x = null]) → self::B<self::B::T, self::B::S>
     : super self::A::•() {}
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.expect
index 7c07c34..44ef58e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Comparable<self::B::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.transformed.expect
index 7c07c34..44ef58e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Comparable<self::B::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 99fed4d..b5e4b59 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Comparable<self::B::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 f4996ec..d787a25 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
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Comparable<self::B::T> = core::Comparable<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
index 66a3752..635fc89 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
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Comparable<self::B::T> = core::Comparable<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.expect
index 7e7802f..b542f5a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo(self::A<dynamic> a) → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.transformed.expect
index 7e7802f..b542f5a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo(self::A<dynamic> a) → 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 8d47cf3..96a89ef 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method foo(self::A<dynamic> a) → 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 2dbd3fa..fe10cec 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo(self::A<core::num> a) → 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 2dbd3fa..fe10cec 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo(self::A<core::num> a) → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.expect
index 752d9aa..43c7732 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.transformed.expect
index 752d9aa..43c7732 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 b6268f4..3e614bc 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 bae54a3..f9130c5 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 bae54a3..f9130c5 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.expect
index 513f483..83e9a8f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.transformed.expect
index 513f483..83e9a8f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 c839345..b4f46aa 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 513f483..83e9a8f 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 513f483..83e9a8f 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::S>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.expect
index 936727b..9bf6de4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.transformed.expect
index 936727b..9bf6de4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 b6268f4..3e614bc 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 2a9e814..d5bf0b9 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 2a9e814..d5bf0b9 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect
index 9385afe..8b55dbe 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect
@@ -47,52 +47,52 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect
index 7e40579..7af2967 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect
@@ -25,52 +25,52 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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::•()
     ;
 }
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 96233c8..3a0c08a 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,43 +25,43 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::X>
     ;
 }
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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;
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 3722939..27c679f 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
@@ -47,52 +47,52 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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::•()
     ;
 }
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 d4f8227..9d8065d 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,52 +25,52 @@
 import "dart:core" as core;
 
 class A<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.expect
index c0cb9b8..ac76218 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.transformed.expect
index c0cb9b8..ac76218 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.transformed.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
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 3b6681f..868083b 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
@@ -3,43 +3,43 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     ;
 }
 static field self::C1<dynamic, dynamic> c1;
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 3621db7..4d3a793 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
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
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 3621db7..4d3a793 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
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.expect
index e323b52..9e7c87b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.transformed.expect
index e323b52..9e7c87b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.transformed.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
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 862f29e..9f84a12 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
@@ -3,43 +3,43 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 d8c6cc7..ddd75ee 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
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
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 d8c6cc7..ddd75ee 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
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class B<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::E<self::E::X>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect
index cc42cff..4f15a48 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::TypeU>
     : super core::Object::•()
     ;
 }
 class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::TypeV>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect
index cc42cff..4f15a48 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::TypeU>
     : super core::Object::•()
     ;
 }
 class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::TypeV>
     : super core::Object::•()
     ;
 }
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 0c77499..1a4b9d6 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
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::TypeT, self::A::TypeS>
     ;
 }
 class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::TypeU>
     ;
 }
 class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::TypeV>
     ;
 }
 static field self::C<dynamic> c;
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 b7a35b1..e89a46a 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
@@ -4,7 +4,7 @@
 // Try providing type arguments to 'A' here.
 // class B<TypeU extends A> {}
 //         ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:10:16: Error: Bound of this variable references variable 'TypeT' from the same declaration.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:10:16: Context: Bound of this variable references variable 'TypeT' from the same declaration.
 // class A<TypeT, TypeS extends TypeT> {}
 //                ^^^^^
 
@@ -20,17 +20,17 @@
 import "dart:core" as core;
 
 class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::TypeV>
     : super core::Object::•()
     ;
 }
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 4bf21ae..c3579fe 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
@@ -10,17 +10,17 @@
 import "dart:core" as core;
 
 class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::TypeV>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect
index dfed3ee..d280666 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::TypeU>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect
index dfed3ee..d280666 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::TypeU>
     : super core::Object::•()
     ;
 }
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 0108401..b23cd6a 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::TypeT, self::A::TypeS>
     ;
 }
 class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::TypeU>
     ;
 }
 static field self::B<dynamic> b;
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 f8cdb5a..9118cd2 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
@@ -4,7 +4,7 @@
 // Try providing type arguments to 'A' here.
 // class B<TypeU extends A> {}
 //         ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:9:16: Error: Bound of this variable references variable 'TypeT' from the same declaration.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:9:16: Context: Bound of this variable references variable 'TypeT' from the same declaration.
 // class A<TypeT, TypeS extends TypeT> {}
 //                ^^^^^
 
@@ -20,12 +20,12 @@
 import "dart:core" as core;
 
 class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::TypeU>
     : super core::Object::•()
     ;
 }
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 4ae9aec..d926c68 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
@@ -10,12 +10,12 @@
 import "dart:core" as core;
 
 class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::TypeU>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect
index 967b3da..f0579e6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect
@@ -4,7 +4,7 @@
 
 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 •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.transformed.expect
index 967b3da..f0579e6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 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 •() → void
+  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 6ac4a79..127fe03 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  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 6269fa0..d1f9062 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
@@ -4,10 +4,10 @@
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
 // typedef Fisk = void Function<TypeY extends Hest>();
 //         ^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:11:30: Error: Bound of this variable references raw type 'Hest'.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:11:30: Context: Bound of this variable references raw type 'Hest'.
 // typedef Fisk = void Function<TypeY extends Hest>();
 //                              ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:9:12: Error: Bound of this variable references raw type 'Fisk'.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:9:12: Context: Bound of this variable references raw type 'Fisk'.
 // class Hest<TypeX extends Fisk> {}
 //            ^^^^^
 
@@ -24,7 +24,7 @@
 
 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 •() → void
+  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 5d686fd..bd3dbbb 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
@@ -11,7 +11,7 @@
 
 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 •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.expect
index 8ff7174..8c847d1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
 class Hest<TypeX extends () → void = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.transformed.expect
index 8ff7174..8c847d1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
 class Hest<TypeX extends () → void = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 57f4622..2000645 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
@@ -4,7 +4,7 @@
 
 typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
 class Hest<TypeX extends () → void = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 1ac7a60..b12ba48 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
@@ -4,10 +4,10 @@
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
 // typedef void Fisk<TypeY extends Hest>();
 //              ^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:19: Error: Bound of this variable references raw type 'Hest'.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:19: Context: Bound of this variable references raw type 'Hest'.
 // typedef void Fisk<TypeY extends Hest>();
 //                   ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:8:12: Error: Bound of this variable references raw type 'Fisk'.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:8:12: Context: Bound of this variable references raw type 'Fisk'.
 // class Hest<TypeX extends Fisk> {}
 //            ^^^^^
 
@@ -24,7 +24,7 @@
 
 typedef Fisk<TypeY extends core::Object = dynamic> = () → void;
 class Hest<TypeX extends () → void = () → void> extends core::Object {
-  synthetic constructor •() → void
+  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 bd13c95..dfe5718 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
@@ -11,7 +11,7 @@
 
 typedef Fisk<TypeY extends core::Object = dynamic> = () → void;
 class Hest<TypeX extends () → void = () → void> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.expect
index 246facc..53f9fc1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.transformed.expect
index 246facc..53f9fc1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 0db76ef..e8cff46 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 178bf7a..62dc787 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
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 f990bcc..a35f146 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,7 +10,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.expect
index e96669a..68d5fb4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.expect
@@ -3,7 +3,7 @@
 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 •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.transformed.expect
index e96669a..68d5fb4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 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 •() → void
+  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 6e46804..d36fb76 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
@@ -3,7 +3,7 @@
 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 •() → void
+  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 c4264ab..6b66d03 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
@@ -27,7 +27,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic, TypeY extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 f4b3391..6594227 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,7 +15,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic, TypeY extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.expect
index 9d87952..71f47e7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.transformed.expect
index 9d87952..71f47e7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 5abeb79..b9f1e44 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 60c725c..673dbbd 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
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 8073742..bfd0570 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,7 +10,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.expect
index cc9040b..fb0be4f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.transformed.expect
index cc9040b..fb0be4f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 65514b1..e9b8c20 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     ;
 }
 class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 a2ec755..f9497f2 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 a2ec755..f9497f2 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.expect
index 8b2d1c8..c4a6a44 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.transformed.expect
index 8b2d1c8..c4a6a44 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 731612d..94a31c0 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 16965b6..143c0fc 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
@@ -4,7 +4,7 @@
 // Try providing type arguments to 'Hest' here.
 // class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
 //            ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:9:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:9:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
 // class Hest<TypeX extends Hest<TypeX>> {}
 //            ^^^^^
 //
@@ -12,7 +12,7 @@
 // Try providing type arguments to 'Hest' here.
 // class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
 //                                ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:9:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:9:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
 // class Hest<TypeX extends Hest<TypeX>> {}
 //            ^^^^^
 
@@ -33,12 +33,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 05da9c9..c98d064 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
@@ -15,12 +15,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.expect
index ae3f2f3..b77b4f5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.transformed.expect
index ae3f2f3..b77b4f5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 910725d..446d326 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
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 7e93861..1abbde3 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
@@ -18,7 +18,7 @@
 import "dart:core" as core;
 
 class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 52cc742..9c68c65 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
@@ -11,7 +11,7 @@
 import "dart:core" as core;
 
 class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.expect
index a5a23c8..8f35bde 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.transformed.expect
index a5a23c8..8f35bde 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 f5b927f..ca65407 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 91a7c9c..02af574 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
@@ -15,12 +15,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 b2e39a8..4bf5fbc 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,12 +9,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect
index 1ebf46d..8ece926 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect
index 1ebf46d..8ece926 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 037cda9..c2f7339 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
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     ;
 }
 class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 4cac409..ad61fa0 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
@@ -4,7 +4,7 @@
 // Try providing type arguments to 'Hest' here.
 // class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
 //               ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:8:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:8:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
 // class Hest<TypeX extends Hest<TypeX>> {}
 //            ^^^^^
 //
@@ -12,7 +12,7 @@
 // Try providing type arguments to 'Fisk' here.
 // class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
 //               ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:10:12: Error: Bound of this variable references variable 'TypeY' from the same declaration.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:10:12: Context: Bound of this variable references variable 'TypeY' from the same declaration.
 // class Fisk<TypeY extends Fisk<TypeY>> {}
 //            ^^^^^
 
@@ -33,17 +33,17 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 7bb7234..e5de63c 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
@@ -15,17 +15,17 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.expect
index 0bdaa11..5691a75 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect
index 0bdaa11..5691a75 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : 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 b2d8428..436437e 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
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     ;
 }
 static method main() → dynamic
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 8e28663..13d4805 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
@@ -4,10 +4,10 @@
 // Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
 // class Hest<TypeX extends lib.Hest> {}
 //       ^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:12: Error: Bound of this variable references raw type 'Hest'.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:12: Context: Bound of this variable references raw type 'Hest'.
 // class Hest<TypeX extends lib.Hest> {}
 //            ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart:16:12: Error: Bound of this variable references raw type 'Hest'.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart:16:12: Context: Bound of this variable references raw type 'Hest'.
 // class Hest<TypeY extends lib.Hest> {}
 //            ^^^^^
 
@@ -23,7 +23,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : 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 f8fe191..9b12ea3 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
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect
index 2cc8768..24daf45 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.transformed.expect
index 2cc8768..24daf45 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 a3d3fb5..c6e450f 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 03e702c..061e900 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
@@ -4,7 +4,7 @@
 // Try providing type arguments to 'Hest' here.
 // class Fisk<TypeY extends Map<Hest, Hest>> {}
 //            ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:9:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:9:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
 // class Hest<TypeX extends Hest<TypeX>> {}
 //            ^^^^^
 
@@ -20,12 +20,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 26843e1..dd60b38 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
@@ -10,12 +10,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.expect
index a2c2f96..0b1c970 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : super core::Object::•()
     ;
 }
 class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
     : super core::Object::•()
     ;
 }
 class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.transformed.expect
index a2c2f96..0b1c970 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : super core::Object::•()
     ;
 }
 class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
     : super core::Object::•()
     ;
 }
 class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 e70601a..6456ed0 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
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     ;
 }
 class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
     ;
 }
 class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 2331e87..c4fbe14 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
@@ -4,7 +4,7 @@
 // Try providing type arguments to 'Hest' here.
 // class Fisk<TypeY extends Hest> {}
 //            ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:9:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:9:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
 // class Hest<TypeX extends Hest<TypeX>> {}
 //            ^^^^^
 
@@ -20,17 +20,17 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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 92649f4..56452e6 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
@@ -10,17 +10,17 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 •() → void
+  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.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.expect
index ccff566..e69cd16 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : super core::Object::•()
     ;
 }
 class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.transformed.expect
index ccff566..e69cd16 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : super core::Object::•()
     ;
 }
 class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 082d2fd..b3554f3 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     ;
 }
 class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 e0630b5..a5b4ddf 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
@@ -4,7 +4,7 @@
 // Try providing type arguments to 'Hest' here.
 // class Fisk<TypeY extends Hest> {}
 //            ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:10:12: Error: Bound of this variable references variable 'TypeX' from the same declaration.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:10:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
 // class Hest<TypeX extends Hest<TypeX>> {}
 //            ^^^^^
 
@@ -20,12 +20,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 f34f645..5953737 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
@@ -10,12 +10,12 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.expect
index b7dfd8e..72ed2b5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.expect
@@ -4,12 +4,12 @@
 import "dart:collection" as col;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → self::A<dynamic>
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.transformed.expect
index b7dfd8e..72ed2b5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 import "dart:collection" as col;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → self::A<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 debf17c..7e226db 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
@@ -4,11 +4,11 @@
 import "dart:collection" as col;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method foo() → self::A<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 b7dfd8e..72ed2b5 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
@@ -4,12 +4,12 @@
 import "dart:collection" as col;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → self::A<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 b7dfd8e..72ed2b5 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
@@ -4,12 +4,12 @@
 import "dart:collection" as col;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → self::A<dynamic>
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.expect
index 995aaf1..6861656 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.transformed.expect
index 995aaf1..6861656 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 a958ced..ac1da81 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 465a807..f4f4b72 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 465a807..f4f4b72 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.expect
index b0c2284..49fae2a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.transformed.expect
index b0c2284..49fae2a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 80aba07..a8e1b17 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 static field self::A<dynamic> a;
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 a9c0166..1b94d92 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends self::A<self::A::T> = self::A<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
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 a9c0166..1b94d92 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends self::A<self::A::T> = self::A<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.expect
index b090467..bb127b8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.expect
@@ -4,17 +4,17 @@
 import "package:expect/expect.dart" as exp;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class X<T extends self::B = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X<self::X::T>
     : super core::Object::•()
     ;
 }
 class Y extends self::X<dynamic> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y
     : super self::X::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.transformed.expect
index b090467..bb127b8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.transformed.expect
@@ -4,17 +4,17 @@
 import "package:expect/expect.dart" as exp;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class X<T extends self::B = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X<self::X::T>
     : super core::Object::•()
     ;
 }
 class Y extends self::X<dynamic> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y
     : super self::X::•()
     ;
 }
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 95892c3..f1a08ad 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
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class X<T extends self::B = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X<self::X::T>
     ;
 }
 class Y extends self::X<dynamic> {
-  synthetic constructor •() → void
+  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 170e64b..ed391ab 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
@@ -4,17 +4,17 @@
 import "package:expect/expect.dart" as exp;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class X<T extends self::B = self::B> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X<self::X::T>
     : super core::Object::•()
     ;
 }
 class Y extends self::X<self::B> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y
     : super self::X::•()
     ;
 }
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 170e64b..ed391ab 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
@@ -4,17 +4,17 @@
 import "package:expect/expect.dart" as exp;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class X<T extends self::B = self::B> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X<self::X::T>
     : super core::Object::•()
     ;
 }
 class Y extends self::X<self::B> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y
     : super self::X::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.expect
index 82574be..36b2665 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo((dynamic) → dynamic a) → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.transformed.expect
index 82574be..36b2665 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo((dynamic) → dynamic a) → 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 1b7b1df..7dc38f3 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method foo((dynamic) → dynamic a) → 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 6c19133..9a78514 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo((core::num) → dynamic a) → 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 6c19133..9a78514 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = core::num> = (T) → dynamic;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo((core::num) → dynamic a) → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.expect
index c2775ea..d67af0a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.expect
@@ -6,7 +6,7 @@
 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 •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
index c2775ea..d67af0a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 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 •() → void
+  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 de720ff..f0a390b 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
@@ -6,7 +6,7 @@
 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 •() → void
+  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 c2775ea..d67af0a 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
@@ -6,7 +6,7 @@
 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 •() → void
+  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 c2775ea..d67af0a 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
@@ -6,7 +6,7 @@
 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 •() → void
+  synthetic constructor •() → self::B<self::B::S>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.expect
index b7cb482..7f89969 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → (dynamic) → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.transformed.expect
index b7cb482..7f89969 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → (dynamic) → 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 a88799c..9aaa7ce 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method foo() → (dynamic) → 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 b7cb482..7f89969 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → (dynamic) → 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 b7cb482..7f89969 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method foo() → (dynamic) → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.expect
index 7df4a93..d47c9b7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B<T extends (dynamic) → dynamic = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.transformed.expect
index 7df4a93..d47c9b7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B<T extends (dynamic) → dynamic = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 f7220cb..91b8274 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
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::num = dynamic> = (T) → dynamic;
 class B<T extends (dynamic) → dynamic = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 97ca06a..334841e 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  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 97ca06a..334841e 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.direct.expect b/pkg/front_end/testcases/invalid_assignment.dart.direct.expect
index a891be4..8e7a4cb 100644
--- a/pkg/front_end/testcases/invalid_assignment.dart.direct.expect
+++ b/pkg/front_end/testcases/invalid_assignment.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int i) → core::String
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.direct.transformed.expect b/pkg/front_end/testcases/invalid_assignment.dart.direct.transformed.expect
index a891be4..8e7a4cb 100644
--- a/pkg/front_end/testcases/invalid_assignment.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/invalid_assignment.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int i) → core::String
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.outline.expect b/pkg/front_end/testcases/invalid_assignment.dart.outline.expect
index d5d3c0e..2c6df27 100644
--- a/pkg/front_end/testcases/invalid_assignment.dart.outline.expect
+++ b/pkg/front_end/testcases/invalid_assignment.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   operator +(core::int i) → core::String
     ;
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect b/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
index b20f7cd..b3fbf5b 100644
--- a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
+++ b/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
@@ -20,7 +20,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int i) → core::String
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect b/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
index 3f357ca..c9eaa51 100644
--- a/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   operator +(core::int i) → core::String
diff --git a/pkg/front_end/testcases/invalid_cast.dart.direct.expect b/pkg/front_end/testcases/invalid_cast.dart.direct.expect
index d768d66..40b3d8c 100644
--- a/pkg/front_end/testcases/invalid_cast.dart.direct.expect
+++ b/pkg/front_end/testcases/invalid_cast.dart.direct.expect
@@ -4,13 +4,13 @@
 
 class C extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::fact2];
-  constructor •() → void
+  constructor •() → self::C
     : super core::Object::•()
     ;
-  constructor nonFact() → void
+  constructor nonFact() → self::C
     : super core::Object::•()
     ;
-  constructor nonFact2() → void
+  constructor nonFact2() → self::C
     : this self::C::nonFact()
     ;
   static factory fact() → self::C
@@ -20,7 +20,7 @@
   static method staticFunction(core::int i) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/invalid_cast.dart.direct.transformed.expect b/pkg/front_end/testcases/invalid_cast.dart.direct.transformed.expect
index d768d66..40b3d8c 100644
--- a/pkg/front_end/testcases/invalid_cast.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/invalid_cast.dart.direct.transformed.expect
@@ -4,13 +4,13 @@
 
 class C extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::fact2];
-  constructor •() → void
+  constructor •() → self::C
     : super core::Object::•()
     ;
-  constructor nonFact() → void
+  constructor nonFact() → self::C
     : super core::Object::•()
     ;
-  constructor nonFact2() → void
+  constructor nonFact2() → self::C
     : this self::C::nonFact()
     ;
   static factory fact() → self::C
@@ -20,7 +20,7 @@
   static method staticFunction(core::int i) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/invalid_cast.dart.outline.expect b/pkg/front_end/testcases/invalid_cast.dart.outline.expect
index fb9e73a..52698ef 100644
--- a/pkg/front_end/testcases/invalid_cast.dart.outline.expect
+++ b/pkg/front_end/testcases/invalid_cast.dart.outline.expect
@@ -4,11 +4,11 @@
 
 class C extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::fact2];
-  constructor •() → void
+  constructor •() → self::C
     ;
-  constructor nonFact() → void
+  constructor nonFact() → self::C
     ;
-  constructor nonFact2() → void
+  constructor nonFact2() → self::C
     ;
   static factory fact() → self::C
     ;
@@ -18,7 +18,7 @@
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 static method topLevelFunction(core::int i) → void
diff --git a/pkg/front_end/testcases/invalid_cast.dart.strong.expect b/pkg/front_end/testcases/invalid_cast.dart.strong.expect
index 8f11e81..dba87e5 100644
--- a/pkg/front_end/testcases/invalid_cast.dart.strong.expect
+++ b/pkg/front_end/testcases/invalid_cast.dart.strong.expect
@@ -51,13 +51,13 @@
 
 class C extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::fact2];
-  constructor •() → void
+  constructor •() → self::C
     : super core::Object::•()
     ;
-  constructor nonFact() → void
+  constructor nonFact() → self::C
     : super core::Object::•()
     ;
-  constructor nonFact2() → void
+  constructor nonFact2() → self::C
     : this self::C::nonFact()
     ;
   static factory fact() → self::C
@@ -67,7 +67,7 @@
   static method staticFunction(core::int i) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect b/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect
index db63dce..d720b90 100644
--- a/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect
@@ -4,13 +4,13 @@
 
 class C extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::fact2];
-  constructor •() → void
+  constructor •() → self::C
     : super core::Object::•()
     ;
-  constructor nonFact() → void
+  constructor nonFact() → self::C
     : super core::Object::•()
     ;
-  constructor nonFact2() → void
+  constructor nonFact2() → self::C
     : this self::C::nonFact()
     ;
   static factory fact() → self::C
@@ -20,7 +20,7 @@
   static method staticFunction(core::int i) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/magic_const.dart.direct.expect b/pkg/front_end/testcases/magic_const.dart.direct.expect
index d0beacd..36d6c67 100644
--- a/pkg/front_end/testcases/magic_const.dart.direct.expect
+++ b/pkg/front_end/testcases/magic_const.dart.direct.expect
@@ -10,12 +10,12 @@
 import "dart:core" as core;
 
 class Constant extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Constant
     : super core::Object::•()
     ;
 }
 class NotConstant extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::NotConstant
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/magic_const.dart.direct.transformed.expect b/pkg/front_end/testcases/magic_const.dart.direct.transformed.expect
index 2f1ef5a..9a97877 100644
--- a/pkg/front_end/testcases/magic_const.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/magic_const.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Constant extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Constant
     : super core::Object::•()
     ;
 }
 class NotConstant extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::NotConstant
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/magic_const.dart.outline.expect b/pkg/front_end/testcases/magic_const.dart.outline.expect
index 8e343a1..cd5d302 100644
--- a/pkg/front_end/testcases/magic_const.dart.outline.expect
+++ b/pkg/front_end/testcases/magic_const.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Constant extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Constant
     ;
 }
 class NotConstant extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::NotConstant
     ;
 }
 static method foo({dynamic a, dynamic b, dynamic c}) → dynamic
diff --git a/pkg/front_end/testcases/magic_const.dart.strong.expect b/pkg/front_end/testcases/magic_const.dart.strong.expect
index 1fdf754..07f6812 100644
--- a/pkg/front_end/testcases/magic_const.dart.strong.expect
+++ b/pkg/front_end/testcases/magic_const.dart.strong.expect
@@ -10,12 +10,12 @@
 import "dart:core" as core;
 
 class Constant extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Constant
     : super core::Object::•()
     ;
 }
 class NotConstant extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::NotConstant
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect b/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect
index b47780b..c4404ef 100644
--- a/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Constant extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::Constant
     : super core::Object::•()
     ;
 }
 class NotConstant extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::NotConstant
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/metadata_enum.dart.direct.expect b/pkg/front_end/testcases/metadata_enum.dart.direct.expect
index f7b63fa..d406cf8 100644
--- a/pkg/front_end/testcases/metadata_enum.dart.direct.expect
+++ b/pkg/front_end/testcases/metadata_enum.dart.direct.expect
@@ -10,7 +10,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/metadata_enum.dart.direct.transformed.expect b/pkg/front_end/testcases/metadata_enum.dart.direct.transformed.expect
index f7b63fa..d406cf8 100644
--- a/pkg/front_end/testcases/metadata_enum.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/metadata_enum.dart.direct.transformed.expect
@@ -10,7 +10,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/metadata_enum.dart.outline.expect b/pkg/front_end/testcases/metadata_enum.dart.outline.expect
index bae6bf7..6fd993b 100644
--- a/pkg/front_end/testcases/metadata_enum.dart.outline.expect
+++ b/pkg/front_end/testcases/metadata_enum.dart.outline.expect
@@ -9,7 +9,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/metadata_enum.dart.strong.expect b/pkg/front_end/testcases/metadata_enum.dart.strong.expect
index f7b63fa..d406cf8 100644
--- a/pkg/front_end/testcases/metadata_enum.dart.strong.expect
+++ b/pkg/front_end/testcases/metadata_enum.dart.strong.expect
@@ -10,7 +10,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/metadata_enum.dart.strong.transformed.expect b/pkg/front_end/testcases/metadata_enum.dart.strong.transformed.expect
index f7b63fa..d406cf8 100644
--- a/pkg/front_end/testcases/metadata_enum.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/metadata_enum.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.expect b/pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.expect
index f571756..43d0e37 100644
--- a/pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.expect
+++ b/pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.expect
@@ -4,17 +4,17 @@
 
 @self::a
 class C = self::D with self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.transformed.expect b/pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.transformed.expect
index 39baa2f..0c681d3 100644
--- a/pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.transformed.expect
@@ -4,17 +4,17 @@
 
 @self::a
 class C extends self::D implements self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
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
index 00b49e4..1da773d 100644
--- a/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect
+++ b/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C = self::D with self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
 }
 static const field dynamic a;
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
index f571756..43d0e37 100644
--- a/pkg/front_end/testcases/metadata_named_mixin_application.dart.strong.expect
+++ b/pkg/front_end/testcases/metadata_named_mixin_application.dart.strong.expect
@@ -4,17 +4,17 @@
 
 @self::a
 class C = self::D with self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
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
index 39baa2f..0c681d3 100644
--- 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
@@ -4,17 +4,17 @@
 
 @self::a
 class C extends self::D implements self::E {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::D::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/micro.dart.outline.expect b/pkg/front_end/testcases/micro.dart.outline.expect
index 56f02f7..ddf99ae 100644
--- a/pkg/front_end/testcases/micro.dart.outline.expect
+++ b/pkg/front_end/testcases/micro.dart.outline.expect
@@ -3,42 +3,42 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
   method instanceMethod() → dynamic
     ;
 }
 abstract class ExternalValue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ExternalValue
     ;
 }
 abstract class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     ;
   abstract method externalInstanceMethod() → self::ExternalValue;
 }
 class Box extends core::Object {
   field dynamic field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Box
     ;
 }
 class FinalBox extends core::Object {
   final field dynamic finalField;
-  constructor •(dynamic finalField) → void
+  constructor •(dynamic finalField) → self::FinalBox
     ;
 }
 class SubFinalBox extends self::FinalBox {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::SubFinalBox
     ;
 }
 class DynamicReceiver1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::DynamicReceiver1
     ;
   method dynamicallyCalled(dynamic x) → dynamic
     ;
 }
 class DynamicReceiver2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::DynamicReceiver2
     ;
   method dynamicallyCalled(dynamic x) → dynamic
     ;
diff --git a/pkg/front_end/testcases/missing_constructor.dart b/pkg/front_end/testcases/missing_constructor.dart
new file mode 100644
index 0000000..190d24c
--- /dev/null
+++ b/pkg/front_end/testcases/missing_constructor.dart
@@ -0,0 +1,26 @@
+// 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.
+
+class Super {
+  Super._();
+}
+
+class Sub extends Super {
+  Sub() : super();
+  Sub.foo() : super.foo();
+}
+
+class Bad {
+  Bad.foo() : this();
+  Bad.bar() : this.baz();
+}
+
+class M {}
+
+class MixinApplication extends Super with M {
+  MixinApplication() : super();
+  MixinApplication.foo() : super.foo();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/missing_constructor.dart.direct.expect b/pkg/front_end/testcases/missing_constructor.dart.direct.expect
new file mode 100644
index 0000000..59fa95b
--- /dev/null
+++ b/pkg/front_end/testcases/missing_constructor.dart.direct.expect
@@ -0,0 +1,67 @@
+// Formatted problems:
+//
+// 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();
+//                            ^^^^^
+
+library;
+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 {
+}
+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.direct.transformed.expect b/pkg/front_end/testcases/missing_constructor.dart.direct.transformed.expect
new file mode 100644
index 0000000..e34b940
--- /dev/null
+++ b/pkg/front_end/testcases/missing_constructor.dart.direct.transformed.expect
@@ -0,0 +1,44 @@
+library;
+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 _() → void
+    : 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
new file mode 100644
index 0000000..6445b5d
--- /dev/null
+++ b/pkg/front_end/testcases/missing_constructor.dart.outline.expect
@@ -0,0 +1,34 @@
+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 {
+}
+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
new file mode 100644
index 0000000..80a4754
--- /dev/null
+++ b/pkg/front_end/testcases/missing_constructor.dart.strong.expect
@@ -0,0 +1,79 @@
+// Formatted problems:
+//
+// 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();
+//                            ^^^^^
+
+library;
+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 {
+}
+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
new file mode 100644
index 0000000..a95622b
--- /dev/null
+++ b/pkg/front_end/testcases/missing_constructor.dart.strong.transformed.expect
@@ -0,0 +1,56 @@
+library;
+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 _() → void
+    : 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.direct.expect b/pkg/front_end/testcases/mixin.dart.direct.expect
index 249e126..a6b7eb7 100644
--- a/pkg/front_end/testcases/mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/mixin.dart.direct.expect
@@ -7,19 +7,19 @@
 abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
 }
 class B extends self::_B&Object&M1&M2 {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::B
     : super core::Object::•()
     ;
 }
 abstract class M1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print("M1");
 }
 abstract class M2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M2
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -30,12 +30,12 @@
 abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
 }
 class C extends self::_C&Object&M1&M2 {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::C
     : super core::Object::•()
     ;
 }
 abstract class G1<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G1<self::G1::T>
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -44,7 +44,7 @@
 abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
 }
 class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::S>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/mixin.dart.direct.transformed.expect
index c3b7891..b21c3c0 100644
--- a/pkg/front_end/testcases/mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/mixin.dart.direct.transformed.expect
@@ -17,19 +17,19 @@
     return core::print("M2");
 }
 class B extends self::_B&Object&M1&M2 {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::B
     : super core::Object::•()
     ;
 }
 abstract class M1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print("M1");
 }
 abstract class M2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M2
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -50,12 +50,12 @@
     return core::print("M2");
 }
 class C extends self::_C&Object&M1&M2 {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::C
     : super core::Object::•()
     ;
 }
 abstract class G1<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G1<self::G1::T>
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -69,7 +69,7 @@
     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 •() → void
+  synthetic constructor •() → self::D<self::D::S>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/mixin.dart.outline.expect b/pkg/front_end/testcases/mixin.dart.outline.expect
index 35f0145..e0f9e24 100644
--- a/pkg/front_end/testcases/mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/mixin.dart.outline.expect
@@ -7,17 +7,17 @@
 abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
 }
 class B extends self::_B&Object&M1&M2 {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::B
     ;
 }
 abstract class M1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1
     ;
   method m() → dynamic
     ;
 }
 abstract class M2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M2
     ;
   method m() → dynamic
     ;
@@ -27,11 +27,11 @@
 abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
 }
 class C extends self::_C&Object&M1&M2 {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::C
     ;
 }
 abstract class G1<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G1<self::G1::T>
     ;
   method m() → dynamic
     ;
@@ -39,7 +39,7 @@
 abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
 }
 class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
-  synthetic constructor •() → void
+  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
index 675b2e9..3463b8e 100644
--- a/pkg/front_end/testcases/mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/mixin.dart.strong.expect
@@ -7,19 +7,19 @@
 abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
 }
 class B extends self::_B&Object&M1&M2 {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::B
     : super core::Object::•()
     ;
 }
 abstract class M1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print("M1");
 }
 abstract class M2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M2
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -30,12 +30,12 @@
 abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
 }
 class C extends self::_C&Object&M1&M2 {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::C
     : super core::Object::•()
     ;
 }
 abstract class G1<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G1<self::G1::T>
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -44,7 +44,7 @@
 abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
 }
 class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::S>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin.dart.strong.transformed.expect
index 12ddf25..bf2b833 100644
--- a/pkg/front_end/testcases/mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/mixin.dart.strong.transformed.expect
@@ -17,19 +17,19 @@
     return core::print("M2");
 }
 class B extends self::_B&Object&M1&M2 {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::B
     : super core::Object::•()
     ;
 }
 abstract class M1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print("M1");
 }
 abstract class M2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M2
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -50,12 +50,12 @@
     return core::print("M2");
 }
 class C extends self::_C&Object&M1&M2 {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::C
     : super core::Object::•()
     ;
 }
 abstract class G1<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G1<self::G1::T>
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -69,7 +69,7 @@
     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 •() → void
+  synthetic constructor •() → self::D<self::D::S>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/mixin_application_override.dart b/pkg/front_end/testcases/mixin_application_override.dart
new file mode 100644
index 0000000..30b4f19
--- /dev/null
+++ b/pkg/front_end/testcases/mixin_application_override.dart
@@ -0,0 +1,41 @@
+// 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 error messages for invalid override in a mixin application.
+
+class S {
+  foo([x]) {}
+}
+
+class M {
+  foo() {}
+}
+
+class M1 {}
+
+class M2 {}
+
+class MX {}
+
+class A0 = S with M;
+class A1 = S with M1, M;
+class A2 = S with M1, M2, M;
+
+class A0X = S with M, MX;
+class A1X = S with M1, M, MX;
+class A2X = S with M1, M2, M, MX;
+
+class B0 extends S with M {}
+
+class B1 extends S with M1, M {}
+
+class B2 extends S with M1, M2, M {}
+
+class B0X extends S with M, MX {}
+
+class B1X extends S with M1, M, MX {}
+
+class B2X extends S with M1, M2, M, MX {}
+
+main() {}
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.direct.expect b/pkg/front_end/testcases/mixin_application_override.dart.direct.expect
new file mode 100644
index 0000000..5ea3f41
--- /dev/null
+++ b/pkg/front_end/testcases/mixin_application_override.dart.direct.expect
@@ -0,0 +1,262 @@
+// Formatted problems:
+//
+// 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 {}
+//       ^^^
+
+library;
+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 class _A1&S&M1 = self::S with self::M1 {
+}
+class A1 = self::_A1&S&M1 with self::M {
+  synthetic constructor •() → self::A1
+    : super self::S::•()
+    ;
+}
+abstract class _A2&S&M1 = self::S with self::M1 {
+}
+abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 {
+}
+class A2 = self::_A2&S&M1&M2 with self::M {
+  synthetic constructor •() → self::A2
+    : super self::S::•()
+    ;
+}
+abstract class _A0X&S&M = self::S with self::M {
+}
+class A0X = self::_A0X&S&M with self::MX {
+  synthetic constructor •() → self::A0X
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1 = self::S with self::M1 {
+}
+abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M {
+}
+class A1X = self::_A1X&S&M1&M with self::MX {
+  synthetic constructor •() → self::A1X
+    : super self::S::•()
+    ;
+}
+abstract class _A2X&S&M1 = self::S with self::M1 {
+}
+abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 {
+}
+abstract class _A2X&S&M1&M2&M = self::_A2X&S&M1&M2 with self::M {
+}
+class A2X = self::_A2X&S&M1&M2&M with self::MX {
+  synthetic constructor •() → self::A2X
+    : super self::S::•()
+    ;
+}
+abstract class _B0&S&M = self::S with self::M {
+}
+class B0 extends self::_B0&S&M {
+  synthetic constructor •() → self::B0
+    : super self::S::•()
+    ;
+}
+abstract class _B1&S&M1 = self::S with self::M1 {
+}
+abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M {
+}
+class B1 extends self::_B1&S&M1&M {
+  synthetic constructor •() → self::B1
+    : super self::S::•()
+    ;
+}
+abstract class _B2&S&M1 = self::S with self::M1 {
+}
+abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 {
+}
+abstract class _B2&S&M1&M2&M = self::_B2&S&M1&M2 with self::M {
+}
+class B2 extends self::_B2&S&M1&M2&M {
+  synthetic constructor •() → self::B2
+    : super self::S::•()
+    ;
+}
+abstract class _B0X&S&M = self::S with self::M {
+}
+abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX {
+}
+class B0X extends self::_B0X&S&M&MX {
+  synthetic constructor •() → self::B0X
+    : super self::S::•()
+    ;
+}
+abstract class _B1X&S&M1 = self::S with self::M1 {
+}
+abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M {
+}
+abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX {
+}
+class B1X extends self::_B1X&S&M1&M&MX {
+  synthetic constructor •() → self::B1X
+    : super self::S::•()
+    ;
+}
+abstract class _B2X&S&M1 = self::S with self::M1 {
+}
+abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 {
+}
+abstract class _B2X&S&M1&M2&M = self::_B2X&S&M1&M2 with self::M {
+}
+abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX {
+}
+class B2X extends self::_B2X&S&M1&M2&M&MX {
+  synthetic constructor •() → self::B2X
+    : super self::S::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.direct.transformed.expect b/pkg/front_end/testcases/mixin_application_override.dart.direct.transformed.expect
new file mode 100644
index 0000000..5d3ca5b
--- /dev/null
+++ b/pkg/front_end/testcases/mixin_application_override.dart.direct.transformed.expect
@@ -0,0 +1,224 @@
+library;
+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::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _A1&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → void
+    : super self::S::•()
+    ;
+}
+class A1 extends self::_A1&S&M1 implements self::M {
+  synthetic constructor •() → self::A1
+    : super self::S::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _A2&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → void
+    : super self::S::•()
+    ;
+}
+abstract class _A2&S&M1&M2 extends self::_A2&S&M1 implements self::M2 {
+  synthetic constructor •() → void
+    : super self::_A2&S&M1::•()
+    ;
+}
+class A2 extends self::_A2&S&M1&M2 implements self::M {
+  synthetic constructor •() → self::A2
+    : super self::S::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _A0X&S&M extends self::S implements self::M {
+  synthetic constructor •() → void
+    : super self::S::•()
+    ;
+  method foo() → dynamic {}
+}
+class A0X extends self::_A0X&S&M implements self::MX {
+  synthetic constructor •() → self::A0X
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → void
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1&M extends self::_A1X&S&M1 implements self::M {
+  synthetic constructor •() → void
+    : super self::_A1X&S&M1::•()
+    ;
+  method foo() → dynamic {}
+}
+class A1X extends self::_A1X&S&M1&M implements self::MX {
+  synthetic constructor •() → self::A1X
+    : super self::S::•()
+    ;
+}
+abstract class _A2X&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → void
+    : super self::S::•()
+    ;
+}
+abstract class _A2X&S&M1&M2 extends self::_A2X&S&M1 implements self::M2 {
+  synthetic constructor •() → void
+    : super self::_A2X&S&M1::•()
+    ;
+}
+abstract class _A2X&S&M1&M2&M extends self::_A2X&S&M1&M2 implements self::M {
+  synthetic constructor •() → void
+    : super self::_A2X&S&M1&M2::•()
+    ;
+  method foo() → dynamic {}
+}
+class A2X extends self::_A2X&S&M1&M2&M implements self::MX {
+  synthetic constructor •() → self::A2X
+    : super self::S::•()
+    ;
+}
+abstract class _B0&S&M extends self::S implements self::M {
+  synthetic constructor •() → void
+    : super self::S::•()
+    ;
+  method foo() → dynamic {}
+}
+class B0 extends self::_B0&S&M {
+  synthetic constructor •() → self::B0
+    : super self::S::•()
+    ;
+}
+abstract class _B1&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → void
+    : super self::S::•()
+    ;
+}
+abstract class _B1&S&M1&M extends self::_B1&S&M1 implements self::M {
+  synthetic constructor •() → void
+    : super self::_B1&S&M1::•()
+    ;
+  method foo() → dynamic {}
+}
+class B1 extends self::_B1&S&M1&M {
+  synthetic constructor •() → self::B1
+    : super self::S::•()
+    ;
+}
+abstract class _B2&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → void
+    : super self::S::•()
+    ;
+}
+abstract class _B2&S&M1&M2 extends self::_B2&S&M1 implements self::M2 {
+  synthetic constructor •() → void
+    : super self::_B2&S&M1::•()
+    ;
+}
+abstract class _B2&S&M1&M2&M extends self::_B2&S&M1&M2 implements self::M {
+  synthetic constructor •() → void
+    : super self::_B2&S&M1&M2::•()
+    ;
+  method foo() → dynamic {}
+}
+class B2 extends self::_B2&S&M1&M2&M {
+  synthetic constructor •() → self::B2
+    : super self::S::•()
+    ;
+}
+abstract class _B0X&S&M extends self::S implements self::M {
+  synthetic constructor •() → void
+    : super self::S::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _B0X&S&M&MX extends self::_B0X&S&M implements self::MX {
+  synthetic constructor •() → void
+    : super self::_B0X&S&M::•()
+    ;
+}
+class B0X extends self::_B0X&S&M&MX {
+  synthetic constructor •() → self::B0X
+    : super self::S::•()
+    ;
+}
+abstract class _B1X&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → void
+    : super self::S::•()
+    ;
+}
+abstract class _B1X&S&M1&M extends self::_B1X&S&M1 implements self::M {
+  synthetic constructor •() → void
+    : super self::_B1X&S&M1::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _B1X&S&M1&M&MX extends self::_B1X&S&M1&M implements self::MX {
+  synthetic constructor •() → void
+    : super self::_B1X&S&M1&M::•()
+    ;
+}
+class B1X extends self::_B1X&S&M1&M&MX {
+  synthetic constructor •() → self::B1X
+    : super self::S::•()
+    ;
+}
+abstract class _B2X&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → void
+    : super self::S::•()
+    ;
+}
+abstract class _B2X&S&M1&M2 extends self::_B2X&S&M1 implements self::M2 {
+  synthetic constructor •() → void
+    : super self::_B2X&S&M1::•()
+    ;
+}
+abstract class _B2X&S&M1&M2&M extends self::_B2X&S&M1&M2 implements self::M {
+  synthetic constructor •() → void
+    : super self::_B2X&S&M1&M2::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _B2X&S&M1&M2&M&MX extends self::_B2X&S&M1&M2&M implements self::MX {
+  synthetic constructor •() → void
+    : super self::_B2X&S&M1&M2&M::•()
+    ;
+}
+class B2X extends self::_B2X&S&M1&M2&M&MX {
+  synthetic constructor •() → self::B2X
+    : super self::S::•()
+    ;
+}
+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
new file mode 100644
index 0000000..41ae8ad
--- /dev/null
+++ b/pkg/front_end/testcases/mixin_application_override.dart.outline.expect
@@ -0,0 +1,254 @@
+// Formatted problems:
+//
+// 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 {}
+//       ^^^
+
+library;
+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 class _A1&S&M1 = self::S with self::M1 {
+}
+class A1 = self::_A1&S&M1 with self::M {
+  synthetic constructor •() → self::A1
+    : super self::S::•()
+    ;
+}
+abstract class _A2&S&M1 = self::S with self::M1 {
+}
+abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 {
+}
+class A2 = self::_A2&S&M1&M2 with self::M {
+  synthetic constructor •() → self::A2
+    : super self::S::•()
+    ;
+}
+abstract class _A0X&S&M = self::S with self::M {
+}
+class A0X = self::_A0X&S&M with self::MX {
+  synthetic constructor •() → self::A0X
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1 = self::S with self::M1 {
+}
+abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M {
+}
+class A1X = self::_A1X&S&M1&M with self::MX {
+  synthetic constructor •() → self::A1X
+    : super self::S::•()
+    ;
+}
+abstract class _A2X&S&M1 = self::S with self::M1 {
+}
+abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 {
+}
+abstract class _A2X&S&M1&M2&M = self::_A2X&S&M1&M2 with self::M {
+}
+class A2X = self::_A2X&S&M1&M2&M with self::MX {
+  synthetic constructor •() → self::A2X
+    : super self::S::•()
+    ;
+}
+abstract class _B0&S&M = self::S with self::M {
+}
+class B0 extends self::_B0&S&M {
+  synthetic constructor •() → self::B0
+    ;
+}
+abstract class _B1&S&M1 = self::S with self::M1 {
+}
+abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M {
+}
+class B1 extends self::_B1&S&M1&M {
+  synthetic constructor •() → self::B1
+    ;
+}
+abstract class _B2&S&M1 = self::S with self::M1 {
+}
+abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 {
+}
+abstract class _B2&S&M1&M2&M = self::_B2&S&M1&M2 with self::M {
+}
+class B2 extends self::_B2&S&M1&M2&M {
+  synthetic constructor •() → self::B2
+    ;
+}
+abstract class _B0X&S&M = self::S with self::M {
+}
+abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX {
+}
+class B0X extends self::_B0X&S&M&MX {
+  synthetic constructor •() → self::B0X
+    ;
+}
+abstract class _B1X&S&M1 = self::S with self::M1 {
+}
+abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M {
+}
+abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX {
+}
+class B1X extends self::_B1X&S&M1&M&MX {
+  synthetic constructor •() → self::B1X
+    ;
+}
+abstract class _B2X&S&M1 = self::S with self::M1 {
+}
+abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 {
+}
+abstract class _B2X&S&M1&M2&M = self::_B2X&S&M1&M2 with self::M {
+}
+abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX {
+}
+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
new file mode 100644
index 0000000..fb58d1f
--- /dev/null
+++ b/pkg/front_end/testcases/mixin_application_override.dart.strong.expect
@@ -0,0 +1,324 @@
+// Formatted problems:
+//
+// 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 {}
+//       ^^^
+
+// Unhandled errors:
+//
+// 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: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: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: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: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: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: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: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: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: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: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:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+//   foo() {}
+//   ^
+
+library;
+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 {
+}
+class A1 = self::_A1&S&M1 with self::M {
+  synthetic constructor •() → self::A1
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+abstract class _A2&S&M1 = self::S with self::M1 {
+}
+abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 {
+}
+class A2 = self::_A2&S&M1&M2 with self::M {
+  synthetic constructor •() → self::A2
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+abstract class _A0X&S&M = self::S with self::M {
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+class A0X = self::_A0X&S&M with self::MX {
+  synthetic constructor •() → self::A0X
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1 = self::S with self::M1 {
+}
+abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M {
+  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::S::•()
+    ;
+}
+abstract class _A2X&S&M1 = self::S with self::M1 {
+}
+abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 {
+}
+abstract class _A2X&S&M1&M2&M = self::_A2X&S&M1&M2 with self::M {
+  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::S::•()
+    ;
+}
+abstract class _B0&S&M = self::S with self::M {
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+class B0 extends self::_B0&S&M {
+  synthetic constructor •() → self::B0
+    : super self::S::•()
+    ;
+}
+abstract class _B1&S&M1 = self::S with self::M1 {
+}
+abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M {
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+class B1 extends self::_B1&S&M1&M {
+  synthetic constructor •() → self::B1
+    : super self::S::•()
+    ;
+}
+abstract class _B2&S&M1 = self::S with self::M1 {
+}
+abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 {
+}
+abstract class _B2&S&M1&M2&M = self::_B2&S&M1&M2 with self::M {
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+class B2 extends self::_B2&S&M1&M2&M {
+  synthetic constructor •() → self::B2
+    : super self::S::•()
+    ;
+}
+abstract class _B0X&S&M = self::S with self::M {
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX {
+}
+class B0X extends self::_B0X&S&M&MX {
+  synthetic constructor •() → self::B0X
+    : super self::S::•()
+    ;
+}
+abstract class _B1X&S&M1 = self::S with self::M1 {
+}
+abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M {
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX {
+}
+class B1X extends self::_B1X&S&M1&M&MX {
+  synthetic constructor •() → self::B1X
+    : super self::S::•()
+    ;
+}
+abstract class _B2X&S&M1 = self::S with self::M1 {
+}
+abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 {
+}
+abstract class _B2X&S&M1&M2&M = self::_B2X&S&M1&M2 with self::M {
+  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 {
+}
+class B2X extends self::_B2X&S&M1&M2&M&MX {
+  synthetic constructor •() → self::B2X
+    : super self::S::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.expect
index 9d1770e..a69ed6d 100644
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.expect
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class C<T extends self::A = dynamic> extends core::Object {
   field self::C::T _field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method foo(self::C::T x) → dynamic {
@@ -17,19 +17,19 @@
   }
 }
 class D extends self::C<self::B> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 abstract class _Foo&Object&C = core::Object with self::C<self::B> {
 }
 class Foo extends self::_Foo&Object&C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.transformed.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.transformed.expect
index 0e95fd1..faed21b 100644
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class C<T extends self::A = dynamic> extends core::Object {
   field self::C::T _field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method foo(self::C::T x) → dynamic {
@@ -17,7 +17,7 @@
   }
 }
 class D extends self::C<self::B> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
@@ -31,12 +31,12 @@
   }
 }
 class Foo extends self::_Foo&Object&C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
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
index 9409948..858ba50 100644
--- 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
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class C<T extends self::A = dynamic> extends core::Object {
   field self::C::T _field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method foo(self::C::T x) → dynamic
     ;
 }
 class D extends self::C<self::B> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 abstract class _Foo&Object&C = core::Object with self::C<self::B> {
 }
 class Foo extends self::_Foo&Object&C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  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
index 16b24db..fbfde41 100644
--- 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::C::T x) → dynamic {
@@ -17,19 +17,19 @@
   }
 }
 class D extends self::C<self::B> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 abstract class _Foo&Object&C = core::Object with self::C<self::B> {
 }
 class Foo extends self::_Foo&Object&C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
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
index 7695db9..d076b3c 100644
--- 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::C::T x) → dynamic {
@@ -17,7 +17,7 @@
   }
 }
 class D extends self::C<self::B> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
@@ -31,12 +31,12 @@
   }
 }
 class Foo extends self::_Foo&Object&C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.direct.expect b/pkg/front_end/testcases/mixin_super_repeated.dart.direct.expect
index 84f870b..0f75c93 100644
--- a/pkg/front_end/testcases/mixin_super_repeated.dart.direct.expect
+++ b/pkg/front_end/testcases/mixin_super_repeated.dart.direct.expect
@@ -4,12 +4,12 @@
 
 abstract class M extends core::Object {
   field dynamic m = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
 }
 abstract class N extends self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::N
     : super self::M::•()
     ;
   set superM(dynamic value) → void {
@@ -19,7 +19,7 @@
     return super.{self::M::m};
 }
 class S extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::S
     : super core::Object::•()
     ;
 }
@@ -28,7 +28,7 @@
 abstract class _Named&S&M&N = self::_Named&S&M with self::N {
 }
 class Named = self::_Named&S&M&N with self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Named
     : super self::S::•()
     ;
 }
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.direct.transformed.expect b/pkg/front_end/testcases/mixin_super_repeated.dart.direct.transformed.expect
index 1cf4d0f..10e9e55 100644
--- a/pkg/front_end/testcases/mixin_super_repeated.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/mixin_super_repeated.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 abstract class M extends core::Object {
   field dynamic m = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
 }
 abstract class N extends self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::N
     : super self::M::•()
     ;
   set superM(dynamic value) → void {
@@ -19,7 +19,7 @@
     return super.{self::M::m};
 }
 class S extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::S
     : super core::Object::•()
     ;
 }
@@ -41,7 +41,7 @@
 }
 class Named extends self::_Named&S&M&N implements self::M {
   field dynamic m = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Named
     : super self::S::•()
     ;
 }
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.outline.expect b/pkg/front_end/testcases/mixin_super_repeated.dart.outline.expect
index a267b35..382eda9 100644
--- a/pkg/front_end/testcases/mixin_super_repeated.dart.outline.expect
+++ b/pkg/front_end/testcases/mixin_super_repeated.dart.outline.expect
@@ -4,11 +4,11 @@
 
 abstract class M extends core::Object {
   field dynamic m;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     ;
 }
 abstract class N extends self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::N
     ;
   set superM(dynamic value) → void
     ;
@@ -16,7 +16,7 @@
     ;
 }
 class S extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::S
     ;
 }
 abstract class _Named&S&M = self::S with self::M {
@@ -24,7 +24,7 @@
 abstract class _Named&S&M&N = self::_Named&S&M with self::N {
 }
 class Named = self::_Named&S&M&N with self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Named
     : super self::S::•()
     ;
 }
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.strong.expect b/pkg/front_end/testcases/mixin_super_repeated.dart.strong.expect
index 2050a52..a52432b 100644
--- a/pkg/front_end/testcases/mixin_super_repeated.dart.strong.expect
+++ b/pkg/front_end/testcases/mixin_super_repeated.dart.strong.expect
@@ -4,12 +4,12 @@
 
 abstract class M extends core::Object {
   field dynamic m = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
 }
 abstract class N extends self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::N
     : super self::M::•()
     ;
   set superM(dynamic value) → void {
@@ -19,7 +19,7 @@
     return super.{self::M::m};
 }
 class S extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::S
     : super core::Object::•()
     ;
 }
@@ -28,7 +28,7 @@
 abstract class _Named&S&M&N = self::_Named&S&M with self::N {
 }
 class Named = self::_Named&S&M&N with self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Named
     : super self::S::•()
     ;
 }
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
index 1bead45..3ce3d54 100644
--- a/pkg/front_end/testcases/mixin_super_repeated.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/mixin_super_repeated.dart.strong.transformed.expect
@@ -4,12 +4,12 @@
 
 abstract class M extends core::Object {
   field dynamic m = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
 }
 abstract class N extends self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::N
     : super self::M::•()
     ;
   set superM(dynamic value) → void {
@@ -19,7 +19,7 @@
     return super.{self::M::m};
 }
 class S extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::S
     : super core::Object::•()
     ;
 }
@@ -41,7 +41,7 @@
 }
 class Named extends self::_Named&S&M&N implements self::M {
   field dynamic m = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Named
     : super self::S::•()
     ;
 }
diff --git a/pkg/front_end/testcases/named_function_scope.dart.direct.expect b/pkg/front_end/testcases/named_function_scope.dart.direct.expect
index 6a0a469..b6b2d79 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.direct.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.direct.expect
@@ -7,14 +7,14 @@
 // pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
 //     var /*@error=DuplicatedNamePreviouslyUsed*/ V;
 //                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:31:52: Error: Previous use of 'V'.
+// pkg/front_end/testcases/named_function_scope.dart:31:52: Context: Previous use of 'V'.
 //     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
 //                                                    ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
 //     var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
 //                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:36:52: Error: Previous use of 'V'.
+// pkg/front_end/testcases/named_function_scope.dart:36:52: Context: Previous use of 'V'.
 //     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
 //                                                    ^
 //
@@ -25,14 +25,14 @@
 // pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
 //         T() {};
 //         ^
-// pkg/front_end/testcases/named_function_scope.dart:45:9: Error: Previous use of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:45:9: Context: Previous use of 'T'.
 //         T
 //         ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
 //     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
 //                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:54:5: Error: Previous use of 'V'.
+// pkg/front_end/testcases/named_function_scope.dart:54:5: Context: Previous use of 'V'.
 //     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
 //     ^
 //
@@ -43,35 +43,35 @@
 // pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
 //         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
 //         ^
-// pkg/front_end/testcases/named_function_scope.dart:62:52: Error: Previous declaration of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:62:52: Context: Previous declaration of 'T'.
 //         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
 //                                                    ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
 //                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:66:5: Error: Previous use of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:66:5: Context: Previous use of 'T'.
 //     T t;
 //     ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
 //                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:71:5: Error: Previous use of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:71:5: Context: Previous use of 'T'.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
 //     ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
 //                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:75:5: Error: Previous use of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:75:5: Context: Previous use of 'T'.
 //     T t;
 //     ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
 //                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:80:5: Error: Previous use of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:80:5: Context: Previous use of 'T'.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
 //     ^
 //
@@ -98,12 +98,12 @@
 import "dart:core" as core;
 
 class T extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T
     : super core::Object::•()
     ;
 }
 class V extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::V
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect b/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect
index 02bf73d..582b0c0 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect
@@ -17,12 +17,12 @@
 import "dart:core" as core;
 
 class T extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T
     : super core::Object::•()
     ;
 }
 class V extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::V
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/named_function_scope.dart.outline.expect b/pkg/front_end/testcases/named_function_scope.dart.outline.expect
index 95be2cd..023ec2f 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.outline.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class T extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T
     ;
 }
 class V extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::V
     ;
 }
 static method test() → dynamic
diff --git a/pkg/front_end/testcases/named_function_scope.dart.strong.expect b/pkg/front_end/testcases/named_function_scope.dart.strong.expect
index 38d058b..cf7a297 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.strong.expect
@@ -7,14 +7,14 @@
 // pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
 //     var /*@error=DuplicatedNamePreviouslyUsed*/ V;
 //                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:31:52: Error: Previous use of 'V'.
+// pkg/front_end/testcases/named_function_scope.dart:31:52: Context: Previous use of 'V'.
 //     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
 //                                                    ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
 //     var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
 //                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:36:52: Error: Previous use of 'V'.
+// pkg/front_end/testcases/named_function_scope.dart:36:52: Context: Previous use of 'V'.
 //     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
 //                                                    ^
 //
@@ -25,14 +25,14 @@
 // pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
 //         T() {};
 //         ^
-// pkg/front_end/testcases/named_function_scope.dart:45:9: Error: Previous use of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:45:9: Context: Previous use of 'T'.
 //         T
 //         ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
 //     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
 //                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:54:5: Error: Previous use of 'V'.
+// pkg/front_end/testcases/named_function_scope.dart:54:5: Context: Previous use of 'V'.
 //     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
 //     ^
 //
@@ -43,35 +43,35 @@
 // pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
 //         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
 //         ^
-// pkg/front_end/testcases/named_function_scope.dart:62:52: Error: Previous declaration of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:62:52: Context: Previous declaration of 'T'.
 //         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
 //                                                    ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
 //                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:66:5: Error: Previous use of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:66:5: Context: Previous use of 'T'.
 //     T t;
 //     ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
 //                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:71:5: Error: Previous use of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:71:5: Context: Previous use of 'T'.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
 //     ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
 //                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:75:5: Error: Previous use of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:75:5: Context: Previous use of 'T'.
 //     T t;
 //     ^
 //
 // pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
 //                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:80:5: Error: Previous use of 'T'.
+// pkg/front_end/testcases/named_function_scope.dart:80:5: Context: Previous use of 'T'.
 //     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
 //     ^
 //
@@ -102,12 +102,12 @@
 import "dart:core" as core;
 
 class T extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T
     : super core::Object::•()
     ;
 }
 class V extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::V
     : super core::Object::•()
     ;
 }
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
index bffb97c..4c5b73f 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
@@ -21,12 +21,12 @@
 import "dart:core" as core;
 
 class T extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T
     : super core::Object::•()
     ;
 }
 class V extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::V
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/named_parameters.dart.outline.expect b/pkg/front_end/testcases/named_parameters.dart.outline.expect
index acdd97f..523fb9c 100644
--- a/pkg/front_end/testcases/named_parameters.dart.outline.expect
+++ b/pkg/front_end/testcases/named_parameters.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Superclass extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Superclass
     ;
   method foo({dynamic alpha, dynamic beta}) → dynamic
     ;
@@ -13,7 +13,7 @@
     ;
 }
 class Subclass extends self::Superclass {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Subclass
     ;
   method foo({dynamic beta, dynamic alpha}) → dynamic
     ;
diff --git a/pkg/front_end/testcases/native_as_name.dart.direct.expect b/pkg/front_end/testcases/native_as_name.dart.direct.expect
index d982aee..52a151a 100644
--- a/pkg/front_end/testcases/native_as_name.dart.direct.expect
+++ b/pkg/front_end/testcases/native_as_name.dart.direct.expect
@@ -4,25 +4,25 @@
 
 class W extends core::Object {
   field core::String native;
-  constructor •() → void
+  constructor •() → self::W
     : self::W::native = "field", super core::Object::•()
     ;
 }
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
   method native() → core::String
     return "method";
 }
 abstract class Y1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y1
     : super core::Object::•()
     ;
   abstract get native() → core::String;
 }
 class Y2 extends self::Y1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y2
     : super self::Y1::•()
     ;
   @core::override
@@ -31,7 +31,7 @@
 }
 class Z extends core::Object {
   field core::String f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Z
     : super core::Object::•()
     ;
   set native(core::String s) → dynamic
diff --git a/pkg/front_end/testcases/native_as_name.dart.direct.transformed.expect b/pkg/front_end/testcases/native_as_name.dart.direct.transformed.expect
index d982aee..52a151a 100644
--- a/pkg/front_end/testcases/native_as_name.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/native_as_name.dart.direct.transformed.expect
@@ -4,25 +4,25 @@
 
 class W extends core::Object {
   field core::String native;
-  constructor •() → void
+  constructor •() → self::W
     : self::W::native = "field", super core::Object::•()
     ;
 }
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
   method native() → core::String
     return "method";
 }
 abstract class Y1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y1
     : super core::Object::•()
     ;
   abstract get native() → core::String;
 }
 class Y2 extends self::Y1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y2
     : super self::Y1::•()
     ;
   @core::override
@@ -31,7 +31,7 @@
 }
 class Z extends core::Object {
   field core::String f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Z
     : super core::Object::•()
     ;
   set native(core::String s) → dynamic
diff --git a/pkg/front_end/testcases/native_as_name.dart.outline.expect b/pkg/front_end/testcases/native_as_name.dart.outline.expect
index 0ee8d2d..6c2884c 100644
--- a/pkg/front_end/testcases/native_as_name.dart.outline.expect
+++ b/pkg/front_end/testcases/native_as_name.dart.outline.expect
@@ -4,29 +4,29 @@
 
 class W extends core::Object {
   field core::String native;
-  constructor •() → void
+  constructor •() → self::W
     ;
 }
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     ;
   method native() → core::String
     ;
 }
 abstract class Y1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y1
     ;
   abstract get native() → core::String;
 }
 class Y2 extends self::Y1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y2
     ;
   get native() → core::String
     ;
 }
 class Z extends core::Object {
   field core::String f;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Z
     ;
   set native(core::String s) → 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
index e667fad..f8d53d9 100644
--- a/pkg/front_end/testcases/native_as_name.dart.strong.expect
+++ b/pkg/front_end/testcases/native_as_name.dart.strong.expect
@@ -4,25 +4,25 @@
 
 class W extends core::Object {
   field core::String native;
-  constructor •() → void
+  constructor •() → self::W
     : self::W::native = "field", super core::Object::•()
     ;
 }
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
   method native() → core::String
     return "method";
 }
 abstract class Y1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y1
     : super core::Object::•()
     ;
   abstract get native() → core::String;
 }
 class Y2 extends self::Y1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y2
     : super self::Y1::•()
     ;
   @core::override
@@ -31,7 +31,7 @@
 }
 class Z extends core::Object {
   field core::String f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Z
     : super core::Object::•()
     ;
   set native(core::String s) → void
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
index a502052..beb0031 100644
--- a/pkg/front_end/testcases/native_as_name.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/native_as_name.dart.strong.transformed.expect
@@ -4,25 +4,25 @@
 
 class W extends core::Object {
   field core::String native;
-  constructor •() → void
+  constructor •() → self::W
     : self::W::native = "field", super core::Object::•()
     ;
 }
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
   method native() → core::String
     return "method";
 }
 abstract class Y1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y1
     : super core::Object::•()
     ;
   abstract get native() → core::String;
 }
 class Y2 extends self::Y1 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y2
     : super self::Y1::•()
     ;
   @core::override
@@ -31,7 +31,7 @@
 }
 class Z extends core::Object {
   field core::String f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Z
     : super core::Object::•()
     ;
   set native(core::String s) → void
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.expect b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.expect
index 6c29079..bbe754b 100644
--- a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.expect
+++ b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   final field core::int bar;
-  const constructor •(core::int bar) → void
+  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) → void
+  const constructor •(self::A baz) → self::B
     : self::B::baz = baz, super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method fun() → dynamic {
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.transformed.expect b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.transformed.expect
index 6c29079..bbe754b 100644
--- a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.transformed.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   final field core::int bar;
-  const constructor •(core::int bar) → void
+  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) → void
+  const constructor •(self::A baz) → self::B
     : self::B::baz = baz, super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method fun() → 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
index 17440e2..2a8f6986 100644
--- 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
@@ -4,16 +4,16 @@
 
 class A extends core::Object {
   final field core::int bar;
-  const constructor •(core::int bar) → void
+  const constructor •(core::int bar) → self::A
     ;
 }
 class B extends core::Object {
   final field self::A baz;
-  const constructor •(self::A baz) → void
+  const constructor •(self::A baz) → self::B
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method fun() → 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
index 6c29079..bbe754b 100644
--- 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
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   final field core::int bar;
-  const constructor •(core::int bar) → void
+  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) → void
+  const constructor •(self::A baz) → self::B
     : self::B::baz = baz, super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method fun() → 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
index 6c29079..bbe754b 100644
--- 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
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   final field core::int bar;
-  const constructor •(core::int bar) → void
+  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) → void
+  const constructor •(self::A baz) → self::B
     : self::B::baz = baz, super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method fun() → dynamic {
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.direct.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.direct.expect
index 6053292..19107e3 100644
--- a/pkg/front_end/testcases/new_const_insertion/simple.dart.direct.expect
+++ b/pkg/front_end/testcases/new_const_insertion/simple.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::int x;
-  const constructor •(core::int x) → void
+  const constructor •(core::int x) → self::A
     : self::A::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.direct.transformed.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.direct.transformed.expect
index 6053292..19107e3 100644
--- a/pkg/front_end/testcases/new_const_insertion/simple.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/new_const_insertion/simple.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::int x;
-  const constructor •(core::int x) → void
+  const constructor •(core::int x) → self::A
     : self::A::x = x, super core::Object::•()
     ;
 }
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 61d4856..d6fdb25 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::int x;
-  const constructor •(core::int x) → void
+  const constructor •(core::int x) → self::A
     ;
 }
 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 d7f734b..45e1e48 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::int x;
-  const constructor •(core::int x) → void
+  const constructor •(core::int x) → self::A
     : self::A::x = x, super core::Object::•()
     ;
 }
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 d7f734b..45e1e48 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
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   final field core::int x;
-  const constructor •(core::int x) → void
+  const constructor •(core::int x) → self::A
     : self::A::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect
index 4715ca5..5227ee2 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect
@@ -4,12 +4,12 @@
 
 abstract class I extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic i) → dynamic
@@ -20,7 +20,7 @@
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect
index 4715ca5..5227ee2 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 abstract class I extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic i) → dynamic
@@ -20,7 +20,7 @@
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
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 4a9cf68..26417ba 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
@@ -4,11 +4,11 @@
 
 abstract class I extends core::Object {
   field core::int foo;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method noSuchMethod(dynamic i) → dynamic
     ;
@@ -18,7 +18,7 @@
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 static method expectTypeError(() → dynamic callback) → void
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 178f196..67f6aca 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
@@ -4,12 +4,12 @@
 
 abstract class I extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -20,7 +20,7 @@
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
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 178f196..67f6aca 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
@@ -4,12 +4,12 @@
 
 abstract class I extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -20,7 +20,7 @@
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect
index b5697c5..a9742d6 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect
@@ -4,12 +4,12 @@
 
 abstract class A extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic i) → dynamic {
@@ -24,7 +24,7 @@
 abstract class _C&Object&B = core::Object with self::B {
 }
 class C extends self::_C&Object&B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get foo() → core::int
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect
index dba219d..cb83539 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 abstract class A extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic i) → dynamic {
@@ -31,7 +31,7 @@
   }
 }
 class C extends self::_C&Object&B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get foo() → core::int
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 ec76229..15c9cda 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
@@ -4,11 +4,11 @@
 
 abstract class A extends core::Object {
   field core::int foo;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method noSuchMethod(dynamic i) → dynamic
     ;
@@ -20,7 +20,7 @@
 abstract class _C&Object&B = core::Object with self::B {
 }
 class C extends self::_C&Object&B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   get foo() → core::int
     ;
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 953a669..4c4939e 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
@@ -4,12 +4,12 @@
 
 abstract class A extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -24,7 +24,7 @@
 abstract class _C&Object&B = core::Object with self::B {
 }
 class C extends self::_C&Object&B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get foo() → core::int
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 ab758a7..c602274 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
@@ -4,12 +4,12 @@
 
 abstract class A extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -31,7 +31,7 @@
   }
 }
 class C extends self::_C&Object&B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get foo() → core::int
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect
index 4f01365..5db27cd 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect
@@ -4,12 +4,12 @@
 
 abstract class A extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get foo() → core::int
@@ -18,14 +18,14 @@
     return "bar";
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  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::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 abstract class D extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set foo(core::int value) → void {}
@@ -33,7 +33,7 @@
     return "bar";
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   no-such-method-forwarder get foo() → core::int
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect
index 4f01365..5db27cd 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 abstract class A extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get foo() → core::int
@@ -18,14 +18,14 @@
     return "bar";
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  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::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 abstract class D extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set foo(core::int value) → void {}
@@ -33,7 +33,7 @@
     return "bar";
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   no-such-method-forwarder get foo() → core::int
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 02d4667..75eb679 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
@@ -4,11 +4,11 @@
 
 abstract class A extends core::Object {
   field core::int foo;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 abstract class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   get foo() → core::int
     ;
@@ -16,13 +16,13 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   no-such-method-forwarder set foo(core::int value) → void
     return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 abstract class D extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   set foo(core::int value) → void
     ;
@@ -30,7 +30,7 @@
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   no-such-method-forwarder get foo() → core::int
     return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
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 43a4429..d157898 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
@@ -4,12 +4,12 @@
 
 abstract class A extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get foo() → core::int
@@ -18,14 +18,14 @@
     return "bar";
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  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::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 abstract class D extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set foo(core::int value) → void {}
@@ -33,7 +33,7 @@
     return "bar";
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   no-such-method-forwarder get foo() → core::int
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 43a4429..d157898 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
@@ -4,12 +4,12 @@
 
 abstract class A extends core::Object {
   field core::int foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get foo() → core::int
@@ -18,14 +18,14 @@
     return "bar";
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  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::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 abstract class D extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set foo(core::int value) → void {}
@@ -33,7 +33,7 @@
     return "bar";
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   no-such-method-forwarder get foo() → core::int
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect
index 232606c..8fcff73 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect
@@ -4,12 +4,12 @@
 
 abstract class A<X extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::X> foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic i) → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect
index 232606c..8fcff73 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 abstract class A<X extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::X> foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic i) → dynamic
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 8d22954..edae600 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
@@ -4,11 +4,11 @@
 
 abstract class A<X extends core::Object = dynamic> extends core::Object {
   field core::List<self::A::X> foo;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::X>
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method noSuchMethod(dynamic i) → 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 3b8a767..d90d08e 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
@@ -4,12 +4,12 @@
 
 abstract class A<X extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field core::List<self::A::X> foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
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 3b8a767..d90d08e 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
@@ -4,12 +4,12 @@
 
 abstract class A<X extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field core::List<self::A::X> foo = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.expect
index 2a97b62..15071a4 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -11,13 +11,13 @@
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.transformed.expect
index 2a97b62..15071a4 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -11,13 +11,13 @@
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
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 e05ba5e..c2010a6 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,18 +3,18 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   abstract method foo() → void;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
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 2a97b62..15071a4 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -11,13 +11,13 @@
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
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 2a97b62..15071a4 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -11,13 +11,13 @@
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.expect
index 86da90d..c5bcd9f 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic {}
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic _) → dynamic
@@ -26,7 +26,7 @@
 abstract class _C&A&B = self::A with self::B {
 }
 class C extends self::_C&A&B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.transformed.expect
index 45424c8..7b853f4 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic {}
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic _) → dynamic
@@ -31,7 +31,7 @@
     return null;
 }
 class C extends self::_C&A&B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
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 8252a0a..eb7632c 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,18 +3,18 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   abstract method foo() → dynamic;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method foo() → dynamic
     ;
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method noSuchMethod(dynamic _) → dynamic
     ;
@@ -24,7 +24,7 @@
 abstract class _C&A&B = self::A with self::B {
 }
 class C extends self::_C&A&B {
-  synthetic constructor •() → void
+  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 10faf1b..4fc3589 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,19 +3,19 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic {}
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation _) → dynamic
@@ -26,7 +26,7 @@
 abstract class _C&A&B = self::A with self::B {
 }
 class C extends self::_C&A&B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
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 15ead99..6b4ec43 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,19 +3,19 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic {}
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation _) → dynamic
@@ -31,7 +31,7 @@
     return null;
 }
 class C extends self::_C&A&B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.expect
index 2be3542..95c74d3 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -20,7 +20,7 @@
   abstract method hest([core::int fisk = 42]) → core::int;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo({core::String bar = "baz"}) → core::String
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.transformed.expect
index 2be3542..95c74d3 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -20,7 +20,7 @@
   abstract method hest([core::int fisk = 42]) → core::int;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo({core::String bar = "baz"}) → core::String
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 ff0e80e..2e7a56d 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     ;
@@ -11,7 +11,7 @@
   abstract method hest([core::int fisk]) → core::int;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   no-such-method-forwarder method foo({core::String bar}) → core::String
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#bar: bar}), false)) as{TypeError} core::String;
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 13822b5..c987a83 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -20,7 +20,7 @@
   abstract method hest([core::int fisk = 42]) → core::int;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo({core::String bar = "baz"}) → core::String
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 13822b5..c987a83 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -20,7 +20,7 @@
   abstract method hest([core::int fisk = 42]) → core::int;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo({core::String bar = "baz"}) → core::String
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.expect
index 5243e2d..dd93aa3 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class M extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.transformed.expect
index 5243e2d..dd93aa3 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class M extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
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 c95a42f..8eb5f2d 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,17 +3,17 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     ;
   abstract method foo() → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     ;
   abstract method foo() → void;
 }
 class M extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     ;
   method noSuchMethod(core::Invocation i) → 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 5243e2d..dd93aa3 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,19 +3,19 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class M extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
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 5243e2d..dd93aa3 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,19 +3,19 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I1
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I2
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class M extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.expect
index 65e96b6..5ad08c0 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -20,7 +20,7 @@
 abstract class _B&Object&A = core::Object with self::A {
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.transformed.expect
index 4211c4c..42ed7d8 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -25,7 +25,7 @@
     return null;
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
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 e39977a..f023ea6 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,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   abstract method foo() → void;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     ;
@@ -18,7 +18,7 @@
 abstract class _B&Object&A = core::Object with self::A {
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
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 65e96b6..5ad08c0 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,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -20,7 +20,7 @@
 abstract class _B&Object&A = core::Object with self::A {
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
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 4211c4c..42ed7d8 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,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -25,7 +25,7 @@
     return null;
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.expect
index 6928073..21135dc 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -11,13 +11,13 @@
   }
 }
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method foo() → void {}
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.transformed.expect
index 6928073..21135dc 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -11,13 +11,13 @@
   }
 }
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method foo() → void {}
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
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 f1b794a..3f0df65 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,19 +3,19 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     ;
 }
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   method foo() → void
     ;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
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 6928073..21135dc 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -11,13 +11,13 @@
   }
 }
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method foo() → void {}
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
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 6928073..21135dc 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -11,13 +11,13 @@
   }
 }
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method foo() → void {}
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.expect
index 5d8ddf7..2957383 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -12,7 +12,7 @@
     return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -21,7 +21,7 @@
 abstract class _A&Object&M = core::Object with self::M {
 }
 class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
@@ -30,7 +30,7 @@
 abstract class _B&Object&M = core::Object with self::M {
 }
 class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.transformed.expect
index eb2d0a0..8c31606 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -12,7 +12,7 @@
     return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -26,7 +26,7 @@
     return null;
 }
 class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
@@ -40,7 +40,7 @@
     return null;
 }
 class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
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 0901c24..42bc14b 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,7 +3,7 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     ;
@@ -11,7 +11,7 @@
     return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     ;
@@ -19,7 +19,7 @@
 abstract class _A&Object&M = core::Object with self::M {
 }
 class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
@@ -27,7 +27,7 @@
 abstract class _B&Object&M = core::Object with self::M {
 }
 class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
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 5d8ddf7..2957383 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,7 +3,7 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -12,7 +12,7 @@
     return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -21,7 +21,7 @@
 abstract class _A&Object&M = core::Object with self::M {
 }
 class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
@@ -30,7 +30,7 @@
 abstract class _B&Object&M = core::Object with self::M {
 }
 class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
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 eb2d0a0..8c31606 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,7 +3,7 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -12,7 +12,7 @@
     return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -26,7 +26,7 @@
     return null;
 }
 class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
@@ -40,7 +40,7 @@
     return null;
 }
 class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.expect
index 0844ef1..705c920 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic i) → dynamic
@@ -11,7 +11,7 @@
   abstract method foo() → void;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.transformed.expect
index 0844ef1..705c920 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic i) → dynamic
@@ -11,7 +11,7 @@
   abstract method foo() → void;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
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 9d07b09..0bb3fab 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,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method noSuchMethod(dynamic i) → dynamic
     ;
   abstract method foo() → void;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
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 06e4afc..fd592d7 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -11,7 +11,7 @@
   abstract method foo() → void;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
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 06e4afc..fd592d7 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -11,7 +11,7 @@
   abstract method foo() → void;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.expect
index 8e3a340..4dc27df 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic i) → dynamic
@@ -11,19 +11,19 @@
   abstract method foo() → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.transformed.expect
index 8e3a340..4dc27df 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic i) → dynamic
@@ -11,19 +11,19 @@
   abstract method foo() → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
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 7be5d2c..a68fbe3 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 •() → void
+  synthetic constructor •() → self::A
     ;
   method noSuchMethod(dynamic i) → dynamic
     ;
   abstract method foo() → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  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 8196a67..ea635a0 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -11,19 +11,19 @@
   abstract method foo() → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
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 8196a67..ea635a0 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,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -11,19 +11,19 @@
   abstract method foo() → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.expect
index 37a4788..b877712 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
 }
 class A extends self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M::•()
     ;
   no-such-method-forwarder method call(core::String s) → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.transformed.expect
index 37a4788..b877712 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
 }
 class A extends self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M::•()
     ;
   no-such-method-forwarder method call(core::String s) → void
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 b0427dc..9ffed72 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,13 +3,13 @@
 import "dart:core" as core;
 
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     ;
 }
 class A extends self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   no-such-method-forwarder method call(core::String s) → void
     return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withoutType("call", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[s]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
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 37a4788..b877712 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,14 +3,14 @@
 import "dart:core" as core;
 
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
 }
 class A extends self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M::•()
     ;
   no-such-method-forwarder method call(core::String s) → void
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 37a4788..b877712 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,14 +3,14 @@
 import "dart:core" as core;
 
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     return null;
 }
 class A extends self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super self::M::•()
     ;
   no-such-method-forwarder method call(core::String s) → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.expect
index 012c9be..9f21bc5 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -13,7 +13,7 @@
 abstract class _B&Object&A = core::Object with self::A {
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.transformed.expect
index 5b1b182..73c44a8 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -19,7 +19,7 @@
   }
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
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 3a59956..f40d07d 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     ;
@@ -11,7 +11,7 @@
 abstract class _B&Object&A = core::Object with self::A {
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
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 012c9be..9f21bc5 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -13,7 +13,7 @@
 abstract class _B&Object&A = core::Object with self::A {
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
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 5b1b182..73c44a8 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -19,7 +19,7 @@
   }
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.expect
index 125b323..14f0a36 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.expect
@@ -4,21 +4,21 @@
 import "./private_module.dart" as pri;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     return 42;
 }
 class Bar extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → void
+  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::_withoutType("_hest", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class Baz extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super self::Foo::•()
     ;
   method _hest() → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.transformed.expect
index 125b323..14f0a36 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.transformed.expect
@@ -4,21 +4,21 @@
 import "./private_module.dart" as pri;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     return 42;
 }
 class Bar extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → void
+  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::_withoutType("_hest", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class Baz extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super self::Foo::•()
     ;
   method _hest() → dynamic
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 36ff954..596c676 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
@@ -4,19 +4,19 @@
 import "./private_module.dart" as pri;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     ;
 }
 class Bar extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → void
+  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::_withoutType("_hest", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class Baz extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     ;
   method _hest() → dynamic
     ;
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 125b323..14f0a36 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
@@ -4,21 +4,21 @@
 import "./private_module.dart" as pri;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     return 42;
 }
 class Bar extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → void
+  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::_withoutType("_hest", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class Baz extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super self::Foo::•()
     ;
   method _hest() → dynamic
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 125b323..14f0a36 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
@@ -4,21 +4,21 @@
 import "./private_module.dart" as pri;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     return 42;
 }
 class Bar extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → void
+  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::_withoutType("_hest", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class Baz extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Baz
     : super self::Foo::•()
     ;
   method _hest() → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.direct.expect
index 9565466..c1d3571 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.direct.transformed.expect
index 9565466..c1d3571 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → void
+  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 fd3f8a1..4b1c326 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 •() → void
+  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 9565466..c1d3571 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 •() → void
+  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 9565466..c1d3571 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 •() → void
+  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.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.direct.expect
index 2a23a7b..05969c5 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   abstract method _foo() → void;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Foo::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.direct.transformed.expect
index 2a23a7b..05969c5 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   abstract method _foo() → void;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Foo::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
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 e8cddd1..c223ebc 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,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
   abstract method _foo() → void;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     ;
   method noSuchMethod(core::Invocation invocation) → 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 2a23a7b..05969c5 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,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   abstract method _foo() → void;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Foo::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
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 2a23a7b..05969c5 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,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   abstract method _foo() → void;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Foo::•()
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.expect
index f043899..731d843 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.transformed.expect
index f043899..731d843 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
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 279022d..a45f5ba 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method noSuchMethod(core::Invocation i) → 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 f043899..731d843 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
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 f043899..731d843 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.expect
index 99cfce5..87b568d 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.expect
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Warning: Can't declare a member that conflicts with an inherited one.
 //   void foo(int x) {}
 //        ^
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Warning: This is the inherited member.
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Context: This is the inherited member.
 //   void set foo(int x);
 //            ^
 
@@ -12,7 +12,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo(core::int x) → void {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.transformed.expect
index 081ba63..7b2e767 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo(core::int x) → void {}
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 94996d7..81abb12 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
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Warning: Can't declare a member that conflicts with an inherited one.
 //   void foo(int x) {}
 //        ^
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Warning: This is the inherited member.
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Context: This is the inherited member.
 //   void set foo(int x);
 //            ^
 
@@ -12,7 +12,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method foo(core::int x) → void
     ;
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 8facc2b..975dbf1 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
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Error: Can't declare a member that conflicts with an inherited one.
 //   void foo(int x) {}
 //        ^
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: This is the inherited member.
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Context: This is the inherited member.
 //   void set foo(int x);
 //            ^
 
@@ -18,7 +18,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo(core::int x) → void {}
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 d158aa5..cecb135 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
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo(core::int x) → void {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect
index 4ae2d71..30c2905 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method foo() → self::I::T;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -19,7 +19,7 @@
 abstract class _A&Object&M = core::Object with self::M {
 }
 class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → core::int
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect
index 198f601..6f791e0 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method foo() → self::I::T;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -25,7 +25,7 @@
   }
 }
 class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → core::int
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 5d00e53..9e561e3 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method foo() → self::I::T;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     ;
@@ -16,7 +16,7 @@
 abstract class _A&Object&M = core::Object with self::M {
 }
 class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   no-such-method-forwarder method foo() → core::int
     return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
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 4ae2d71..30c2905 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method foo() → self::I::T;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -19,7 +19,7 @@
 abstract class _A&Object&M = core::Object with self::M {
 }
 class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → core::int
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 198f601..6f791e0 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method foo() → self::I::T;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -25,7 +25,7 @@
   }
 }
 class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   no-such-method-forwarder method foo() → core::int
diff --git a/pkg/front_end/testcases/null_aware.dart.direct.expect b/pkg/front_end/testcases/null_aware.dart.direct.expect
index ddf9175..5695867 100644
--- a/pkg/front_end/testcases/null_aware.dart.direct.expect
+++ b/pkg/front_end/testcases/null_aware.dart.direct.expect
@@ -5,7 +5,7 @@
 class Foo extends core::Object {
   field core::int field = null;
   static field core::int staticField = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/null_aware.dart.direct.transformed.expect
index ddf9175..5695867 100644
--- a/pkg/front_end/testcases/null_aware.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/null_aware.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 class Foo extends core::Object {
   field core::int field = null;
   static field core::int staticField = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/null_aware.dart.outline.expect b/pkg/front_end/testcases/null_aware.dart.outline.expect
index ef39846..2dda472 100644
--- a/pkg/front_end/testcases/null_aware.dart.outline.expect
+++ b/pkg/front_end/testcases/null_aware.dart.outline.expect
@@ -5,7 +5,7 @@
 class Foo extends core::Object {
   field core::int field;
   static field core::int staticField;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/operators.dart.direct.expect b/pkg/front_end/testcases/operators.dart.direct.expect
index 1997580..9760fe2 100644
--- a/pkg/front_end/testcases/operators.dart.direct.expect
+++ b/pkg/front_end/testcases/operators.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Operators extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Operators
     : super core::Object::•()
     ;
   operator +(dynamic other) → dynamic
diff --git a/pkg/front_end/testcases/operators.dart.direct.transformed.expect b/pkg/front_end/testcases/operators.dart.direct.transformed.expect
index 1997580..9760fe2 100644
--- a/pkg/front_end/testcases/operators.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/operators.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Operators extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Operators
     : super core::Object::•()
     ;
   operator +(dynamic other) → dynamic
diff --git a/pkg/front_end/testcases/operators.dart.outline.expect b/pkg/front_end/testcases/operators.dart.outline.expect
index 58caf3b..22aa8c4 100644
--- a/pkg/front_end/testcases/operators.dart.outline.expect
+++ b/pkg/front_end/testcases/operators.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Operators extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Operators
     ;
   operator +(dynamic other) → dynamic
     ;
diff --git a/pkg/front_end/testcases/optional.dart.outline.expect b/pkg/front_end/testcases/optional.dart.outline.expect
index b82f9f2..0f681fd 100644
--- a/pkg/front_end/testcases/optional.dart.outline.expect
+++ b/pkg/front_end/testcases/optional.dart.outline.expect
@@ -3,36 +3,36 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
   method method(dynamic x, [dynamic y, dynamic z]) → dynamic
     ;
 }
 abstract class External extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::Listener
     ;
   abstract method event(core::String input, [core::int x, core::int y]) → void;
 }
 class TestListener extends self::Listener {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::TestListener
     ;
   method event(dynamic input, [dynamic x, dynamic y]) → void
     ;
 }
 class ExtendedListener extends self::Listener {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ExtendedListener
     ;
   method event(dynamic input, [dynamic x, dynamic y, dynamic z]) → void
     ;
 }
 class InvalidListener extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::InvalidListener
     ;
   method event(dynamic input, [dynamic x]) → void
     ;
diff --git a/pkg/front_end/testcases/override.dart.direct.expect b/pkg/front_end/testcases/override.dart.direct.expect
index f491b61..d13c10d 100644
--- a/pkg/front_end/testcases/override.dart.direct.expect
+++ b/pkg/front_end/testcases/override.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Foo::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   method method() → self::Foo {
@@ -21,7 +21,7 @@
   }
 }
 class Sub extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Sub
     : super self::Base::•()
     ;
   method method() → self::Foo {
diff --git a/pkg/front_end/testcases/override.dart.direct.transformed.expect b/pkg/front_end/testcases/override.dart.direct.transformed.expect
index f491b61..d13c10d 100644
--- a/pkg/front_end/testcases/override.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/override.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Foo::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   method method() → self::Foo {
@@ -21,7 +21,7 @@
   }
 }
 class Sub extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Sub
     : super self::Base::•()
     ;
   method method() → self::Foo {
diff --git a/pkg/front_end/testcases/override.dart.outline.expect b/pkg/front_end/testcases/override.dart.outline.expect
index 1cd8eab..3f78064 100644
--- a/pkg/front_end/testcases/override.dart.outline.expect
+++ b/pkg/front_end/testcases/override.dart.outline.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     ;
   method method() → self::Foo
     ;
 }
 class Sub extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Sub
     ;
   method method() → self::Foo
     ;
diff --git a/pkg/front_end/testcases/override.dart.strong.expect b/pkg/front_end/testcases/override.dart.strong.expect
index da081a5..d83238df 100644
--- a/pkg/front_end/testcases/override.dart.strong.expect
+++ b/pkg/front_end/testcases/override.dart.strong.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Foo::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   method method() → self::Foo {
@@ -21,7 +21,7 @@
   }
 }
 class Sub extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Sub
     : super self::Base::•()
     ;
   method method() → self::Foo {
diff --git a/pkg/front_end/testcases/override.dart.strong.transformed.expect b/pkg/front_end/testcases/override.dart.strong.transformed.expect
index da081a5..d83238df 100644
--- a/pkg/front_end/testcases/override.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/override.dart.strong.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super self::Foo::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
   method method() → self::Foo {
@@ -21,7 +21,7 @@
   }
 }
 class Sub extends self::Base {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Sub
     : super self::Base::•()
     ;
   method method() → self::Foo {
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.expect
index 929fb02..cf84a61 100644
--- a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(self::A value) → void {}
@@ -21,7 +21,7 @@
     return null;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(dynamic value) → void {}
@@ -29,7 +29,7 @@
     return null;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   set x(self::A value) → void {}
@@ -37,7 +37,7 @@
     return null;
 }
 class F extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::D::•()
     ;
   set x(self::B value) → void {}
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.transformed.expect
index 929fb02..cf84a61 100644
--- a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(self::A value) → void {}
@@ -21,7 +21,7 @@
     return null;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(dynamic value) → void {}
@@ -29,7 +29,7 @@
     return null;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   set x(self::A value) → void {}
@@ -37,7 +37,7 @@
     return null;
 }
 class F extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::D::•()
     ;
   set x(self::B value) → void {}
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
index e72187d..98a1f1b 100644
--- 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
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   set x(self::A value) → void
     ;
@@ -19,7 +19,7 @@
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   set x(dynamic value) → void
     ;
@@ -27,7 +27,7 @@
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   set x(self::A value) → void
     ;
@@ -35,7 +35,7 @@
     ;
 }
 class F extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     ;
   set x(self::B value) → void
     ;
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
index d517d97..d6ad025 100644
--- 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
@@ -4,7 +4,7 @@
 // Change to a subtype of #lib1::B.
 //   A get /*@error=OverrideTypeMismatchReturnType*/ y => null;
 //                                                   ^
-// pkg/front_end/testcases/override_check_accessor_after_inference.dart:18:7: Error: This is the overridden method ('y').
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:18:7: Context: This is the overridden method ('y').
 //   get y => null; // Inferred type: B
 //       ^
 //
@@ -12,7 +12,7 @@
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
 //   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
 //                                                         ^
-// pkg/front_end/testcases/override_check_accessor_after_inference.dart:17:12: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:17:12: Context: This is the overridden method ('x').
 //   void set x(value) {} // Inferred type: A
 //            ^
 
@@ -33,17 +33,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(self::A value) → void {}
@@ -51,7 +51,7 @@
     return null;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(self::A value) → void {}
@@ -59,7 +59,7 @@
     return null;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   set x(self::A value) → void {}
@@ -67,7 +67,7 @@
     return null;
 }
 class F extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::D::•()
     ;
   set x(self::B value) → void {}
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.expect
index 28beda4..959f74d 100644
--- a/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.expect
+++ b/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(self::A value) → void {}
@@ -21,7 +21,7 @@
     return null;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(core::Object value) → void {}
@@ -29,7 +29,7 @@
     return null;
 }
 class E extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::C::•()
     ;
   set x(self::B value) → void {}
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.transformed.expect
index 28beda4..959f74d 100644
--- a/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(self::A value) → void {}
@@ -21,7 +21,7 @@
     return null;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(core::Object value) → void {}
@@ -29,7 +29,7 @@
     return null;
 }
 class E extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::C::•()
     ;
   set x(self::B value) → void {}
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
index 81a11b3..19a8160 100644
--- a/pkg/front_end/testcases/override_check_accessor_basic.dart.outline.expect
+++ b/pkg/front_end/testcases/override_check_accessor_basic.dart.outline.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   set x(self::A value) → void
     ;
@@ -19,7 +19,7 @@
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   set x(core::Object value) → void
     ;
@@ -27,7 +27,7 @@
     ;
 }
 class E extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   set x(self::B value) → void
     ;
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
index cdc0223..dc4010c 100644
--- a/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
@@ -4,7 +4,7 @@
 // Change to a subtype of #lib1::A.
 //   Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;
 //                                                        ^
-// pkg/front_end/testcases/override_check_accessor_basic.dart:13:9: Error: This is the overridden method ('y').
+// pkg/front_end/testcases/override_check_accessor_basic.dart:13:9: Context: This is the overridden method ('y').
 //   A get y => null;
 //         ^
 //
@@ -12,7 +12,7 @@
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
 //   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
 //                                                         ^
-// pkg/front_end/testcases/override_check_accessor_basic.dart:12:12: Error: This is the overridden method ('x').
+// pkg/front_end/testcases/override_check_accessor_basic.dart:12:12: Context: This is the overridden method ('x').
 //   void set x(A value) {}
 //            ^
 
@@ -33,17 +33,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(self::A value) → void {}
@@ -51,7 +51,7 @@
     return null;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(core::Object value) → void {}
@@ -59,7 +59,7 @@
     return null;
 }
 class E extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::C::•()
     ;
   set x(self::B value) → void {}
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.expect
index 66aef63..7a03141 100644
--- a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.expect
+++ b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x1(covariant self::A value) → void {}
@@ -24,7 +24,7 @@
   set x6(covariant self::B value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x1(self::B value) → void {}
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.transformed.expect
index 66aef63..7a03141 100644
--- a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x1(covariant self::A value) → void {}
@@ -24,7 +24,7 @@
   set x6(covariant self::B value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x1(self::B value) → void {}
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
index ef4604c..f5ae95c 100644
--- 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
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   set x1(covariant self::A value) → void
     ;
@@ -27,7 +27,7 @@
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   set x1(self::B value) → void
     ;
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
index 0a4e4f0..8fc4f70 100644
--- 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
@@ -4,7 +4,7 @@
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
 //       B /*@error=OverrideTypeMismatchParameter*/ value) {} // Not covariant
 //                                                  ^
-// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:15:12: Error: This is the overridden method ('x4').
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:15:12: Context: This is the overridden method ('x4').
 //   void set x4(A value) {}
 //            ^
 //
@@ -12,7 +12,7 @@
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
 //       covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}
 //                                                                 ^
-// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:16:12: Error: This is the overridden method ('x5').
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:16:12: Context: This is the overridden method ('x5').
 //   void set x5(covariant A value) {}
 //            ^
 
@@ -33,17 +33,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x1(covariant self::A value) → void {}
@@ -54,7 +54,7 @@
   set x6(covariant self::B value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x1(covariant self::B value) → void {}
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.direct.expect b/pkg/front_end/testcases/override_check_after_inference.dart.direct.expect
index aecb023..deaf420 100644
--- a/pkg/front_end/testcases/override_check_after_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/override_check_after_inference.dart.direct.expect
@@ -3,35 +3,35 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(self::A x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f(dynamic x) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   method f(self::A x) → void {}
 }
 class F extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::D::•()
     ;
   method f(self::B x) → void {}
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_after_inference.dart.direct.transformed.expect
index aecb023..deaf420 100644
--- a/pkg/front_end/testcases/override_check_after_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/override_check_after_inference.dart.direct.transformed.expect
@@ -3,35 +3,35 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(self::A x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f(dynamic x) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   method f(self::A x) → void {}
 }
 class F extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::D::•()
     ;
   method f(self::B x) → void {}
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
index 0f780a0..82c9ce4 100644
--- a/pkg/front_end/testcases/override_check_after_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/override_check_after_inference.dart.outline.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method f(self::A x) → void
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method f(dynamic x) → void
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   method f(self::A x) → void
     ;
 }
 class F extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     ;
   method f(self::B x) → void
     ;
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
index bc8edb9..8b8b1b8 100644
--- a/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
@@ -4,7 +4,7 @@
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
 //   void f(B /*@error=OverrideTypeMismatchParameter*/ x) {}
 //                                                     ^
-// pkg/front_end/testcases/override_check_after_inference.dart:16:8: Error: This is the overridden method ('f').
+// pkg/front_end/testcases/override_check_after_inference.dart:16:8: Context: This is the overridden method ('f').
 //   void f(x) {} // Inferred type: (A) -> void
 //        ^
 
@@ -20,35 +20,35 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(self::A x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f(self::A x) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   method f(self::A x) → void {}
 }
 class F extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super self::D::•()
     ;
   method f(self::B x) → void {}
diff --git a/pkg/front_end/testcases/override_check_basic.dart.direct.expect b/pkg/front_end/testcases/override_check_basic.dart.direct.expect
index cb5a353..e538a45 100644
--- a/pkg/front_end/testcases/override_check_basic.dart.direct.expect
+++ b/pkg/front_end/testcases/override_check_basic.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f1(self::A x) → void {}
@@ -22,7 +22,7 @@
   method f4() → self::A {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f1(core::Object x) → void {}
@@ -31,7 +31,7 @@
   method f4() → self::B {}
 }
 class E extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::C::•()
     ;
   method f1(self::B x) → void {}
diff --git a/pkg/front_end/testcases/override_check_basic.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_basic.dart.direct.transformed.expect
index cb5a353..e538a45 100644
--- a/pkg/front_end/testcases/override_check_basic.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/override_check_basic.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f1(self::A x) → void {}
@@ -22,7 +22,7 @@
   method f4() → self::A {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f1(core::Object x) → void {}
@@ -31,7 +31,7 @@
   method f4() → self::B {}
 }
 class E extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::C::•()
     ;
   method f1(self::B x) → void {}
diff --git a/pkg/front_end/testcases/override_check_basic.dart.outline.expect b/pkg/front_end/testcases/override_check_basic.dart.outline.expect
index 3432cbe..a3277c0 100644
--- a/pkg/front_end/testcases/override_check_basic.dart.outline.expect
+++ b/pkg/front_end/testcases/override_check_basic.dart.outline.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method f1(self::A x) → void
     ;
@@ -23,7 +23,7 @@
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method f1(core::Object x) → void
     ;
@@ -35,7 +35,7 @@
     ;
 }
 class E extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   method f1(self::B x) → void
     ;
diff --git a/pkg/front_end/testcases/override_check_basic.dart.strong.expect b/pkg/front_end/testcases/override_check_basic.dart.strong.expect
index 8b4f9db..72ccf4c 100644
--- a/pkg/front_end/testcases/override_check_basic.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_basic.dart.strong.expect
@@ -4,7 +4,7 @@
 // Change to a subtype of #lib1::A.
 //   Object /*@error=OverrideTypeMismatchReturnType*/ f4() {}
 //                                                    ^
-// pkg/front_end/testcases/override_check_basic.dart:15:5: Error: This is the overridden method ('f4').
+// pkg/front_end/testcases/override_check_basic.dart:15:5: Context: This is the overridden method ('f4').
 //   A f4() {}
 //     ^
 //
@@ -12,7 +12,7 @@
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
 //   void f3({B /*@error=OverrideTypeMismatchParameter*/ x}) {}
 //                                                       ^
-// pkg/front_end/testcases/override_check_basic.dart:14:8: Error: This is the overridden method ('f3').
+// pkg/front_end/testcases/override_check_basic.dart:14:8: Context: This is the overridden method ('f3').
 //   void f3({A x}) {}
 //        ^
 //
@@ -20,7 +20,7 @@
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
 //   void f1(B /*@error=OverrideTypeMismatchParameter*/ x) {}
 //                                                      ^
-// pkg/front_end/testcases/override_check_basic.dart:12:8: Error: This is the overridden method ('f1').
+// pkg/front_end/testcases/override_check_basic.dart:12:8: Context: This is the overridden method ('f1').
 //   void f1(A x) {}
 //        ^
 //
@@ -28,7 +28,7 @@
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
 //   void f2([B /*@error=OverrideTypeMismatchParameter*/ x]) {}
 //                                                       ^
-// pkg/front_end/testcases/override_check_basic.dart:13:8: Error: This is the overridden method ('f2').
+// pkg/front_end/testcases/override_check_basic.dart:13:8: Context: This is the overridden method ('f2').
 //   void f2([A x]) {}
 //        ^
 
@@ -59,17 +59,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f1(self::A x) → void {}
@@ -78,7 +78,7 @@
   method f4() → self::A {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f1(core::Object x) → void {}
@@ -87,7 +87,7 @@
   method f4() → self::B {}
 }
 class E extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::C::•()
     ;
   method f1(self::B x) → void {}
diff --git a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.expect b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.expect
index b01aeb7..1b50295 100644
--- a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.expect
+++ b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class Foo<T extends self::Foo<self::Foo::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
 }
 abstract class Bar extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::Hest
     : super core::Object::•()
     ;
   @core::override
diff --git a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.transformed.expect
index b01aeb7..1b50295 100644
--- a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class Foo<T extends self::Foo<self::Foo::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
 }
 abstract class Bar extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::Hest
     : super core::Object::•()
     ;
   @core::override
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
index f6befa0..9051099 100644
--- 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
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class Foo<T extends self::Foo<self::Foo::T> = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     ;
 }
 abstract class Bar extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::Hest
     ;
   method fisk<U extends self::Foo<self::Hest::fisk::U> = dynamic>() → 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
index d4dc158..ef8c1dc 100644
--- 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
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class Foo<T extends self::Foo<self::Foo::T> = self::Foo<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
 }
 abstract class Bar extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::Hest
     : super core::Object::•()
     ;
   @core::override
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
index d4dc158..ef8c1dc 100644
--- 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
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class Foo<T extends self::Foo<self::Foo::T> = self::Foo<dynamic>> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo<self::Foo::T>
     : super core::Object::•()
     ;
 }
 abstract class Bar extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::Hest
     : super core::Object::•()
     ;
   @core::override
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.expect
index edbd26a..dfd8d78 100644
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.expect
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   method f<U extends core::Object = dynamic>(core::Map<self::A::T, self::A::f::U> m) → void {}
 }
 class B extends self::A<core::String> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   method f<V extends core::Object = dynamic>(core::Map<core::String, self::B::f::V> m) → void {}
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.transformed.expect
index edbd26a..dfd8d78 100644
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   method f<U extends core::Object = dynamic>(core::Map<self::A::T, self::A::f::U> m) → void {}
 }
 class B extends self::A<core::String> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   method f<V extends core::Object = dynamic>(core::Map<core::String, self::B::f::V> m) → void {}
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
index b2cfae4..2f0107f 100644
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.outline.expect
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
   method f<U extends core::Object = dynamic>(core::Map<self::A::T, self::A::f::U> m) → void
     ;
 }
 class B extends self::A<core::String> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f<V extends core::Object = dynamic>(core::Map<core::String, self::B::f::V> m) → void
     ;
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
index 28b4a22..05d92ea 100644
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 {}
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
index 28b4a22..05d92ea 100644
--- 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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 {}
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.expect
index fe85b88..bd8f94e 100644
--- a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.expect
+++ b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f1(covariant self::A x) → void {}
@@ -24,7 +24,7 @@
   method f6(covariant self::B x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f1(self::B x) → void {}
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.transformed.expect
index fe85b88..bd8f94e 100644
--- a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f1(covariant self::A x) → void {}
@@ -24,7 +24,7 @@
   method f6(covariant self::B x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f1(self::B x) → void {}
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
index 6037ed1..2d4aa32 100644
--- 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
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method f1(covariant self::A x) → void
     ;
@@ -27,7 +27,7 @@
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method f1(self::B x) → void
     ;
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
index cdddc5d..955df32 100644
--- 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
@@ -4,7 +4,7 @@
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
 //   void f5(covariant String /*@error=OverrideTypeMismatchParameter*/ x) {}
 //                                                                     ^
-// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:16:8: Error: This is the overridden method ('f5').
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:16:8: Context: This is the overridden method ('f5').
 //   void f5(covariant A x) {}
 //        ^
 //
@@ -12,7 +12,7 @@
 // Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
 //   void f4(B /*@error=OverrideTypeMismatchParameter*/ x) {} // Not covariant
 //                                                      ^
-// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:15:8: Error: This is the overridden method ('f4').
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:15:8: Context: This is the overridden method ('f4').
 //   void f4(A x) {}
 //        ^
 
@@ -33,17 +33,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f1(covariant self::A x) → void {}
@@ -54,7 +54,7 @@
   method f6(covariant self::B x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f1(covariant self::B x) → void {}
diff --git a/pkg/front_end/testcases/prefer_baseclass.dart.direct.expect b/pkg/front_end/testcases/prefer_baseclass.dart.direct.expect
index a31ae2c..18f3480 100644
--- a/pkg/front_end/testcases/prefer_baseclass.dart.direct.expect
+++ b/pkg/front_end/testcases/prefer_baseclass.dart.direct.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class AB1 extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::AB1
     : super self::A::•()
     ;
 }
 class AB2 extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::AB2
     : super self::A::•()
     ;
 }
 class BA1 extends self::B implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BA1
     : super self::B::•()
     ;
 }
 class BA2 extends self::B implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BA2
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/prefer_baseclass.dart.direct.transformed.expect b/pkg/front_end/testcases/prefer_baseclass.dart.direct.transformed.expect
index a31ae2c..18f3480 100644
--- a/pkg/front_end/testcases/prefer_baseclass.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/prefer_baseclass.dart.direct.transformed.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class AB1 extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::AB1
     : super self::A::•()
     ;
 }
 class AB2 extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::AB2
     : super self::A::•()
     ;
 }
 class BA1 extends self::B implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BA1
     : super self::B::•()
     ;
 }
 class BA2 extends self::B implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BA2
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/prefer_baseclass.dart.outline.expect b/pkg/front_end/testcases/prefer_baseclass.dart.outline.expect
index d00f434..1e16047 100644
--- a/pkg/front_end/testcases/prefer_baseclass.dart.outline.expect
+++ b/pkg/front_end/testcases/prefer_baseclass.dart.outline.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class AB1 extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::AB1
     ;
 }
 class AB2 extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::AB2
     ;
 }
 class BA1 extends self::B implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BA1
     ;
 }
 class BA2 extends self::B implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BA2
     ;
 }
 static method takeSubclassOfA(dynamic obj) → dynamic
diff --git a/pkg/front_end/testcases/qualified.dart.direct.expect b/pkg/front_end/testcases/qualified.dart.direct.expect
index c507585..ffe6b62 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.expect
@@ -3,7 +3,7 @@
 // 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: Error: The name of the enclosing class is 'Bad'.
+// pkg/front_end/testcases/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
 // class Bad extends lib.Missing {
 //       ^^^
 //
@@ -45,21 +45,21 @@
 abstract class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
 }
 class WithMixin extends self::_WithMixin&Supertype&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::WithMixin
     : super lib::Supertype::•()
     ;
 }
 class IllegalSupertype extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  constructor a() → void
+  constructor a() → self::C<self::C::T>
     : super core::Object::•()
     ;
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
diff --git a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
index bc19cfd..dca499a 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
@@ -30,21 +30,21 @@
   }
 }
 class WithMixin extends self::_WithMixin&Supertype&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::WithMixin
     : super lib::Supertype::•()
     ;
 }
 class IllegalSupertype extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  constructor a() → void
+  constructor a() → self::C<self::C::T>
     : super core::Object::•()
     ;
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
diff --git a/pkg/front_end/testcases/qualified.dart.outline.expect b/pkg/front_end/testcases/qualified.dart.outline.expect
index ae38d0d..15d4637 100644
--- a/pkg/front_end/testcases/qualified.dart.outline.expect
+++ b/pkg/front_end/testcases/qualified.dart.outline.expect
@@ -3,7 +3,7 @@
 // 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: Error: The name of the enclosing class is 'Bad'.
+// pkg/front_end/testcases/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
 // class Bad extends lib.Missing {
 //       ^^^
 //
@@ -33,18 +33,18 @@
 abstract class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
 }
 class WithMixin extends self::_WithMixin&Supertype&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::WithMixin
     ;
 }
 class IllegalSupertype extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  constructor •() → self::C<self::C::T>
     ;
-  constructor a() → void
+  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;
diff --git a/pkg/front_end/testcases/qualified.dart.strong.expect b/pkg/front_end/testcases/qualified.dart.strong.expect
index 81c5a97..d6e1727 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.expect
@@ -3,7 +3,7 @@
 // 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: Error: The name of the enclosing class is 'Bad'.
+// pkg/front_end/testcases/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
 // class Bad extends lib.Missing {
 //       ^^^
 //
@@ -49,21 +49,21 @@
 abstract class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
 }
 class WithMixin extends self::_WithMixin&Supertype&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::WithMixin
     : super lib::Supertype::•()
     ;
 }
 class IllegalSupertype extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  constructor a() → void
+  constructor a() → self::C<self::C::T>
     : super core::Object::•()
     ;
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
diff --git a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
index 35303f8..ad0928d 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
@@ -34,21 +34,21 @@
   }
 }
 class WithMixin extends self::_WithMixin&Supertype&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::WithMixin
     : super lib::Supertype::•()
     ;
 }
 class IllegalSupertype extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  constructor a() → void
+  constructor a() → self::C<self::C::T>
     : super core::Object::•()
     ;
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
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 8fc1fa2..f05d10d 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 •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static method main() → dynamic
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 d8ddaed..bbe1cea 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
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C
     ;
-  const constructor x() → void
+  const constructor x() → self::C
     ;
 }
 static method main() → dynamic
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 1edd902..9eec648 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) → void
+  constructor •(dynamic x) → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.direct.expect
index 9f269d1..627bb4bb 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.direct.expect
@@ -1,15 +1,23 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Warning: Too few positional arguments: 1 required, 0 given.
+//   const B() : super();
+//                    ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •(dynamic x) → void
+  constructor •(dynamic x) → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  const constructor •() → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:15: Error: Method not found: 'super.'.\n  const B() : super();\n              ^"))
+  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.direct.transformed.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.direct.transformed.expect
new file mode 100644
index 0000000..145398b
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.direct.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  const constructor •() → self::B
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
+  const B() : super();
+                   ^"
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  const self::B::•();
+}
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 b8dc013..525802d 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •(dynamic x) → void
+  constructor •(dynamic x) → self::A
     ;
 }
 class B extends self::A {
-  const constructor •() → void
+  const constructor •() → self::B
     ;
 }
 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
new file mode 100644
index 0000000..94e3c44
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.strong.expect
@@ -0,0 +1,26 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
+//   const B() : super();
+//                    ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  const constructor •() → self::B
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
+  const B() : super();
+                   ^"
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  const self::B::•();
+}
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
new file mode 100644
index 0000000..145398b
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  const constructor •() → self::B
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
+  const B() : super();
+                   ^"
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  const self::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 b8dc013..525802d 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
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •(dynamic x) → void
+  constructor •(dynamic x) → self::A
     ;
 }
 class B extends self::A {
-  const constructor •() → void
+  const constructor •() → self::B
     ;
 }
 static method main() → dynamic
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 ca1dccd..06f511e 100644
--- a/pkg/front_end/testcases/rasta/bad_redirection.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_redirection.dart.outline.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  constructor •() → void
+  constructor •() → self::Foo
     ;
 }
 class Bar extends self::Foo {
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 e95aa3d..97d6cdd 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 •() → void
+  constructor •() → self::C
     ;
   set field(dynamic value) → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.direct.expect b/pkg/front_end/testcases/rasta/cascades.dart.direct.expect
index 3e0316e..72ce722 100644
--- a/pkg/front_end/testcases/rasta/cascades.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/cascades.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method add(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/cascades.dart.direct.transformed.expect
index 3e0316e..72ce722 100644
--- a/pkg/front_end/testcases/rasta/cascades.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/cascades.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 66fdaf0..4e10201 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 •() → void
+  synthetic constructor •() → self::A
     ;
   method add(dynamic x) → dynamic
     ;
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 5bae75e..bae8de1 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
@@ -29,15 +29,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 d7df801..5719ce2 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() → void
+  constructor constructor1() → self::Foo
     ;
-  constructor constructor2() → void
+  constructor constructor2() → self::Foo
     ;
-  constructor constructor3() → void
+  constructor constructor3() → self::Foo
     ;
   method a() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.expect
index 8d36ce1..87d7e8d 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
 }
@@ -13,7 +13,7 @@
 abstract class _A&Object&Mixin&Mixin = self::_A&Object&Mixin with self::Mixin {
 }
 class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.transformed.expect
index f2ec868..ebb7020 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
 }
@@ -21,7 +21,7 @@
     ;
 }
 class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 494e9e1..bb832c5 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class Mixin extends core::Object {
   field dynamic field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     ;
 }
 abstract class _A&Object&Mixin = core::Object with self::Mixin {
@@ -12,6 +12,6 @@
 abstract class _A&Object&Mixin&Mixin = self::_A&Object&Mixin with self::Mixin {
 }
 class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → void
+  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 8d36ce1..87d7e8d 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
 }
@@ -13,7 +13,7 @@
 abstract class _A&Object&Mixin&Mixin = self::_A&Object&Mixin with self::Mixin {
 }
 class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 f2ec868..ebb7020 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,7 +4,7 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
 }
@@ -21,7 +21,7 @@
     ;
 }
 class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/enum.dart.direct.expect b/pkg/front_end/testcases/rasta/enum.dart.direct.expect
index 804a5a2..111e2dc 100644
--- a/pkg/front_end/testcases/rasta/enum.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/enum.dart.direct.expect
@@ -8,7 +8,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/rasta/enum.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/enum.dart.direct.transformed.expect
index 804a5a2..111e2dc 100644
--- a/pkg/front_end/testcases/rasta/enum.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/enum.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
   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) → void
+  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
diff --git a/pkg/front_end/testcases/rasta/enum.dart.outline.expect b/pkg/front_end/testcases/rasta/enum.dart.outline.expect
index d31354b..0a56230 100644
--- a/pkg/front_end/testcases/rasta/enum.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/enum.dart.outline.expect
@@ -8,7 +8,7 @@
   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) → void
+  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
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 2bee7a2..312b830 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
@@ -13,20 +13,20 @@
 import "dart:core" as core;
 
 class C1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C1
     ;
 }
 class C2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C2
     ;
 }
 class C3 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C3
     ;
 }
 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() → void
+  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;
@@ -37,7 +37,7 @@
 }
 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() → void
+  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;
@@ -45,7 +45,7 @@
     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 •() → void
+  constructor •() → self::C<self::C::U>
     ;
 }
 static method main() → dynamic
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 7076215..ed8e416 100644
--- a/pkg/front_end/testcases/rasta/issue_000002.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000002.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   final field dynamic value;
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::Foo
     ;
   static factory fac(dynamic value) → self::Foo
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.direct.expect
index 524ca4d..d7d5102 100644
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Mixin extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -17,7 +17,7 @@
 abstract class _Sub&Base&Mixin = self::Base with self::Mixin {
 }
 class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Sub
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.direct.transformed.expect
index 4d03387..8370ef2 100644
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Mixin extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -22,7 +22,7 @@
     return core::print("foo");
 }
 class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Sub
     : super self::Base::•()
     ;
 }
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 f322f88..7ab01f3 100644
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     ;
 }
 class Mixin extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     ;
   method foo() → dynamic
     ;
@@ -15,7 +15,7 @@
 abstract class _Sub&Base&Mixin = self::Base with self::Mixin {
 }
 class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → void
+  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 55136c8..53e4ecf 100644
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Mixin extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -17,7 +17,7 @@
 abstract class _Sub&Base&Mixin = self::Base with self::Mixin {
 }
 class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Sub
     : super self::Base::•()
     ;
 }
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 c12cde2..10d26a4 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,12 +3,12 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Mixin extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -22,7 +22,7 @@
     return core::print("foo");
 }
 class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Sub
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.direct.expect
index 034eb0d..9d954d9 100644
--- a/pkg/front_end/testcases/rasta/issue_000008.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000008.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(dynamic x) → void
+  constructor •(dynamic x) → self::C
     : self::C::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.direct.transformed.expect
index 034eb0d..9d954d9 100644
--- a/pkg/front_end/testcases/rasta/issue_000008.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000008.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(dynamic x) → void
+  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 873e541..b9a64e4 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) → void
+  constructor •(dynamic x) → self::C
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.direct.expect
index 8acc697..cc540eb 100644
--- a/pkg/front_end/testcases/rasta/issue_000012.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000012.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   method m() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.direct.transformed.expect
index 8acc697..cc540eb 100644
--- a/pkg/front_end/testcases/rasta/issue_000012.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000012.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  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 bce37695..9ff402a 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 •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method m() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.direct.expect
index b7a10584..8bdc9ad 100644
--- a/pkg/front_end/testcases/rasta/issue_000026.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.direct.expect
@@ -6,7 +6,7 @@
   field dynamic a = null;
   field dynamic b = 0;
   field dynamic c = 1.+(2);
-  synthetic constructor •() → void
+  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 •() → void
+  constructor •() → self::D
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.direct.transformed.expect
index b7a10584..8bdc9ad 100644
--- a/pkg/front_end/testcases/rasta/issue_000026.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   field dynamic a = null;
   field dynamic b = 0;
   field dynamic c = 1.+(2);
-  synthetic constructor •() → void
+  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 •() → void
+  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 11c2fc1..d2ef05c 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 •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends core::Object {
   field dynamic a;
   field dynamic b;
   field dynamic c;
-  constructor •() → void
+  constructor •() → self::D
     ;
 }
 static method main() → dynamic
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 530ae8d..80c2638 100644
--- a/pkg/front_end/testcases/rasta/issue_000032.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.outline.expect
@@ -22,7 +22,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → void
+  constructor •() → self::C
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect
index 1ad775d..19ba3b1 100644
--- a/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect
@@ -2,12 +2,12 @@
 //
 // pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Warning: Method not found: 'JS'.
 // @JS()
-//  ^
+//  ^^
 
 library;
 import self as self;
 
 @invalid-expression "pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Error: Method not found: 'JS'.
 @JS()
- ^"
+ ^^"
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000033.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000033.dart.direct.transformed.expect
index 0f7997f..99c583e 100644
--- a/pkg/front_end/testcases/rasta/issue_000033.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000033.dart.direct.transformed.expect
@@ -3,5 +3,5 @@
 
 @invalid-expression "pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Error: Method not found: 'JS'.
 @JS()
- ^"
+ ^^"
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000034.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000034.dart.direct.expect
index 017f3f2..01973e9 100644
--- a/pkg/front_end/testcases/rasta/issue_000034.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.direct.expect
@@ -1,10 +1,30 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   const C() : this.x;
+//               ^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: Can't access 'this' in a field initializer.
+//   const C() : this.x;
+//               ^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   const C() : this.x;
+//               ^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  const constructor •() → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/issue_000034.dart:6:20: Error: Can't use x here.\n  const C() : this.x;\n                   ^"))
+  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.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000034.dart.direct.transformed.expect
new file mode 100644
index 0000000..e4532bb
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.direct.transformed.expect
@@ -0,0 +1,21 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   const C() : this.x;
+//               ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  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::•();
+}
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 ca492a1..c482cf9 100644
--- a/pkg/front_end/testcases/rasta/issue_000034.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.outline.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C
     ;
 }
 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
new file mode 100644
index 0000000..01973e9
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.strong.expect
@@ -0,0 +1,32 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   const C() : this.x;
+//               ^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: Can't access 'this' in a field initializer.
+//   const C() : this.x;
+//               ^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   const C() : this.x;
+//               ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  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::•();
+}
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
new file mode 100644
index 0000000..e4532bb
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   const C() : this.x;
+//               ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  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::•();
+}
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 1486b02..1cb4d37 100644
--- a/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   abstract method æøC() → dynamic;
 }
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 d32fcc1..94e5b72 100644
--- a/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect
@@ -13,6 +13,6 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → void
+  constructor •() → self::C
     ;
 }
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 74c22b5..db8dbba 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) → void
+  constructor •(dynamic x) → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.direct.expect
index 2c2bacee..e53681c 100644
--- a/pkg/front_end/testcases/rasta/issue_000041.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.direct.expect
@@ -1,3 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+//
+// pkg/front_end/testcases/rasta/issue_000041.dart:7:10: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     use(+super);
+//          ^^^^^
+
 // Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: '+' is not a prefix operator.
@@ -10,14 +22,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method test() → dynamic {
-    self::use(invalid-expression "pkg/front_end/testcases/rasta/issue_000041.dart:7:10: Error: Can't use 'super' as an expression.
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: This couldn't be parsed.
+    use(+super);
+        ^".+(invalid-expression "pkg/front_end/testcases/rasta/issue_000041.dart:7:10: Error: Can't use 'super' as an expression.
 To delegate a constructor to a super constructor, put the super call as an initializer.
     use(+super);
-         ^^^^^");
+         ^^^^^"));
   }
 }
 static method use(dynamic _) → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.direct.transformed.expect
new file mode 100644
index 0000000..96e8ae6
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.direct.transformed.expect
@@ -0,0 +1,29 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method test() → dynamic {
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: This couldn't be parsed.
+    use(+super);
+        ^".+(invalid-expression "pkg/front_end/testcases/rasta/issue_000041.dart:7:10: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    use(+super);
+         ^^^^^"));
+  }
+}
+static method use(dynamic _) → dynamic
+  return null;
+static method main() → dynamic {
+  new self::C::•().test();
+}
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 e2e33dc..7f6021d 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 •() → void
+  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 5a7b5f6..8d033ce 100644
--- a/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect
@@ -1,11 +1,19 @@
-// Unhandled errors:
+// Formatted problems:
 //
 // pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: '+' is not a prefix operator.
 // Try removing '+'.
 //     use(+super);
 //         ^
 //
-// pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: Getter not found: ''.
+// pkg/front_end/testcases/rasta/issue_000041.dart:7:10: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     use(+super);
+//          ^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
 //     use(+super);
 //         ^
 
@@ -14,11 +22,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method test() → dynamic {
-    self::use(const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/issue_000041.dart:7:10: Error: Can't use `super` as an expression.\n    use(+super);\n         ^")));
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: This couldn't be parsed.
+    use(+super);
+        ^".+(invalid-expression "pkg/front_end/testcases/rasta/issue_000041.dart:7:10: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    use(+super);
+         ^^^^^"));
   }
 }
 static method use(dynamic _) → 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
new file mode 100644
index 0000000..e597329
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.strong.transformed.expect
@@ -0,0 +1,29 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method test() → dynamic {
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: This couldn't be parsed.
+    use(+super);
+        ^".+(invalid-expression "pkg/front_end/testcases/rasta/issue_000041.dart:7:10: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    use(+super);
+         ^^^^^"));
+  }
+}
+static method use(dynamic _) → dynamic
+  return null;
+static method main() → dynamic {
+  new self::C::•().{self::C::test}();
+}
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 8efb57a..c9f2a90 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 •() → void
+  synthetic constructor •() → self::C
     ;
   get x() → dynamic
     ;
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 a542560..684d860 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect
@@ -29,9 +29,9 @@
 
 class C extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::good];
-  const constructor constant() → void
+  const constructor constant() → self::C
     ;
-  constructor missingFactoryKeyword() → void
+  constructor missingFactoryKeyword() → self::C
     ;
   static factory good() → self::C
     let dynamic #redirecting_factory = self::C::constant in invalid-expression;
diff --git a/pkg/front_end/testcases/rasta/issue_000048.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.direct.expect
index 584e9e7..06247c1 100644
--- a/pkg/front_end/testcases/rasta/issue_000048.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000048.dart.direct.expect
@@ -5,18 +5,18 @@
 class A extends core::Object {
   field core::bool v1;
   field core::num v2;
-  constructor •(core::bool v1, core::num v2) → void
+  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 •() → void
+  synthetic constructor •() → self::M1
     : super core::Object::•()
     ;
 }
 class C = self::A with self::M1 {
-  synthetic constructor •(core::bool v1, core::num v2) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.direct.transformed.expect
index 5b6fd06..4a79310 100644
--- a/pkg/front_end/testcases/rasta/issue_000048.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000048.dart.direct.transformed.expect
@@ -5,19 +5,19 @@
 class A extends core::Object {
   field core::bool v1;
   field core::num v2;
-  constructor •(core::bool v1, core::num v2) → void
+  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 •() → void
+  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) → void
+  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.outline.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.outline.expect
index 8469fe4..08c49b2 100644
--- a/pkg/front_end/testcases/rasta/issue_000048.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000048.dart.outline.expect
@@ -5,16 +5,16 @@
 class A extends core::Object {
   field core::bool v1;
   field core::num v2;
-  constructor •(core::bool v1, core::num v2) → void
+  constructor •(core::bool v1, core::num v2) → self::A
     ;
 }
 class M1 extends core::Object {
   field core::num v2;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M1
     ;
 }
 class C = self::A with self::M1 {
-  synthetic constructor •(core::bool v1, core::num v2) → void
+  synthetic constructor •(core::bool v1, core::num v2) → self::C
     : super self::A::•(v1, v2)
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.direct.expect
index 565ce7e..230c10b 100644
--- a/pkg/front_end/testcases/rasta/issue_000053.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000053.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator ==(dynamic other) → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.direct.transformed.expect
index 565ce7e..230c10b 100644
--- a/pkg/front_end/testcases/rasta/issue_000053.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000053.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator ==(dynamic other) → dynamic
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 368853e..bc032b0 100644
--- a/pkg/front_end/testcases/rasta/issue_000053.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000053.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   operator ==(dynamic other) → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.direct.expect
index 359f315..dac4315 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.direct.expect
@@ -5,7 +5,7 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::foo];
-  constructor •() → void
+  constructor •() → self::A
     : super core::Object::•() {}
   static factory foo() → self::A
     let dynamic #redirecting_factory = self::C::bar in invalid-expression;
@@ -13,7 +13,7 @@
 }
 class C extends self::A {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → void
+  constructor •() → self::C
     : super self::A::•() {}
   static factory bar() → self::C
     let dynamic #redirecting_factory = self::D::• in invalid-expression;
@@ -22,7 +22,7 @@
   }
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method m() → core::int {
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.direct.transformed.expect
index 359f315..dac4315 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::foo];
-  constructor •() → void
+  constructor •() → self::A
     : super core::Object::•() {}
   static factory foo() → self::A
     let dynamic #redirecting_factory = self::C::bar in invalid-expression;
@@ -13,7 +13,7 @@
 }
 class C extends self::A {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → void
+  constructor •() → self::C
     : super self::A::•() {}
   static factory bar() → self::C
     let dynamic #redirecting_factory = self::D::• in invalid-expression;
@@ -22,7 +22,7 @@
   }
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method m() → core::int {
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 8e6ec1a..cda502f 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::foo];
-  constructor •() → void
+  constructor •() → self::A
     ;
   static factory foo() → self::A
     let dynamic #redirecting_factory = self::C::bar in invalid-expression;
@@ -13,7 +13,7 @@
 }
 class C extends self::A {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → void
+  constructor •() → self::C
     ;
   static factory bar() → self::C
     let dynamic #redirecting_factory = self::D::• in invalid-expression;
@@ -21,7 +21,7 @@
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method m() → core::int
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect
index 3432824..eeadf14 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect
@@ -4,22 +4,22 @@
 import "package:expect/expect.dart" as exp;
 
 class G<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G<self::G::T>
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect
index 3432824..eeadf14 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect
@@ -4,22 +4,22 @@
 import "package:expect/expect.dart" as exp;
 
 class G<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G<self::G::T>
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 9c46dd8..3ed2a46 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.outline.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class G<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::G<self::G::T>
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.direct.expect
index 3ea2923b..a4e0188 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.direct.expect
@@ -5,14 +5,14 @@
 
 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) → void
+  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() → void
+  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) → void
+  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> {
@@ -25,12 +25,12 @@
   set setter(self::A::S s) → void {}
 }
 abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I<self::I::H, self::I::C, self::I::K>
     : super self::J::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect
index 935af28..1acca31 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect
@@ -5,14 +5,14 @@
 
 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) → void
+  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() → void
+  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) → void
+  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> {
@@ -25,12 +25,12 @@
   set setter(self::A::S s) → void {}
 }
 abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I<self::I::H, self::I::C, self::I::K>
     : super self::J::•()
     ;
 }
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 00c0cb3..acc739a 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
@@ -4,11 +4,11 @@
 
 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) → void
+  constructor •(self::A::N n, self::A::S s) → self::A<self::A::N, self::A::S, self::A::U>
     ;
-  constructor empty() → void
+  constructor empty() → self::A<self::A::N, self::A::S, self::A::U>
     ;
-  const constructor c(self::A::U u, self::A::S s) → void
+  const constructor c(self::A::U u, self::A::S s) → self::A<self::A::N, self::A::S, self::A::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>
     ;
@@ -18,11 +18,11 @@
     ;
 }
 abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  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_000080.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.direct.expect
index 1e8a13f..c28c1f2 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -13,7 +13,7 @@
 abstract class _Foo&Object&Mixin = core::Object with self::Mixin {
 }
 class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method foo() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.direct.transformed.expect
index ad6004d..4511afb 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -19,7 +19,7 @@
     return 87;
 }
 class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   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 c254729..77653fd 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class Mixin extends core::Object {
   field dynamic field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     ;
   method foo() → dynamic
     ;
@@ -12,7 +12,7 @@
 abstract class _Foo&Object&Mixin = core::Object with self::Mixin {
 }
 class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → void
+  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 a336a75..541a5e7 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -13,7 +13,7 @@
 abstract class _Foo&Object&Mixin = core::Object with self::Mixin {
 }
 class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method foo() → dynamic
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 66c8ff0..2385fc1 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 •() → void
+  synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -19,7 +19,7 @@
     return 87;
 }
 class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method foo() → dynamic
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 076eb4a..cb7bd6b 100644
--- a/pkg/front_end/testcases/rasta/issue_000081.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.outline.expect
@@ -4,12 +4,12 @@
 
 class Base extends core::Object {
   field core::int hashCode;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     ;
 }
 class Sub extends self::Base {
   field core::int _hashCode;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Sub
     ;
   get hashCode() → dynamic
     ;
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 5002235..e94468a 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
@@ -24,7 +24,7 @@
 
 class A extends core::Object {
   field dynamic x;
-  constructor •() → void
+  constructor •() → self::A
     ;
 }
 static method main() → 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 27d7daf..62d6389 100644
--- a/pkg/front_end/testcases/rasta/mixin_library.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/mixin_library.dart.outline.expect
@@ -7,7 +7,7 @@
   field dynamic y;
   field dynamic z;
   field self::Mixin::T t;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin<self::Mixin::T>
     ;
   method foo() → 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 7994ea9..eadddb5 100644
--- a/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
@@ -19,7 +19,7 @@
   field dynamic y = null;
   field dynamic z = null;
   generic-covariant-impl field self::Mixin::T t = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Mixin<self::Mixin::T>
     : super core::Object::•()
     ;
   method foo() → dynamic
diff --git a/pkg/front_end/testcases/rasta/static.dart.direct.expect b/pkg/front_end/testcases/rasta/static.dart.direct.expect
index 4702749..db9d31a 100644
--- a/pkg/front_end/testcases/rasta/static.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.direct.expect
@@ -143,7 +143,7 @@
 class Foo extends core::Object {
   static const field dynamic staticConstant = 42;
   static field dynamic staticField = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   static method staticFunction() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/static.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/static.dart.direct.transformed.expect
index 2154f49..4ea88e5 100644
--- a/pkg/front_end/testcases/rasta/static.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 class Foo extends core::Object {
   static const field dynamic staticConstant = 42;
   static field dynamic staticField = 42;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   static method staticFunction() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/static.dart.outline.expect b/pkg/front_end/testcases/rasta/static.dart.outline.expect
index 5a87d22..970c3bb 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;
   static field dynamic staticField;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
   static method staticFunction() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/super.dart.outline.expect b/pkg/front_end/testcases/rasta/super.dart.outline.expect
index f81146c..1ed12a8 100644
--- a/pkg/front_end/testcases/rasta/super.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.outline.expect
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/rasta/super.dart:26:8: Warning: Can't declare a member that conflicts with an inherited one.
 //   void n() {}
 //        ^
-// pkg/front_end/testcases/rasta/super.dart:27:7: Warning: This is the inherited member.
+// pkg/front_end/testcases/rasta/super.dart:27:7: Context: This is the inherited member.
 //   set n(_) {}
 //       ^
 
@@ -17,7 +17,7 @@
   field dynamic c;
   field dynamic d;
   final field dynamic f;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   get e() → dynamic
     ;
@@ -48,7 +48,7 @@
 }
 class B extends self::A {
   final field dynamic d;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   get b() → dynamic
     ;
@@ -58,7 +58,7 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method test() → dynamic
     ;
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 b5a1cdb..7e735ba 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() → void
+  constructor arg0() → self::Super
     ;
-  constructor arg1(dynamic a) → void
+  constructor arg1(dynamic a) → self::Super
     ;
-  constructor arg2(dynamic a, dynamic b) → void
+  constructor arg2(dynamic a, dynamic b) → self::Super
     ;
 }
 class Sub extends self::Super {
   field dynamic field;
-  constructor arg0() → void
+  constructor arg0() → self::Sub
     ;
-  constructor arg1(dynamic a) → void
+  constructor arg1(dynamic a) → self::Sub
     ;
-  constructor arg2(dynamic a, dynamic b) → void
+  constructor arg2(dynamic a, dynamic b) → self::Sub
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect
index adf016a..57e448d 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect
@@ -10,7 +10,7 @@
 import "./mixin_library.dart" as mix;
 
 class Super<S extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Super<self::Super::S>
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -21,24 +21,24 @@
 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> {
 }
 class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::V>
     : super self::Super::•()
     ;
 }
 abstract class _D&Super&Mixin = self::Super<dynamic> with mix::Mixin<dynamic> {
 }
 class D extends self::_D&Super&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::Super::•()
     ;
 }
 class C2<V extends core::Object = dynamic> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C2<self::C2::V>
     : super self::Super::•()
     ;
 }
 class D2 = self::Super<dynamic> with mix::Mixin<dynamic> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D2
     : super self::Super::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.transformed.expect
index 49f815b..888a9fb 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "./mixin_library.dart" as mix;
 
 class Super<S extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Super<self::Super::S>
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -34,7 +34,7 @@
     return this.{mix::Mixin::_privateMethod}();
 }
 class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::V>
     : super self::Super::•()
     ;
 }
@@ -60,7 +60,7 @@
     return this.{mix::Mixin::_privateMethod}();
 }
 class D extends self::_D&Super&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::Super::•()
     ;
 }
@@ -69,7 +69,7 @@
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field self::C2::V t = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C2<self::C2::V>
     : super self::Super::•()
     ;
   method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
@@ -90,7 +90,7 @@
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic t = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D2
     : super self::Super::•()
     ;
   method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
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 226be4d..8edc868 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect
@@ -4,7 +4,7 @@
 import "./mixin_library.dart" as mix;
 
 class Super<S extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Super<self::Super::S>
     ;
   method foo() → dynamic
     ;
@@ -14,22 +14,22 @@
 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> {
 }
 class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::V>
     ;
 }
 abstract class _D&Super&Mixin = self::Super<dynamic> with mix::Mixin<dynamic> {
 }
 class D extends self::_D&Super&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class C2<V extends core::Object = dynamic> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C2<self::C2::V>
     : super self::Super::•()
     ;
 }
 class D2 = self::Super<dynamic> with mix::Mixin<dynamic> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D2
     : super self::Super::•()
     ;
 }
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 3037992..557a0b5 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
@@ -16,7 +16,7 @@
 import "./mixin_library.dart" as mix;
 
 class Super<S extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Super<self::Super::S>
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -27,24 +27,24 @@
 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> {
 }
 class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::V>
     : super self::Super::•()
     ;
 }
 abstract class _D&Super&Mixin = self::Super<dynamic> with mix::Mixin<dynamic> {
 }
 class D extends self::_D&Super&Mixin {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::Super::•()
     ;
 }
 class C2<V extends core::Object = dynamic> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C2<self::C2::V>
     : super self::Super::•()
     ;
 }
 class D2 = self::Super<dynamic> with mix::Mixin<dynamic> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D2
     : super self::Super::•()
     ;
 }
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 865c5c8..d0ecc4d 100644
--- a/pkg/front_end/testcases/rasta/super_operator.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super_operator.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   operator +(core::String s) → dynamic
     ;
@@ -13,7 +13,7 @@
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   operator +(core::String s) → dynamic
     ;
@@ -23,7 +23,7 @@
     ;
 }
 class Autobianchi extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Autobianchi
     ;
   method g() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/this_invoke.dart.direct.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.direct.expect
index 3bb5487..7341259 100644
--- a/pkg/front_end/testcases/rasta/this_invoke.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/this_invoke.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method m(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/rasta/this_invoke.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.direct.transformed.expect
index 3bb5487..7341259 100644
--- a/pkg/front_end/testcases/rasta/this_invoke.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/this_invoke.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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 0e97189..eb198e5 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 •() → void
+  synthetic constructor •() → self::C
     ;
   method m(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 48fb196..75c1fa6 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.outline.expect
@@ -4,7 +4,7 @@
 
 typedef Func = () → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method test() → dynamic
     ;
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 33539ac..8e86896 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) → void
+  constructor •(dynamic x, dynamic y) → self::Foo
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
index ed58703..1d31f44 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
@@ -88,7 +88,7 @@
 
 typedef VoidFunction = () → void;
 class Fisk extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Fisk
     : super core::Object::•()
     ;
   method it1(dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.transformed.expect
index a8e8265..19ae243 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.transformed.expect
@@ -14,7 +14,7 @@
 
 typedef VoidFunction = () → void;
 class Fisk extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Fisk
     : super core::Object::•()
     ;
   method it1(dynamic x) → dynamic {
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 d7b074d..dde777f 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,7 +4,7 @@
 
 typedef VoidFunction = () → void;
 class Fisk extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Fisk
     ;
   method it1(dynamic x) → dynamic
     ;
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 ada7d49..3cc4558 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 •() → void
+  synthetic constructor •() → self::E
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.direct.expect b/pkg/front_end/testcases/redirecting_constructor.dart.direct.expect
index e17a8f7..618bd6b 100644
--- a/pkg/front_end/testcases/redirecting_constructor.dart.direct.expect
+++ b/pkg/front_end/testcases/redirecting_constructor.dart.direct.expect
@@ -4,14 +4,14 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::fisk];
-  constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_constructor.dart.direct.transformed.expect
index e17a8f7..618bd6b 100644
--- a/pkg/front_end/testcases/redirecting_constructor.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_constructor.dart.direct.transformed.expect
@@ -4,14 +4,14 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::fisk];
-  constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.outline.expect b/pkg/front_end/testcases/redirecting_constructor.dart.outline.expect
index 50ce3cd..874062c 100644
--- a/pkg/front_end/testcases/redirecting_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/redirecting_constructor.dart.outline.expect
@@ -4,13 +4,13 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::fisk];
-  constructor •() → void
+  constructor •() → self::A
     ;
   static factory fisk() → self::A
     let dynamic #redirecting_factory = self::B::• in invalid-expression;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/redirecting_factory.dart.outline.expect b/pkg/front_end/testcases/redirecting_factory.dart.outline.expect
index 0e9db8ea..a3e5543 100644
--- a/pkg/front_end/testcases/redirecting_factory.dart.outline.expect
+++ b/pkg/front_end/testcases/redirecting_factory.dart.outline.expect
@@ -15,11 +15,11 @@
 }
 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) → void
+  constructor •(core::int x) → self::Bar<self::Bar::Sb, self::Bar::Tb>
     ;
 }
 class Builder<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Builder<self::Builder::X>
     ;
   method method() → dynamic
     ;
@@ -35,19 +35,19 @@
     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 •() → void
+  synthetic constructor •() → self::SimpleCaseImpl2<self::SimpleCaseImpl2::Ai2, self::SimpleCaseImpl2::Bi2>
     ;
 }
 class Base<M extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base<self::Base::M>
     ;
 }
 class Mixin<M extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::Mix<self::Mix::M>
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.expect
index 5e1d683..afbcf0c 100644
--- a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.expect
@@ -8,18 +8,18 @@
     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 •() → void
+  const constructor •() → self::_Y<self::_Y::T>
     : super core::Object::•()
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
   field self::_X<self::A::T> x;
-  constructor •(self::_X<self::A::T> x) → void
+  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 •() → void
+  constructor •() → self::B<self::B::T>
     : super self::A::•(const self::_Y::•<dynamic>())
     ;
 }
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.transformed.expect
index 5e1d683..afbcf0c 100644
--- a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.transformed.expect
@@ -8,18 +8,18 @@
     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 •() → void
+  const constructor •() → self::_Y<self::_Y::T>
     : super core::Object::•()
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
   field self::_X<self::A::T> x;
-  constructor •(self::_X<self::A::T> x) → void
+  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 •() → void
+  constructor •() → self::B<self::B::T>
     : super self::A::•(const self::_Y::•<dynamic>())
     ;
 }
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
index 1b16077..a111baf 100644
--- a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect
@@ -8,16 +8,16 @@
     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 •() → void
+  const constructor •() → self::_Y<self::_Y::T>
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
   field self::_X<self::A::T> x;
-  constructor •(self::_X<self::A::T> x) → void
+  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 •() → void
+  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
index 3e7197c..0b4d35b 100644
--- a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.expect
@@ -8,18 +8,18 @@
     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 •() → void
+  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) → void
+  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 •() → void
+  constructor •() → self::B<self::B::T>
     : super self::A::•(const self::_Y::•<core::Null>())
     ;
 }
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
index c825208..ee3ea48 100644
--- 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
@@ -8,18 +8,18 @@
     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 •() → void
+  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) → void
+  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 •() → void
+  constructor •() → self::B<self::B::T>
     : super self::A::•(const self::_Y::•<core::Null>())
     ;
 }
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.expect
index b260e07..166f99e 100644
--- a/pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.expect
+++ b/pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  constructor named(dynamic p) → void
+  constructor named(dynamic p) → self::Foo
     : super core::Object::•()
     ;
   @self::forFactoryItself
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.transformed.expect
index b260e07..166f99e 100644
--- a/pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  constructor named(dynamic p) → void
+  constructor named(dynamic p) → self::Foo
     : super core::Object::•()
     ;
   @self::forFactoryItself
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.outline.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.outline.expect
index d504d4c..5b95c2b 100644
--- a/pkg/front_end/testcases/redirecting_factory_metadata.dart.outline.expect
+++ b/pkg/front_end/testcases/redirecting_factory_metadata.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  constructor named(dynamic p) → void
+  constructor named(dynamic p) → self::Foo
     ;
   static factory •(dynamic p) → self::Foo
     let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.expect
index 868e62384..f6f89a4 100644
--- a/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  constructor named(dynamic p) → void
+  constructor named(dynamic p) → self::Foo
     : super core::Object::•()
     ;
   @self::forFactoryItself
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
index 5885c06..a4f3bab 100644
--- a/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  constructor named(dynamic p) → void
+  constructor named(dynamic p) → self::Foo
     : super core::Object::•()
     ;
   @self::forFactoryItself
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.expect
index b456e45..dd1e103 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
 class Foo<T extends self::X = dynamic> extends core::Object {
   field self::Foo::T x;
-  constructor fromX(self::X _init) → void
+  constructor fromX(self::X _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
-  constructor fromT(self::Foo::T _init) → void
+  constructor fromT(self::Foo::T _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
-  constructor _internal({self::Foo::T x = null}) → void
+  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
     : self::Foo::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.transformed.expect
index b456e45..dd1e103 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
 class Foo<T extends self::X = dynamic> extends core::Object {
   field self::Foo::T x;
-  constructor fromX(self::X _init) → void
+  constructor fromX(self::X _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
-  constructor fromT(self::Foo::T _init) → void
+  constructor fromT(self::Foo::T _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
-  constructor _internal({self::Foo::T x = null}) → void
+  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
     : self::Foo::x = x, super core::Object::•()
     ;
 }
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
index 9a93e35..fdfee1c 100644
--- 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
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     ;
 }
 class Foo<T extends self::X = dynamic> extends core::Object {
   field self::Foo::T x;
-  constructor fromX(self::X _init) → void
+  constructor fromX(self::X _init) → self::Foo<self::Foo::T>
     ;
-  constructor fromT(self::Foo::T _init) → void
+  constructor fromT(self::Foo::T _init) → self::Foo<self::Foo::T>
     ;
-  constructor _internal({self::Foo::T x}) → void
+  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
index fd5af02..224bb84 100644
--- 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
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → void
+  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) → void
+  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) → void
+  constructor fromT(self::Foo::T _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
-  constructor _internal({self::Foo::T x = null}) → void
+  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
     : self::Foo::x = x, super core::Object::•()
     ;
 }
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
index fd5af02..224bb84 100644
--- 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
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → void
+  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) → void
+  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) → void
+  constructor fromT(self::Foo::T _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
-  constructor _internal({self::Foo::T x = null}) → void
+  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
     : self::Foo::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.expect
index 4a3a9d5..c18e8e1 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.expect
@@ -4,10 +4,10 @@
 
 class Foo<T extends core::Object = dynamic> extends core::Object {
   field self::Foo::T x;
-  constructor from(core::String _init) → void
+  constructor from(core::String _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
-  constructor _internal({self::Foo::T x = null}) → void
+  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
     : self::Foo::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.transformed.expect
index 4a3a9d5..c18e8e1 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.transformed.expect
@@ -4,10 +4,10 @@
 
 class Foo<T extends core::Object = dynamic> extends core::Object {
   field self::Foo::T x;
-  constructor from(core::String _init) → void
+  constructor from(core::String _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
-  constructor _internal({self::Foo::T x = null}) → void
+  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
     : self::Foo::x = x, super core::Object::•()
     ;
 }
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
index 467c389..1655fc6 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect
@@ -4,9 +4,9 @@
 
 class Foo<T extends core::Object = dynamic> extends core::Object {
   field self::Foo::T x;
-  constructor from(core::String _init) → void
+  constructor from(core::String _init) → self::Foo<self::Foo::T>
     ;
-  constructor _internal({self::Foo::T x}) → void
+  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
index e03cc64..d498a68 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
@@ -11,13 +11,13 @@
 
 class Foo<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::Foo::T x;
-  constructor from(core::String _init) → void
+  constructor from(core::String _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type '#lib1::Foo::T'.
 Try changing the type of the parameter, or casting the argument to '#lib1::Foo::T'.
   Foo.from(String _init) : this._internal(x: _init);
                                              ^" in let final dynamic #t2 = _init in null)
     ;
-  constructor _internal({self::Foo::T x = null}) → void
+  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
     : self::Foo::x = x, super core::Object::•()
     ;
 }
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
index 6ec2d0c..25c2b06 100644
--- 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
@@ -4,13 +4,13 @@
 
 class Foo<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::Foo::T x;
-  constructor from(core::String _init) → void
+  constructor from(core::String _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type '#lib1::Foo::T'.
 Try changing the type of the parameter, or casting the argument to '#lib1::Foo::T'.
   Foo.from(String _init) : this._internal(x: _init);
                                              ^" in let final dynamic #t2 = _init in null)
     ;
-  constructor _internal({self::Foo::T x = null}) → void
+  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
     : self::Foo::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.expect
index 12a281f..90b0fbf 100644
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.expect
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.expect
@@ -5,7 +5,7 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → void
+  constructor empty() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
@@ -13,14 +13,14 @@
 }
 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() → void
+  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 •() → void
+  constructor •() → self::C<self::C::V, self::C::S, self::C::R>
     : super self::B::empty()
     ;
   method toString() → dynamic
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.transformed.expect
index 12a281f..90b0fbf 100644
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → void
+  constructor empty() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
@@ -13,14 +13,14 @@
 }
 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() → void
+  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 •() → void
+  constructor •() → self::C<self::C::V, self::C::S, self::C::R>
     : super self::B::empty()
     ;
   method toString() → dynamic
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
index 038ab97..1454cdb 100644
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.outline.expect
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.outline.expect
@@ -4,20 +4,20 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → void
+  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() → void
+  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 •() → void
+  constructor •() → self::C<self::C::V, self::C::S, self::C::R>
     ;
   method toString() → 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
index 24e8590..530eceb 100644
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.strong.expect
@@ -5,7 +5,7 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → void
+  constructor empty() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
@@ -13,14 +13,14 @@
 }
 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() → void
+  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 •() → void
+  constructor •() → self::C<self::C::V, self::C::S, self::C::R>
     : super self::B::empty()
     ;
   method toString() → core::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
index 2f29db1..d2d7128 100644
--- 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
@@ -5,7 +5,7 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → void
+  constructor empty() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
@@ -13,14 +13,14 @@
 }
 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() → void
+  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 •() → void
+  constructor •() → self::C<self::C::V, self::C::S, self::C::R>
     : super self::B::empty()
     ;
   method toString() → core::String
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.expect
index d706b30..6eb52f4 100644
--- a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.expect
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.expect
@@ -5,7 +5,7 @@
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → void
+  constructor empty() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
@@ -13,14 +13,14 @@
 }
 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() → void
+  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 •() → void
+  constructor •() → self::C<self::C::V, self::C::S, self::C::R>
     : super self::B::empty()
     ;
   method toString() → dynamic
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.transformed.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.transformed.expect
index d706b30..6eb52f4 100644
--- a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → void
+  constructor empty() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
@@ -13,14 +13,14 @@
 }
 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() → void
+  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 •() → void
+  constructor •() → self::C<self::C::V, self::C::S, self::C::R>
     : super self::B::empty()
     ;
   method toString() → dynamic
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
index f6ba5d2..2be51bd 100644
--- 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
@@ -4,20 +4,20 @@
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → void
+  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() → void
+  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 •() → void
+  constructor •() → self::C<self::C::V, self::C::S, self::C::R>
     ;
   method toString() → 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
index 2305393..981ccb8 100644
--- 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
@@ -5,7 +5,7 @@
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → void
+  constructor empty() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
@@ -13,14 +13,14 @@
 }
 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() → void
+  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 •() → void
+  constructor •() → self::C<self::C::V, self::C::S, self::C::R>
     : super self::B::empty()
     ;
   method toString() → core::String
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
index 48ff701..f2d09cc 100644
--- 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
@@ -5,7 +5,7 @@
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → void
+  constructor empty() → self::A<self::A::T>
     : super core::Object::•()
     ;
   static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
@@ -13,14 +13,14 @@
 }
 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() → void
+  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 •() → void
+  constructor •() → self::C<self::C::V, self::C::S, self::C::R>
     : super self::B::empty()
     ;
   method toString() → core::String
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.direct.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.direct.expect
index c39fbd5..3f0dbf7 100644
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.direct.expect
+++ b/pkg/front_end/testcases/redirection_type_arguments.dart.direct.expect
@@ -5,14 +5,14 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  const constructor empty() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::T>
     : super self::A::empty()
     ;
   method toString() → dynamic
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.direct.transformed.expect
index c39fbd5..3f0dbf7 100644
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/redirection_type_arguments.dart.direct.transformed.expect
@@ -5,14 +5,14 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  const constructor empty() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::T>
     : super self::A::empty()
     ;
   method toString() → dynamic
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.outline.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.outline.expect
index 7ec5a97..e6e3790 100644
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.outline.expect
+++ b/pkg/front_end/testcases/redirection_type_arguments.dart.outline.expect
@@ -4,13 +4,13 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  const constructor empty() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::T>
     ;
   method toString() → dynamic
     ;
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.strong.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.strong.expect
index 781d97dc..2e533bd 100644
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/redirection_type_arguments.dart.strong.expect
@@ -5,14 +5,14 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  const constructor empty() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::T>
     : super self::A::empty()
     ;
   method toString() → core::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
index 993c466..a388ba6 100644
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/redirection_type_arguments.dart.strong.transformed.expect
@@ -5,14 +5,14 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
-  const constructor empty() → void
+  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 •() → void
+  const constructor •() → self::B<self::B::T>
     : super self::A::empty()
     ;
   method toString() → core::String
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29944.dart.direct.expect
index 7fa8fb7..e6a419d 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.direct.expect
@@ -16,7 +16,7 @@
 
 class C extends core::Object {
   field dynamic C = null;
-  constructor •() → void
+  constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29944.dart.direct.transformed.expect
index af5fa11..d3ab9b2 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.direct.transformed.expect
@@ -10,7 +10,7 @@
 
 class C extends core::Object {
   field dynamic C = null;
-  constructor •() → void
+  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 22ab63f..cc5aa07 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.outline.expect
@@ -10,7 +10,7 @@
 
 class C extends core::Object {
   field dynamic C;
-  constructor •() → void
+  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 7fa8fb7..e6a419d 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect
@@ -16,7 +16,7 @@
 
 class C extends core::Object {
   field dynamic C = null;
-  constructor •() → void
+  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 af5fa11..d3ab9b2 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
@@ -10,7 +10,7 @@
 
 class C extends core::Object {
   field dynamic C = null;
-  constructor •() → void
+  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 5343ae7..c49120e 100644
--- a/pkg/front_end/testcases/regress/issue_29975.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.outline.expect
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: 'F' is already declared in this scope.
 // typedef void F();
 //              ^
-// pkg/front_end/testcases/regress/issue_29975.dart:5:14: Error: Previous declaration of 'F'.
+// pkg/front_end/testcases/regress/issue_29975.dart:5:14: Context: Previous declaration of 'F'.
 // typedef void F();
 //              ^
 
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect
index 381ef02..e6fed7c 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect
@@ -60,20 +60,17 @@
 //   )
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Method not found: 'f'.
-//   f(
-//   ^
-//
 // pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
 //   )
 //   ^
 
 library;
 import self as self;
-import "dart:core" as core;
 
 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>{})));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Method not found: 'f'.
+  f(
+  ^";
 }
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29976.dart.strong.transformed.expect
index 080428d..2b9588c 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.strong.transformed.expect
@@ -25,20 +25,17 @@
 //   )
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Method not found: 'f'.
-//   f(
-//   ^
-//
 // pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
 //   )
 //   ^
 
 library;
 import self as self;
-import "dart:core" as core;
 
 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>{})));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Method not found: 'f'.
+  f(
+  ^";
 }
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect
index c031f86..2d805d8 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect
@@ -10,7 +10,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C<dynamic> field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29981.dart.direct.transformed.expect
index dad6a74..483a0c4 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C<dynamic> field = null;
-  synthetic constructor •() → void
+  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 95b5a02..39e6ac5 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C<dynamic> field;
-  synthetic constructor •() → void
+  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 a99b77c..d746374 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
@@ -16,7 +16,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field invalid-type field = null;
-  synthetic constructor •() → void
+  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 f41e053..a4f22b0 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
@@ -10,7 +10,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field invalid-type field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
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 3cf1dab..7c7d19a 100644
--- a/pkg/front_end/testcases/regress/issue_29982.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.strong.expect
@@ -56,10 +56,6 @@
 //   print('${eh[éh']}');
 //                 ^^^^
 //
-// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: Getter not found: 'éh'.
-//   print('${eh[éh']}');
-//               ^^
-//
 // pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
 //   print('${eh[éh']}');
 //                 ^^^^
@@ -74,5 +70,7 @@
 
 static method main() → dynamic {
   core::Map<core::String, core::String> eh = <core::String, core::String>{"\u0233h": "\u0233h"};
-  core::print("${eh.{core::Map::[]}(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.{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 02e6e5f..039a91c 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
@@ -21,10 +21,6 @@
 //   print('${eh[éh']}');
 //                 ^^^^
 //
-// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: Getter not found: 'éh'.
-//   print('${eh[éh']}');
-//               ^^
-//
 // pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
 //   print('${eh[éh']}');
 //                 ^^^^
@@ -39,5 +35,7 @@
 
 static method main() → dynamic {
   core::Map<core::String, core::String> eh = <core::String, core::String>{"\u0233h": "\u0233h"};
-  core::print("${eh.{core::Map::[]}(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.{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.strong.expect b/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
index 5af7027..448582e 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
@@ -16,16 +16,6 @@
 // g() sync* => dummy;
 //              ^
 
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_29983.dart:7:10: Error: Getter not found: 'missing'.
-//   return missing;
-//          ^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: Getter not found: 'dummy'.
-// g() sync* => dummy;
-//              ^^^^^
-
 library;
 import self as self;
 import "dart:core" as core;
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 6fcb220..d3d95c2 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
@@ -1,13 +1,3 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_29983.dart:7:10: Error: Getter not found: 'missing'.
-//   return missing;
-//          ^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: Getter not found: 'dummy'.
-// g() sync* => dummy;
-//              ^^^^^
-
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
index 9c9464b..adf51b4 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
@@ -7,7 +7,7 @@
 // pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
 //   for (int i = i;; false) {}
 //            ^
-// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Previous use of 'i'.
+// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Context: Previous use of 'i'.
 //   for (int i = i;; false) {}
 //                ^
 
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 ca8ca48..c6e236f 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
@@ -7,13 +7,7 @@
 // pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
 //   for (int i = i;; false) {}
 //            ^
-// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Previous use of 'i'.
-//   for (int i = i;; false) {}
-//                ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Getter not found: 'i'.
+// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Context: Previous use of 'i'.
 //   for (int i = i;; false) {}
 //                ^
 
@@ -24,7 +18,9 @@
 static method bad() → dynamic {
   for (core::int i = (let final dynamic #t1 = let dynamic _ = null in 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 let final dynamic #t2 = let dynamic _ = null 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>{}))) in null) as{TypeError} core::int; ; false) {
+           ^" in let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Getter not found: 'i'.
+  for (int i = i;; false) {}
+               ^" in null) 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 03506c1..8842e30 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
@@ -1,9 +1,3 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Getter not found: 'i'.
-//   for (int i = i;; false) {}
-//                ^
-
 library;
 import self as self;
 import "dart:core" as core;
@@ -11,7 +5,9 @@
 static method bad() → dynamic {
   for (core::int i = (let final dynamic #t1 = let<BottomType> _ = null in 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 let final<BottomType> #t2 = let<BottomType> _ = null 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>{}))) in null) as{TypeError} core::int; ; false) {
+           ^" in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Getter not found: 'i'.
+  for (int i = i;; false) {}
+               ^" in null) as{TypeError} core::int; ; false) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
index 0a05af8..f74e906 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
@@ -23,16 +23,13 @@
 // pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
 //   🔛
 //   ^^
-//
-// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Getter not found: '🔛'.
-//   🔛
-//   ^^
 
 library;
 import self as self;
-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>{})));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Getter not found: '\u55357\u56603'.
+  \u55357\u56603
+  ^^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29985.dart.strong.transformed.expect
index 0d94ae5..02cc98e0 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.strong.transformed.expect
@@ -8,16 +8,13 @@
 // pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
 //   🔛
 //   ^^
-//
-// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Getter not found: '🔛'.
-//   🔛
-//   ^^
 
 library;
 import self as self;
-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>{})));
+  invalid-expression "pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Getter not found: '\u55357\u56603'.
+  \u55357\u56603
+  ^^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect
index e7243ad..f2504e8 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set A(dynamic v) → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30834.dart.direct.transformed.expect
index 6b3d9f4..6e15af0 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set A(dynamic v) → dynamic {}
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 d2f5b89..5e79dad 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   set A(dynamic v) → dynamic
     ;
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 41ead93..41f5529 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set A(dynamic v) → void {}
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 5b18f1e..ef4ea19 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
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   set A(dynamic v) → void {}
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect
index 981475d..57441e0 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect
@@ -18,6 +18,6 @@
 
 class A extends core::Object {
   final field core::int x = null;
-  constructor •() → void
+  constructor •() → self::A
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect
index 686b6ba..40ac4eb 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect
@@ -11,6 +11,6 @@
 
 class A extends core::Object {
   final field core::int x = null;
-  constructor •() → void
+  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 3eafa91..b1048d5 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.outline.expect
@@ -4,6 +4,6 @@
 
 class A extends core::Object {
   final field core::int x;
-  constructor •() → void
+  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 981475d..57441e0 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect
@@ -18,6 +18,6 @@
 
 class A extends core::Object {
   final field core::int x = null;
-  constructor •() → void
+  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 686b6ba..40ac4eb 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,6 +11,6 @@
 
 class A extends core::Object {
   final field core::int x = null;
-  constructor •() → void
+  constructor •() → self::A
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
index 9efb697..01ce7fe 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect
index 9efb697..01ce7fe 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method test() → void {
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 10ab505..a756f96 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::A
     ;
   method test() → 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 7526f86..a856d1f 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method test() → void {
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 7526f86..a856d1f 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method test() → void {
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30981.dart.direct.expect
index 3f2e7c5..7bed291 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.direct.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get A() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30981.dart.direct.transformed.expect
index f9a4f7b..e1e9e01 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 b7d5e6b..67b74d0 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.outline.expect
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 3f2e7c5..7bed291 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 f9a4f7b..e1e9e01 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
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get A() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
index fbe631b..7168787 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
@@ -51,19 +51,19 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field dynamic f = core::Map<dynamic, dynamic>.<(self::A);
   field dynamic B = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator >() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
index 78c1a61..9265bb3 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
@@ -27,19 +27,19 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field dynamic f = core::Map<dynamic, dynamic>.<(self::A);
   field dynamic B = null;
-  synthetic constructor •() → void
+  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 526a82b..44a0931 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
@@ -27,17 +27,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
   field dynamic f;
   field dynamic B;
-  synthetic constructor •() → void
+  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 23f4fbd..08d514c 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -56,12 +56,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
@@ -71,7 +71,7 @@
   var f = Map<A, B> {};
              ^";
   field dynamic B = null;
-  synthetic constructor •() → void
+  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 d572835..aadf35a 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
@@ -27,12 +27,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
@@ -42,7 +42,7 @@
   var f = Map<A, B> {};
              ^";
   field dynamic B = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator >() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31183.dart.direct.expect
index dfeec4e..cf6950e 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.direct.expect
@@ -25,7 +25,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator unary-() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31183.dart.direct.transformed.expect
index 3ffea36..a0f201d 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.direct.transformed.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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 2de1a4b..5635a433 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.outline.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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 dfeec4e..cf6950e 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect
@@ -25,7 +25,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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 3ffea36..a0f201d 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
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator unary-() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
index 8528783..e6ca181 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' is already declared in this scope.
 //   for (int i = 0, i > 10; i++) {}
 //                   ^
-// pkg/front_end/testcases/regress/issue_31184.dart:6:12: Error: Previous declaration of 'i'.
+// pkg/front_end/testcases/regress/issue_31184.dart:6:12: Context: Previous declaration of 'i'.
 //   for (int i = 0, i > 10; i++) {}
 //            ^
 //
@@ -14,10 +14,6 @@
 // pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.
 //   for (int i = 0, i > 10; i++) {}
 //                     ^
-//
-// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Warning: Getter not found: ''.
-//   for (int i = 0, i > 10; i++) {}
-//                     ^
 
 // Unhandled errors:
 //
@@ -36,7 +32,9 @@
 static method bad() → dynamic {
   for (core::int i = 0, core::int i = invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' is already declared in this scope.
   for (int i = 0, i > 10; i++) {}
-                  ^"; (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>{})))).>(10); i = i.+(1)) {
+                  ^"; 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); i = i.+(1)) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31184.dart.direct.transformed.expect
index fd614a7..b02bd88 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.direct.transformed.expect
@@ -15,7 +15,9 @@
 static method bad() → dynamic {
   for (core::int i = 0, core::int i = invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' is already declared in this scope.
   for (int i = 0, i > 10; i++) {}
-                  ^"; (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>{})))).>(10); i = i.+(1)) {
+                  ^"; 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); i = i.+(1)) {
   }
 }
 static method main() → dynamic {}
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 a72fee1..310a49e 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
@@ -3,7 +3,7 @@
 // pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' is already declared in this scope.
 //   for (int i = 0, i > 10; i++) {}
 //                   ^
-// pkg/front_end/testcases/regress/issue_31184.dart:6:12: Error: Previous declaration of 'i'.
+// pkg/front_end/testcases/regress/issue_31184.dart:6:12: Context: Previous declaration of 'i'.
 //   for (int i = 0, i > 10; i++) {}
 //            ^
 //
@@ -14,10 +14,6 @@
 // pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.
 //   for (int i = 0, i > 10; i++) {}
 //                     ^
-//
-// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Getter not found: ''.
-//   for (int i = 0, i > 10; i++) {}
-//                     ^
 
 // Unhandled errors:
 //
@@ -28,10 +24,6 @@
 // pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.
 //   for (int i = 0, i > 10; i++) {}
 //                     ^
-//
-// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Getter not found: ''.
-//   for (int i = 0, i > 10; i++) {}
-//                     ^
 
 library;
 import self as self;
@@ -40,7 +32,9 @@
 static method bad() → dynamic {
   for (core::int i = 0, core::int i = invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' is already declared in this scope.
   for (int i = 0, i > 10; i++) {}
-                  ^" as{TypeError} core::int; (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>{})))).>(10) as{TypeError} core::bool; i = i.{core::num::+}(1)) {
+                  ^" 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)) {
   }
 }
 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
new file mode 100644
index 0000000..8de07cd
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: Expected ';' after this.
+//   for (int i = 0, i > 10; i++) {}
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.
+//   for (int i = 0, i > 10; i++) {}
+//                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method bad() → dynamic {
+  for (core::int i = 0, core::int i = invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' is already declared in this scope.
+  for (int i = 0, i > 10; i++) {}
+                  ^" 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)) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
index 5e7a651..77b5497 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
@@ -39,10 +39,6 @@
 // type T = Map<A, B>
 // ^
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
-// type T = Map<A, B>
-//              ^
-//
 // pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
 // type T = Map<A, B>
 // ^^^^
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
index 6757514..f3b79b1 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
@@ -12,10 +12,6 @@
 // type T = Map<A, B>
 // ^
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
-// type T = Map<A, B>
-//              ^
-//
 // pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
 // type T = Map<A, B>
 // ^^^^
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect
index 6c4525d..06b6a8b 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect
@@ -17,7 +17,7 @@
 
 class Typed<T extends core::Object = dynamic> extends core::Object {
   field self::Typed::T v = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Typed<self::Typed::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31190.dart.direct.transformed.expect
index 808b453..aacf8fa 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Typed<T extends core::Object = dynamic> extends core::Object {
   field self::Typed::T v = null;
-  synthetic constructor •() → void
+  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 3961a70..64491c6 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
@@ -9,7 +9,7 @@
 
 class Typed<T extends core::Object = dynamic> extends core::Object {
   field self::Typed::T v;
-  synthetic constructor •() → void
+  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 a02febd..94f1212 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
@@ -30,7 +30,7 @@
 
 class Typed<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::Typed::T v = null;
-  synthetic constructor •() → void
+  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 4f5ca69..c6fbf14 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
@@ -17,7 +17,7 @@
 
 class Typed<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::Typed::T v = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Typed<self::Typed::T>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
index 7729a31..be20748 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
@@ -8,10 +8,6 @@
 // pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Can't access 'this' in a field initializer to read 'x'.
 //   Increment() : x++ {}
 //                 ^
-//
-// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: '' isn't an instance field of this class.
-//   Increment() : x++ {}
-//                 ^
 
 // Unhandled errors:
 //
@@ -26,8 +22,8 @@
 
 class Increment extends core::Object {
   field core::int x = null;
-  constructor •() → void
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: '' isn't an instance field of this class.
+  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.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31192.dart.direct.transformed.expect
index 3a2498d..66b40c3 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.direct.transformed.expect
@@ -11,8 +11,8 @@
 
 class Increment extends core::Object {
   field core::int x = null;
-  constructor •() → void
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: '' isn't an instance field of this class.
+  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 2ce48d5..b416833 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.outline.expect
@@ -11,7 +11,7 @@
 
 class Increment extends core::Object {
   field core::int x;
-  constructor •() → void
+  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 7729a31..be20748 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
@@ -8,10 +8,6 @@
 // pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Can't access 'this' in a field initializer to read 'x'.
 //   Increment() : x++ {}
 //                 ^
-//
-// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: '' isn't an instance field of this class.
-//   Increment() : x++ {}
-//                 ^
 
 // Unhandled errors:
 //
@@ -26,8 +22,8 @@
 
 class Increment extends core::Object {
   field core::int x = null;
-  constructor •() → void
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: '' isn't an instance field of this class.
+  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 3a2498d..66b40c3 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
@@ -11,8 +11,8 @@
 
 class Increment extends core::Object {
   field core::int x = null;
-  constructor •() → void
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: '' isn't an instance field of this class.
+  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.direct.expect b/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
index 008a259..3cf0eb0 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
@@ -14,12 +14,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31198.dart.direct.transformed.expect
index 6421b2c..807896b 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → void
+  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 58ff8eb..08a7214 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 •() → void
+  synthetic constructor •() → self::A
     ;
 }
 class B extends self::A {
-  constructor •() → void
+  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 008a259..3cf0eb0 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
@@ -14,12 +14,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → void
+  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 6421b2c..807896b 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → void
+  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_31299.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
index 6385681..67df7a5 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
@@ -4,9 +4,14 @@
 // Try removing the extra positional arguments.
 //   new A.foo(1, 2);
 //            ^
-// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Warning: Found this candidate, but the arguments don't match.
+// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Context: Found this candidate, but the arguments don't match.
 //   A.foo() : m = 2;
 //   ^^^
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:18:12: Warning: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   new A.foo(1, 2);
+//            ^
 
 library;
 import self as self;
@@ -14,10 +19,10 @@
 
 class A extends core::Object {
   field core::int m;
-  constructor •() → void
+  constructor •() → self::A
     : self::A::m = 1, super core::Object::•()
     ;
-  constructor foo() → void
+  constructor foo() → self::A
     : self::A::m = 2, super core::Object::•()
     ;
   method foo(core::int a, core::int b) → core::int
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31299.dart.direct.transformed.expect
index 30d4403..8f696fe 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.direct.transformed.expect
@@ -4,10 +4,10 @@
 
 class A extends core::Object {
   field core::int m;
-  constructor •() → void
+  constructor •() → self::A
     : self::A::m = 1, super core::Object::•()
     ;
-  constructor foo() → void
+  constructor foo() → self::A
     : self::A::m = 2, super core::Object::•()
     ;
   method foo(core::int a, core::int b) → core::int
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 caa88eb..286af56 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.outline.expect
@@ -4,9 +4,9 @@
 
 class A extends core::Object {
   field core::int m;
-  constructor •() → void
+  constructor •() → self::A
     ;
-  constructor foo() → void
+  constructor foo() → self::A
     ;
   method foo(core::int a, core::int b) → core::int
     ;
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 b103d7c..61450ea 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
@@ -4,24 +4,29 @@
 // Try removing the extra positional arguments.
 //   new A.foo(1, 2);
 //            ^
-// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Found this candidate, but the arguments don't match.
+// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Context: Found this candidate, but the arguments don't match.
 //   A.foo() : m = 2;
 //   ^^^
 //
 // pkg/front_end/testcases/regress/issue_31299.dart:15:14: Error: Too few positional arguments: 2 required, 0 given.
 //   new A().foo();
 //              ^
-
-// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31299.dart:18:12: Error: Too many positional arguments: 0 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   new A.foo(1, 2);
 //            ^
+
+// Unhandled errors:
 //
 // pkg/front_end/testcases/regress/issue_31299.dart:15:14: Error: Too few positional arguments: 2 required, 0 given.
 //   new A().foo();
 //              ^
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:18:12: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   new A.foo(1, 2);
+//            ^
 
 library;
 import self as self;
@@ -29,10 +34,10 @@
 
 class A extends core::Object {
   field core::int m;
-  constructor •() → void
+  constructor •() → self::A
     : self::A::m = 1, super core::Object::•()
     ;
-  constructor foo() → void
+  constructor foo() → self::A
     : self::A::m = 2, super core::Object::•()
     ;
   method foo(core::int a, core::int b) → core::int
@@ -42,6 +47,9 @@
   new self::A::•().{self::A::foo}();
   new self::A::•().{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>{})));
+  invalid-expression "pkg/front_end/testcases/regress/issue_31299.dart:18:12: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+  new A.foo(1, 2);
+           ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31766.dart.outline.expect
index 54cb769..6d52cfc 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 •() → void
+  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 494d91f..d0f5eb8 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic
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 494d91f..d0f5eb8 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,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31996.dart.direct.expect
index 46c7f90..10f5e32 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.direct.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 abstract class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
 class Base extends core::Object implements self::B<dynamic> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Child1 extends self::Base implements self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Child1
     : super self::Base::•()
     ;
 }
 class Child2 extends self::Base implements self::C<core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Child2
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31996.dart.direct.transformed.expect
index 46c7f90..10f5e32 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.direct.transformed.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 abstract class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
 class Base extends core::Object implements self::B<dynamic> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Child1 extends self::Base implements self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Child1
     : super self::Base::•()
     ;
 }
 class Child2 extends self::Base implements self::C<core::double> {
-  synthetic constructor •() → void
+  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 38497b9..67628e9 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.outline.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 abstract class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
 }
 abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
 }
 class Base extends core::Object implements self::B<dynamic> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     ;
 }
 class Child1 extends self::Base implements self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Child1
     ;
 }
 class Child2 extends self::Base implements self::C<core::double> {
-  synthetic constructor •() → void
+  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 46c7f90..10f5e32 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.strong.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 abstract class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
 class Base extends core::Object implements self::B<dynamic> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Child1 extends self::Base implements self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Child1
     : super self::Base::•()
     ;
 }
 class Child2 extends self::Base implements self::C<core::double> {
-  synthetic constructor •() → void
+  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 46c7f90..10f5e32 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
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 abstract class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
 class Base extends core::Object implements self::B<dynamic> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 }
 class Child1 extends self::Base implements self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Child1
     : super self::Base::•()
     ;
 }
 class Child2 extends self::Base implements self::C<core::double> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Child2
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32182.dart.direct.expect
index f95cc9a..35b4513 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.direct.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -17,7 +17,7 @@
 abstract class _C&A&M = self::A<self::A<dynamic>> with self::M {
 }
 class C extends self::_C&A&M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_32182.dart.direct.transformed.expect
index a899754..055f44c 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.direct.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -22,7 +22,7 @@
     return 42;
 }
 class C extends self::_C&A&M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
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 a8c130e..ed2bfcf 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     ;
   method m() → dynamic
     ;
@@ -15,7 +15,7 @@
 abstract class _C&A&M = self::A<self::A<dynamic>> with self::M {
 }
 class C extends self::_C&A&M {
-  synthetic constructor •() → void
+  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 3d90b60..f311f0a 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -17,7 +17,7 @@
 abstract class _C&A&M = self::A<self::A<dynamic>> with self::M {
 }
 class C extends self::_C&A&M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
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 34ee38b..e1841e8 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
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -22,7 +22,7 @@
     return 42;
 }
 class C extends self::_C&A&M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32196.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32196.dart.direct.expect
index bf9d1e2..296b485 100644
--- a/pkg/front_end/testcases/regress/issue_32196.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_32196.dart.direct.expect
@@ -4,10 +4,10 @@
 
 class A extends core::Object {
   final field core::String name;
-  constructor get(core::String name) → void
+  constructor get(core::String name) → self::A
     : self::A::name = name, super core::Object::•()
     ;
-  constructor set(core::String name) → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_32196.dart.direct.transformed.expect
index bf9d1e2..296b485 100644
--- a/pkg/front_end/testcases/regress/issue_32196.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32196.dart.direct.transformed.expect
@@ -4,10 +4,10 @@
 
 class A extends core::Object {
   final field core::String name;
-  constructor get(core::String name) → void
+  constructor get(core::String name) → self::A
     : self::A::name = name, super core::Object::•()
     ;
-  constructor set(core::String name) → void
+  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 383d16c..1cfa044 100644
--- a/pkg/front_end/testcases/regress/issue_32196.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32196.dart.outline.expect
@@ -4,9 +4,9 @@
 
 class A extends core::Object {
   final field core::String name;
-  constructor get(core::String name) → void
+  constructor get(core::String name) → self::A
     ;
-  constructor set(core::String name) → void
+  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 bf9d1e2..296b485 100644
--- a/pkg/front_end/testcases/regress/issue_32196.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32196.dart.strong.expect
@@ -4,10 +4,10 @@
 
 class A extends core::Object {
   final field core::String name;
-  constructor get(core::String name) → void
+  constructor get(core::String name) → self::A
     : self::A::name = name, super core::Object::•()
     ;
-  constructor set(core::String name) → void
+  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 bf9d1e2..296b485 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
@@ -4,10 +4,10 @@
 
 class A extends core::Object {
   final field core::String name;
-  constructor get(core::String name) → void
+  constructor get(core::String name) → self::A
     : self::A::name = name, super core::Object::•()
     ;
-  constructor set(core::String name) → void
+  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.direct.expect b/pkg/front_end/testcases/regress/issue_32200.dart.direct.expect
index 14469fb9..432ea75 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.direct.expect
@@ -10,7 +10,7 @@
 
 class Foo extends core::Object {
   field self::Foo self = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_32200.dart.direct.transformed.expect
index 9857054..e8a56d4 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field self::Foo self = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
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 f1fcdb9..cbde884 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field self::Foo self;
-  synthetic constructor •() → void
+  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 ff1f016..170b627 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
@@ -16,7 +16,7 @@
 
 class Foo extends core::Object {
   field self::Foo self = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
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 40183e6..c2ad32e 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
@@ -10,7 +10,7 @@
 
 class Foo extends core::Object {
   field self::Foo self = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32660.dart.direct.expect
index 7f42fe5..46f8dc2 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.direct.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo(core::int x) → dynamic
     return x;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo(core::int x, {core::int y = null}) → dynamic
     return y;
 }
 class C extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
   method noSuchMethod(dynamic i) → dynamic {
@@ -26,14 +26,14 @@
   }
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   method foo(core::int x) → dynamic
     return x;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   abstract method foo(core::int x, {core::int y = null}) → dynamic;
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_32660.dart.direct.transformed.expect
index 7f42fe5..46f8dc2 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.direct.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo(core::int x) → dynamic
     return x;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo(core::int x, {core::int y = null}) → dynamic
     return y;
 }
 class C extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
   method noSuchMethod(dynamic i) → dynamic {
@@ -26,14 +26,14 @@
   }
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   method foo(core::int x) → dynamic
     return x;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   abstract method foo(core::int x, {core::int y = null}) → dynamic;
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 e77621d..9dc571a 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method foo(core::int x) → dynamic
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method foo(core::int x, {core::int y}) → dynamic
     ;
 }
 class C extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method noSuchMethod(dynamic i) → dynamic
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method foo(core::int x) → dynamic
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   abstract method foo(core::int x, {core::int y}) → dynamic;
   method noSuchMethod(dynamic i) → 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 90e7da0..a8975fa 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
@@ -1,77 +1,55 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:13:7: Error: The non-abstract class 'C' is missing implementations for these members:
-//   '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.
-//
+// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Error: The method 'A::foo' has fewer named arguments than those of overridden method 'B::foo'.
+//   foo(int x) => x;
+//   ^
+// pkg/front_end/testcases/regress/issue_32660.dart:10:3: Context: This is the overridden method ('foo').
+//   foo(int x, {int y}) => y;
+//   ^
+// pkg/front_end/testcases/regress/issue_32660.dart:13:7: Context: Both members are inherited by the non-abstract class 'C'.
 // class C extends A implements B {
 //       ^
-// pkg/front_end/testcases/regress/issue_32660.dart:10:3: Error: 'foo' is defined here.
-//   foo(int x, {int y}) => y;
-//   ^^^
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The non-abstract class 'E' is missing implementations for these members:
-//   '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.
-//
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Error: The method 'D::foo' has fewer named arguments than those of overridden method 'E::foo'.
+//   foo(int x) => x;
+//   ^
+// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
+//   foo(int x, {int y});
+//   ^
+// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Context: Both members are inherited by the non-abstract class 'E'.
 // class E extends D {
 //       ^
-// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Error: 'foo' is defined here.
-//   foo(int x, {int y});
-//   ^^^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:13:7: Error: The non-abstract class 'C' is missing implementations for these members:
-//   '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 C extends A implements B {
-//       ^
+// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Error: The method 'A::foo' has fewer named arguments than those of overridden method 'B::foo'.
+//   foo(int x) => x;
+//   ^
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The non-abstract class 'E' is missing implementations for these members:
-//   '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 E extends D {
-//       ^
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Error: The method 'D::foo' has fewer named arguments than those of overridden method 'E::foo'.
+//   foo(int x) => x;
+//   ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method foo(core::int x) → dynamic
     return x;
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method foo(core::int x, {core::int y = null}) → dynamic
     return y;
 }
 class C extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::A::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -81,14 +59,14 @@
   abstract forwarding-stub method foo(core::int x, {core::int y = null}) → dynamic;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   method foo(core::int x) → dynamic
     return x;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   abstract method foo(core::int x, {core::int y = null}) → dynamic;
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
new file mode 100644
index 0000000..404937a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
@@ -0,0 +1,59 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Error: The method 'A::foo' has fewer named arguments than those of overridden method 'B::foo'.
+//   foo(int x) => x;
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Error: The method 'D::foo' has fewer named arguments than those of overridden method 'E::foo'.
+//   foo(int x) => x;
+//   ^
+
+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::int x) → dynamic
+    return x;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method foo(core::int x, {core::int y = null}) → dynamic
+    return y;
+}
+class C extends self::A implements self::B {
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    core::print("No such method!");
+    return 42;
+  }
+  abstract forwarding-stub method foo(core::int x, {core::int y = null}) → dynamic;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  method foo(core::int x) → dynamic
+    return x;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E
+    : super self::D::•()
+    ;
+  abstract method foo(core::int x, {core::int y = null}) → 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::•();
+}
diff --git a/pkg/front_end/testcases/regress/issue_32972.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32972.dart.direct.expect
index eb7d14d..68f79ea 100644
--- a/pkg/front_end/testcases/regress/issue_32972.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_32972.dart.direct.expect
@@ -3,30 +3,42 @@
 // pkg/front_end/testcases/regress/issue_32972.dart:22:3: Warning: Expected 1 type arguments.
 //   foo<String, String>("hello world");
 //   ^
-// pkg/front_end/testcases/regress/issue_32972.dart:5:6: Warning: Found this candidate, but the arguments don't match.
+// pkg/front_end/testcases/regress/issue_32972.dart:5:6: Context: Found this candidate, but the arguments don't match.
 // void foo<X>(X i) {
 //      ^^^
 //
 // pkg/front_end/testcases/regress/issue_32972.dart:24:7: Warning: Expected 1 type arguments.
 //   Foo.foo<int, int>(42);
 //       ^
-// pkg/front_end/testcases/regress/issue_32972.dart:10:10: Warning: Found this candidate, but the arguments don't match.
+// pkg/front_end/testcases/regress/issue_32972.dart:10:10: Context: Found this candidate, but the arguments don't match.
 //   static foo<X>(X i) {
 //          ^^^
 //
 // pkg/front_end/testcases/regress/issue_32972.dart:29:7: Warning: Expected 2 type arguments.
 //   new Bar<String>();
 //       ^
-// pkg/front_end/testcases/regress/issue_32972.dart:19:7: Warning: The class 'Bar' has a constructor that takes no arguments.
+// pkg/front_end/testcases/regress/issue_32972.dart:19:7: Context: The class 'Bar' has a constructor that takes no arguments.
 // class Bar<X, Y> {}
 //       ^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:22:3: Warning: Expected 1 type arguments.
+//   foo<String, String>("hello world");
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:24:7: Warning: Expected 1 type arguments.
+//   Foo.foo<int, int>(42);
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:29:7: Warning: Expected 2 type arguments.
+//   new Bar<String>();
+//       ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   static method foo<X extends core::Object = dynamic>(self::Foo::foo::X i) → dynamic {
@@ -37,7 +49,7 @@
   }
 }
 class Bar<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::X, self::Bar::Y>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32972.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_32972.dart.direct.transformed.expect
index 720e78e..5f60828 100644
--- a/pkg/front_end/testcases/regress/issue_32972.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32972.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   static method foo<X extends core::Object = dynamic>(self::Foo::foo::X i) → dynamic {
@@ -14,7 +14,7 @@
   }
 }
 class Bar<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::X, self::Bar::Y>
     : super core::Object::•()
     ;
 }
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 e9de5cd..c7e2e5d 100644
--- a/pkg/front_end/testcases/regress/issue_32972.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32972.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
   static method foo<X extends core::Object = dynamic>(self::Foo::foo::X i) → dynamic
     ;
@@ -11,7 +11,7 @@
     ;
 }
 class Bar<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::X, self::Bar::Y>
     ;
 }
 static method foo<X extends core::Object = dynamic>(self::foo::X i) → void
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 bf43955..a96c187 100644
--- a/pkg/front_end/testcases/regress/issue_32972.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32972.dart.strong.expect
@@ -3,27 +3,39 @@
 // pkg/front_end/testcases/regress/issue_32972.dart:22:3: Error: Expected 1 type arguments.
 //   foo<String, String>("hello world");
 //   ^
-// pkg/front_end/testcases/regress/issue_32972.dart:5:6: Error: Found this candidate, but the arguments don't match.
+// pkg/front_end/testcases/regress/issue_32972.dart:5:6: Context: Found this candidate, but the arguments don't match.
 // void foo<X>(X i) {
 //      ^^^
 //
 // pkg/front_end/testcases/regress/issue_32972.dart:24:7: Error: Expected 1 type arguments.
 //   Foo.foo<int, int>(42);
 //       ^
-// pkg/front_end/testcases/regress/issue_32972.dart:10:10: Error: Found this candidate, but the arguments don't match.
+// pkg/front_end/testcases/regress/issue_32972.dart:10:10: Context: Found this candidate, but the arguments don't match.
 //   static foo<X>(X i) {
 //          ^^^
 //
 // pkg/front_end/testcases/regress/issue_32972.dart:29:7: Error: Expected 2 type arguments.
 //   new Bar<String>();
 //       ^
-// pkg/front_end/testcases/regress/issue_32972.dart:19:7: Error: The class 'Bar' has a constructor that takes no arguments.
+// pkg/front_end/testcases/regress/issue_32972.dart:19:7: Context: The class 'Bar' has a constructor that takes no arguments.
 // class Bar<X, Y> {}
 //       ^
 //
+// pkg/front_end/testcases/regress/issue_32972.dart:22:3: Error: Expected 1 type arguments.
+//   foo<String, String>("hello world");
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:24:7: Error: Expected 1 type arguments.
+//   Foo.foo<int, int>(42);
+//       ^
+//
 // pkg/front_end/testcases/regress/issue_32972.dart:27:5: Error: Expected 1 type arguments.
 //   f.bar<double, double>(42.42);
 //     ^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:29:7: Error: Expected 2 type arguments.
+//   new Bar<String>();
+//       ^
 
 // Unhandled errors:
 //
@@ -35,20 +47,20 @@
 //   Foo.foo<int, int>(42);
 //       ^
 //
-// pkg/front_end/testcases/regress/issue_32972.dart:29:7: Error: Expected 2 type arguments.
-//   new Bar<String>();
-//       ^
-//
 // pkg/front_end/testcases/regress/issue_32972.dart:27:5: Error: Expected 1 type arguments.
 //   f.bar<double, double>(42.42);
 //     ^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:29:7: Error: Expected 2 type arguments.
+//   new Bar<String>();
+//       ^
 
 library;
 import self as self;
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   static method foo<X extends core::Object = dynamic>(self::Foo::foo::X i) → dynamic {
@@ -59,7 +71,7 @@
   }
 }
 class Bar<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar<self::Bar::X, self::Bar::Y>
     : super core::Object::•()
     ;
 }
@@ -67,13 +79,19 @@
   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>{})));
+  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");
-  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>{})));
+  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);
-  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>{})));
+  invalid-expression "pkg/front_end/testcases/regress/issue_32972.dart:29:7: Error: Expected 2 type arguments.
+  new Bar<String>();
+      ^";
   new self::Bar::•<core::String, core::String>();
 }
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect b/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
index 65a098c..1b94419 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
@@ -29,7 +29,7 @@
 import "dart:core" as core;
 
 class ExistingClass extends core::Object {
-  constructor existingConstructor() → void
+  constructor existingConstructor() → self::ExistingClass
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect
index edcd349..22a417b 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class ExistingClass extends core::Object {
-  constructor existingConstructor() → void
+  constructor existingConstructor() → self::ExistingClass
     : super core::Object::•()
     ;
 }
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 6f1e5f7..c5db3ed7 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() → void
+  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 b93ac6e..6dc7b76 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
@@ -24,46 +24,32 @@
 //   x = new NonExistingClass();
 //           ^^^^^^^^^^^^^^^^
 
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:10:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
-//   var x = new ExistingClass.nonExistingConstructor();
-//                             ^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:11:11: Error: Method not found: 'ExistingClass'.
-//   x = new ExistingClass();
-//           ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:12:11: Error: Method not found: 'ExistingClass'.
-//   x = new ExistingClass<String>();
-//           ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:13:33: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
-//   x = new ExistingClass<String>.nonExistingConstructor();
-//                                 ^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:14:41: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
-//   x = new ExistingClass<String, String>.nonExistingConstructor();
-//                                         ^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:15:11: Error: Method not found: 'NonExistingClass'.
-//   x = new NonExistingClass();
-//           ^^^^^^^^^^^^^^^^
-
 library;
 import self as self;
 import "dart:core" as core;
 
 class ExistingClass extends core::Object {
-  constructor existingConstructor() → void
+  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 = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:10:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+  var x = new ExistingClass.nonExistingConstructor();
+                            ^^^^^^^^^^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:11:11: Error: Method not found: 'ExistingClass'.
+  x = new ExistingClass();
+          ^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:12:11: Error: Method not found: 'ExistingClass'.
+  x = new ExistingClass<String>();
+          ^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:13:33: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+  x = new ExistingClass<String>.nonExistingConstructor();
+                                ^^^^^^^^^^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:14:41: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+  x = new ExistingClass<String, String>.nonExistingConstructor();
+                                        ^^^^^^^^^^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:15:11: Error: Method not found: 'NonExistingClass'.
+  x = new NonExistingClass();
+          ^^^^^^^^^^^^^^^^";
 }
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 69ac3ff..e7c037a 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
@@ -1,43 +1,29 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:10:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
-//   var x = new ExistingClass.nonExistingConstructor();
-//                             ^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:11:11: Error: Method not found: 'ExistingClass'.
-//   x = new ExistingClass();
-//           ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:12:11: Error: Method not found: 'ExistingClass'.
-//   x = new ExistingClass<String>();
-//           ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:13:33: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
-//   x = new ExistingClass<String>.nonExistingConstructor();
-//                                 ^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:14:41: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
-//   x = new ExistingClass<String, String>.nonExistingConstructor();
-//                                         ^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:15:11: Error: Method not found: 'NonExistingClass'.
-//   x = new NonExistingClass();
-//           ^^^^^^^^^^^^^^^^
-
 library;
 import self as self;
 import "dart:core" as core;
 
 class ExistingClass extends core::Object {
-  constructor existingConstructor() → void
+  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 = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:10:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+  var x = new ExistingClass.nonExistingConstructor();
+                            ^^^^^^^^^^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:11:11: Error: Method not found: 'ExistingClass'.
+  x = new ExistingClass();
+          ^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:12:11: Error: Method not found: 'ExistingClass'.
+  x = new ExistingClass<String>();
+          ^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:13:33: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+  x = new ExistingClass<String>.nonExistingConstructor();
+                                ^^^^^^^^^^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:14:41: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+  x = new ExistingClass<String, String>.nonExistingConstructor();
+                                        ^^^^^^^^^^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:15:11: Error: Method not found: 'NonExistingClass'.
+  x = new NonExistingClass();
+          ^^^^^^^^^^^^^^^^";
 }
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect
index e783015..0735fd9 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect
@@ -23,13 +23,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static set C(dynamic v) → dynamic {}
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set D(dynamic v) → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect
index db5adcb..69eb56f 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect
@@ -13,13 +13,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static set C(dynamic v) → dynamic {}
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set D(dynamic v) → dynamic {}
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 f78eb0b..b4677c5 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect
@@ -13,13 +13,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   static set C(dynamic v) → dynamic
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   set D(dynamic v) → dynamic
     ;
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 76bcc00..0bfa5a5 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
@@ -28,13 +28,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static set C(dynamic v) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set D(dynamic v) → void {}
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 4b9ee03..fd60d26 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
@@ -13,13 +13,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   static set C(dynamic v) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
   set D(dynamic v) → void {}
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34291.dart.direct.expect
index ee89c3a..bc156cf 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.direct.expect
@@ -4,7 +4,7 @@
 import "./issue_34291_lib.dart" as iss;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34291.dart.direct.transformed.expect
index ee89c3a..bc156cf 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "./issue_34291_lib.dart" as iss;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : 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 103a1a4..f3be0ec 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect
@@ -4,7 +4,7 @@
 import "./issue_34291_lib.dart" as iss;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 static method foo() → 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 b4234d1..84cab9dc 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.strong.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : 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 98d11ba..35951e5 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
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart b/pkg/front_end/testcases/regress/issue_34563.dart
new file mode 100644
index 0000000..84109cc
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34563.dart
@@ -0,0 +1,26 @@
+// 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.
+
+mixin M1 {
+  int get m => 1;
+}
+
+mixin M2 extend M1 {}
+
+mixin M3 extends M1 {}
+
+class C1 {
+  int get c => 2;
+}
+
+class C2 extend C1 with M2 {}
+
+class C3 on C1 with M3 {}
+
+main() {
+  var c2 = new C2();
+  c2.m + c2.c;
+  var c3 = new C3();
+  c3.m + c3.c;
+}
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34563.dart.direct.expect
new file mode 100644
index 0000000..e878e85
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.direct.expect
@@ -0,0 +1,80 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
+// mixin M2 extend M1 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
+// mixin M3 extends M1 {}
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
+// class C2 extend C1 with M2 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
+// class C3 on C1 with M3 {}
+//          ^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
+// mixin M2 extend M1 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
+// mixin M3 extends M1 {}
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
+// class C2 extend C1 with M2 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
+// class C3 on C1 with M3 {}
+//          ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Object {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+  get m() → core::int
+    return 1;
+}
+abstract class M2 extends core::Object {
+  synthetic constructor •() → self::M2
+    : super core::Object::•()
+    ;
+}
+abstract class M3 extends core::Object {
+  synthetic constructor •() → self::M3
+    : super core::Object::•()
+    ;
+}
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1
+    : super core::Object::•()
+    ;
+  get c() → core::int
+    return 2;
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+}
+class C3 extends core::Object {
+  synthetic constructor •() → self::C3
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic c2 = new self::C2::•();
+  c2.m.+(c2.c);
+  dynamic c3 = new self::C3::•();
+  c3.m.+(c3.c);
+}
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34563.dart.direct.transformed.expect
new file mode 100644
index 0000000..5e662e3
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.direct.transformed.expect
@@ -0,0 +1,62 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
+// mixin M2 extend M1 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
+// mixin M3 extends M1 {}
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
+// class C2 extend C1 with M2 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
+// class C3 on C1 with M3 {}
+//          ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Object {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+  get m() → core::int
+    return 1;
+}
+abstract class M2 extends core::Object {
+  synthetic constructor •() → self::M2
+    : super core::Object::•()
+    ;
+}
+abstract class M3 extends core::Object {
+  synthetic constructor •() → self::M3
+    : super core::Object::•()
+    ;
+}
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1
+    : super core::Object::•()
+    ;
+  get c() → core::int
+    return 2;
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+}
+class C3 extends core::Object {
+  synthetic constructor •() → self::C3
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic c2 = new self::C2::•();
+  c2.m.+(c2.c);
+  dynamic c3 = new self::C3::•();
+  c3.m.+(c3.c);
+}
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34563.dart.outline.expect
new file mode 100644
index 0000000..8a53597
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.outline.expect
@@ -0,0 +1,52 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
+// mixin M2 extend M1 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
+// mixin M3 extends M1 {}
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
+// class C2 extend C1 with M2 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
+// class C3 on C1 with M3 {}
+//          ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Object {
+  synthetic constructor •() → self::M1
+    ;
+  get m() → core::int
+    ;
+}
+abstract class M2 extends core::Object {
+  synthetic constructor •() → self::M2
+    ;
+}
+abstract class M3 extends core::Object {
+  synthetic constructor •() → self::M3
+    ;
+}
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1
+    ;
+  get c() → core::int
+    ;
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2
+    ;
+}
+class C3 extends core::Object {
+  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
new file mode 100644
index 0000000..c1eaeba
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.strong.expect
@@ -0,0 +1,112 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
+// mixin M2 extend M1 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
+// mixin M3 extends M1 {}
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
+// class C2 extend C1 with M2 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
+// class C3 on C1 with M3 {}
+//          ^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:23:6: Error: The getter 'm' isn't defined for the class '#lib1::C2'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
+//   c2.m + c2.c;
+//      ^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:23:13: Error: The getter 'c' isn't defined for the class '#lib1::C2'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
+//   c2.m + c2.c;
+//             ^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:25:6: Error: The getter 'm' isn't defined for the class '#lib1::C3'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
+//   c3.m + c3.c;
+//      ^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:25:13: Error: The getter 'c' isn't defined for the class '#lib1::C3'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
+//   c3.m + c3.c;
+//             ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
+// mixin M2 extend M1 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
+// mixin M3 extends M1 {}
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
+// class C2 extend C1 with M2 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
+// class C3 on C1 with M3 {}
+//          ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Object {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+  get m() → core::int
+    return 1;
+}
+abstract class M2 extends core::Object {
+  synthetic constructor •() → self::M2
+    : super core::Object::•()
+    ;
+}
+abstract class M3 extends core::Object {
+  synthetic constructor •() → self::M3
+    : super core::Object::•()
+    ;
+}
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1
+    : super core::Object::•()
+    ;
+  get c() → core::int
+    return 2;
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+}
+class C3 extends core::Object {
+  synthetic constructor •() → self::C3
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::C2 c2 = new self::C2::•();
+  (let final dynamic #t1 = c2 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:6: Error: The getter 'm' isn't defined for the class '#lib1::C2'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
+  c2.m + c2.c;
+     ^").+(let final dynamic #t2 = c2 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:13: Error: The getter 'c' isn't defined for the class '#lib1::C2'.
+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::•();
+  (let final dynamic #t3 = c3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:6: Error: The getter 'm' isn't defined for the class '#lib1::C3'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
+  c3.m + c3.c;
+     ^").+(let final dynamic #t4 = c3 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:13: Error: The getter 'c' isn't defined for the class '#lib1::C3'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
+  c3.m + c3.c;
+            ^");
+}
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
new file mode 100644
index 0000000..8301f54
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.strong.transformed.expect
@@ -0,0 +1,74 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
+// mixin M2 extend M1 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
+// mixin M3 extends M1 {}
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
+// class C2 extend C1 with M2 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
+// class C3 on C1 with M3 {}
+//          ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Object {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+  get m() → core::int
+    return 1;
+}
+abstract class M2 extends core::Object {
+  synthetic constructor •() → self::M2
+    : super core::Object::•()
+    ;
+}
+abstract class M3 extends core::Object {
+  synthetic constructor •() → self::M3
+    : super core::Object::•()
+    ;
+}
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1
+    : super core::Object::•()
+    ;
+  get c() → core::int
+    return 2;
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+}
+class C3 extends core::Object {
+  synthetic constructor •() → self::C3
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::C2 c2 = new self::C2::•();
+  (let final self::C2 #t1 = c2 in let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:6: Error: The getter 'm' isn't defined for the class '#lib1::C2'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
+  c2.m + c2.c;
+     ^").+(let final self::C2 #t2 = c2 in let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:13: Error: The getter 'c' isn't defined for the class '#lib1::C2'.
+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::•();
+  (let final self::C3 #t3 = c3 in let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:6: Error: The getter 'm' isn't defined for the class '#lib1::C3'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
+  c3.m + c3.c;
+     ^").+(let final self::C3 #t4 = c3 in let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:13: Error: The getter 'c' isn't defined for the class '#lib1::C3'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
+  c3.m + c3.c;
+            ^");
+}
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart b/pkg/front_end/testcases/regress/issue_34614.dart
new file mode 100644
index 0000000..aedbef3a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34614.dart
@@ -0,0 +1,11 @@
+// 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.
+
+class C { C. }
+
+main() {
+  var c = new C();
+  c.toString();
+}
+
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34614.dart.direct.expect
new file mode 100644
index 0000000..004bcd9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34614.dart.direct.expect
@@ -0,0 +1,43 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected an identifier, but got '}'.
+// class C { C. }
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C. }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected '{' before this.
+// class C { C. }
+//              ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected an identifier, but got '}'.
+// class C { C. }
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C. }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected '{' before this.
+// class C { C. }
+//              ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  c.toString();
+}
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34614.dart.direct.transformed.expect
new file mode 100644
index 0000000..85f5296
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34614.dart.direct.transformed.expect
@@ -0,0 +1,28 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected an identifier, but got '}'.
+// class C { C. }
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C. }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected '{' before this.
+// class C { C. }
+//              ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  c.toString();
+}
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34614.dart.outline.expect
new file mode 100644
index 0000000..6cd7c77
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34614.dart.outline.expect
@@ -0,0 +1,25 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected an identifier, but got '}'.
+// class C { C. }
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C. }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected '{' before this.
+// class C { C. }
+//              ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  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
new file mode 100644
index 0000000..d36a30c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34614.dart.strong.expect
@@ -0,0 +1,43 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected an identifier, but got '}'.
+// class C { C. }
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C. }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected '{' before this.
+// class C { C. }
+//              ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected an identifier, but got '}'.
+// class C { C. }
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C. }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected '{' before this.
+// class C { C. }
+//              ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  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
new file mode 100644
index 0000000..225711f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34614.dart.strong.transformed.expect
@@ -0,0 +1,28 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected an identifier, but got '}'.
+// class C { C. }
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C. }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected '{' before this.
+// class C { C. }
+//              ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::C c = new self::C::•();
+  c.{core::Object::toString}();
+}
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.expect
index 8abcc85..d5e9850 100644
--- a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.expect
+++ b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends <TypeY extends core::Object = dynamic>(TypeY) → TypeY = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.transformed.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.transformed.expect
index 8abcc85..d5e9850 100644
--- a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends <TypeY extends core::Object = dynamic>(TypeY) → TypeY = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : super core::Object::•()
     ;
 }
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
index 1149d7f..7910f91 100644
--- 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends <TypeY extends core::Object = dynamic>(TypeY) → TypeY = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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
index 31e819a..f7c017d 100644
--- 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
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends <TypeY extends core::Object = dynamic>(TypeY) → TypeY = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : super core::Object::•()
     ;
 }
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
index 77b3db2..be82e20 100644
--- 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
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class Hest<TypeX extends <TypeY extends core::Object = dynamic>(TypeY) → TypeY = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Hest<self::Hest::TypeX>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.expect
index 044ccf6..4500d24 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef F = () → void;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.transformed.expect
index 044ccf6..4500d24 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F = () → void;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → void {}
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 91d5b6c..3dc3997 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
@@ -4,7 +4,7 @@
 
 typedef F = () → void;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method f() → void
     ;
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 c1938f2..097b531 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
@@ -4,7 +4,7 @@
 
 typedef F = () → void;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → void {}
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 c1938f2..097b531 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
@@ -4,7 +4,7 @@
 
 typedef F = () → void;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.expect
index d61a225..c8baa14 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.transformed.expect
index d61a225..c8baa14 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get x() → dynamic
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 1fc6d80..40f5e62 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,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   get x() → 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 18abd83..66a4e65 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get x() → dynamic
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 18abd83..66a4e65 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.expect
index 2341dd8..d39871fd 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.transformed.expect
index 2341dd8..d39871fd 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
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 74b6309..fe02523 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,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   set x(dynamic value) → void
     ;
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 b7006b5..9524a9d 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
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 b7006b5..9524a9d 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.expect
index 7108626..1d689ba 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.transformed.expect
index 7108626..1d689ba 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call() → void {}
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 544b511..3f4889b 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 •() → void
+  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 a7d91b4..b8d731a 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call() → void {}
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 a7d91b4..b8d731a 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.expect
index 3c40128..b88dd51 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.transformed.expect
index 3c40128..b88dd51 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call() → void {}
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 544b511..3f4889b 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  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 6429b52..5140370 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
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call() → void {}
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 6429b52..5140370 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
@@ -4,7 +4,7 @@
 import "dart:async" as asy;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method call() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.expect
index 24a436e..77c7ebd 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.expect
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.transformed.expect
index 24a436e..77c7ebd 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f() → 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 e23f39e..a14c9fc 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f() → 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 44fde23..8cec95f 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f() → 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 44fde23..8cec95f 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.expect
index bd2b5aa..766b438 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.transformed.expect
index bd2b5aa..766b438 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
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 a709687..05796c2 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f<U extends (self::C::T) → void = dynamic>(self::C::f::U x) → 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 798b35d..0eace1e 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
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 798b35d..0eace1e 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.expect
index e5707a0..dcfbb1a 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1() → (self::C::T) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.transformed.expect
index e5707a0..dcfbb1a 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1() → (self::C::T) → 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 87b34bb..7e23e51 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f1() → (self::C::T) → 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 c94a828..118f770 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1() → (self::C::T) → 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 c94a828..118f770 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1() → (self::C::T) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.expect
index e4d2536..eb6429b 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1() → (self::C::T) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.transformed.expect
index e4d2536..eb6429b 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1() → (self::C::T) → 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 87b34bb..7e23e51 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f1() → (self::C::T) → 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 e9ad7e2..7f26200 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1() → (self::C::T) → 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 e9ad7e2..7f26200 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1() → (self::C::T) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.expect
index 7c86eac..a07805e 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.expect
@@ -6,7 +6,7 @@
 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) → void
+  constructor •((self::C::T) → void _x) → self::C<self::C::T>
     : self::C::_x = _x, super core::Object::•()
     ;
   method f() → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.transformed.expect
index 7c86eac..a07805e 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 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) → void
+  constructor •((self::C::T) → void _x) → self::C<self::C::T>
     : self::C::_x = _x, super core::Object::•()
     ;
   method f() → (self::C::T) → void
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 929714f..1172f3c 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
@@ -6,7 +6,7 @@
 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) → void
+  constructor •((self::C::T) → void _x) → self::C<self::C::T>
     ;
   method f() → (self::C::T) → 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 c12fd60..de2d0dc 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
@@ -6,7 +6,7 @@
 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) → void
+  constructor •((self::C::T) → void _x) → self::C<self::C::T>
     : self::C::_x = _x, super core::Object::•()
     ;
   method f() → (self::C::T) → void
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 c12fd60..de2d0dc 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
@@ -6,7 +6,7 @@
 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) → void
+  constructor •((self::C::T) → void _x) → self::C<self::C::T>
     : self::C::_x = _x, super core::Object::•()
     ;
   method f() → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.expect
index 427e870..d75022d 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.expect
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(self::C::T value) → void {
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.transformed.expect
index 427e870..d75022d 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(self::C::T value) → 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 46e1514..5cb4a3a 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f(self::C::T value) → 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 df79537..e8b71dc 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(generic-covariant-impl self::C::T value) → 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 df79537..e8b71dc 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(generic-covariant-impl self::C::T value) → void {
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.expect
index a07d5f0..844dc6d 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get f1() → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.transformed.expect
index a07d5f0..844dc6d 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get f1() → (self::C::T) → 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 1043616..cc0b97a 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   get f1() → (self::C::T) → 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 147d4fd..fbbc155 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get f1() → (self::C::T) → 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 147d4fd..fbbc155 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get f1() → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.expect
index 35547b1..bdcc90a 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get f1() → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.transformed.expect
index 35547b1..bdcc90a 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get f1() → (self::C::T) → 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 1043616..cc0b97a 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   get f1() → (self::C::T) → 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 6f4b3ea..faea41a 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get f1() → (self::C::T) → 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 6f4b3ea..faea41a 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get f1() → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.expect
index 4f1bbc3..b8aa4df 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f<U extends self::C::T = dynamic>(self::C::f::U x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.transformed.expect
index 4f1bbc3..b8aa4df 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f<U extends self::C::T = dynamic>(self::C::f::U x) → 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 ec15d19..6a94b0f 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f<U extends self::C::T = dynamic>(self::C::f::U x) → 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 09a6b38..5a266d2 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
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
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 57f48fc..f8c0eb9 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.expect
index cf3c2b8..11fed34 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(self::C::T x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.transformed.expect
index cf3c2b8..11fed34 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(self::C::T x) → void {}
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 67723c56..af07f90 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f(self::C::T x) → void
     ;
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 bc445d9..1533f83 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(generic-covariant-impl self::C::T x) → void {}
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 bc445d9..1533f83 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(generic-covariant-impl self::C::T x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.expect
index 3487157..072d922 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1(core::List<self::C::T> x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.transformed.expect
index 3487157..072d922 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1(core::List<self::C::T> x) → void {}
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 3968bbe..831387d 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f1(core::List<self::C::T> x) → void
     ;
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 469d404..19bc917 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1(generic-covariant-impl core::List<self::C::T> x) → void {}
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 469d404..19bc917 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1(generic-covariant-impl core::List<self::C::T> x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.expect
index 7dfdaaf..fc22b45 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f1(self::I::T x) → void;
   abstract method f2(self::I::T x) → void;
 }
 class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super core::Object::•()
     ;
   method f1(core::int x) → void {}
   method f2(core::int x, [self::C::U y = null]) → void {}
 }
 class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::U>
     : super self::C::•()
     ;
   method f1(core::int x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.transformed.expect
index 7dfdaaf..fc22b45 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f1(self::I::T x) → void;
   abstract method f2(self::I::T x) → void;
 }
 class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     : super core::Object::•()
     ;
   method f1(core::int x) → void {}
   method f2(core::int x, [self::C::U y = null]) → void {}
 }
 class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::U>
     : super self::C::•()
     ;
   method f1(core::int x) → void {}
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 426bf40..a268782 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
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method f1(self::I::T x) → void;
   abstract method f2(self::I::T x) → void;
 }
 class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::U>
     ;
   method f1(core::int x) → void
     ;
@@ -17,7 +17,7 @@
     ;
 }
 class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::U>
     ;
   method f1(core::int x) → 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 9a3a345..a04329b 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
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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;
 }
 class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → void
+  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 {}
 }
 class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::U>
     : super self::C::•()
     ;
   method f1(generic-covariant-impl core::int x) → void {}
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 9a3a345..a04329b 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
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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;
 }
 class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → void
+  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 {}
 }
 class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::U>
     : super self::C::•()
     ;
   method f1(generic-covariant-impl core::int x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.expect
index 6577fa6..51518db 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.expect
@@ -3,25 +3,25 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.transformed.expect
index f4b7d39..8fe549e 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.transformed.expect
@@ -3,25 +3,25 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 class C extends self::B implements self::I<core::int>, self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   method f(core::int x) → 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 0a93e1b..c96cbc1 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,24 +3,24 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f(core::int x) → void
     ;
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method f(self::I::T x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     ;
   method f(core::int x) → void
     ;
 }
 class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 174c6b3..74b04625 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,25 +3,25 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f(generic-covariant-impl core::int x) → 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 2076939..e1d9d67 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,25 +3,25 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 class C extends self::B implements self::I<core::int>, self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   method f(generic-covariant-impl core::int x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.expect
index 5c01902..67ecc72 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.transformed.expect
index 5c01902..67ecc72 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 5990c58..2c50229 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,18 +3,18 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f(core::int x) → void
     ;
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method f(self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static method g1(self::C c) → 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 b9f3df7..104c6af 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,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f(generic-covariant-impl core::int x) → 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 b9f3df7..104c6af 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,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f(generic-covariant-impl core::int x) → void
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.expect
index eb9914c..fff4959 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
 }
 class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.transformed.expect
index 0cc0cd00..aca4225 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.transformed.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
 }
 class C extends self::B implements self::I<core::int>, self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 4815e5f..171a55f 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,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f(core::int x) → void
     ;
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method f(self::I::T x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     ;
 }
 class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 185086f..ab6b4b0 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,24 +3,24 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
 }
 class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f(generic-covariant-impl core::int x) → 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 03608fb..7b3a731 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,24 +3,24 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
 }
 class C extends self::B implements self::I<core::int>, self::M {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f(generic-covariant-impl core::int x) → void
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.expect
index 625be9b..cb4340c 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.expect
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1(self::C::T x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.transformed.expect
index 625be9b..cb4340c 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1(self::C::T x) → void {}
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 f1468ee..d426ddb 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f1(self::C::T x) → 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 9dea4dd..f172d58 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1(generic-covariant-impl self::C::T x) → void {}
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 9dea4dd..f172d58 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1(generic-covariant-impl self::C::T x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.expect
index 85f3c37..31aa1f7 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.expect
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(core::num x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f(covariant core::int x) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   method f(core::int x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.transformed.expect
index 85f3c37..31aa1f7 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.transformed.expect
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(core::num x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f(covariant core::int x) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   method f(core::int x) → void {}
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 2b11d85..3303a29 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
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method f(core::num x) → void
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method f(covariant core::int x) → void
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   method f(core::int x) → void
     ;
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 ba57944..057c2e6 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
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(core::num x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f(covariant core::int x) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   method f(covariant core::int x) → void {}
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 ba57944..057c2e6 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
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f(core::num x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f(covariant core::int x) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   method f(covariant core::int x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.expect
index a100ec5..306dd42 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.expect
@@ -4,19 +4,19 @@
 
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.transformed.expect
index a100ec5..306dd42 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.transformed.expect
@@ -4,19 +4,19 @@
 
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
   field core::int x = null;
-  synthetic constructor •() → void
+  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 103431f..643c93c 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
@@ -4,17 +4,17 @@
 
 class C extends core::Object {
   field core::num x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends core::Object implements self::C {
   covariant field core::int x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::Object implements self::D {
   field core::int x;
-  synthetic constructor •() → void
+  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 3c842e9..1f3710c 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
@@ -4,19 +4,19 @@
 
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  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 3c842e9..1f3710c 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
@@ -4,19 +4,19 @@
 
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.expect
index 61c27ca..4e1a3ad 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.expect
@@ -4,18 +4,18 @@
 
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   get x() → core::int
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.transformed.expect
index 61c27ca..4e1a3ad 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.transformed.expect
@@ -4,18 +4,18 @@
 
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   get x() → core::int
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 7d4f5fa..358009c 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
@@ -4,16 +4,16 @@
 
 class C extends core::Object {
   field core::num x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends core::Object implements self::C {
   covariant field core::int x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::Object implements self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   get x() → core::int
     ;
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 0ec77c4..760a9dc 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
@@ -4,18 +4,18 @@
 
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   get x() → core::int
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 0ec77c4..760a9dc 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
@@ -4,18 +4,18 @@
 
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   get x() → core::int
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.expect
index fc4bc15..d5f7a72 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::num value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(covariant core::int value) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   set x(core::int value) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.transformed.expect
index fc4bc15..d5f7a72 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::num value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(covariant core::int value) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   set x(core::int value) → void {}
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 6cba96e..8f94f9e 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,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   set x(core::num value) → void
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   set x(covariant core::int value) → void
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   set x(core::int value) → void
     ;
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 ef38d7a..cc9e3d7 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,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::num value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(covariant core::int value) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   set x(covariant core::int value) → void {}
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 ef38d7a..cc9e3d7 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,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::num value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(covariant core::int value) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   set x(covariant core::int value) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.expect
index dc7f644..79a95bb 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::num value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(covariant core::int value) → void {}
 }
 class E extends core::Object implements self::D {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.transformed.expect
index dc7f644..79a95bb 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::num value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(covariant core::int value) → void {}
 }
 class E extends core::Object implements self::D {
   field core::int x = null;
-  synthetic constructor •() → void
+  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 58df96b..97331e8 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 •() → void
+  synthetic constructor •() → self::C
     ;
   set x(core::num value) → void
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   set x(covariant core::int value) → void
     ;
 }
 class E extends core::Object implements self::D {
   field core::int x;
-  synthetic constructor •() → void
+  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 8175f23..492c9a2 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::num value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(covariant core::int value) → void {}
 }
 class E extends core::Object implements self::D {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  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 8175f23..492c9a2 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(core::num value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set x(covariant core::int value) → void {}
 }
 class E extends core::Object implements self::D {
   covariant field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.expect
index af80278..fa9d6c9 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.expect
@@ -5,7 +5,7 @@
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   set y(self::C::T value) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.transformed.expect
index af80278..fa9d6c9 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   set y(self::C::T value) → void {}
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 70e1cb2..edbba3a 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
@@ -5,7 +5,7 @@
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   set y(self::C::T value) → 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 3169cd8..54237f9 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   set y(generic-covariant-impl self::C::T value) → void {}
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 3169cd8..54237f9 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   set y(generic-covariant-impl self::C::T value) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.expect
index 4ac52bc..92254e8 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1(self::C::T x) → void {}
   method f2(core::int x) → void {}
 }
 class D extends self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f1(covariant core::int x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.transformed.expect
index 4ac52bc..92254e8 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f1(self::C::T x) → void {}
   method f2(core::int x) → void {}
 }
 class D extends self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f1(covariant core::int x) → void {}
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 3ce3e00..e6d2c0e 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f1(self::C::T x) → void
     ;
@@ -11,7 +11,7 @@
     ;
 }
 class D extends self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method f1(covariant core::int x) → 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 77a08e8..a6d4f4c 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
 }
 class D extends self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f1(covariant generic-covariant-impl core::int x) → void {}
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 77a08e8..a6d4f4c 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
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
 }
 class D extends self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method f1(covariant generic-covariant-impl core::int x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.expect
index 7595443..8fc21ae 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f<U extends self::C::T = dynamic>(self::C::f::U x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.transformed.expect
index 7595443..8fc21ae 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f<U extends self::C::T = dynamic>(self::C::f::U x) → void {}
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 b72ecf1..195a9e4 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f<U extends self::C::T = dynamic>(self::C::f::U x) → 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 f5a72bc..a88f0d1 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
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 f5a72bc..a88f0d1 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 {}
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.expect
index 5441e5e..1fe2ff5 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic f;
-  constructor •(dynamic f) → void
+  constructor •(dynamic f) → self::C
     : self::C::f = f, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.transformed.expect
index 5441e5e..1fe2ff5 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic f;
-  constructor •(dynamic f) → void
+  constructor •(dynamic f) → self::C
     : self::C::f = f, super core::Object::•()
     ;
 }
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 82fc3c9..a96d631 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,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic f;
-  constructor •(dynamic f) → void
+  constructor •(dynamic f) → self::C
     ;
 }
 static method g(self::C c) → 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 f2325b6..1431719 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,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic f;
-  constructor •(dynamic f) → void
+  constructor •(dynamic f) → self::C
     : self::C::f = f, super core::Object::•()
     ;
 }
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 f2325b6..1431719 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,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic f;
-  constructor •(dynamic f) → void
+  constructor •(dynamic f) → self::C
     : self::C::f = f, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.expect
index ed9baff..7f689fb 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.expect
@@ -4,18 +4,18 @@
 
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.transformed.expect
index ed9baff..7f689fb 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.transformed.expect
@@ -4,18 +4,18 @@
 
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
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 b253175..e67be67 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
@@ -4,16 +4,16 @@
 
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
 }
 class C extends core::Object {
   field core::num x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::C implements self::B<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 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 ab70a8d..4a50297 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
@@ -4,18 +4,18 @@
 
 class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   forwarding-stub set x(generic-covariant-impl core::num _) → 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 ab70a8d..4a50297 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
@@ -4,18 +4,18 @@
 
 class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   forwarding-stub set x(generic-covariant-impl core::num _) → void
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.expect
index de3d63c..01f712b 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class B extends core::Object {
   field core::Object _x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f([core::num x = 10]) → void {
@@ -20,14 +20,14 @@
   }
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f([self::I::T x = null]) → void;
   abstract method g({self::I::T x = null}) → void;
 }
 class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.transformed.expect
index de3d63c..01f712b 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class B extends core::Object {
   field core::Object _x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f([core::num x = 10]) → void {
@@ -20,14 +20,14 @@
   }
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f([self::I::T x = null]) → void;
   abstract method g({self::I::T x = null}) → void;
 }
 class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 9719eeb..596728c 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
@@ -4,7 +4,7 @@
 
 class B extends core::Object {
   field core::Object _x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f([core::num x]) → void
     ;
@@ -14,13 +14,13 @@
     ;
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method f([self::I::T x]) → void;
   abstract method g({self::I::T x}) → void;
 }
 class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 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 36ff607b..3474b5d 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
@@ -4,7 +4,7 @@
 
 class B extends core::Object {
   field core::Object _x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f([core::num x = 10]) → void {
@@ -20,14 +20,14 @@
   }
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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;
 }
 class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f([generic-covariant-impl core::num x = 10]) → void
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 36ff607b..3474b5d 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
@@ -4,7 +4,7 @@
 
 class B extends core::Object {
   field core::Object _x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f([core::num x = 10]) → void {
@@ -20,14 +20,14 @@
   }
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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;
 }
 class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f([generic-covariant-impl core::num x = 10]) → void
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.expect
index 33fa3f3..049bff0 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x, core::int y) → void;
 }
 class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.transformed.expect
index 33fa3f3..049bff0 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x, core::int y) → void;
 }
 class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 8206474..e33d959 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,18 +3,18 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f(core::int x, core::int y) → void
     ;
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method f(self::I::T x, core::int y) → void;
 }
 class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 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 fc360e3..760fd0e 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,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f(generic-covariant-impl core::int x, core::int y) → 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 fc360e3..760fd0e 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,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f(generic-covariant-impl core::int x, core::int y) → void
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.expect
index 61904ef..8874ff3 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   set x(self::C::T t) → void {}
@@ -12,12 +12,12 @@
 class D extends core::Object implements self::C<core::num> {
   field core::num x = null;
   field core::num y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   set x(core::num t) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.transformed.expect
index 61904ef..8874ff3 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   set x(self::C::T t) → void {}
@@ -12,12 +12,12 @@
 class D extends core::Object implements self::C<core::num> {
   field core::num x = null;
   field core::num y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   set x(core::num t) → 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 88ddc9b..f6ab6e3 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   field self::C::T y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   set x(self::C::T t) → void
     ;
@@ -12,11 +12,11 @@
 class D extends core::Object implements self::C<core::num> {
   field core::num x;
   field core::num y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends core::Object implements self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   set x(core::num t) → 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 1567f5d..add41b9 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   set x(generic-covariant-impl self::C::T t) → void {}
@@ -12,12 +12,12 @@
 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 •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   set x(generic-covariant-impl core::num t) → 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 1567f5d..add41b9 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
@@ -4,7 +4,7 @@
 
 class C<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::C::T y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   set x(generic-covariant-impl self::C::T t) → void {}
@@ -12,12 +12,12 @@
 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 •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
   set x(generic-covariant-impl core::num t) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.expect
index 19e4b9b..943bf76 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(covariant core::Object value) → void;
 }
 class B extends core::Object implements self::A {
   field core::Object x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(covariant core::Object x) → void {}
 }
 class C<T extends core::Object = dynamic> extends core::Object implements self::B {
   field self::C::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(self::C::T x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.transformed.expect
index 19e4b9b..943bf76 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(covariant core::Object value) → void;
 }
 class B extends core::Object implements self::A {
   field core::Object x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(covariant core::Object x) → void {}
 }
 class C<T extends core::Object = dynamic> extends core::Object implements self::B {
   field self::C::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(self::C::T x) → void {}
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 6f06015..89789e5 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,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   abstract set x(covariant core::Object value) → void;
 }
 class B extends core::Object implements self::A {
   field core::Object x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f(covariant core::Object x) → void
     ;
 }
 class C<T extends core::Object = dynamic> extends core::Object implements self::B {
   field self::C::T x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f(self::C::T x) → void
     ;
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 863bd18..d50d07e 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,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(covariant core::Object value) → void;
 }
 class B extends core::Object implements self::A {
   covariant field core::Object x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(covariant generic-covariant-impl self::C::T x) → void {}
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 863bd18..d50d07e 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,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract set x(covariant core::Object value) → void;
 }
 class B extends core::Object implements self::A {
   covariant field core::Object x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(covariant generic-covariant-impl self::C::T x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.expect
index c72d8754..4624a30 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(core::Object o) → void
+  constructor •(core::Object o) → self::C
     : assert(o), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.transformed.expect
index c72d8754..4624a30 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(core::Object o) → void
+  constructor •(core::Object o) → self::C
     : assert(o), super core::Object::•()
     ;
 }
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 321f620..25e616e 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) → void
+  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 7d2a4f1..d9d3799 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(core::Object o) → void
+  constructor •(core::Object o) → self::C
     : assert(o as{TypeError} core::bool), super core::Object::•()
     ;
 }
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 7d2a4f1..d9d3799 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,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(core::Object o) → void
+  constructor •(core::Object o) → self::C
     : assert(o as{TypeError} core::bool), super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.expect
index d28fd17..c7d9f2f6 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::bool b;
-  constructor •(core::Object o) → void
+  constructor •(core::Object o) → self::C
     : self::C::b = o, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.transformed.expect
index d28fd17..c7d9f2f6 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::bool b;
-  constructor •(core::Object o) → void
+  constructor •(core::Object o) → self::C
     : self::C::b = o, super core::Object::•()
     ;
 }
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 57a986b..993ccb0 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::bool b;
-  constructor •(core::Object o) → void
+  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 a47dcde..45d49ea 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::bool b;
-  constructor •(core::Object o) → void
+  constructor •(core::Object o) → self::C
     : self::C::b = o as{TypeError} core::bool, super core::Object::•()
     ;
 }
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 a47dcde..45d49ea 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
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field core::bool b;
-  constructor •(core::Object o) → void
+  constructor •(core::Object o) → self::C
     : self::C::b = o as{TypeError} core::bool, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.expect
index fb75e74..aea0463 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::num x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   abstract method f(core::num x) → void;
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.transformed.expect
index fb75e74..aea0463 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::num x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   abstract method f(core::num x) → void;
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 0a75151..8a400cf 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,18 +3,18 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f(core::num x) → void
     ;
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method f(self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   abstract method f(core::num x) → void;
 }
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 feb0e21..5862850 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,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::num x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub forwarding-semi-stub method f(generic-covariant-impl core::num x) → void
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 feb0e21..5862850 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,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::num x) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub forwarding-semi-stub method f(generic-covariant-impl core::num x) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.expect
index 20d497c..f02f1bc 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(self::C::T x) → void {}
@@ -21,12 +21,12 @@
     return this.{self::C::f};
 }
 class D extends self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::C::•()
     ;
   method f(covariant core::int x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.transformed.expect
index 20d497c..f02f1bc 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(self::C::T x) → void {}
@@ -21,12 +21,12 @@
     return this.{self::C::f};
 }
 class D extends self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::C::•()
     ;
   method f(covariant core::int x) → void {}
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 1b240b6..5b69334 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method f(self::C::T x) → void
     ;
@@ -18,11 +18,11 @@
     ;
 }
 class D extends self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 class E extends self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   method f(covariant core::int x) → void
     ;
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 3ceb928..50189fa 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(generic-covariant-impl self::C::T x) → void {}
@@ -21,12 +21,12 @@
     return this.{self::C::f};
 }
 class D extends self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::C::•()
     ;
   method f(covariant generic-covariant-impl core::int x) → void {}
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 3ceb928..50189fa 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → dynamic;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method f(generic-covariant-impl self::C::T x) → void {}
@@ -21,12 +21,12 @@
     return this.{self::C::f};
 }
 class D extends self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends self::C<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::C::•()
     ;
   method f(covariant generic-covariant-impl core::int x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.expect
index 1c8d174..96ac7ed 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.expect
@@ -4,7 +4,7 @@
 
 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 •() → void
+  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>
@@ -13,7 +13,7 @@
 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator [](core::int i) → self::B<core::num, (core::num) → void>
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.transformed.expect
index 1c8d174..96ac7ed 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 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 •() → void
+  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>
@@ -13,7 +13,7 @@
 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator [](core::int i) → self::B<core::num, (core::num) → void>
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 99545e4..a7fef48 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  synthetic constructor •() → self::B<self::B::T, self::B::U>
     ;
   operator +(dynamic other) → self::B<self::B::T, (self::B::T) → void>
     ;
@@ -12,7 +12,7 @@
 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 •() → void
+  synthetic constructor •() → self::C
     ;
   operator [](core::int i) → self::B<core::num, (core::num) → 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 447bd5c..5cb600d 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  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>
@@ -13,7 +13,7 @@
 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator [](core::int i) → self::B<core::num, (core::num) → 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 447bd5c..5cb600d 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
@@ -4,7 +4,7 @@
 
 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 •() → void
+  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>
@@ -13,7 +13,7 @@
 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   operator [](core::int i) → self::B<core::num, (core::num) → void>
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 466bc13..519326d 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
@@ -4,7 +4,7 @@
 
 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) → void
+  constructor •((self::C::T) → core::num plusResult) → self::C<self::C::T>
     ;
   operator +(core::int i) → (self::C::T) → core::num
     ;
@@ -12,7 +12,7 @@
 class D extends core::Object {
   final field self::C<core::num> getValue;
   field (core::int) → core::int setValue;
-  constructor •(self::C<core::num> getValue) → void
+  constructor •(self::C<core::num> getValue) → self::D
     ;
   get value() → self::C<core::num>
     ;
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 2eb1e5fa..70b44af 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
@@ -16,7 +16,7 @@
 
 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) → void
+  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
@@ -25,7 +25,7 @@
 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) → void
+  constructor •(self::C<core::num> getValue) → self::D
     : self::D::getValue = getValue, super core::Object::•()
     ;
   get value() → self::C<core::num>
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 a09c774..017d625 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
@@ -4,7 +4,7 @@
 
 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) → void
+  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
@@ -13,7 +13,7 @@
 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) → void
+  constructor •(self::C<core::num> getValue) → self::D
     : self::D::getValue = getValue, super core::Object::•()
     ;
   get value() → self::C<core::num>
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.expect
index 7941e44..89d07f9 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.expect
@@ -4,14 +4,14 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   operator +(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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get x() → self::B<(self::C::T) → void>
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.transformed.expect
index 7941e44..89d07f9 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.transformed.expect
@@ -4,14 +4,14 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   operator +(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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get x() → self::B<(self::C::T) → void>
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 6305ba1..c30ef22 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
@@ -4,13 +4,13 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
   operator +(self::B<self::B::T> other) → self::B<self::B::T>
     ;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   get x() → self::B<(self::C::T) → void>
     ;
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 6cb51fa..534f69a 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
@@ -26,14 +26,14 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>
     return null;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get x() → self::B<(self::C::T) → void>
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 0bad701..1f74ac1 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
@@ -4,14 +4,14 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>
     return null;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   get x() → self::B<(self::C::T) → void>
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.expect
index 8370814..e7781b1 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.expect
@@ -4,14 +4,14 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   operator +(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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   operator [](core::int i) → self::B<(self::C::T) → void>
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.transformed.expect
index 8370814..e7781b1 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.transformed.expect
@@ -4,14 +4,14 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   operator +(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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   operator [](core::int i) → self::B<(self::C::T) → void>
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 9fe6f92..5e2e915 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
@@ -4,13 +4,13 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
   operator +(self::B<self::B::T> other) → self::B<self::B::T>
     ;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   operator [](core::int i) → self::B<(self::C::T) → void>
     ;
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 0789042..f00a907 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
@@ -4,14 +4,14 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>
     return null;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   operator [](core::int i) → self::B<(self::C::T) → void>
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 0789042..f00a907 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
@@ -4,14 +4,14 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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>
     return null;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   operator [](core::int i) → self::B<(self::C::T) → void>
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.expect
index be5b7ea..c364e4f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   operator [](core::int i) → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.transformed.expect
index be5b7ea..c364e4f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   operator [](core::int i) → (self::C::T) → void
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 136af72..ea44fde 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   operator [](core::int i) → (self::C::T) → void
     ;
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 5d00df6..e373f2c 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   operator [](core::int i) → (self::C::T) → void
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 5d00df6..e373f2c 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
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   operator [](core::int i) → (self::C::T) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.expect
index 7d922fa..1fe58ed 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method f(self::B::T x) → void {}
@@ -11,7 +11,7 @@
   method h<U extends self::B::T = dynamic>() → void {}
 }
 class C extends self::B<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.transformed.expect
index 7d922fa..1fe58ed 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method f(self::B::T x) → void {}
@@ -11,7 +11,7 @@
   method h<U extends self::B::T = dynamic>() → void {}
 }
 class C extends self::B<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 895a16d..b4ae0e0 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
   method f(self::B::T x) → void
     ;
@@ -13,7 +13,7 @@
     ;
 }
 class C extends self::B<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static method g1(self::B<core::num> b) → 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 452359a..abc52e0 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method f(generic-covariant-impl self::B::T x) → void {}
@@ -11,7 +11,7 @@
   method h<generic-covariant-impl U extends self::B::T = self::B::T>() → void {}
 }
 class C extends self::B<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 452359a..abc52e0 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method f(generic-covariant-impl self::B::T x) → void {}
@@ -11,7 +11,7 @@
   method h<generic-covariant-impl U extends self::B::T = self::B::T>() → void {}
 }
 class C extends self::B<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.expect
index 25d0e7a..052b5bf 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.expect
@@ -4,12 +4,12 @@
 
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class C extends self::B<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.transformed.expect
index 25d0e7a..052b5bf 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.transformed.expect
@@ -4,12 +4,12 @@
 
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class C extends self::B<core::num> {
-  synthetic constructor •() → void
+  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 5146cef..9318356 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
@@ -4,11 +4,11 @@
 
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
 }
 class C extends self::B<core::num> {
-  synthetic constructor •() → void
+  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 d853752..ff86372 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
@@ -4,12 +4,12 @@
 
 class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class C extends self::B<core::num> {
-  synthetic constructor •() → void
+  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 d853752..ff86372 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
@@ -4,12 +4,12 @@
 
 class B<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
 }
 class C extends self::B<core::num> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.expect
index 0825415..3f2338c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.expect
@@ -4,18 +4,18 @@
 
 class B extends core::Object {
   covariant field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.transformed.expect
index 0825415..3f2338c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.transformed.expect
@@ -4,18 +4,18 @@
 
 class B extends core::Object {
   covariant field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
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 731ee5b..64163de 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
@@ -4,16 +4,16 @@
 
 class B extends core::Object {
   covariant field core::num x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
   field core::int x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 class D extends self::C implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
 }
 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 98aaa88..eea0f36 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
@@ -4,18 +4,18 @@
 
 class B extends core::Object {
   covariant field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   forwarding-stub set x(covariant core::num _) → 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 98aaa88..eea0f36 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
@@ -4,18 +4,18 @@
 
 class B extends core::Object {
   covariant field core::num x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
   field core::int x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   forwarding-stub set x(covariant core::num _) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.direct.expect
index 810f4b8..63b5c84 100644
--- a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.direct.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field dynamic staticField = null;
   field dynamic instanceField = null;
-  synthetic constructor •() → void
+  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.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.direct.transformed.expect
index 810f4b8..63b5c84 100644
--- a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field dynamic staticField = null;
   field dynamic instanceField = null;
-  synthetic constructor •() → void
+  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 1e63df1..7c9daac 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 •() → void
+  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 810f4b8..63b5c84 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 •() → void
+  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 810f4b8..63b5c84 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 •() → void
+  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.direct.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect
index caf1225..29d74ce 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect
@@ -5,13 +5,13 @@
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
   field self::B::T y = null;
-  synthetic constructor •() → void
+  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> {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   abstract get y() → dynamic;
@@ -19,7 +19,7 @@
 }
 abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
   abstract get y() → dynamic;
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect
index caf1225..29d74ce 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect
@@ -5,13 +5,13 @@
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x = null;
   field self::B::T y = null;
-  synthetic constructor •() → void
+  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> {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   abstract get y() → dynamic;
@@ -19,7 +19,7 @@
 }
 abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
   abstract get y() → 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 441306a..e9bcb8a 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
@@ -5,19 +5,19 @@
 class B<T extends core::Object = dynamic> extends core::Object {
   field self::B::T x;
   field self::B::T y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
 }
 abstract class C<T extends core::Object = dynamic> extends core::Object implements self::B<core::num> {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   abstract get y() → dynamic;
   abstract set y(dynamic value) → dynamic;
 }
 abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D<self::D::T>
     ;
   abstract get y() → dynamic;
   abstract set y(dynamic value) → 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 143a69a..f6be89d 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
@@ -5,13 +5,13 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   abstract get y() → core::num;
@@ -19,7 +19,7 @@
 }
 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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
   abstract get y() → self::D::T;
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 143a69a..f6be89d 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
@@ -5,13 +5,13 @@
 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 •() → void
+  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 •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   abstract get y() → core::num;
@@ -19,7 +19,7 @@
 }
 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 •() → void
+  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
   abstract get y() → self::D::T;
diff --git a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.expect
index 8e15a1f..b7d7a8b 100644
--- a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field core::bool staticValue = self::o;
   field core::bool instanceValue = self::o;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.transformed.expect
index 8e15a1f..b7d7a8b 100644
--- a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field core::bool staticValue = self::o;
   field core::bool instanceValue = self::o;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 40daf68..bc5261e 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
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field core::bool staticValue;
   field core::bool instanceValue;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static field core::Object o;
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 8cea5b3..9148470 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 8cea5b3..9148470 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
@@ -5,7 +5,7 @@
 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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
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 a054265..2c1118b 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,7 +3,7 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   get x() → core::int
     ;
@@ -15,7 +15,7 @@
     ;
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract get x() → self::I::T;
   abstract set x(self::I::T value) → void;
@@ -25,11 +25,11 @@
 class M extends core::Object {
   field core::int x;
   field core::int y;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     ;
 }
 class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 2990e03..4932edda 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
@@ -1,9 +1,29 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:48:7: Error: The return type of the method 'M::y' is dart.core::int, which does not match the return type of the overridden method (dart.core::Object).
+// Change to a subtype of dart.core::Object.
+//   int y;
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:43:12: Context: This is the overridden method ('y').
+//   void set y(covariant Object /*@covariance=explicit*/ value);
+//            ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:54:5: Context: Override was introduced in the mixin application class 'C'.
+//     C = B with M implements I<int>;
+//     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:48:7: Error: The return type of the method 'M::y' is dart.core::int, which does not match the return type of the overridden method (dart.core::Object).
+// Change to a subtype of dart.core::Object.
+//   int y;
+//       ^
+
 library test;
 import self as self;
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → core::int {
@@ -20,7 +40,7 @@
   }
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract get x() → self::I::T;
@@ -31,12 +51,12 @@
 class M extends core::Object {
   field core::int x = null;
   field core::int y = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
 }
 class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub set y(covariant core::Object value) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.expect
index 16a273b..dc8bb3d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → (core::int) → void {
@@ -15,14 +15,14 @@
   }
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract get x() → (self::I::T) → void;
   abstract set x(core::Object value) → void;
 }
 abstract class M<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M<self::M::T>
     : super core::Object::•()
     ;
   get x() → self::M::T
@@ -33,12 +33,12 @@
   abstract method f() → self::M::T;
 }
 abstract class C<T extends core::Object = dynamic> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
 }
 class D extends self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::B::•()
     ;
   method f() → (core::int) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.transformed.expect
index 92d7a50..f47ed24 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → (core::int) → void {
@@ -15,14 +15,14 @@
   }
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract get x() → (self::I::T) → void;
   abstract set x(core::Object value) → void;
 }
 abstract class M<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M<self::M::T>
     : super core::Object::•()
     ;
   get x() → self::M::T
@@ -33,7 +33,7 @@
   abstract method f() → self::M::T;
 }
 abstract class C<T extends core::Object = dynamic> extends self::B implements self::I<self::C::T>, self::M<(self::C::T) → void> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
   get x() → (self::C::T) → void
@@ -44,7 +44,7 @@
   abstract method f() → (self::C::T) → void;
 }
 class D extends self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::B::•()
     ;
   method f() → (core::int) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.outline.expect
index 6ce8632..e432df6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.outline.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   get x() → (core::int) → void
     ;
@@ -12,13 +12,13 @@
     ;
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract get x() → (self::I::T) → void;
   abstract set x(core::Object value) → void;
 }
 abstract class M<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M<self::M::T>
     ;
   get x() → self::M::T
     ;
@@ -27,12 +27,12 @@
   abstract method f() → self::M::T;
 }
 abstract class C<T extends core::Object = dynamic> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
 }
 class D extends self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method f() → (core::int) → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
index 606c252..e47b16c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
@@ -1,10 +1,30 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart:39:9: Error: The return type of the method 'M::x' is (test::C::T) → void, which does not match the return type of the overridden method ((dart.core::int) → void).
+// Change to a subtype of (dart.core::int) → void.
+//   T get x => f();
+//         ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart:24:14: Context: This is the overridden method ('x').
+//   F<int> get x {
+//              ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart:47:16: Context: Override was introduced in the mixin application class 'C'.
+// abstract class C<T> = B with M<F<T>> implements I<T>;
+//                ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart:39:9: Error: The return type of the method 'M::x' is (test::C::T) → void, which does not match the return type of the overridden method ((dart.core::int) → void).
+// Change to a subtype of (dart.core::int) → void.
+//   T get x => f();
+//         ^
+
 library test;
 import self as self;
 import "dart:core" as core;
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → (core::int) → void {
@@ -15,14 +35,14 @@
   }
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract get x() → (self::I::T) → void;
   abstract set x(core::Object value) → void;
 }
 abstract class M<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M<self::M::T>
     : super core::Object::•()
     ;
   get x() → self::M::T
@@ -33,12 +53,12 @@
   abstract method f() → self::M::T;
 }
 abstract class C<T extends core::Object = dynamic> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
 }
 class D extends self::C<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::B::•()
     ;
   method f() → (core::int) → void
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 2bd1d45..4195710 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,7 +3,7 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   get x() → core::int
     ;
@@ -15,7 +15,7 @@
     ;
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract get x() → self::I::T;
   abstract set x(self::I::T value) → void;
@@ -23,7 +23,7 @@
   abstract set y(covariant core::Object value) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     ;
   get x() → core::int
     ;
@@ -35,7 +35,7 @@
     ;
 }
 class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 811f68e..923fd4c 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
@@ -1,9 +1,29 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:53:18: Error: The parameter 'value' of the method 'M::y' has type dart.core::int, which does not match the corresponding type in the overridden method (dart.core::Object).
+// Change to a supertype of dart.core::Object (or, for a covariant parameter, a subtype).
+//   void set y(int value) {
+//                  ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:43:12: Context: This is the overridden method ('y').
+//   void set y(covariant Object /*@covariance=explicit*/ value);
+//            ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:61:5: Context: Override was introduced in the mixin application class 'C'.
+//     C = B with M implements I<int>;
+//     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:53:18: Error: The parameter 'value' of the method 'M::y' has type dart.core::int, which does not match the corresponding type in the overridden method (dart.core::Object).
+// Change to a supertype of dart.core::Object (or, for a covariant parameter, a subtype).
+//   void set y(int value) {
+//                  ^
+
 library test;
 import self as self;
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   get x() → core::int {
@@ -20,7 +40,7 @@
   }
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract get x() → self::I::T;
@@ -29,7 +49,7 @@
   abstract set y(covariant core::Object value) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::M
     : super core::Object::•()
     ;
   get x() → core::int
@@ -44,7 +64,7 @@
   }
 }
 class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub set y(covariant core::Object value) → void
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 90af082..4e4266a 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,18 +3,18 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f(core::int x) → core::int
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   abstract method f(covariant core::Object x) → core::int;
 }
 class C extends self::B implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
 }
 static method expectTypeError(() → void callback) → void
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 33025a0..1fe3ea5 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,7 +3,7 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → core::int {
@@ -12,13 +12,13 @@
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(covariant core::Object x) → core::int;
 }
 class C extends self::B implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f(covariant core::Object x) → core::int
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 33025a0..1fe3ea5 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,7 +3,7 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x) → core::int {
@@ -12,13 +12,13 @@
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(covariant core::Object x) → core::int;
 }
 class C extends self::B implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f(covariant core::Object x) → core::int
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart
index 34982db..4c3139d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart
@@ -15,7 +15,7 @@
   T f(Object x);
 }
 
-class
+abstract class
 /*@forwardingStub=abstract (C::T) -> void f(covariance=() Object x)*/
     C<T> extends B<F<T>> implements I<F<T>> {}
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.expect
index 8075c32..7d32948 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.expect
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(core::Object x) → self::I::T;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.transformed.expect
index 8075c32..7d32948 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.transformed.expect
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(core::Object x) → self::I::T;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.outline.expect
index 9da9feb..6b7705e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.outline.expect
@@ -4,18 +4,18 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method f(core::Object x) → self::I::T;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect
index d78be9f..c8ec998 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(core::Object x) → self::I::T;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
   abstract forwarding-stub method f(core::Object x) → (self::C::T) → void;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.transformed.expect
new file mode 100644
index 0000000..c8ec998
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library test;
+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 self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
+    : super self::B::•()
+    ;
+  abstract forwarding-stub method f(core::Object x) → (self::C::T) → void;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart
index 3382ef6..ff360dc 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart
@@ -15,7 +15,7 @@
   void f(F<T> x, Object y);
 }
 
-class
+abstract class
 /*@forwardingStub=void f(covariance=(genericImpl) ((C::T) -> void) -> void x, covariance=() Object y)*/
     C<T> extends B<F<T>> implements I<F<T>> {}
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.expect
index a267375..5e95811 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.expect
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.transformed.expect
index a267375..5e95811 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.transformed.expect
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.outline.expect
index 6959519..5526106 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.outline.expect
@@ -4,18 +4,18 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.expect
index 0a9304b..14a514f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.expect
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
   forwarding-stub method f(generic-covariant-impl ((self::C::T) → void) → void x, core::Object y) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.transformed.expect
index 0a9304b..14a514f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.strong.transformed.expect
@@ -4,19 +4,19 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
   forwarding-stub method f(generic-covariant-impl ((self::C::T) → void) → void x, core::Object y) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart
index d275f46..dc1766a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart
@@ -13,7 +13,7 @@
   void f(T /*@covariance=genericImpl*/ x, Object y);
 }
 
-class
+abstract class
 /*@forwardingStub=void f(covariance=(genericImpl) int x, covariance=() Object y)*/
     C extends B implements I<int> {}
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.expect
index 43f51a2..083d277 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x, core::Object y) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I<core::int> {
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.transformed.expect
index 43f51a2..083d277 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(self::I::T x, core::Object y) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I<core::int> {
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 123da75..2fd12fe 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,18 +3,18 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f(core::int x, core::int y) → void
     ;
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method f(self::I::T x, core::Object y) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I<core::int> {
+  synthetic constructor •() → self::C
     ;
 }
 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 df8dc2f..082a15f 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,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl self::I::T x, core::Object y) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+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
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 df8dc2f..082a15f 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,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl self::I::T x, core::Object y) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → void
+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
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart
index f232d54..6c7a38e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart
@@ -13,7 +13,7 @@
   void f(int x, Object y);
 }
 
-class
+abstract class
 /*@forwardingStub=abstract void f(covariance=(genericImpl) int x, covariance=() Object y)*/
     C extends B<int> implements I {}
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.expect
index 34a373d..c6e865f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method f(self::B::T x, core::int y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(core::int x, core::Object y) → void;
 }
-class C extends self::B<core::int> implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B<core::int> implements self::I {
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.transformed.expect
index 34a373d..c6e865f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method f(self::B::T x, core::int y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(core::int x, core::Object y) → void;
 }
-class C extends self::B<core::int> implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B<core::int> implements self::I {
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 97b15b3..a447e02 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
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     ;
   method f(self::B::T x, core::int y) → void
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   abstract method f(core::int x, core::Object y) → void;
 }
-class C extends self::B<core::int> implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B<core::int> implements self::I {
+  synthetic constructor •() → self::C
     ;
 }
 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 f48cc4b..04bbcf3 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
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method f(generic-covariant-impl self::B::T x, core::int y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(core::int x, core::Object y) → void;
 }
-class C extends self::B<core::int> implements self::I {
-  synthetic constructor •() → void
+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;
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
new file mode 100644
index 0000000..04bbcf3
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T>
+    : super core::Object::•()
+    ;
+  method f(generic-covariant-impl self::B::T x, core::int y) → void {}
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+  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
+    : super self::B::•()
+    ;
+  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_covariantInterface_from_class.dart b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart
index 0394769..4b5e2b0 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart
@@ -19,7 +19,7 @@
   void f(F<T> /*@covariance=genericImpl*/ x, Object y);
 }
 
-class
+abstract class
 /*@forwardingStub=abstract void f(covariance=(genericImpl) ((C::T) -> void) -> void x, covariance=() Object y)*/
     C<T> extends B<F<T>> implements I<F<T>> {}
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.expect
index 863ae95..8455164 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.expect
@@ -4,25 +4,25 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 abstract class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   abstract method f(self::A::T x, core::int y) → void;
 }
 class B<T extends core::Object = dynamic> extends core::Object implements self::A<(self::B::T) → void> {
-  synthetic constructor •() → void
+  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 implements self::A<(self::I::T) → void> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.transformed.expect
index 863ae95..8455164 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.transformed.expect
@@ -4,25 +4,25 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 abstract class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   abstract method f(self::A::T x, core::int y) → void;
 }
 class B<T extends core::Object = dynamic> extends core::Object implements self::A<(self::B::T) → void> {
-  synthetic constructor •() → void
+  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 implements self::A<(self::I::T) → void> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect
index 723d19c..5313aae 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect
@@ -4,23 +4,23 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 abstract class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
   abstract method f(self::A::T x, core::int y) → void;
 }
 class B<T extends core::Object = dynamic> extends core::Object implements self::A<(self::B::T) → void> {
-  synthetic constructor •() → void
+  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 implements self::A<(self::I::T) → void> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     ;
   abstract method f((self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.strong.expect
index 27289d4..fd2002b 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.strong.expect
@@ -4,25 +4,25 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 abstract class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  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 implements self::A<(self::B::T) → void> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
   method f(generic-covariant-impl (self::B::T) → void x, core::int y) → void {}
 }
 abstract class I<T extends core::Object = dynamic> extends core::Object implements self::A<(self::I::T) → void> {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
   abstract method f(generic-covariant-impl (self::I::T) → void x, core::Object y) → void;
 }
-class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
-  synthetic constructor •() → void
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
     : super self::B::•()
     ;
   abstract forwarding-stub method f(generic-covariant-impl ((self::C::T) → void) → void x, core::Object y) → void;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.strong.transformed.expect
new file mode 100644
index 0000000..fd2002b
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library test;
+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 implements self::A<(self::B::T) → void> {
+  synthetic constructor •() → self::B<self::B::T>
+    : super core::Object::•()
+    ;
+  method f(generic-covariant-impl (self::B::T) → void x, core::int y) → void {}
+}
+abstract class I<T extends core::Object = dynamic> extends core::Object implements self::A<(self::I::T) → void> {
+  synthetic constructor •() → self::I<self::I::T>
+    : super core::Object::•()
+    ;
+  abstract method f(generic-covariant-impl (self::I::T) → void x, core::Object y) → void;
+}
+abstract class C<T extends core::Object = dynamic> extends self::B<(self::C::T) → void> implements self::I<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
+    : super self::B::•()
+    ;
+  abstract forwarding-stub method f(generic-covariant-impl ((self::C::T) → void) → void 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 b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart
index 5da7f7a..2de34db 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart
@@ -13,7 +13,7 @@
   void f(covariant int /*@covariance=explicit*/ x, Object y);
 }
 
-class
+abstract class
 /*@forwardingStub=void f(covariance=(explicit) int x, covariance=() Object y)*/
     C extends B implements I {}
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.expect
index 3b68eaf..22a66005 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(covariant core::int x, core::Object y) → void;
 }
-class C extends self::B implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.transformed.expect
index 3b68eaf..22a66005 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(covariant core::int x, core::Object y) → void;
 }
-class C extends self::B implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 12472cd..91a90a9 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,18 +3,18 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f(core::int x, core::int y) → void
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   abstract method f(covariant core::int x, core::Object y) → void;
 }
-class C extends self::B implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C
     ;
 }
 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 e6a169e..ed5aa28 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,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(covariant core::int x, core::Object y) → void;
 }
-class C extends self::B implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f(covariant core::int x, core::Object y) → 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 e6a169e..ed5aa28 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,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(core::int x, core::int y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(covariant core::int x, core::Object y) → void;
 }
-class C extends self::B implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   forwarding-stub method f(covariant core::int x, core::Object y) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart
index 9e4934d..f6e26ca 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart
@@ -13,7 +13,7 @@
   void f(int x, Object y);
 }
 
-class
+abstract class
 /*@forwardingStub=abstract void f(covariance=(explicit) int x, covariance=() Object y)*/
     C extends B implements I {}
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.expect
index 67e593a..cf870cc 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(covariant core::int x, core::int y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(core::int x, core::Object y) → void;
 }
-class C extends self::B implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.transformed.expect
index 67e593a..cf870cc 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(covariant core::int x, core::int y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(core::int x, core::Object y) → void;
 }
-class C extends self::B implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
 }
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 b5cf523..d4b0825 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,18 +3,18 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method f(covariant core::int x, core::int y) → void
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   abstract method f(core::int x, core::Object y) → void;
 }
-class C extends self::B implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C
     ;
 }
 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 4e31b00..1ce982c 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,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
   method f(covariant core::int x, core::int y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method f(core::int x, core::Object y) → void;
 }
-class C extends self::B implements self::I {
-  synthetic constructor •() → void
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   abstract forwarding-stub method f(covariant core::int x, core::Object y) → 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
new file mode 100644
index 0000000..1ce982c
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method f(covariant core::int x, core::int y) → void {}
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+  abstract method f(core::int x, core::Object y) → void;
+}
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  abstract forwarding-stub method f(covariant core::int x, core::Object y) → void;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/static_setter.dart.direct.expect b/pkg/front_end/testcases/static_setter.dart.direct.expect
index cdb5c4d..05125e5 100644
--- a/pkg/front_end/testcases/static_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/static_setter.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/static_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/static_setter.dart.direct.transformed.expect
index cdb5c4d..05125e5 100644
--- a/pkg/front_end/testcases/static_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/static_setter.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/static_setter.dart.outline.expect b/pkg/front_end/testcases/static_setter.dart.outline.expect
index 8321fc4..13eaefe 100644
--- a/pkg/front_end/testcases/static_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/static_setter.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
 }
 static set foo(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/static_setter.dart.strong.expect b/pkg/front_end/testcases/static_setter.dart.strong.expect
index 98e7239..055ed11 100644
--- a/pkg/front_end/testcases/static_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/static_setter.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/static_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/static_setter.dart.strong.transformed.expect
index 98e7239..055ed11 100644
--- a/pkg/front_end/testcases/static_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/static_setter.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/store_load.dart.direct.expect b/pkg/front_end/testcases/store_load.dart.direct.expect
index ad7092d..51b4dc2 100644
--- a/pkg/front_end/testcases/store_load.dart.direct.expect
+++ b/pkg/front_end/testcases/store_load.dart.direct.expect
@@ -4,23 +4,23 @@
 
 class Foo extends core::Object {
   field dynamic _field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class FooValue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::FooValue
     : super core::Object::•()
     ;
 }
 class Bar extends core::Object {
   field dynamic _field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 class BarValue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BarValue
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/store_load.dart.direct.transformed.expect b/pkg/front_end/testcases/store_load.dart.direct.transformed.expect
index ad7092d..51b4dc2 100644
--- a/pkg/front_end/testcases/store_load.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/store_load.dart.direct.transformed.expect
@@ -4,23 +4,23 @@
 
 class Foo extends core::Object {
   field dynamic _field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class FooValue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::FooValue
     : super core::Object::•()
     ;
 }
 class Bar extends core::Object {
   field dynamic _field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 class BarValue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BarValue
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/store_load.dart.outline.expect b/pkg/front_end/testcases/store_load.dart.outline.expect
index a5b4130..3fc47e2 100644
--- a/pkg/front_end/testcases/store_load.dart.outline.expect
+++ b/pkg/front_end/testcases/store_load.dart.outline.expect
@@ -4,20 +4,20 @@
 
 class Foo extends core::Object {
   field dynamic _field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
 }
 class FooValue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::FooValue
     ;
 }
 class Bar extends core::Object {
   field dynamic _field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     ;
 }
 class BarValue extends core::Object {
-  synthetic constructor •() → void
+  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
index 59c3869..f3426e5 100644
--- a/pkg/front_end/testcases/store_load.dart.strong.expect
+++ b/pkg/front_end/testcases/store_load.dart.strong.expect
@@ -4,23 +4,23 @@
 
 class Foo extends core::Object {
   field dynamic _field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class FooValue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::FooValue
     : super core::Object::•()
     ;
 }
 class Bar extends core::Object {
   field dynamic _field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 class BarValue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BarValue
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/store_load.dart.strong.transformed.expect b/pkg/front_end/testcases/store_load.dart.strong.transformed.expect
index 59c3869..f3426e5 100644
--- a/pkg/front_end/testcases/store_load.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/store_load.dart.strong.transformed.expect
@@ -4,23 +4,23 @@
 
 class Foo extends core::Object {
   field dynamic _field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class FooValue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::FooValue
     : super core::Object::•()
     ;
 }
 class Bar extends core::Object {
   field dynamic _field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
 class BarValue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BarValue
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 70bdfe0..2e05e3e 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -21,12 +21,14 @@
 casts: Fail
 classes: Fail
 closure: Fail
+constructor_initializer_invalid: RuntimeError # Fails execution after recovery
 covariant_generic: Fail
 cycles: Fail
 default_values: Fail
 duplicated_declarations: TypeCheckError
 dynamic_and_void: Fail # Test assumes Dart 1.0 semantics
 escape: Fail
+expressions: RuntimeError
 external: Fail
 external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
 fallthrough: Fail
@@ -84,6 +86,7 @@
 literals: Fail
 map: Fail
 micro: Fail
+mixin_application_override: TypeCheckError
 named_parameters: Fail
 null_aware: Fail
 operators: Fail
@@ -100,7 +103,7 @@
 rasta/bad_constructor_redirection: Fail
 rasta/bad_continue: Fail
 rasta/bad_default_constructor: Fail
-rasta/bad_explicit_super_constructor: Fail
+rasta/bad_explicit_super_constructor: RuntimeError
 rasta/bad_implicit_super_constructor: Fail
 rasta/bad_interpolation: Fail
 rasta/bad_redirection: Fail
@@ -133,12 +136,12 @@
 rasta/issue_000031: Fail
 rasta/issue_000032: Fail
 rasta/issue_000033: Fail
-rasta/issue_000034: Fail
+rasta/issue_000034: RuntimeError
 rasta/issue_000035: Fail
 rasta/issue_000035a: Fail
 rasta/issue_000036: Fail
 rasta/issue_000039: Fail
-rasta/issue_000041: Fail
+rasta/issue_000041: RuntimeError
 rasta/issue_000042: Fail
 rasta/issue_000043: Fail
 rasta/issue_000044: Fail
@@ -187,20 +190,15 @@
 regress/issue_29976: RuntimeError # Tests runtime behavior of error recovery.
 regress/issue_29982: RuntimeError # Tests runtime behavior of error recovery.
 regress/issue_30836: RuntimeError # Issue 30836.
-regress/issue_31184: TypeCheckError
 regress/issue_31299: TypeCheckError
-regress/issue_32660: TypeCheckError # Test has an intentional error
 regress/issue_32972: TypeCheckError
 regress/issue_33452: RuntimeError # Test has an intentional error
 regress/issue_34225: RuntimeError
+regress/issue_34563: RuntimeError # Test execution after recovery
 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
-runtime_checks_new/stub_from_interface_contravariant_from_class: TypeCheckError
-runtime_checks_new/stub_from_interface_covariantImpl_from_super: TypeCheckError
-runtime_checks_new/stub_from_interface_covariantInterface_from_class: TypeCheckError
-runtime_checks_new/stub_from_interface_covariant_from_super: TypeCheckError
 statements: Fail
 stringliteral: Fail
 super_rasta_copy: Fail
diff --git a/pkg/front_end/testcases/super_call.dart.direct.expect b/pkg/front_end/testcases/super_call.dart.direct.expect
index e803acb..0928d4f 100644
--- a/pkg/front_end/testcases/super_call.dart.direct.expect
+++ b/pkg/front_end/testcases/super_call.dart.direct.expect
@@ -10,14 +10,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method call(core::int x) → core::int
     return x.*(2);
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   method call(core::int x) → core::int
diff --git a/pkg/front_end/testcases/super_call.dart.direct.transformed.expect b/pkg/front_end/testcases/super_call.dart.direct.transformed.expect
index d97a5e2..e58a60b 100644
--- a/pkg/front_end/testcases/super_call.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/super_call.dart.direct.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   method call(core::int x) → core::int
     return x.*(2);
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   method call(core::int x) → core::int
diff --git a/pkg/front_end/testcases/super_call.dart.outline.expect b/pkg/front_end/testcases/super_call.dart.outline.expect
index 84c2e19..8b792be 100644
--- a/pkg/front_end/testcases/super_call.dart.outline.expect
+++ b/pkg/front_end/testcases/super_call.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   method call(core::int x) → core::int
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   method call(core::int x) → core::int
     ;
diff --git a/pkg/front_end/testcases/super_call.dart.strong.expect b/pkg/front_end/testcases/super_call.dart.strong.expect
index c2176cd..bc4395d 100644
--- a/pkg/front_end/testcases/super_call.dart.strong.expect
+++ b/pkg/front_end/testcases/super_call.dart.strong.expect
@@ -10,14 +10,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   method call(core::int x) → core::int
diff --git a/pkg/front_end/testcases/super_call.dart.strong.transformed.expect b/pkg/front_end/testcases/super_call.dart.strong.transformed.expect
index be03ad0..0d474d7 100644
--- a/pkg/front_end/testcases/super_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/super_call.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  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 •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   method call(core::int x) → core::int
diff --git a/pkg/front_end/testcases/super_nsm.dart.direct.expect b/pkg/front_end/testcases/super_nsm.dart.direct.expect
index 6409395..5381e9e 100644
--- a/pkg/front_end/testcases/super_nsm.dart.direct.expect
+++ b/pkg/front_end/testcases/super_nsm.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method interfaceMethod() → dynamic;
 }
 class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic _) → dynamic
@@ -18,7 +18,7 @@
     return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("interfaceMethod", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method noSuchMethod(dynamic _) → dynamic
diff --git a/pkg/front_end/testcases/super_nsm.dart.direct.transformed.expect b/pkg/front_end/testcases/super_nsm.dart.direct.transformed.expect
index 6409395..5381e9e 100644
--- a/pkg/front_end/testcases/super_nsm.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/super_nsm.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method interfaceMethod() → dynamic;
 }
 class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method noSuchMethod(dynamic _) → dynamic
@@ -18,7 +18,7 @@
     return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("interfaceMethod", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method noSuchMethod(dynamic _) → dynamic
diff --git a/pkg/front_end/testcases/super_nsm.dart.outline.expect b/pkg/front_end/testcases/super_nsm.dart.outline.expect
index ac7f6b6..c9ea1e3 100644
--- a/pkg/front_end/testcases/super_nsm.dart.outline.expect
+++ b/pkg/front_end/testcases/super_nsm.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     ;
   abstract method interfaceMethod() → dynamic;
 }
 class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method noSuchMethod(dynamic _) → dynamic
     ;
@@ -16,7 +16,7 @@
     return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("interfaceMethod", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   method noSuchMethod(dynamic _) → dynamic
     ;
diff --git a/pkg/front_end/testcases/super_nsm.dart.strong.expect b/pkg/front_end/testcases/super_nsm.dart.strong.expect
index 5cf1472..476071f 100644
--- a/pkg/front_end/testcases/super_nsm.dart.strong.expect
+++ b/pkg/front_end/testcases/super_nsm.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method interfaceMethod() → dynamic;
 }
 class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation _) → dynamic
@@ -18,7 +18,7 @@
     return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("interfaceMethod", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method noSuchMethod(core::Invocation _) → dynamic
diff --git a/pkg/front_end/testcases/super_nsm.dart.strong.transformed.expect b/pkg/front_end/testcases/super_nsm.dart.strong.transformed.expect
index 5cf1472..476071f 100644
--- a/pkg/front_end/testcases/super_nsm.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/super_nsm.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::I
     : super core::Object::•()
     ;
   abstract method interfaceMethod() → dynamic;
 }
 class C extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation _) → dynamic
@@ -18,7 +18,7 @@
     return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("interfaceMethod", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
 }
 class D extends self::C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   method noSuchMethod(core::Invocation _) → dynamic
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect b/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect
index aeab753..c262ce9 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect
@@ -242,7 +242,7 @@
   field dynamic c = null;
   field dynamic d = null;
   final field dynamic f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get e() → dynamic
@@ -266,7 +266,7 @@
 }
 class B extends self::A {
   final field dynamic d = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   get b() → dynamic
@@ -275,7 +275,7 @@
   set i(dynamic x) → dynamic {}
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   method test() → dynamic {
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect b/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect
index c327223..e99eae0 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect
@@ -20,7 +20,7 @@
   field dynamic c = null;
   field dynamic d = null;
   final field dynamic f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get e() → dynamic
@@ -44,7 +44,7 @@
 }
 class B extends self::A {
   final field dynamic d = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   get b() → dynamic
@@ -53,7 +53,7 @@
   set i(dynamic x) → dynamic {}
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   method test() → dynamic {
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.outline.expect b/pkg/front_end/testcases/super_rasta_copy.dart.outline.expect
index dc09d25..b65a6c3 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.outline.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.outline.expect
@@ -8,7 +8,7 @@
   field dynamic c;
   field dynamic d;
   final field dynamic f;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     ;
   get e() → dynamic
     ;
@@ -35,7 +35,7 @@
 }
 class B extends self::A {
   final field dynamic d;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     ;
   get b() → dynamic
     ;
@@ -45,7 +45,7 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method test() → dynamic
     ;
diff --git a/pkg/front_end/testcases/tabs.dart.strong.expect b/pkg/front_end/testcases/tabs.dart.strong.expect
index e7be999..55b8efd 100644
--- a/pkg/front_end/testcases/tabs.dart.strong.expect
+++ b/pkg/front_end/testcases/tabs.dart.strong.expect
@@ -20,37 +20,25 @@
 // 	   	  print(five);
 // 	   	        ^^^^
 
-// Unhandled errors:
-//
-// 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);
-// 	   	        ^^^^
-
 library;
 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>{}))));
+  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
index 47ecc13..3028e07 100644
--- a/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
@@ -1,34 +1,22 @@
-// Unhandled errors:
-//
-// 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);
-// 	   	        ^^^^
-
 library;
 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>{}))));
+  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/type_variable_as_super.dart.outline.expect b/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect
index 5c17d4e..fc52e8d 100644
--- a/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect
+++ b/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect
@@ -17,15 +17,15 @@
 import "dart:core" as core;
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A<self::A::T>
     ;
 }
 abstract class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •() → void
+  constructor •() → self::B<self::B::T>
     ;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect b/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect
index c7067eb..7e86ed3 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method method() → invalid-type
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.direct.transformed.expect b/pkg/front_end/testcases/type_variable_prefix.dart.direct.transformed.expect
index 515d754..91a6346 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method method() → invalid-type
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect b/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect
index 7e5d61a..344aa5f 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     ;
   method method() → invalid-type
     ;
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
index 8ff0020..c820e09 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
@@ -25,7 +25,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method method() → invalid-type
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
index 485e406..47c2c06 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   method method() → invalid-type
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.direct.expect b/pkg/front_end/testcases/type_variable_uses.dart.direct.expect
index 0356bbd..eeed9e1 100644
--- a/pkg/front_end/testcases/type_variable_uses.dart.direct.expect
+++ b/pkg/front_end/testcases/type_variable_uses.dart.direct.expect
@@ -87,7 +87,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   static method staticMethod() → self::C<dynamic> {
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.direct.transformed.expect b/pkg/front_end/testcases/type_variable_uses.dart.direct.transformed.expect
index ddc705b..ab55341 100644
--- a/pkg/front_end/testcases/type_variable_uses.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/type_variable_uses.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   static method staticMethod() → self::C<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
index 45094c8..57300d4 100644
--- a/pkg/front_end/testcases/type_variable_uses.dart.outline.expect
+++ b/pkg/front_end/testcases/type_variable_uses.dart.outline.expect
@@ -9,7 +9,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C<self::C::T>
     ;
   static method staticMethod() → self::C<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
index 945078a..a8e6b38 100644
--- a/pkg/front_end/testcases/type_variable_uses.dart.strong.expect
+++ b/pkg/front_end/testcases/type_variable_uses.dart.strong.expect
@@ -127,7 +127,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   static method staticMethod() → self::C<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
index a14fdb5..335895d 100644
--- a/pkg/front_end/testcases/type_variable_uses.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/type_variable_uses.dart.strong.transformed.expect
@@ -65,7 +65,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → void
+  const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
   static method staticMethod() → self::C<dynamic> {
diff --git a/pkg/front_end/testcases/undefined.dart.direct.expect b/pkg/front_end/testcases/undefined.dart.direct.expect
index e3bfd98..f7eb342 100644
--- a/pkg/front_end/testcases/undefined.dart.direct.expect
+++ b/pkg/front_end/testcases/undefined.dart.direct.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → void {}
diff --git a/pkg/front_end/testcases/undefined.dart.direct.transformed.expect b/pkg/front_end/testcases/undefined.dart.direct.transformed.expect
index e3bfd98..f7eb342 100644
--- a/pkg/front_end/testcases/undefined.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/undefined.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → void {}
diff --git a/pkg/front_end/testcases/undefined.dart.outline.expect b/pkg/front_end/testcases/undefined.dart.outline.expect
index b11bd19..235d055 100644
--- a/pkg/front_end/testcases/undefined.dart.outline.expect
+++ b/pkg/front_end/testcases/undefined.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method f() → void
     ;
diff --git a/pkg/front_end/testcases/undefined.dart.strong.expect b/pkg/front_end/testcases/undefined.dart.strong.expect
index 06632af..e1d8047 100644
--- a/pkg/front_end/testcases/undefined.dart.strong.expect
+++ b/pkg/front_end/testcases/undefined.dart.strong.expect
@@ -21,7 +21,7 @@
 
 class C extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → void {}
diff --git a/pkg/front_end/testcases/undefined.dart.strong.transformed.expect b/pkg/front_end/testcases/undefined.dart.strong.transformed.expect
index 40d46b1..276f5c6 100644
--- a/pkg/front_end/testcases/undefined.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/undefined.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method f() → void {}
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.expect
index 8fbca83..b349e27 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.expect
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.transformed.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.transformed.expect
index 8fbca83..b349e27 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
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
index 36f9321..c63f24c 100644
--- 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   set x(dynamic value) → void
     ;
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
index 407c01c..4785789 100644
--- 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
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
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
index 956e97e..d826a78 100644
--- 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
diff --git a/pkg/front_end/testcases/uninitialized_fields.dart.outline.expect b/pkg/front_end/testcases/uninitialized_fields.dart.outline.expect
index 0b1cf23..8e795ce 100644
--- a/pkg/front_end/testcases/uninitialized_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/uninitialized_fields.dart.outline.expect
@@ -4,26 +4,26 @@
 
 class Uninitialized extends core::Object {
   field core::int x;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Uninitialized
     ;
 }
 class PartiallyInitialized extends core::Object {
   field core::int x;
-  constructor •(core::int x) → void
+  constructor •(core::int x) → self::PartiallyInitialized
     ;
-  constructor noInitializer() → void
+  constructor noInitializer() → self::PartiallyInitialized
     ;
 }
 class Initialized extends core::Object {
   field core::int x;
-  constructor •(core::int x) → void
+  constructor •(core::int x) → self::Initialized
     ;
 }
 class Forwarding extends core::Object {
   field core::int x;
-  constructor initialize(core::int x) → void
+  constructor initialize(core::int x) → self::Forwarding
     ;
-  constructor •(core::int arg) → void
+  constructor •(core::int arg) → self::Forwarding
     ;
 }
 static field core::int uninitializedTopLevel;
diff --git a/pkg/front_end/testcases/unused_methods.dart.direct.expect b/pkg/front_end/testcases/unused_methods.dart.direct.expect
index 9b1c543..323ddb0 100644
--- a/pkg/front_end/testcases/unused_methods.dart.direct.expect
+++ b/pkg/front_end/testcases/unused_methods.dart.direct.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class UnusedClass extends core::Object {
-  constructor •() → void
+  constructor •() → self::UnusedClass
     : super core::Object::•() {
     core::print("Unused");
   }
 }
 abstract class UsedAsBaseClass extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::UsedAsBaseClass
     : super core::Object::•()
     ;
   method usedInSubclass() → void {
@@ -23,7 +23,7 @@
   }
 }
 class UsedAsInterface extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::UsedAsInterface
     : super core::Object::•()
     ;
   method usedInSubclass() → void {
@@ -31,7 +31,7 @@
   }
 }
 class InstantiatedButMethodsUnused extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::InstantiatedButMethodsUnused
     : super core::Object::•()
     ;
   method usedInSubclass() → void {
@@ -39,7 +39,7 @@
   }
 }
 class ClassA extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ClassA
     : super self::UsedAsBaseClass::•()
     ;
   method usedInSubclass() → void {
@@ -47,7 +47,7 @@
   }
 }
 class ClassB extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ClassB
     : super self::UsedAsBaseClass::•()
     ;
   method usedInSubclass() → void {
diff --git a/pkg/front_end/testcases/unused_methods.dart.direct.transformed.expect b/pkg/front_end/testcases/unused_methods.dart.direct.transformed.expect
index 9b1c543..323ddb0 100644
--- a/pkg/front_end/testcases/unused_methods.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/unused_methods.dart.direct.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class UnusedClass extends core::Object {
-  constructor •() → void
+  constructor •() → self::UnusedClass
     : super core::Object::•() {
     core::print("Unused");
   }
 }
 abstract class UsedAsBaseClass extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::UsedAsBaseClass
     : super core::Object::•()
     ;
   method usedInSubclass() → void {
@@ -23,7 +23,7 @@
   }
 }
 class UsedAsInterface extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::UsedAsInterface
     : super core::Object::•()
     ;
   method usedInSubclass() → void {
@@ -31,7 +31,7 @@
   }
 }
 class InstantiatedButMethodsUnused extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::InstantiatedButMethodsUnused
     : super core::Object::•()
     ;
   method usedInSubclass() → void {
@@ -39,7 +39,7 @@
   }
 }
 class ClassA extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ClassA
     : super self::UsedAsBaseClass::•()
     ;
   method usedInSubclass() → void {
@@ -47,7 +47,7 @@
   }
 }
 class ClassB extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ClassB
     : super self::UsedAsBaseClass::•()
     ;
   method usedInSubclass() → void {
diff --git a/pkg/front_end/testcases/unused_methods.dart.outline.expect b/pkg/front_end/testcases/unused_methods.dart.outline.expect
index e3031b0..a08de38 100644
--- a/pkg/front_end/testcases/unused_methods.dart.outline.expect
+++ b/pkg/front_end/testcases/unused_methods.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class UnusedClass extends core::Object {
-  constructor •() → void
+  constructor •() → self::UnusedClass
     ;
 }
 abstract class UsedAsBaseClass extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::UsedAsBaseClass
     ;
   method usedInSubclass() → void
     ;
@@ -17,25 +17,25 @@
     ;
 }
 class UsedAsInterface extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::UsedAsInterface
     ;
   method usedInSubclass() → void
     ;
 }
 class InstantiatedButMethodsUnused extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::InstantiatedButMethodsUnused
     ;
   method usedInSubclass() → void
     ;
 }
 class ClassA extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ClassA
     ;
   method usedInSubclass() → void
     ;
 }
 class ClassB extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ClassB
     ;
   method usedInSubclass() → void
     ;
diff --git a/pkg/front_end/testcases/var_as_type_name.dart b/pkg/front_end/testcases/var_as_type_name.dart
new file mode 100644
index 0000000..aed26bd
--- /dev/null
+++ b/pkg/front_end/testcases/var_as_type_name.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.
+
+class A {
+  Map<String, var> m;
+}
+
+main() {
+  var a = new A();
+  a.m = null;
+}
+
diff --git a/pkg/front_end/testcases/var_as_type_name.dart.direct.expect b/pkg/front_end/testcases/var_as_type_name.dart.direct.expect
new file mode 100644
index 0000000..afad0be
--- /dev/null
+++ b/pkg/front_end/testcases/var_as_type_name.dart.direct.expect
@@ -0,0 +1,34 @@
+// Formatted problems:
+//
+// 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;
+//               ^^^
+
+// Unhandled errors:
+//
+// 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;
+//               ^^^
+
+library;
+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.direct.transformed.expect b/pkg/front_end/testcases/var_as_type_name.dart.direct.transformed.expect
new file mode 100644
index 0000000..0311700
--- /dev/null
+++ b/pkg/front_end/testcases/var_as_type_name.dart.direct.transformed.expect
@@ -0,0 +1,20 @@
+// Unhandled errors:
+//
+// 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;
+//               ^^^
+
+library;
+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
new file mode 100644
index 0000000..5eb0452
--- /dev/null
+++ b/pkg/front_end/testcases/var_as_type_name.dart.outline.expect
@@ -0,0 +1,21 @@
+// Formatted problems:
+//
+// 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;
+//               ^
+
+library;
+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
new file mode 100644
index 0000000..3f847ee
--- /dev/null
+++ b/pkg/front_end/testcases/var_as_type_name.dart.strong.expect
@@ -0,0 +1,42 @@
+// Formatted problems:
+//
+// 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;
+//               ^^^
+
+// Unhandled errors:
+//
+// 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;
+//               ^^^
+
+library;
+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
new file mode 100644
index 0000000..0c4887c
--- /dev/null
+++ b/pkg/front_end/testcases/var_as_type_name.dart.strong.transformed.expect
@@ -0,0 +1,28 @@
+// Unhandled errors:
+//
+// 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;
+//               ^^^
+
+library;
+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
index 31c9bac..b73833b 100644
--- a/pkg/front_end/testcases/void_methods.dart.outline.expect
+++ b/pkg/front_end/testcases/void_methods.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field core::List<dynamic> list;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     ;
   set first(dynamic x) → dynamic
     ;
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.expect b/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.expect
index 65c4883..46b046b 100644
--- a/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.expect
+++ b/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.expect
@@ -30,7 +30,7 @@
 
 class C extends core::Object {
   field dynamic superField = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method superMethod() → dynamic {}
@@ -43,7 +43,7 @@
 }
 class D extends self::C {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set setterOnly(dynamic _) → void {}
@@ -81,7 +81,7 @@
 }
 class E extends self::D {
   field dynamic missingField = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   method missingMethod() → void {}
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.transformed.expect b/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.transformed.expect
index 5750f13..08aae4d 100644
--- a/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic superField = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
   method superMethod() → dynamic {}
@@ -17,7 +17,7 @@
 }
 class D extends self::C {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   set setterOnly(dynamic _) → void {}
@@ -55,7 +55,7 @@
 }
 class E extends self::D {
   field dynamic missingField = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
   method missingMethod() → void {}
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.outline.expect b/pkg/front_end/testcases/warn_unresolved_sends.dart.outline.expect
index a22d6d0..ba36f3f 100644
--- a/pkg/front_end/testcases/warn_unresolved_sends.dart.outline.expect
+++ b/pkg/front_end/testcases/warn_unresolved_sends.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic superField;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     ;
   method superMethod() → dynamic
     ;
@@ -19,7 +19,7 @@
 }
 class D extends self::C {
   field dynamic field;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     ;
   set setterOnly(dynamic _) → void
     ;
@@ -32,7 +32,7 @@
 }
 class E extends self::D {
   field dynamic missingField;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     ;
   method missingMethod() → void
     ;
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 4ebfbb2..10adcb4 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -215,41 +215,15 @@
       "": "subtest name in multi test.",
       "": "Tracked by: https://github.com/dart-lang/sdk/issues/28436",
       "exclude": [
-        "/sdk/tests/language/arg_param_trailing_comma_test\\.dart$",
-        "/sdk/tests/language/assert_initializer_test\\.dart$",
-        "/sdk/tests/language/async_switch_test\\.dart$",
-        "/sdk/tests/language/case_expression_with_assignment_test\\.dart$",
-        "/sdk/tests/language/deep_nesting1_negative_test\\.dart$",
-        "/sdk/tests/language/deep_nesting2_negative_test\\.dart$",
-        "/sdk/tests/language/deferred_type_dependency_test\\.dart$",
-        "/sdk/tests/language/mixin_of_mixin_test\\.dart$",
         "/sdk/tests/language/regress_23996_test\\.dart$",
-        "/sdk/tests/language/regress_28217_test\\.dart$",
         "/sdk/tests/language/round_test\\.dart$",
-        "/sdk/tests/language_2/arg_param_trailing_comma_test\\.dart$",
-        "/sdk/tests/language_2/async_switch_test\\.dart$",
-        "/sdk/tests/language_2/built_in_identifier_type_annotation_test\\.dart$",
-        "/sdk/tests/language_2/case_expression_with_assignment_test\\.dart$",
-        "/sdk/tests/language_2/constructor_redirect1_negative_test\\.dart$",
-        "/sdk/tests/language_2/deferred_type_dependency_test\\.dart$",
-        "/sdk/tests/language_2/factory_redirection_test\\.dart$",
-        "/sdk/tests/language_2/factory2_test\\.dart$",
-        "/sdk/tests/language_2/factory3_test\\.dart$",
-        "/sdk/tests/language_2/field_initialization_order_test\\.dart$",
-        "/sdk/tests/language_2/field_override_test\\.dart$",
-        "/sdk/tests/language_2/field3_test\\.dart$",
-        "/sdk/tests/language_2/known_identifier_usage_test\\.dart$",
-        "/sdk/tests/language_2/map_literal11_test\\.dart$",
+        "/sdk/tests/language_2/abstract_getter2_test\\.dart$",
         "/sdk/tests/language_2/round_test\\.dart$",
         "/sdk/tests/language_2/regress_23996_test\\.dart$",
-        "/sdk/tests/language_2/regress_28217_test\\.dart$",
         "/sdk/tests/language_2/regress_30669_test\\.dart$",
         "/sdk/tests/language_2/regress_30927_test\\.dart$",
         "/sdk/tests/language_2/runtime_type_function_test\\.dart$",
-        "/sdk/tests/language_2/setter_override_test\\.dart$",
-        "/sdk/tests/language_strong/function_type_alias10_test\\.dart$",
-        "/sdk/tests/language_strong/regress_30669_test\\.dart$",
-        "/sdk/tests/language_strong/regress_30927_test\\.dart$"
+        "/sdk/tests/language_2/setter_override_test\\.dart$"
       ]
     },
 
diff --git a/pkg/front_end/tool/_fasta/generate_messages.dart b/pkg/front_end/tool/_fasta/generate_messages.dart
index e95b6ad..b5a3205 100644
--- a/pkg/front_end/tool/_fasta/generate_messages.dart
+++ b/pkg/front_end/tool/_fasta/generate_messages.dart
@@ -113,7 +113,7 @@
     new RegExp("#\([-a-zA-Z0-9_]+\)(?:%\([0-9]*\)\.\([0-9]+\))?");
 
 String compileTemplate(String name, int index, String template, String tip,
-    String analyzerCode, String severity) {
+    Object analyzerCode, String severity) {
   if (template == null) {
     print('Error: missing template for message: $name');
     exitCode = 1;
@@ -160,6 +160,8 @@
     switch (name) {
       case "character":
         parameters.add("String character");
+        conversions.add("if (character.runes.length != 1)"
+            "throw \"Not a character '\${character}'\";");
         arguments.add("'character': character");
         break;
 
@@ -175,17 +177,23 @@
 
       case "name":
         parameters.add("String name");
+        conversions.add("if (name.isEmpty) throw 'No name provided';");
         arguments.add("'name': name");
+        conversions.add("name = demangleMixinApplicationName(name);");
         break;
 
       case "name2":
         parameters.add("String name2");
+        conversions.add("if (name2.isEmpty) throw 'No name provided';");
         arguments.add("'name2': name2");
+        conversions.add("name2 = demangleMixinApplicationName(name2);");
         break;
 
       case "name3":
         parameters.add("String name3");
+        conversions.add("if (name3.isEmpty) throw 'No name provided';");
         arguments.add("'name3': name3");
+        conversions.add("name3 = demangleMixinApplicationName(name3);");
         break;
 
       case "lexeme":
@@ -202,16 +210,19 @@
 
       case "string":
         parameters.add("String string");
+        conversions.add("if (string.isEmpty) throw 'No string provided';");
         arguments.add("'string': string");
         break;
 
       case "string2":
         parameters.add("String string2");
+        conversions.add("if (string2.isEmpty) throw 'No string provided';");
         arguments.add("'string2': string2");
         break;
 
       case "string3":
         parameters.add("String string3");
+        conversions.add("if (string3.isEmpty) throw 'No string provided';");
         arguments.add("'string3': string3");
         break;
 
@@ -257,11 +268,13 @@
 
       case "count":
         parameters.add("int count");
+        conversions.add("if (count == null) throw 'No count provided';");
         arguments.add("'count': count");
         break;
 
       case "count2":
         parameters.add("int count2");
+        conversions.add("if (count2 == null) throw 'No count provided';");
         arguments.add("'count2': count2");
         break;
 
@@ -280,18 +293,21 @@
 
       case "num1":
         parameters.add("num _num1");
+        conversions.add("if (_num1 == null) throw 'No number provided';");
         conversions.add("String num1 = ${format('_num1')};");
         arguments.add("'num1': _num1");
         break;
 
       case "num2":
         parameters.add("num _num2");
+        conversions.add("if (_num2 == null) throw 'No number provided';");
         conversions.add("String num2 = ${format('_num2')};");
         arguments.add("'num2': _num2");
         break;
 
       case "num3":
         parameters.add("num _num3");
+        conversions.add("if (_num3 == null) throw 'No number provided';");
         conversions.add("String num3 = ${format('_num3')};");
         arguments.add("'num3': _num3");
         break;
@@ -312,9 +328,13 @@
   if (index != null) {
     codeArguments.add('index: $index');
   } else if (analyzerCode != null) {
+    if (analyzerCode is String) {
+      analyzerCode = <String>[analyzerCode];
+    }
+    List<Object> codes = analyzerCode;
     // If "index:" is defined, then "analyzerCode:" should not be generated
     // in the front end. See comment in messages.yaml
-    codeArguments.add('analyzerCode: "$analyzerCode"');
+    codeArguments.add('analyzerCodes: <String>["${codes.join('", "')}"]');
   }
   if (severity != null) {
     String severityEnumName = severityEnumNames[severity];
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index 8a28dc5..803b94b 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -47,7 +47,6 @@
 import 'dart:io' hide FileSystemEntity;
 
 import 'package:args/args.dart';
-import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/api_prototype/file_system.dart'
     show FileSystemEntity;
 import 'package:front_end/src/api_prototype/front_end.dart';
@@ -55,7 +54,6 @@
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/base/processed_options.dart';
-import 'package:front_end/src/byte_store/protected_file_byte_store.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
 
 import 'perf_common.dart';
@@ -125,7 +123,6 @@
   }
 
   var dir = Directory.systemTemp.createTempSync("ikg-cache");
-  compilerOptions.byteStore = createByteStore(cache, dir.path);
 
   final processedOptions =
       new ProcessedOptions(options: compilerOptions, inputs: [entryUri]);
@@ -263,21 +260,6 @@
       _fs.memory.entityForUri(uri).writeAsStringSync(contents);
 }
 
-ByteStore createByteStore(String cachePolicy, String path) {
-  switch (cachePolicy) {
-    case 'memory':
-      return new MemoryByteStore();
-    case 'protected':
-      return new ProtectedFileByteStore(path);
-    case 'evicting':
-      return new MemoryCachingByteStore(
-          new EvictingFileByteStore(path, 1024 * 1024 * 1024 /* 1G */),
-          64 * 1024 * 1024 /* 64M */);
-    default:
-      throw new UnsupportedError('Unknown cache policy: $cachePolicy');
-  }
-}
-
 /// A string replacement edit in a source file.
 class Edit {
   final Uri uri;
diff --git a/pkg/js_ast/lib/src/nodes.dart b/pkg/js_ast/lib/src/nodes.dart
index 9b933ae..2c44a3c 100644
--- a/pkg/js_ast/lib/src/nodes.dart
+++ b/pkg/js_ast/lib/src/nodes.dart
@@ -1046,7 +1046,12 @@
 class VariableDeclarationList extends Expression {
   final List<VariableInitialization> declarations;
 
-  VariableDeclarationList(this.declarations);
+  /// When pretty-printing a declaration list with multiple declarations over
+  /// several lines, the declarations are usually indented with respect to the
+  /// `var` keyword. Set [indentSplits] to `false` to suppress the indentation.
+  final bool indentSplits;
+
+  VariableDeclarationList(this.declarations, {this.indentSplits = true});
 
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitVariableDeclarationList(this);
diff --git a/pkg/js_ast/lib/src/printer.dart b/pkg/js_ast/lib/src/printer.dart
index 21f94bd..e56cca8 100644
--- a/pkg/js_ast/lib/src/printer.dart
+++ b/pkg/js_ast/lib/src/printer.dart
@@ -678,8 +678,53 @@
   @override
   visitVariableDeclarationList(VariableDeclarationList list) {
     out("var ");
-    visitCommaSeparated(list.declarations, ASSIGNMENT,
-        newInForInit: inForInit, newAtStatementBegin: false);
+    List<Node> nodes = list.declarations;
+    if (inForInit) {
+      visitCommaSeparated(nodes, ASSIGNMENT,
+          newInForInit: inForInit, newAtStatementBegin: false);
+    } else {
+      // Print 'big' declarations on their own line, while keeping adjacent
+      // small and uninitialized declarations on the same line.
+      bool useIndent = nodes.length > 1 && list.indentSplits;
+      if (useIndent) {
+        indentMore();
+      }
+      bool lastWasBig = false;
+      for (int i = 0; i < nodes.length; i++) {
+        Node node = nodes[i];
+        bool thisIsBig = !_isSmallInitialization(node);
+        if (i > 0) {
+          atStatementBegin = false;
+          out(",");
+          if (lastWasBig || thisIsBig) {
+            lineOut();
+            indent();
+          } else {
+            spaceOut();
+          }
+        }
+        visitNestedExpression(node, ASSIGNMENT,
+            newInForInit: inForInit, newAtStatementBegin: false);
+        lastWasBig = thisIsBig;
+      }
+      if (useIndent) {
+        indentLess();
+      }
+    }
+  }
+
+  static bool _isSmallInitialization(Node node) {
+    if (node is VariableInitialization) {
+      Node value = node.value;
+      if (value == null) return true;
+      if (value is This) return true;
+      if (value is LiteralNull) return true;
+      if (value is LiteralNumber) return true;
+      if (value is LiteralString && value.value.length <= 8) return true;
+      if (value is ObjectInitializer && value.properties.isEmpty) return true;
+      if (value is ArrayInitializer && value.elements.isEmpty) return true;
+    }
+    return false;
   }
 
   @override
diff --git a/pkg/kernel/README.md b/pkg/kernel/README.md
index 778bcc7..e426706 100644
--- a/pkg/kernel/README.md
+++ b/pkg/kernel/README.md
@@ -1,17 +1,17 @@
 Dart Kernel
 ===========
-**Dart Kernel** is a small high-level language derived from Dart.
-It is designed for use as an intermediate format for whole-program analysis
-and transformations, and as a frontend for codegen and execution backends.
+**Dart Kernel** is a small high-level language derived from Dart.  It is
+designed for use as an intermediate format for whole-program analysis and
+transformations, and to be consumed by codegen and execution backends.
 
-The kernel language has in-memory representations in Dart and C++, and
-can be serialized as binary or text.
+The kernel language has an in-memory representation in Dart and can be
+serialized as binary or text.
 
-Both the kernel language and its implementations are unstable and are under development.
+Both the kernel language and its implementations are unstable and are under
+development.
 
 This package contains the Dart part of the implementation and contains:
 - A transformable IR for the kernel language
-- A frontend based on the analyzer
 - Serialization of kernel code
 
 _Note:_ The APIs in this package are in an early state; developers should be
@@ -19,54 +19,6 @@
 contract for release versions of this package.  Please depend directly
 on individual versions.
 
-Getting Kernel
-------------
-
-Checkout the repository and run pub get:
-```bash
-git clone https://github.com/dart-lang/kernel
-cd kernel
-pub get
-```
-
-Command-Line Tool
------------------
-
-Run `tool/dartk.dart` from the command-line to convert between .dart files
-and the serialized binary and textual formats.
-
-`dartk` expects the `.dill` extension for files in the binary format.
-The textual format has no preferred extension right now.
-
-Example commands:
-```bash
-dartk foo.dart            # print text IR for foo.dart
-dartk foo.dart -ofoo.dill # write binary IR for foo.dart to foo.dill
-dartk foo.dill            # print text IR for binary file foo.dill
-```
-
-Pass the `--link` or `-l` flag to link all transitive dependencies into one file:
-```bash
-dartk myapp.dart -ppackages -l -omyapp.dill # Bundle everything.
-dartk myapp.dill # Print it back out in a (very, very long) textual format.
-```
-
 See [ast.dart](lib/ast.dart) for the in-memory IR, or [binary.md](binary.md) for
 a description of the binary format.  For now, the textual format is very ad-hoc
 and cannot be parsed back in.
-
-
-Testing
--------
-
-If you plan to make changes to kernel, get a checkout of the Dartk SDK and run:
-```bash
-tool/regenerate_dill_files.dart --sdk <path to SDK checkout>
-pub run test
-```
-
-
-Linking
--------------------------
-Linking from binary files is not yet implemented.  In order to compile a whole
-program, currently everything must be compiled from source at once.
diff --git a/pkg/kernel/bin/count_breakdown.dart b/pkg/kernel/bin/count_breakdown.dart
index fe8353f..43450ff 100755
--- a/pkg/kernel/bin/count_breakdown.dart
+++ b/pkg/kernel/bin/count_breakdown.dart
@@ -18,8 +18,9 @@
 }
 
 main(List<String> args) {
-  CommandLineHelper.requireExactlyOneArgument(true, args, usage);
-  Component component = CommandLineHelper.tryLoadDill(args[0], usage);
+  CommandLineHelper.requireExactlyOneArgument(args, usage,
+      requireFileExists: true);
+  Component component = CommandLineHelper.tryLoadDill(args[0]);
   TypeCounter counter = new TypeCounter();
   component.accept(counter);
   counter.printStats();
diff --git a/pkg/kernel/bin/dump.dart b/pkg/kernel/bin/dump.dart
index 3d76a9a..0c3ab47 100755
--- a/pkg/kernel/bin/dump.dart
+++ b/pkg/kernel/bin/dump.dart
@@ -24,8 +24,8 @@
 
 main(List<String> args) {
   CommandLineHelper.requireVariableArgumentCount([1, 2], args, usage);
-  CommandLineHelper.requireFileExists(args[0], usage);
-  var binary = CommandLineHelper.tryLoadDill(args[0], usage);
+  CommandLineHelper.requireFileExists(args[0]);
+  var binary = CommandLineHelper.tryLoadDill(args[0]);
   writeComponentToText(binary,
       path: args.length > 1 ? args[1] : null,
       showOffsets: const bool.fromEnvironment("showOffsets"));
diff --git a/pkg/kernel/bin/eval.dart b/pkg/kernel/bin/eval.dart
index 0f9ce1a..3d26780 100755
--- a/pkg/kernel/bin/eval.dart
+++ b/pkg/kernel/bin/eval.dart
@@ -19,7 +19,8 @@
 }
 
 main(List<String> args) {
-  CommandLineHelper.requireExactlyOneArgument(true, args, usage);
-  Component component = CommandLineHelper.tryLoadDill(args[0], usage);
+  CommandLineHelper.requireExactlyOneArgument(args, usage,
+      requireFileExists: true);
+  Component component = CommandLineHelper.tryLoadDill(args[0]);
   new Interpreter(component).run();
 }
diff --git a/pkg/kernel/bin/size_breakdown.dart b/pkg/kernel/bin/size_breakdown.dart
index b8a5386..a99233d 100755
--- a/pkg/kernel/bin/size_breakdown.dart
+++ b/pkg/kernel/bin/size_breakdown.dart
@@ -20,7 +20,8 @@
 }
 
 main(args) {
-  CommandLineHelper.requireExactlyOneArgument(true, args, usage);
+  CommandLineHelper.requireExactlyOneArgument(args, usage,
+      requireFileExists: true);
   List<int> bytes = new File(args[0]).readAsBytesSync();
   try {
     Component p = new Component();
diff --git a/pkg/kernel/bin/split.dart b/pkg/kernel/bin/split.dart
index 9bacdfc..fd7532c 100755
--- a/pkg/kernel/bin/split.dart
+++ b/pkg/kernel/bin/split.dart
@@ -23,8 +23,9 @@
 }
 
 main(args) async {
-  CommandLineHelper.requireExactlyOneArgument(true, args, usage);
-  Component binary = CommandLineHelper.tryLoadDill(args[0], usage);
+  CommandLineHelper.requireExactlyOneArgument(args, usage,
+      requireFileExists: true);
+  Component binary = CommandLineHelper.tryLoadDill(args[0]);
 
   int part = 1;
   binary.libraries.forEach((lib) => lib.isExternal = true);
diff --git a/pkg/kernel/bin/type_check.dart b/pkg/kernel/bin/type_check.dart
index 24b78d3d..7591ee0 100755
--- a/pkg/kernel/bin/type_check.dart
+++ b/pkg/kernel/bin/type_check.dart
@@ -20,8 +20,9 @@
 }
 
 void main(List<String> args) {
-  CommandLineHelper.requireExactlyOneArgument(true, args, usage);
-  final binary = CommandLineHelper.tryLoadDill(args[0], usage);
+  CommandLineHelper.requireExactlyOneArgument(args, usage,
+      requireFileExists: true);
+  final binary = CommandLineHelper.tryLoadDill(args[0]);
   ErrorFormatter errorFormatter = new ErrorFormatter();
   new StrongModeTypeChecker(errorFormatter, binary)..checkComponent(binary);
   if (errorFormatter.numberOfFailures > 0) {
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 90aa8c7..76cafc1 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -753,10 +753,10 @@
   /// class C {}
   /// class D {}
   /// ...creates:
-  /// abstract class A&B extends A mixedIn B {}
-  /// abstract class A&B&C extends A&B mixedIn C {}
-  /// abstract class A&B&C&D extends A&B&C mixedIn D {}
-  /// class Z extends A&B&C&D {}
+  /// abstract class _Z&A&B extends A mixedIn B {}
+  /// abstract class _Z&A&B&C extends A&B mixedIn C {}
+  /// abstract class _Z&A&B&C&D extends A&B&C mixedIn D {}
+  /// class Z extends _Z&A&B&C&D {}
   /// All X&Y classes are marked as synthetic.
   bool get isAnonymousMixin => flags & FlagAnonymousMixin != 0;
 
@@ -794,17 +794,20 @@
     if (!isMixinDeclaration) return constraints;
 
     Class previous = this;
-    Class current = supertype.classNode;
+    Class current = superclass;
 
     // Otherwise we have a left-linear binary tree (subtrees are supertype and
     // mixedInType) of constraints, where all the interior nodes are anonymous
     // mixin applications.
     while (current != null && current.isAnonymousMixin) {
-      constraints.add(current.mixedInType);
+      assert(current.implementedTypes.length == 2);
+      constraints.add(current.implementedTypes[1]);
       previous = current;
-      current = current.supertype.classNode;
+      current = current.implementedTypes[0].classNode;
     }
-    return constraints..add(previous.supertype);
+    return constraints
+      ..add(
+          previous == this ? previous.supertype : previous.implementedTypes[0]);
   }
 
   /// The URI of the source file this class was loaded from.
@@ -900,6 +903,22 @@
 
   bool get isMixinApplication => mixedInType != null;
 
+  String get demangledName {
+    if (isAnonymousMixin) return nameAsMixinApplication;
+    assert(!name.contains('&'));
+    return name;
+  }
+
+  String get nameAsMixinApplication {
+    assert(isAnonymousMixin);
+    return demangleMixinApplicationName(name);
+  }
+
+  String get nameAsMixinApplicationSubclass {
+    assert(isAnonymousMixin);
+    return demangleMixinApplicationSubclassName(name);
+  }
+
   /// Members declared in this class.
   ///
   /// This getter is for convenience, not efficiency.  Consider manually
@@ -4945,11 +4964,13 @@
   accept(TreeVisitor v) => v.visitTypeParameter(this);
 
   visitChildren(Visitor v) {
+    visitList(annotations, v);
     bound.accept(v);
     defaultType?.accept(v);
   }
 
   transformChildren(Transformer v) {
+    transformList(annotations, v, this);
     bound = v.visitDartType(bound);
     if (defaultType != null) {
       defaultType = v.visitDartType(defaultType);
@@ -5088,8 +5109,7 @@
 
   int get hashCode => value.isNaN ? 199 : super.hashCode;
   bool operator ==(Object other) =>
-      other is DoubleConstant &&
-      (other.value == value || identical(value, other.value) /* For NaN */);
+      other is DoubleConstant && identical(value, other.value);
 
   DartType getType(TypeEnvironment types) => types.doubleType;
 }
@@ -5802,3 +5822,32 @@
     return new Location(fileUri, TreeNode.noOffset, TreeNode.noOffset);
   }
 }
+
+/// Convert the synthetic name of an implicit mixin application class
+/// into a name suitable for user-faced strings.
+///
+/// For example, when compiling "class A extends S with M1, M2", the
+/// two synthetic classes will be named "_A&S&M1" and "_A&S&M1&M2".
+/// This function will return "S with M1" and "S with M1, M2", respectively.
+String demangleMixinApplicationName(String name) {
+  List<String> nameParts = name.split('&');
+  if (nameParts.length < 2) return name;
+  String demangledName = nameParts[1];
+  for (int i = 2; i < nameParts.length; i++) {
+    demangledName += (i == 2 ? " with " : ", ") + nameParts[i];
+  }
+  return demangledName;
+}
+
+/// Extract from the synthetic name of an implicit mixin application class
+/// the name of the final subclass of the mixin application.
+///
+/// For example, when compiling "class A extends S with M1, M2", the
+/// two synthetic classes will be named "_A&S&M1" and "_A&S&M1&M2".
+/// This function will return "A" for both classes.
+String demangleMixinApplicationSubclassName(String name) {
+  List<String> nameParts = name.split('&');
+  if (nameParts.length < 2) return name;
+  assert(nameParts[0].startsWith('_'));
+  return nameParts[0].substring(1);
+}
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 70684ea..860489e 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -23,9 +23,14 @@
 }
 
 class InvalidKernelVersionError {
-  final String message;
+  final int version;
 
-  InvalidKernelVersionError(this.message);
+  InvalidKernelVersionError(this.version);
+
+  String toString() {
+    return 'Unexpected Kernel version ${version} '
+        '(expected ${Tag.BinaryFormatVersion}).';
+  }
 }
 
 class CanonicalNameError {
@@ -81,7 +86,7 @@
       : _disableLazyReading = disableLazyReading;
 
   fail(String message) {
-    throw new ParseError(message,
+    throw ParseError(message,
         byteIndex: _byteOffset, filename: filename, path: debugPath.join('::'));
   }
 
@@ -266,7 +271,7 @@
         return new TypeLiteralConstant(type);
     }
 
-    throw 'Invalid constant tag $constantTag';
+    throw fail('unexpected constant tag: $constantTag');
   }
 
   Constant readConstantReference() {
@@ -305,7 +310,7 @@
     } else if (tag == Tag.Something) {
       return true;
     } else {
-      throw fail('Invalid Option tag: $tag');
+      throw fail('unexpected option tag: $tag');
     }
   }
 
@@ -394,7 +399,9 @@
     while (_byteOffset > 0) {
       int size = readUint32();
       int start = _byteOffset - size;
-      if (start < 0) throw "Invalid component file: Indicated size is invalid.";
+      if (start < 0) {
+        throw fail("indicated size does not match file size");
+      }
       index.add(size);
       _byteOffset = start - 4;
     }
@@ -409,6 +416,18 @@
   ///
   /// The input bytes may contain multiple files concatenated.
   void readComponent(Component component, {bool checkCanonicalNames: false}) {
+    // Check that we have a .dill file and it has the correct version before we
+    // start decoding it.  Otherwise we will fail for cryptic reasons.
+    int offset = _byteOffset;
+    int magic = readUint32();
+    if (magic != Tag.ComponentFile) {
+      throw ArgumentError('Not a .dill file (wrong magic number).');
+    }
+    int version = readUint32();
+    if (version != Tag.BinaryFormatVersion) {
+      throw InvalidKernelVersionError(version);
+    }
+    _byteOffset = offset;
     List<int> componentFileSizes = _indexComponents();
     if (componentFileSizes.length > 1) {
       _disableLazyReading = true;
@@ -451,7 +470,7 @@
   void readSingleFileComponent(Component component,
       {bool checkCanonicalNames: false}) {
     List<int> componentFileSizes = _indexComponents();
-    if (componentFileSizes.isEmpty) throw "Invalid component data.";
+    if (componentFileSizes.isEmpty) throw fail("invalid component data");
     _readOneComponent(component, componentFileSizes[0]);
     if (_byteOffset < _bytes.length) {
       if (_byteOffset + 3 < _bytes.length) {
@@ -554,14 +573,12 @@
 
     final int magic = readUint32();
     if (magic != Tag.ComponentFile) {
-      throw fail('This is not a binary dart file. '
-          'Magic number was: ${magic.toRadixString(16)}');
+      throw ArgumentError('Not a .dill file (wrong magic number).');
     }
 
     final int formatVersion = readUint32();
     if (formatVersion != Tag.BinaryFormatVersion) {
-      throw fail('Invalid kernel binary format version '
-          '(found ${formatVersion}, expected ${Tag.BinaryFormatVersion})');
+      throw InvalidKernelVersionError(formatVersion);
     }
 
     // Read component index from the end of this ComponentFiles serialized data.
@@ -579,15 +596,12 @@
 
     final int magic = readUint32();
     if (magic != Tag.ComponentFile) {
-      throw fail('This is not a binary dart file. '
-          'Magic number was: ${magic.toRadixString(16)}');
+      throw ArgumentError('Not a .dill file (wrong magic number).');
     }
 
     final int formatVersion = readUint32();
     if (formatVersion != Tag.BinaryFormatVersion) {
-      throw new InvalidKernelVersionError(
-          'Invalid kernel binary format version '
-          '(found ${formatVersion}, expected ${Tag.BinaryFormatVersion})');
+      throw InvalidKernelVersionError(formatVersion);
     }
 
     // Read component index from the end of this ComponentFiles serialized data.
@@ -1192,7 +1206,7 @@
       case Tag.AssertInitializer:
         return new AssertInitializer(readStatement());
       default:
-        throw fail('Invalid initializer tag: $tag');
+        throw fail('unexpected initializer tag: $tag');
     }
   }
 
@@ -1294,7 +1308,7 @@
   VariableDeclaration readVariableReference() {
     int index = readUInt();
     if (index >= variableStack.length) {
-      throw fail('Invalid variable index: $index');
+      throw fail('unexpected variable index: $index');
     }
     return variableStack[index];
   }
@@ -1306,7 +1320,7 @@
       case 1:
         return '||';
       default:
-        throw fail('Invalid logical operator index: $index');
+        throw fail('unexpected logical operator index: $index');
     }
   }
 
@@ -1538,7 +1552,7 @@
       case Tag.ConstantExpression:
         return new ConstantExpression(readConstantReference());
       default:
-        throw fail('Invalid expression tag: $tag');
+        throw fail('unexpected expression tag: $tag');
     }
   }
 
@@ -1689,7 +1703,7 @@
         var function = readFunctionNode();
         return new FunctionDeclaration(variable, function)..fileOffset = offset;
       default:
-        throw fail('Invalid statement tag: $tag');
+        throw fail('unexpected statement tag: $tag');
     }
   }
 
@@ -1832,7 +1846,7 @@
         var bound = readDartTypeOption();
         return new TypeParameterType(typeParameterStack[index], bound);
       default:
-        throw fail('Invalid dart type tag: $tag');
+        throw fail('unexpected dart type tag: $tag');
     }
   }
 
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 011e40c..6082e81 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -23,10 +23,8 @@
       {HandleAmbiguousSupertypes onAmbiguousSupertypes,
       MixinInferrer mixinInferrer}) {
     onAmbiguousSupertypes ??= (Class cls, Supertype a, Supertype b) {
-      if (!cls.isAnonymousMixin) {
-        // See https://github.com/dart-lang/sdk/issues/32091
-        throw "$cls can't implement both $a and $b";
-      }
+      // See https://github.com/dart-lang/sdk/issues/32091
+      throw "$cls can't implement both $a and $b";
     };
     return new ClosedWorldClassHierarchy._internal(
         onAmbiguousSupertypes, mixinInferrer)
@@ -662,26 +660,8 @@
       var superclass = supertype.classNode;
       var superGetters = getInterfaceMembers(superclass);
       var superSetters = getInterfaceMembers(superclass, setters: true);
-      _reportOverrides(info.implementedGettersAndCalls, superGetters, callback);
-      _reportOverrides(info.declaredGettersAndCalls, superGetters, callback,
-          onlyAbstract: true);
-      _reportOverrides(info.implementedSetters, superSetters, callback,
-          isSetter: true);
+      _reportOverrides(info.declaredGettersAndCalls, superGetters, callback);
       _reportOverrides(info.declaredSetters, superSetters, callback,
-          isSetter: true, onlyAbstract: true);
-    }
-    if (!class_.isAbstract) {
-      // If a non-abstract class declares an abstract method M whose
-      // implementation M' is inherited from the superclass, then the inherited
-      // method M' overrides the declared method M.
-      // This flies in the face of conventional override logic, but is necessary
-      // because an instance of the class will contain the method M' which can
-      // be invoked through the interface of M.
-      // Note that [_reportOverrides] does not report self-overrides, so in
-      // most cases these calls will just scan both lists and report nothing.
-      _reportOverrides(info.implementedGettersAndCalls,
-          info.declaredGettersAndCalls, callback);
-      _reportOverrides(info.implementedSetters, info.declaredSetters, callback,
           isSetter: true);
     }
   }
@@ -690,15 +670,10 @@
       List<Member> declaredList,
       List<Member> inheritedList,
       callback(Member declaredMember, Member interfaceMember, bool isSetter),
-      {bool isSetter: false,
-      bool onlyAbstract: false}) {
+      {bool isSetter: false}) {
     int i = 0, j = 0;
     while (i < declaredList.length && j < inheritedList.length) {
       Member declared = declaredList[i];
-      if (onlyAbstract && !declared.isAbstract) {
-        ++i;
-        continue;
-      }
       Member inherited = inheritedList[j];
       int comparison = ClassHierarchy.compareMembers(declared, inherited);
       if (comparison < 0) {
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index 485074d..f74dc34 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -25,7 +25,6 @@
       'Type',
       'Function',
       'Invocation',
-      '_ConstantExpressionError',
       'FallThroughError',
     ],
     'dart:_internal': [
@@ -65,8 +64,6 @@
   Procedure _listUnmodifiableConstructor;
   Procedure _printProcedure;
   Procedure _identicalProcedure;
-  Constructor _constantExpressionErrorDefaultConstructor;
-  Procedure _constantExpressionErrorThrow;
   Constructor _duplicatedFieldInitializerErrorDefaultConstructor;
   Constructor _fallThroughErrorUrlAndLineConstructor;
   Constructor _compileTimeErrorDefaultConstructor;
@@ -419,16 +416,6 @@
     return _typeClass ??= index.getClass('dart:core', 'Type');
   }
 
-  Constructor get constantExpressionErrorDefaultConstructor {
-    return _constantExpressionErrorDefaultConstructor ??=
-        index.getMember('dart:core', '_ConstantExpressionError', '');
-  }
-
-  Member get constantExpressionErrorThrow {
-    return _constantExpressionErrorThrow ??=
-        index.getMember('dart:core', '_ConstantExpressionError', '_throw');
-  }
-
   Constructor get duplicatedFieldInitializerErrorDefaultConstructor {
     return _duplicatedFieldInitializerErrorDefaultConstructor ??=
         index.getMember('dart:core', '_DuplicatedFieldInitializerError', '');
diff --git a/pkg/kernel/lib/src/tool/command_line_util.dart b/pkg/kernel/lib/src/tool/command_line_util.dart
index 35988b5..7149f76 100644
--- a/pkg/kernel/lib/src/tool/command_line_util.dart
+++ b/pkg/kernel/lib/src/tool/command_line_util.dart
@@ -68,13 +68,13 @@
 }
 
 class CommandLineHelper {
-  static requireExactlyOneArgument(
-      bool requireExistingFile, List<String> args, void Function() usage) {
+  static requireExactlyOneArgument(List<String> args, void Function() usage,
+      {bool requireFileExists: false}) {
     if (args.length != 1) {
       print("Expected exactly 1 argument, got ${args.length}.");
       usage();
     }
-    requireFileExists(args[0], usage);
+    if (requireFileExists) CommandLineHelper.requireFileExists(args[0]);
   }
 
   static requireVariableArgumentCount(
@@ -86,19 +86,20 @@
     }
   }
 
-  static requireFileExists(String file, void Function() usage) {
+  static requireFileExists(String file) {
     if (!new File(file).existsSync()) {
-      print("Argument '$file' isn't an existing file.");
-      usage();
+      print("File $file doesn't exist.");
+      exit(1);
     }
   }
 
-  static Component tryLoadDill(String file, void Function() usage) {
+  static Component tryLoadDill(String file) {
     try {
       return loadComponentFromBinary(file);
     } catch (e) {
-      print("Argument '$file' isn't a dill file that can be loaded.");
-      usage();
+      print("$file can't be loaded.");
+      print(e);
+      exit(1);
     }
     return null;
   }
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 0346f89..77a1987 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -176,19 +176,6 @@
       bool isConstructor: false,
       bool isTopLevel: false});
 
-  /// Builds an expression that throws [error] as compile-time error. The
-  /// target must be able to handle this expression in a constant expression.
-  Expression throwCompileConstantError(CoreTypes coreTypes, Expression error) {
-    return error;
-  }
-
-  /// Builds an expression that represents a compile-time error which is
-  /// suitable for being passed to [throwCompileConstantError].
-  Expression buildCompileTimeError(
-      CoreTypes coreTypes, String message, int offset) {
-    return new InvalidExpression(message)..fileOffset = offset;
-  }
-
   /// Configure the given [Component] in a target specific way.
   /// Returns the configured component.
   Component configureComponent(Component component) => component;
diff --git a/pkg/kernel/lib/transformations/constants.dart b/pkg/kernel/lib/transformations/constants.dart
index 2d20281..bfd7e7a 100644
--- a/pkg/kernel/lib/transformations/constants.dart
+++ b/pkg/kernel/lib/transformations/constants.dart
@@ -164,6 +164,10 @@
   visitTypedef(Typedef node) {
     constantEvaluator.withNewEnvironment(() {
       transformAnnotations(node.annotations, node);
+      transformList(node.typeParameters, this, node);
+      transformList(node.typeParametersOfFunctionType, this, node);
+      transformList(node.positionalParameters, this, node);
+      transformList(node.namedParameters, this, node);
     });
     return node;
   }
@@ -206,6 +210,7 @@
         i < positionalParameterCount;
         ++i) {
       final VariableDeclaration variable = node.positionalParameters[i];
+      transformAnnotations(variable.annotations, variable);
       if (variable.initializer != null) {
         variable.initializer =
             tryEvaluateAndTransformWithContext(variable, variable.initializer)
@@ -213,6 +218,7 @@
       }
     }
     for (final VariableDeclaration variable in node.namedParameters) {
+      transformAnnotations(variable.annotations, variable);
       if (variable.initializer != null) {
         variable.initializer =
             tryEvaluateAndTransformWithContext(variable, variable.initializer)
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index 6094e62..625bc5b 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -78,12 +78,16 @@
     List<TypeParameter> typeParameters, Class object) {
   List<DartType> bounds = new List<DartType>(typeParameters.length);
   for (int i = 0; i < typeParameters.length; i++) {
-    DartType type = typeParameters[i].bound;
-    if (type == null || type is InterfaceType && type.classNode == object) {
-      type = const DynamicType();
+    DartType bound = typeParameters[i].bound;
+    if (bound == null) {
+      bound = const DynamicType();
+    } else if (bound is InterfaceType && bound.classNode == object) {
+      DartType defaultType = typeParameters[i].defaultType;
+      if (!(defaultType is InterfaceType && defaultType.classNode == object)) {
+        bound = const DynamicType();
+      }
     }
-
-    bounds[i] = type;
+    bounds[i] = bound;
   }
 
   _TypeVariableGraph graph = new _TypeVariableGraph(typeParameters, bounds);
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index ef538e2..f9119a0 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -1,7 +1,7 @@
 name: kernel
 # Currently, kernel API is not stable and users should
 # not depend on semver semantics when depending on this package.
-version: 0.3.5
+version: 0.3.6
 author: Dart Team <misc@dartlang.org>
 description: Dart IR (Intermediate Representation)
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/kernel
@@ -13,8 +13,8 @@
   logging: ^0.11.2
   package_config: ^1.0.0
 dev_dependencies:
-  analyzer: '^0.33.0-alpha.0'
-  front_end: 0.1.5
+  analyzer: '^0.33.0'
+  front_end: 0.1.6
   test: ^0.12.15+6
   stack_trace: ^1.6.6
   test_reflective_loader: ^0.1.0
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 0e01a2b..0ff8051 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -346,7 +346,7 @@
 class E = self::D with self::A implements self::B {}
 ''');
 
-    _assertOverridePairs(c, ['test::A::foo overrides test::B::foo']);
+    _assertOverridePairs(c, []);
     _assertOverridePairs(e, ['test::A::foo overrides test::B::foo']);
   }
 
@@ -383,13 +383,10 @@
 class E extends self::C {}
 ''');
 
-    _assertOverridePairs(b, [
-      'test::A::foo overrides test::B::foo',
-      'test::B::foo overrides test::A::foo'
-    ]);
+    _assertOverridePairs(b, ['test::B::foo overrides test::A::foo']);
     _assertOverridePairs(c, ['test::C::foo overrides test::A::foo']);
-    _assertOverridePairs(d, ['test::A::foo overrides test::B::foo']);
-    _assertOverridePairs(e, ['test::A::foo overrides test::C::foo']);
+    _assertOverridePairs(d, []);
+    _assertOverridePairs(e, []);
   }
 
   /// 3. A non-abstract member is inherited from a superclass, and it overrides
@@ -416,10 +413,7 @@
 
     // The documentation says:
     // It is possible for two methods to override one another in both directions.
-    _assertOverridePairs(b, [
-      'test::A::foo overrides test::B::foo',
-      'test::B::foo overrides test::A::foo'
-    ]);
+    _assertOverridePairs(b, ['test::B::foo overrides test::A::foo']);
   }
 
   /// 1. A member declared in the class overrides a member inheritable through
diff --git a/pkg/kernel/test/graph_test.dart b/pkg/kernel/test/graph_test.dart
index dd86696e..8a84aaf 100644
--- a/pkg/kernel/test/graph_test.dart
+++ b/pkg/kernel/test/graph_test.dart
@@ -23,6 +23,16 @@
   Expect.stringEquals(expected, "$result");
 }
 
+void checkGraph(Map<String, List<String>> graph, String startingNodeName,
+    List<List<String>> expectedEvaluations, List<bool> expectedSccFlags) {
+  List<List<String>> result = computeStrongComponents(new TestGraph(graph));
+  List<List<String>> expectedReversed = <List<String>>[];
+  for (List<String> list in expectedEvaluations) {
+    expectedReversed.add(list.reversed.toList());
+  }
+  Expect.stringEquals(expectedReversed.join(", "), result.join(", "));
+}
+
 main() {
   test("[[B, A], [C], [D]]", {
     "A": ["B"],
@@ -67,4 +77,126 @@
     "C": ["A"],
     "D": ["B", "C"],
   });
+
+  // Test a complex graph.
+  checkGraph(
+      {
+        'a': ['b', 'c'],
+        'b': ['c', 'd'],
+        'c': [],
+        'd': ['c', 'e'],
+        'e': ['b', 'f'],
+        'f': ['c', 'd']
+      },
+      'a',
+      [
+        ['c'],
+        ['b', 'd', 'e', 'f'],
+        ['a']
+      ],
+      [false, true, false]);
+
+  // Test a diamond-shaped graph.
+  checkGraph(
+      {
+        'a': ['b', 'c'],
+        'b': ['d'],
+        'c': ['d'],
+        'd': []
+      },
+      'a',
+      [
+        ['d'],
+        ['b'],
+        ['c'],
+        ['a']
+      ],
+      [false, false, false, false]);
+
+  // Test a graph with a single node.
+  checkGraph(
+      {'a': []},
+      'a',
+      [
+        ['a']
+      ],
+      [false]);
+
+  // Test a graph with a single node and a trivial cycle.
+  checkGraph(
+      {
+        'a': ['a']
+      },
+      'a',
+      [
+        ['a']
+      ],
+      [true]);
+
+  // Test a graph with three nodes with circular dependencies.
+  checkGraph(
+      {
+        'a': ['b'],
+        'b': ['c'],
+        'c': ['a'],
+      },
+      'a',
+      [
+        ['a', 'b', 'c']
+      ],
+      [true]);
+  // Test a graph A->B->C->D, where D points back to B and then C.
+  checkGraph(
+      {
+        'a': ['b'],
+        'b': ['c'],
+        'c': ['d'],
+        'd': ['b', 'c']
+      },
+      'a',
+      [
+        ['b', 'c', 'd'],
+        ['a']
+      ],
+      [true, false]);
+
+  // Test a graph A->B->C->D, where D points back to C and then B.
+  checkGraph(
+      {
+        'a': ['b'],
+        'b': ['c'],
+        'c': ['d'],
+        'd': ['c', 'b']
+      },
+      'a',
+      [
+        ['b', 'c', 'd'],
+        ['a']
+      ],
+      [true, false]);
+
+  // Test a graph with two nodes with circular dependencies.
+  checkGraph(
+      {
+        'a': ['b'],
+        'b': ['a']
+      },
+      'a',
+      [
+        ['a', 'b']
+      ],
+      [true]);
+
+  // Test a graph with two nodes and a single dependency.
+  checkGraph(
+      {
+        'a': ['b'],
+        'b': []
+      },
+      'a',
+      [
+        ['b'],
+        ['a']
+      ],
+      [false, false]);
 }
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 70629d2..518dcce 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -110,7 +110,7 @@
 analysis_server/test/services/refactoring/inline_method_test: Pass, Slow
 analysis_server/test/socket_server_test: Skip # Pass, Slow
 analysis_server/test/src/plugin/plugin_manager_test: Pass, Slow
-analyzer/test/file_system/physical_resource_provider_test: Pass, Fail # Issue 25472
+analyzer/test/file_system/physical_resource_provider_watch_test: Pass, Fail # Issue 25472
 analyzer/test/generated/hint_code_driver_test: Pass, Slow
 analyzer/test/generated/non_error_resolver_kernel_test: Pass, Slow
 analyzer/test/generated/strong_mode_driver_test: Pass, Slow
@@ -125,7 +125,7 @@
 
 [ $runtime != vm ]
 dev_compiler/test/options/*: SkipByDesign
-front_end/test/src/incremental/hot_reload_e2e_test: Skip
+front_end/test/hot_reload_e2e_test: Skip
 vm/test/*: SkipByDesign # Only meant to run on vm
 
 [ $system == linux ]
@@ -136,8 +136,8 @@
 front_end/test/fasta/ast_builder_test: Pass, Slow, Timeout
 front_end/test/fasta/bootstrap_test: Skip # Issue 31902
 front_end/test/fasta/strong_test: Pass, Slow, Timeout
+front_end/test/hot_reload_e2e_test: Skip # Issue 31901
 front_end/test/incremental_dart2js_load_from_dill_test: Pass, Slow
-front_end/test/src/incremental/hot_reload_e2e_test: Skip # Issue 31901
 front_end/test/whole_program_test: Skip # Issue 31902
 
 [ $browser ]
diff --git a/pkg/testing/lib/src/multitest.dart b/pkg/testing/lib/src/multitest.dart
index b049210..d87ac1b 100644
--- a/pkg/testing/lib/src/multitest.dart
+++ b/pkg/testing/lib/src/multitest.dart
@@ -10,7 +10,7 @@
 
 import 'log.dart' show splitLines;
 
-import 'test_description.dart' show FileBasedTestDescription;
+import 'test_description.dart' show FileBasedTestDescription, TestDescription;
 
 bool isError(Set<String> expectations) {
   if (expectations.contains("compile-time error")) return true;
@@ -24,8 +24,8 @@
   return isError(expectations);
 }
 
-class MultitestTransformer extends StreamTransformerBase<
-    FileBasedTestDescription, FileBasedTestDescription> {
+class MultitestTransformer
+    extends StreamTransformerBase<TestDescription, TestDescription> {
   static RegExp multitestMarker = new RegExp(r"//[#/]");
   static int _multitestMarkerLength = 3;
 
@@ -42,8 +42,7 @@
   static final Set<String> validOutcomes =
       new Set<String>.from(validOutcomesList);
 
-  Stream<FileBasedTestDescription> bind(
-      Stream<FileBasedTestDescription> stream) async* {
+  Stream<TestDescription> bind(Stream<TestDescription> stream) async* {
     List<String> errors = <String>[];
     reportError(String error) {
       errors.add(error);
@@ -51,9 +50,17 @@
     }
 
     nextTest:
-    await for (FileBasedTestDescription test in stream) {
-      String contents = await test.file.readAsString();
-      if (!contents.contains(multitestMarker)) {
+    await for (TestDescription test in stream) {
+      FileBasedTestDescription multitest;
+      String contents;
+      if (test is FileBasedTestDescription) {
+        contents = await test.file.readAsString();
+        if (contents.contains(multitestMarker)) {
+          multitest = test;
+        }
+      }
+
+      if (multitest == null) {
         yield test;
         continue nextTest;
       }
@@ -82,13 +89,8 @@
                 .split(",")
                 .map((s) => s.trim())
                 .toList();
-            if (subtestName == "none") {
-              reportError(test.formatError(
-                  "$lineNumber: $subtestName can't be used as test name."));
-              continue nextTest;
-            }
             if (subtestOutcomesList.isEmpty) {
-              reportError(test
+              reportError(multitest
                   .formatError("$lineNumber: Expected <testname>:<outcomes>"));
               continue nextTest;
             }
@@ -106,7 +108,7 @@
               if (validOutcomes.contains(outcome)) {
                 subtestOutcomes.add(outcome);
               } else {
-                reportError(test.formatError(
+                reportError(multitest.formatError(
                     "$lineNumber: '$outcome' isn't a recognized outcome."));
                 continue nextTest;
               }
@@ -120,7 +122,8 @@
         }
       }
       Uri root = Uri.base.resolve("generated/");
-      Directory generated = new Directory.fromUri(root.resolve(test.shortName));
+      Directory generated =
+          new Directory.fromUri(root.resolve(multitest.shortName));
       generated = await generated.create(recursive: true);
       for (String name in testsAsLines.keys) {
         List<String> lines = testsAsLines[name];
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index 50d244a..09ee2dd 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -6,7 +6,7 @@
 import 'dart:io';
 
 import 'package:args/args.dart' show ArgParser, ArgResults;
-import 'package:front_end/src/api_prototype/front_end.dart';
+import 'package:front_end/src/api_unstable/vm.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/src/tool/batch_util.dart' as batch_util;
 import 'package:kernel/target/targets.dart' show TargetFlags;
@@ -105,8 +105,10 @@
     ]
     ..packagesFileUri =
         packages != null ? Uri.base.resolveUri(new Uri.file(packages)) : null
-    ..reportMessages = true
-    ..onProblem = errorDetector
+    ..onDiagnostic = (DiagnosticMessage m) {
+      printDiagnosticMessage(m, stderr.writeln);
+      errorDetector(m);
+    }
     ..embedSourceText = options['embed-sources'];
 
   final inputUri = new Uri.file(filename);
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index e472da9..5ec9dc6 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -27,14 +27,7 @@
 import 'dart:typed_data' show Uint8List;
 
 import 'package:build_integration/file_system/multi_root.dart';
-import 'package:front_end/src/api_prototype/file_system.dart';
-import 'package:front_end/src/api_prototype/front_end.dart';
-import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/api_prototype/standard_file_system.dart';
-import 'package:front_end/src/compute_platform_binaries_location.dart'
-    show computePlatformBinariesLocation;
-import 'package:front_end/src/fasta/kernel/utils.dart';
-import 'package:front_end/src/fasta/hybrid_file_system.dart';
+import 'package:front_end/src/api_unstable/vm.dart';
 import 'package:kernel/kernel.dart' show Component, Procedure;
 import 'package:kernel/target/targets.dart' show TargetFlags;
 import 'package:vm/incremental_compiler.dart';
@@ -102,16 +95,15 @@
       ..packagesFileUri = packagesUri
       ..sdkSummary = platformKernelPath
       ..verbose = verbose
-      ..onProblem = (FormattedMessage message, Severity severity,
-          List<FormattedMessage> context) {
+      ..onDiagnostic = (DiagnosticMessage message) {
         bool printMessage;
-        switch (severity) {
+        switch (message.severity) {
           case Severity.error:
           case Severity.internalProblem:
             // TODO(sigmund): support emitting code with errors as long as they
             // are handled in the generated code.
             printMessage = false; // errors are printed by VM
-            errors.add(message.formatted);
+            errors.addAll(message.plainTextFormatted);
             break;
           case Severity.warning:
             printMessage = !suppressWarnings;
@@ -119,13 +111,10 @@
           case Severity.errorLegacyWarning:
           case Severity.context:
           case Severity.ignored:
-            throw "Unexpected severity: $severity";
+            throw "Unexpected severity: ${message.severity}";
         }
         if (printMessage) {
-          stderr.writeln(message.formatted);
-          for (FormattedMessage message in context) {
-            stderr.writeln(message.formatted);
-          }
+          printDiagnosticMessage(message, stderr.writeln);
         }
       };
   }
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
index 82b3c2a..dce3410 100644
--- a/pkg/vm/lib/bytecode/assembler.dart
+++ b/pkg/vm/lib/bytecode/assembler.dart
@@ -98,7 +98,7 @@
   int _uint8(int v) => _unsigned(v, 8);
   int _uint16(int v) => _unsigned(v, 16);
 
-  int _int8(int v) => _signed(v, 8);
+//  int _int8(int v) => _signed(v, 8);
   int _int16(int v) => _signed(v, 16);
   int _int24(int v) => _signed(v, 24);
 
@@ -110,8 +110,11 @@
   int _encodeAD(Opcode opcode, int ra, int rd) =>
       _uint8(opcode.index) | (_uint8(ra) << 8) | (_uint16(rd) << 16);
 
-  int _encodeAX(Opcode opcode, int ra, int rx) =>
-      _uint8(opcode.index) | (_uint8(ra) << 8) | (_int16(rx) << 16);
+// TODO(alexmarkov) This format is currently unused. Restore it if needed, or
+// remove it once bytecode instruction set is finalized.
+//
+//  int _encodeAX(Opcode opcode, int ra, int rx) =>
+//      _uint8(opcode.index) | (_uint8(ra) << 8) | (_int16(rx) << 16);
 
   int _encodeD(Opcode opcode, int rd) =>
       _uint8(opcode.index) | (_uint16(rd) << 16);
@@ -125,47 +128,31 @@
       (_uint8(rb) << 16) |
       (_uint8(rc) << 24);
 
-  int _encodeABY(Opcode opcode, int ra, int rb, int ry) =>
-      _uint8(opcode.index) |
-      (_uint8(ra) << 8) |
-      (_uint8(rb) << 16) |
-      (_int8(ry) << 24);
+// TODO(alexmarkov) This format is currently unused. Restore it if needed, or
+// remove it once bytecode instruction set is finalized.
+//
+//  int _encodeABY(Opcode opcode, int ra, int rb, int ry) =>
+//      _uint8(opcode.index) |
+//      (_uint8(ra) << 8) |
+//      (_uint8(rb) << 16) |
+//      (_int8(ry) << 24);
 
   int _encodeT(Opcode opcode, int rt) =>
       _uint8(opcode.index) | (_int24(rt) << 8);
 
+  void emitBytecode0(Opcode opcode) {
+    assert(BytecodeFormats[opcode].encoding == Encoding.k0);
+    emitWord(_encode0(opcode));
+  }
+
   void emitTrap() {
     emitWord(_encode0(Opcode.kTrap));
   }
 
-  void emitNop(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kNop, ra, rd));
-  }
-
-  void emitCompile() {
-    emitWord(_encode0(Opcode.kCompile));
-  }
-
-  void emitHotCheck(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kHotCheck, ra, rd));
-  }
-
-  void emitIntrinsic(int ra) {
-    emitWord(_encodeA(Opcode.kIntrinsic, ra));
-  }
-
   void emitDrop1() {
     emitWord(_encode0(Opcode.kDrop1));
   }
 
-  void emitDropR(int ra) {
-    emitWord(_encodeA(Opcode.kDropR, ra));
-  }
-
-  void emitDrop(int ra) {
-    emitWord(_encodeA(Opcode.kDrop, ra));
-  }
-
   void emitJump(Label label) {
     emitWord(_encodeT(Opcode.kJump, label.jumpOperand(offset)));
   }
@@ -179,28 +166,40 @@
         _encodeT(Opcode.kJumpIfNotZeroTypeArgs, label.jumpOperand(offset)));
   }
 
+  void emitJumpIfEqStrict(Label label) {
+    emitWord(_encodeT(Opcode.kJumpIfEqStrict, label.jumpOperand(offset)));
+  }
+
+  void emitJumpIfNeStrict(Label label) {
+    emitWord(_encodeT(Opcode.kJumpIfNeStrict, label.jumpOperand(offset)));
+  }
+
+  void emitJumpIfTrue(Label label) {
+    emitWord(_encodeT(Opcode.kJumpIfTrue, label.jumpOperand(offset)));
+  }
+
+  void emitJumpIfFalse(Label label) {
+    emitWord(_encodeT(Opcode.kJumpIfFalse, label.jumpOperand(offset)));
+  }
+
+  void emitJumpIfNull(Label label) {
+    emitWord(_encodeT(Opcode.kJumpIfNull, label.jumpOperand(offset)));
+  }
+
+  void emitJumpIfNotNull(Label label) {
+    emitWord(_encodeT(Opcode.kJumpIfNotNull, label.jumpOperand(offset)));
+  }
+
   void patchJump(int pos, int rt) {
     final Opcode opcode = Opcode.values[_getOpcodeAt(pos)];
     assert(isJump(opcode));
     _setWord(pos, _encodeT(opcode, rt));
   }
 
-  void emitReturn(int ra) {
-    emitWord(_encodeA(Opcode.kReturn, ra));
-  }
-
   void emitReturnTOS() {
     emitWord(_encode0(Opcode.kReturnTOS));
   }
 
-  void emitMove(int ra, int rx) {
-    emitWord(_encodeAX(Opcode.kMove, ra, rx));
-  }
-
-  void emitSwap(int ra, int rx) {
-    emitWord(_encodeAX(Opcode.kSwap, ra, rx));
-  }
-
   void emitPush(int rx) {
     emitWord(_encodeX(Opcode.kPush, rx));
   }
@@ -209,14 +208,6 @@
     emitWord(_encodeAD(Opcode.kLoadConstant, ra, rd));
   }
 
-  void emitLoadClassId(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kLoadClassId, ra, rd));
-  }
-
-  void emitLoadClassIdTOS() {
-    emitWord(_encode0(Opcode.kLoadClassIdTOS));
-  }
-
   void emitPushConstant(int rd) {
     emitWord(_encodeD(Opcode.kPushConstant, rd));
   }
@@ -249,258 +240,14 @@
     emitWord(_encodeAD(Opcode.kIndirectStaticCall, ra, rd));
   }
 
-  void emitStaticCall(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kStaticCall, ra, rd));
-  }
-
   void emitInstanceCall(int ra, int rd) {
     emitWord(_encodeAD(Opcode.kInstanceCall, ra, rd));
   }
 
-  void emitInstanceCall1Opt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kInstanceCall1Opt, ra, rd));
-  }
-
-  void emitInstanceCall2Opt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kInstanceCall2Opt, ra, rd));
-  }
-
-  void emitPushPolymorphicInstanceCall(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kPushPolymorphicInstanceCall, ra, rd));
-  }
-
-  void emitPushPolymorphicInstanceCallByRange(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kPushPolymorphicInstanceCallByRange, ra, rd));
-  }
-
   void emitNativeCall(int rd) {
     emitWord(_encodeD(Opcode.kNativeCall, rd));
   }
 
-  void emitOneByteStringFromCharCode(int ra, int rx) {
-    emitWord(_encodeAX(Opcode.kOneByteStringFromCharCode, ra, rx));
-  }
-
-  void emitStringToCharCode(int ra, int rx) {
-    emitWord(_encodeAX(Opcode.kStringToCharCode, ra, rx));
-  }
-
-  void emitAddTOS() {
-    emitWord(_encode0(Opcode.kAddTOS));
-  }
-
-  void emitSubTOS() {
-    emitWord(_encode0(Opcode.kSubTOS));
-  }
-
-  void emitMulTOS() {
-    emitWord(_encode0(Opcode.kMulTOS));
-  }
-
-  void emitBitOrTOS() {
-    emitWord(_encode0(Opcode.kBitOrTOS));
-  }
-
-  void emitBitAndTOS() {
-    emitWord(_encode0(Opcode.kBitAndTOS));
-  }
-
-  void emitEqualTOS() {
-    emitWord(_encode0(Opcode.kEqualTOS));
-  }
-
-  void emitLessThanTOS() {
-    emitWord(_encode0(Opcode.kLessThanTOS));
-  }
-
-  void emitGreaterThanTOS() {
-    emitWord(_encode0(Opcode.kGreaterThanTOS));
-  }
-
-  void emitSmiAddTOS() {
-    emitWord(_encode0(Opcode.kSmiAddTOS));
-  }
-
-  void emitSmiSubTOS() {
-    emitWord(_encode0(Opcode.kSmiSubTOS));
-  }
-
-  void emitSmiMulTOS() {
-    emitWord(_encode0(Opcode.kSmiMulTOS));
-  }
-
-  void emitSmiBitAndTOS() {
-    emitWord(_encode0(Opcode.kSmiBitAndTOS));
-  }
-
-  void emitAdd(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kAdd, ra, rb, rc));
-  }
-
-  void emitSub(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kSub, ra, rb, rc));
-  }
-
-  void emitMul(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kMul, ra, rb, rc));
-  }
-
-  void emitDiv(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kDiv, ra, rb, rc));
-  }
-
-  void emitMod(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kMod, ra, rb, rc));
-  }
-
-  void emitShl(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kShl, ra, rb, rc));
-  }
-
-  void emitShr(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kShr, ra, rb, rc));
-  }
-
-  void emitShlImm(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kShlImm, ra, rb, rc));
-  }
-
-  void emitNeg(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kNeg, ra, rd));
-  }
-
-  void emitBitOr(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kBitOr, ra, rb, rc));
-  }
-
-  void emitBitAnd(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kBitAnd, ra, rb, rc));
-  }
-
-  void emitBitXor(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kBitXor, ra, rb, rc));
-  }
-
-  void emitBitNot(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kBitNot, ra, rd));
-  }
-
-  void emitMin(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kMin, ra, rb, rc));
-  }
-
-  void emitMax(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kMax, ra, rb, rc));
-  }
-
-  void emitWriteIntoDouble(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kWriteIntoDouble, ra, rd));
-  }
-
-  void emitUnboxDouble(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kUnboxDouble, ra, rd));
-  }
-
-  void emitCheckedUnboxDouble(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kCheckedUnboxDouble, ra, rd));
-  }
-
-  void emitUnboxInt32(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kUnboxInt32, ra, rb, rc));
-  }
-
-  void emitBoxInt32(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kBoxInt32, ra, rd));
-  }
-
-  void emitBoxUint32(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kBoxUint32, ra, rd));
-  }
-
-  void emitSmiToDouble(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kSmiToDouble, ra, rd));
-  }
-
-  void emitDoubleToSmi(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kDoubleToSmi, ra, rd));
-  }
-
-  void emitDAdd(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kDAdd, ra, rb, rc));
-  }
-
-  void emitDSub(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kDSub, ra, rb, rc));
-  }
-
-  void emitDMul(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kDMul, ra, rb, rc));
-  }
-
-  void emitDDiv(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kDDiv, ra, rb, rc));
-  }
-
-  void emitDNeg(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kDNeg, ra, rd));
-  }
-
-  void emitDSqrt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kDSqrt, ra, rd));
-  }
-
-  void emitDMin(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kDMin, ra, rb, rc));
-  }
-
-  void emitDMax(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kDMax, ra, rb, rc));
-  }
-
-  void emitDCos(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kDCos, ra, rd));
-  }
-
-  void emitDSin(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kDSin, ra, rd));
-  }
-
-  void emitDPow(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kDPow, ra, rb, rc));
-  }
-
-  void emitDMod(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kDMod, ra, rb, rc));
-  }
-
-  void emitDTruncate(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kDTruncate, ra, rd));
-  }
-
-  void emitDFloor(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kDFloor, ra, rd));
-  }
-
-  void emitDCeil(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kDCeil, ra, rd));
-  }
-
-  void emitDoubleToFloat(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kDoubleToFloat, ra, rd));
-  }
-
-  void emitFloatToDouble(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kFloatToDouble, ra, rd));
-  }
-
-  void emitDoubleIsNaN(int ra) {
-    emitWord(_encodeA(Opcode.kDoubleIsNaN, ra));
-  }
-
-  void emitDoubleIsInfinite(int ra) {
-    emitWord(_encodeA(Opcode.kDoubleIsInfinite, ra));
-  }
-
   void emitStoreStaticTOS(int rd) {
     emitWord(_encodeD(Opcode.kStoreStaticTOS, rd));
   }
@@ -509,130 +256,10 @@
     emitWord(_encodeD(Opcode.kPushStatic, rd));
   }
 
-  void emitInitStaticTOS() {
-    emitWord(_encode0(Opcode.kInitStaticTOS));
-  }
-
-  void emitIfNeStrictTOS() {
-    emitWord(_encode0(Opcode.kIfNeStrictTOS));
-  }
-
-  void emitIfEqStrictTOS() {
-    emitWord(_encode0(Opcode.kIfEqStrictTOS));
-  }
-
-  void emitIfNeStrictNumTOS() {
-    emitWord(_encode0(Opcode.kIfNeStrictNumTOS));
-  }
-
-  void emitIfEqStrictNumTOS() {
-    emitWord(_encode0(Opcode.kIfEqStrictNumTOS));
-  }
-
-  void emitIfSmiLtTOS() {
-    emitWord(_encode0(Opcode.kIfSmiLtTOS));
-  }
-
-  void emitIfSmiLeTOS() {
-    emitWord(_encode0(Opcode.kIfSmiLeTOS));
-  }
-
-  void emitIfSmiGeTOS() {
-    emitWord(_encode0(Opcode.kIfSmiGeTOS));
-  }
-
-  void emitIfSmiGtTOS() {
-    emitWord(_encode0(Opcode.kIfSmiGtTOS));
-  }
-
-  void emitIfNeStrict(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfNeStrict, ra, rd));
-  }
-
-  void emitIfEqStrict(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfEqStrict, ra, rd));
-  }
-
-  void emitIfLe(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfLe, ra, rd));
-  }
-
-  void emitIfLt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfLt, ra, rd));
-  }
-
-  void emitIfGe(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfGe, ra, rd));
-  }
-
-  void emitIfGt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfGt, ra, rd));
-  }
-
-  void emitIfULe(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfULe, ra, rd));
-  }
-
-  void emitIfULt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfULt, ra, rd));
-  }
-
-  void emitIfUGe(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfUGe, ra, rd));
-  }
-
-  void emitIfUGt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfUGt, ra, rd));
-  }
-
-  void emitIfDNe(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfDNe, ra, rd));
-  }
-
-  void emitIfDEq(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfDEq, ra, rd));
-  }
-
-  void emitIfDLe(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfDLe, ra, rd));
-  }
-
-  void emitIfDLt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfDLt, ra, rd));
-  }
-
-  void emitIfDGe(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfDGe, ra, rd));
-  }
-
-  void emitIfDGt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfDGt, ra, rd));
-  }
-
-  void emitIfNeStrictNum(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfNeStrictNum, ra, rd));
-  }
-
-  void emitIfEqStrictNum(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kIfEqStrictNum, ra, rd));
-  }
-
-  void emitIfEqNull(int ra) {
-    emitWord(_encodeA(Opcode.kIfEqNull, ra));
-  }
-
-  void emitIfNeNull(int ra) {
-    emitWord(_encodeA(Opcode.kIfNeNull, ra));
-  }
-
   void emitCreateArrayTOS() {
     emitWord(_encode0(Opcode.kCreateArrayTOS));
   }
 
-  void emitCreateArrayOpt(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kCreateArrayOpt, ra, rb, rc));
-  }
-
   void emitAllocate(int rd) {
     emitWord(_encodeD(Opcode.kAllocate, rd));
   }
@@ -641,154 +268,10 @@
     emitWord(_encode0(Opcode.kAllocateT));
   }
 
-  void emitAllocateOpt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kAllocateOpt, ra, rd));
-  }
-
-  void emitAllocateTOpt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kAllocateTOpt, ra, rd));
-  }
-
   void emitStoreIndexedTOS() {
     emitWord(_encode0(Opcode.kStoreIndexedTOS));
   }
 
-  void emitStoreIndexed(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kStoreIndexed, ra, rb, rc));
-  }
-
-  void emitStoreIndexedUint8(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kStoreIndexedUint8, ra, rb, rc));
-  }
-
-  void emitStoreIndexedExternalUint8(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kStoreIndexedExternalUint8, ra, rb, rc));
-  }
-
-  void emitStoreIndexedOneByteString(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kStoreIndexedOneByteString, ra, rb, rc));
-  }
-
-  void emitStoreIndexedUint32(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kStoreIndexedUint32, ra, rb, rc));
-  }
-
-  void emitStoreIndexedFloat32(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kStoreIndexedFloat32, ra, rb, rc));
-  }
-
-  void emitStoreIndexed4Float32(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kStoreIndexed4Float32, ra, rb, rc));
-  }
-
-  void emitStoreIndexedFloat64(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kStoreIndexedFloat64, ra, rb, rc));
-  }
-
-  void emitStoreIndexed8Float64(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kStoreIndexed8Float64, ra, rb, rc));
-  }
-
-  void emitNoSuchMethod() {
-    emitWord(_encode0(Opcode.kNoSuchMethod));
-  }
-
-  void emitTailCall() {
-    emitWord(_encode0(Opcode.kTailCall));
-  }
-
-  void emitTailCallOpt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kTailCallOpt, ra, rd));
-  }
-
-  void emitLoadArgDescriptor() {
-    emitWord(_encode0(Opcode.kLoadArgDescriptor));
-  }
-
-  void emitLoadArgDescriptorOpt(int ra) {
-    emitWord(_encodeA(Opcode.kLoadArgDescriptorOpt, ra));
-  }
-
-  void emitLoadFpRelativeSlot(int rx) {
-    emitWord(_encodeX(Opcode.kLoadFpRelativeSlot, rx));
-  }
-
-  void emitLoadFpRelativeSlotOpt(int ra, int rb, int ry) {
-    emitWord(_encodeABY(Opcode.kLoadFpRelativeSlotOpt, ra, rb, ry));
-  }
-
-  void emitStoreFpRelativeSlot(int rx) {
-    emitWord(_encodeX(Opcode.kStoreFpRelativeSlot, rx));
-  }
-
-  void emitStoreFpRelativeSlotOpt(int ra, int rb, int ry) {
-    emitWord(_encodeABY(Opcode.kStoreFpRelativeSlotOpt, ra, rb, ry));
-  }
-
-  void emitLoadIndexedTOS() {
-    emitWord(_encode0(Opcode.kLoadIndexedTOS));
-  }
-
-  void emitLoadIndexed(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexed, ra, rb, rc));
-  }
-
-  void emitLoadIndexedUint8(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexedUint8, ra, rb, rc));
-  }
-
-  void emitLoadIndexedInt8(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexedInt8, ra, rb, rc));
-  }
-
-  void emitLoadIndexedInt32(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexedInt32, ra, rb, rc));
-  }
-
-  void emitLoadIndexedUint32(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexedUint32, ra, rb, rc));
-  }
-
-  void emitLoadIndexedExternalUint8(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexedExternalUint8, ra, rb, rc));
-  }
-
-  void emitLoadIndexedExternalInt8(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexedExternalInt8, ra, rb, rc));
-  }
-
-  void emitLoadIndexedFloat32(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexedFloat32, ra, rb, rc));
-  }
-
-  void emitLoadIndexed4Float32(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexed4Float32, ra, rb, rc));
-  }
-
-  void emitLoadIndexedFloat64(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexedFloat64, ra, rb, rc));
-  }
-
-  void emitLoadIndexed8Float64(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexed8Float64, ra, rb, rc));
-  }
-
-  void emitLoadIndexedOneByteString(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexedOneByteString, ra, rb, rc));
-  }
-
-  void emitLoadIndexedTwoByteString(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadIndexedTwoByteString, ra, rb, rc));
-  }
-
-  void emitStoreField(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kStoreField, ra, rb, rc));
-  }
-
-  void emitStoreFieldExt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kStoreFieldExt, ra, rd));
-  }
-
   void emitStoreFieldTOS(int rd) {
     emitWord(_encodeD(Opcode.kStoreFieldTOS, rd));
   }
@@ -801,18 +284,6 @@
     emitWord(_encodeD(Opcode.kStoreContextVar, rd));
   }
 
-  void emitLoadField(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadField, ra, rb, rc));
-  }
-
-  void emitLoadFieldExt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kLoadFieldExt, ra, rd));
-  }
-
-  void emitLoadUntagged(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kLoadUntagged, ra, rb, rc));
-  }
-
   void emitLoadFieldTOS(int rd) {
     emitWord(_encodeD(Opcode.kLoadFieldTOS, rd));
   }
@@ -833,10 +304,6 @@
     emitWord(_encode0(Opcode.kBooleanNegateTOS));
   }
 
-  void emitBooleanNegate(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kBooleanNegate, ra, rd));
-  }
-
   void emitThrow(int ra) {
     emitWord(_encodeA(Opcode.kThrow, ra));
   }
@@ -845,10 +312,6 @@
     emitWord(_encodeD(Opcode.kEntry, rd));
   }
 
-  void emitEntryOptimized(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kEntryOptimized, ra, rd));
-  }
-
   void emitFrame(int rd) {
     emitWord(_encodeD(Opcode.kFrame, rd));
   }
@@ -861,10 +324,6 @@
     emitWord(_encodeD(Opcode.kAllocateContext, rd));
   }
 
-  void emitAllocateUninitializedContext(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kAllocateUninitializedContext, ra, rd));
-  }
-
   void emitCloneContext() {
     emitWord(_encode0(Opcode.kCloneContext));
   }
@@ -881,14 +340,6 @@
     emitWord(_encodeAD(Opcode.kInstantiateTypeArgumentsTOS, ra, rd));
   }
 
-  void emitInstanceOf() {
-    emitWord(_encode0(Opcode.kInstanceOf));
-  }
-
-  void emitBadTypeError() {
-    emitWord(_encode0(Opcode.kBadTypeError));
-  }
-
   void emitAssertAssignable(int ra, int rd) {
     emitWord(_encodeAD(Opcode.kAssertAssignable, ra, rd));
   }
@@ -901,70 +352,14 @@
     emitWord(_encodeA(Opcode.kAssertBoolean, ra));
   }
 
-  void emitTestSmi(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kTestSmi, ra, rd));
-  }
-
-  void emitTestCids(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kTestCids, ra, rd));
-  }
-
-  void emitCheckSmi(int ra) {
-    emitWord(_encodeA(Opcode.kCheckSmi, ra));
-  }
-
-  void emitCheckEitherNonSmi(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kCheckEitherNonSmi, ra, rd));
-  }
-
-  void emitCheckClassId(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kCheckClassId, ra, rd));
-  }
-
-  void emitCheckClassIdRange(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kCheckClassIdRange, ra, rd));
-  }
-
-  void emitCheckBitTest(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kCheckBitTest, ra, rd));
-  }
-
-  void emitCheckCids(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kCheckCids, ra, rb, rc));
-  }
-
-  void emitCheckCidsByRange(int ra, int rb, int rc) {
-    emitWord(_encodeABC(Opcode.kCheckCidsByRange, ra, rb, rc));
-  }
-
   void emitCheckStack() {
     emitWord(_encode0(Opcode.kCheckStack));
   }
 
-  void emitCheckStackAlwaysExit() {
-    emitWord(_encode0(Opcode.kCheckStackAlwaysExit));
-  }
-
   void emitCheckFunctionTypeArgs(int ra, int rd) {
     emitWord(_encodeAD(Opcode.kCheckFunctionTypeArgs, ra, rd));
   }
 
-  void emitDebugStep() {
-    emitWord(_encode0(Opcode.kDebugStep));
-  }
-
-  void emitDebugBreak(int ra) {
-    emitWord(_encodeA(Opcode.kDebugBreak, ra));
-  }
-
-  void emitDeopt(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kDeopt, ra, rd));
-  }
-
-  void emitDeoptRewind() {
-    emitWord(_encode0(Opcode.kDeoptRewind));
-  }
-
   void emitEntryFixed(int ra, int rd) {
     emitWord(_encodeAD(Opcode.kEntryFixed, ra, rd));
   }
diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart
index 8fd6b05..7bb56e6 100644
--- a/pkg/vm/lib/bytecode/dbc.dart
+++ b/pkg/vm/lib/bytecode/dbc.dart
@@ -2,259 +2,110 @@
 // for 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 vm.bytecode.dbc;
+/// Dart kernel bytecode instructions (described in runtime/vm/constants_kbc.h).
 
-// List of changes from original DBC (described in runtime/vm/constants_dbc.h):
-//
-// 1. StoreFieldTOS, LoadFieldTOS instructions:
-//    D = index of constant pool entry with InstanceField tag.
-//    (instead of field offset in words).
-//
-// 2. EntryOptional instruction is revived in order to re-shuffle optional
-//    parameters. This DBC instruction was removed at
-//    https://github.com/dart-lang/sdk/commit/cf1de7d46cd88e204380e8f96a993439be56b24c
-//
-// 3. NativeCall instruction is modified to have 'D' format and take 1 argument:
-//    D = index of NativeEntry constant pool entry
-//
-// 4. JumpIfNoAsserts instruction is added. This instruction jumps to the given
-//    target if assertions are not enabled. It has the same format as Jump
-//    instruction.
-//
-// 5. StoreContextParent stores context SP[0] into `parent` field of context SP[-1].
-//
-// 6. LoadContextParent loads parent from context SP[0].
-//
-// 7. StoreContextVar stores value SP[0] into context SP[-1] at index D.
-//
-// 8. LoadContextVar loads value from context SP[0] at index D.
-//
-// 9. LoadTypeArgumentsField loads instantiator type arguments from an
-//    instance SP[0].
-//    D = index of TypeArgumentsField constant pool entry corresponding
-//    to an instance's class.
-//
-// 10. InstanceCall1 and InstanceCall2 instructions are superseded by
-//     InstanceCall which works for any number of checked arguments.
-//
-// 11. EntryFixed instruction works like Entry. In addition, it checks number
-//     of fixed arguments.
-//
-// 12. JumpIfNotZeroTypeArgs instruction jumps if number of passed
-//     function type arguments is not zero.
-//
-// 13. PushNull, PushTrue, PushFalse, PushInt instructions added.
-//
+library vm.bytecode.dbc;
 
 enum Opcode {
   kTrap,
-  kNop,
-  kCompile,
-  kHotCheck,
-  kIntrinsic,
-  kDrop1,
-  kDropR,
-  kDrop,
-  kJump,
-  kJumpIfNoAsserts,
-  kJumpIfNotZeroTypeArgs,
-  kReturn,
-  kReturnTOS,
-  kMove,
-  kSwap,
-  kPush,
+
+  // Prologue and stack management.
+  kEntry,
+  kEntryFixed,
+  kEntryOptional,
   kLoadConstant,
-  kLoadClassId,
-  kLoadClassIdTOS,
+  kFrame,
+  kCheckFunctionTypeArgs,
+  kCheckStack,
+
+  // Object allocation.
+  kAllocate,
+  kAllocateT,
+  kCreateArrayTOS,
+
+  // Context allocation and access.
+  kAllocateContext,
+  kCloneContext,
+  kLoadContextParent,
+  kStoreContextParent,
+  kLoadContextVar,
+  kStoreContextVar,
+
+  // Constants.
   kPushConstant,
   kPushNull,
   kPushTrue,
   kPushFalse,
   kPushInt,
-  kStoreLocal,
+
+  // Locals and expression stack.
+  kDrop1,
+  kPush,
   kPopLocal,
-  kIndirectStaticCall,
-  kStaticCall,
-  kInstanceCall,
-  kInstanceCall1Opt,
-  kInstanceCall2Opt,
-  kPushPolymorphicInstanceCall,
-  kPushPolymorphicInstanceCallByRange,
-  kNativeCall,
-  kOneByteStringFromCharCode,
-  kStringToCharCode,
-  kAddTOS,
-  kSubTOS,
-  kMulTOS,
-  kBitOrTOS,
-  kBitAndTOS,
-  kEqualTOS,
-  kLessThanTOS,
-  kGreaterThanTOS,
-  kSmiAddTOS,
-  kSmiSubTOS,
-  kSmiMulTOS,
-  kSmiBitAndTOS,
-  kAdd,
-  kSub,
-  kMul,
-  kDiv,
-  kMod,
-  kShl,
-  kShr,
-  kShlImm,
-  kNeg,
-  kBitOr,
-  kBitAnd,
-  kBitXor,
-  kBitNot,
-  kMin,
-  kMax,
-  kWriteIntoDouble,
-  kUnboxDouble,
-  kCheckedUnboxDouble,
-  kUnboxInt32,
-  kBoxInt32,
-  kBoxUint32,
-  kSmiToDouble,
-  kDoubleToSmi,
-  kDAdd,
-  kDSub,
-  kDMul,
-  kDDiv,
-  kDNeg,
-  kDSqrt,
-  kDMin,
-  kDMax,
-  kDCos,
-  kDSin,
-  kDPow,
-  kDMod,
-  kDTruncate,
-  kDFloor,
-  kDCeil,
-  kDoubleToFloat,
-  kFloatToDouble,
-  kDoubleIsNaN,
-  kDoubleIsInfinite,
-  kStoreStaticTOS,
-  kPushStatic,
-  kInitStaticTOS,
-  kIfNeStrictTOS,
-  kIfEqStrictTOS,
-  kIfNeStrictNumTOS,
-  kIfEqStrictNumTOS,
-  kIfSmiLtTOS,
-  kIfSmiLeTOS,
-  kIfSmiGeTOS,
-  kIfSmiGtTOS,
-  kIfNeStrict,
-  kIfEqStrict,
-  kIfLe,
-  kIfLt,
-  kIfGe,
-  kIfGt,
-  kIfULe,
-  kIfULt,
-  kIfUGe,
-  kIfUGt,
-  kIfDNe,
-  kIfDEq,
-  kIfDLe,
-  kIfDLt,
-  kIfDGe,
-  kIfDGt,
-  kIfNeStrictNum,
-  kIfEqStrictNum,
-  kIfEqNull,
-  kIfNeNull,
-  kCreateArrayTOS,
-  kCreateArrayOpt,
-  kAllocate,
-  kAllocateT,
-  kAllocateOpt,
-  kAllocateTOpt,
-  kStoreIndexedTOS,
-  kStoreIndexed,
-  kStoreIndexedUint8,
-  kStoreIndexedExternalUint8,
-  kStoreIndexedOneByteString,
-  kStoreIndexedUint32,
-  kStoreIndexedFloat32,
-  kStoreIndexed4Float32,
-  kStoreIndexedFloat64,
-  kStoreIndexed8Float64,
-  kNoSuchMethod,
-  kTailCall,
-  kTailCallOpt,
-  kLoadArgDescriptor,
-  kLoadArgDescriptorOpt,
-  kLoadFpRelativeSlot,
-  kLoadFpRelativeSlotOpt,
-  kStoreFpRelativeSlot,
-  kStoreFpRelativeSlotOpt,
-  kLoadIndexedTOS,
-  kLoadIndexed,
-  kLoadIndexedUint8,
-  kLoadIndexedInt8,
-  kLoadIndexedInt32,
-  kLoadIndexedUint32,
-  kLoadIndexedExternalUint8,
-  kLoadIndexedExternalInt8,
-  kLoadIndexedFloat32,
-  kLoadIndexed4Float32,
-  kLoadIndexedFloat64,
-  kLoadIndexed8Float64,
-  kLoadIndexedOneByteString,
-  kLoadIndexedTwoByteString,
-  kStoreField,
-  kStoreFieldExt,
-  kStoreFieldTOS,
-  kStoreContextParent,
-  kStoreContextVar,
-  kLoadField,
-  kLoadFieldExt,
-  kLoadUntagged,
+  kStoreLocal,
+
+  // Instance fields and arrays.
   kLoadFieldTOS,
+  kStoreFieldTOS,
+  kStoreIndexedTOS,
+
+  // Static fields.
+  kPushStatic,
+  kStoreStaticTOS,
+
+  // Jumps.
+  kJump,
+  kJumpIfNoAsserts,
+  kJumpIfNotZeroTypeArgs,
+  kJumpIfEqStrict,
+  kJumpIfNeStrict,
+  kJumpIfTrue,
+  kJumpIfFalse,
+  kJumpIfNull,
+  kJumpIfNotNull,
+
+  // Calls.
+  kIndirectStaticCall,
+  kInstanceCall,
+  kNativeCall,
+  kReturnTOS,
+
+  // Types and type checks.
+  kAssertAssignable,
+  kAssertBoolean,
+  kAssertSubtype,
   kLoadTypeArgumentsField,
-  kLoadContextParent,
-  kLoadContextVar,
-  kBooleanNegateTOS,
-  kBooleanNegate,
-  kThrow,
-  kEntry,
-  kEntryFixed,
-  kEntryOptional,
-  kEntryOptimized,
-  kFrame,
-  kSetFrame,
-  kAllocateContext,
-  kAllocateUninitializedContext,
-  kCloneContext,
-  kMoveSpecial,
   kInstantiateType,
   kInstantiateTypeArgumentsTOS,
-  kInstanceOf,
-  kBadTypeError,
-  kAssertAssignable,
-  kAssertSubtype,
-  kAssertBoolean,
-  kTestSmi,
-  kTestCids,
-  kCheckSmi,
-  kCheckEitherNonSmi,
-  kCheckClassId,
-  kCheckClassIdRange,
-  kCheckBitTest,
-  kCheckCids,
-  kCheckCidsByRange,
-  kCheckStack,
-  kCheckStackAlwaysExit,
-  kCheckFunctionTypeArgs,
-  kDebugStep,
-  kDebugBreak,
-  kDeopt,
-  kDeoptRewind,
+
+  // Exception handling.
+  kThrow,
+  kMoveSpecial,
+  kSetFrame,
+
+  // Bool operations.
+  kBooleanNegateTOS,
+
+  // Null operations.
+  kEqualsNull,
+
+  // Int operations.
+  kNegateInt,
+  kAddInt,
+  kSubInt,
+  kMulInt,
+  kTruncDivInt,
+  kModInt,
+  kBitAndInt,
+  kBitOrInt,
+  kBitXorInt,
+  kShlInt,
+  kShrInt,
+  kCompareIntEq,
+  kCompareIntGt,
+  kCompareIntLt,
+  kCompareIntGe,
+  kCompareIntLe,
 }
 
 enum Encoding {
@@ -288,42 +139,38 @@
 const Map<Opcode, Format> BytecodeFormats = const {
   Opcode.kTrap: const Format(
       Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kNop: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
-  Opcode.kCompile: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kHotCheck: const Format(
+  Opcode.kEntry: const Format(
+      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kEntryFixed: const Format(
       Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kIntrinsic: const Format(
-      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kDrop1: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kDropR: const Format(
-      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kDrop: const Format(
-      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kJump: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kJumpIfNoAsserts: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kJumpIfNotZeroTypeArgs: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kReturn: const Format(
-      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
-  Opcode.kReturnTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kMove: const Format(
-      Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
-  Opcode.kSwap: const Format(
-      Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
-  Opcode.kPush: const Format(
-      Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
+  Opcode.kEntryOptional: const Format(
+      Encoding.kABC, const [Operand.imm, Operand.imm, Operand.imm]),
   Opcode.kLoadConstant: const Format(
       Encoding.kAD, const [Operand.reg, Operand.lit, Operand.none]),
-  Opcode.kLoadClassId: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kLoadClassIdTOS: const Format(
+  Opcode.kFrame: const Format(
+      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kCheckFunctionTypeArgs: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
+  Opcode.kCheckStack: 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(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCreateArrayTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kAllocateContext: const Format(
+      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kCloneContext: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kLoadContextParent: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kStoreContextParent: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kLoadContextVar: const Format(
+      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kStoreContextVar: const Format(
+      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
   Opcode.kPushConstant: const Format(
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
   Opcode.kPushNull: const Format(
@@ -334,373 +181,103 @@
       Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
   Opcode.kPushInt: const Format(
       Encoding.kX, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kStoreLocal: const Format(
+  Opcode.kDrop1: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kPush: const Format(
       Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
   Opcode.kPopLocal: const Format(
       Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
-  Opcode.kIndirectStaticCall: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
-  Opcode.kStaticCall: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kInstanceCall: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
-  Opcode.kInstanceCall1Opt: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
-  Opcode.kInstanceCall2Opt: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
-  Opcode.kPushPolymorphicInstanceCall: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kPushPolymorphicInstanceCallByRange: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kNativeCall: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kOneByteStringFromCharCode: const Format(
-      Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
-  Opcode.kStringToCharCode: const Format(
-      Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
-  Opcode.kAddTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kSubTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kMulTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kBitOrTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kBitAndTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kEqualTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kLessThanTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kGreaterThanTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kSmiAddTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kSmiSubTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kSmiMulTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kSmiBitAndTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kAdd: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kSub: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kMul: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kDiv: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kMod: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kShl: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kShr: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kShlImm: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
-  Opcode.kNeg: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kBitOr: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kBitAnd: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kBitXor: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kBitNot: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kMin: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kMax: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kWriteIntoDouble: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kUnboxDouble: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kCheckedUnboxDouble: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kUnboxInt32: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
-  Opcode.kBoxInt32: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kBoxUint32: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kSmiToDouble: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kDoubleToSmi: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kDAdd: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kDSub: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kDMul: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kDDiv: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kDNeg: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kDSqrt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kDMin: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kDMax: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kDCos: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kDSin: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kDPow: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kDMod: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kDTruncate: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kDFloor: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kDCeil: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kDoubleToFloat: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kFloatToDouble: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kDoubleIsNaN: const Format(
-      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
-  Opcode.kDoubleIsInfinite: const Format(
-      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
-  Opcode.kStoreStaticTOS: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kPushStatic: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kInitStaticTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kIfNeStrictTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kIfEqStrictTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kIfNeStrictNumTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kIfEqStrictNumTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kIfSmiLtTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kIfSmiLeTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kIfSmiGeTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kIfSmiGtTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kIfNeStrict: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfEqStrict: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfLe: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfLt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfGe: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfGt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfULe: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfULt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfUGe: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfUGt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfDNe: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfDEq: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfDLe: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfDLt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfDGe: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfDGt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfNeStrictNum: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfEqStrictNum: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kIfEqNull: const Format(
-      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
-  Opcode.kIfNeNull: const Format(
-      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
-  Opcode.kCreateArrayTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCreateArrayOpt: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kAllocate: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kAllocateT: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kAllocateOpt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.lit, Operand.none]),
-  Opcode.kAllocateTOpt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.lit, Operand.none]),
-  Opcode.kStoreIndexedTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kStoreIndexed: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kStoreIndexedUint8: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kStoreIndexedExternalUint8: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kStoreIndexedOneByteString: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kStoreIndexedUint32: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kStoreIndexedFloat32: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kStoreIndexed4Float32: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kStoreIndexedFloat64: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kStoreIndexed8Float64: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kNoSuchMethod: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kTailCall: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kTailCallOpt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kLoadArgDescriptor: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kLoadArgDescriptorOpt: const Format(
-      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
-  Opcode.kLoadFpRelativeSlot: const Format(
-      Encoding.kX, const [Operand.reg, Operand.none, Operand.none]),
-  Opcode.kLoadFpRelativeSlotOpt: const Format(
-      Encoding.kABY, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kStoreFpRelativeSlot: const Format(
-      Encoding.kX, const [Operand.reg, Operand.none, Operand.none]),
-  Opcode.kStoreFpRelativeSlotOpt: const Format(
-      Encoding.kABY, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexedTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kLoadIndexed: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexedUint8: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexedInt8: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexedInt32: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexedUint32: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexedExternalUint8: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexedExternalInt8: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexedFloat32: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexed4Float32: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexedFloat64: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexed8Float64: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexedOneByteString: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kLoadIndexedTwoByteString: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
-  Opcode.kStoreField: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.imm, Operand.reg]),
-  Opcode.kStoreFieldExt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kStoreFieldTOS: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kStoreContextParent: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kStoreContextVar: const Format(
-      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kLoadField: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
-  Opcode.kLoadFieldExt: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kLoadUntagged: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
+  Opcode.kStoreLocal: const Format(
+      Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
   Opcode.kLoadFieldTOS: const Format(
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kStoreFieldTOS: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kStoreIndexedTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kPushStatic: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kStoreStaticTOS: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kJump: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kJumpIfNoAsserts: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kJumpIfNotZeroTypeArgs: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kJumpIfEqStrict: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kJumpIfNeStrict: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kJumpIfTrue: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kJumpIfFalse: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kJumpIfNull: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kJumpIfNotNull: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kIndirectStaticCall: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kInstanceCall: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kNativeCall: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kReturnTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kAssertAssignable: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kAssertBoolean: const Format(
+      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kAssertSubtype: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
   Opcode.kLoadTypeArgumentsField: const Format(
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kLoadContextParent: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kLoadContextVar: const Format(
-      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kBooleanNegateTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kBooleanNegate: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kThrow: const Format(
-      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kEntry: const Format(
-      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kEntryFixed: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kEntryOptional: const Format(
-      Encoding.kABC, const [Operand.imm, Operand.imm, Operand.imm]),
-  Opcode.kEntryOptimized: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kFrame: const Format(
-      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kSetFrame: const Format(
-      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kAllocateContext: const Format(
-      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kAllocateUninitializedContext: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
-  Opcode.kCloneContext: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kMoveSpecial: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.spe, Operand.none]),
   Opcode.kInstantiateType: const Format(
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
   Opcode.kInstantiateTypeArgumentsTOS: const Format(
       Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
-  Opcode.kInstanceOf: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kBadTypeError: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kAssertAssignable: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
-  Opcode.kAssertSubtype: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kAssertBoolean: const Format(
+  Opcode.kThrow: const Format(
       Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kTestSmi: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kTestCids: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
-  Opcode.kCheckSmi: const Format(
-      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
-  Opcode.kCheckEitherNonSmi: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
-  Opcode.kCheckClassId: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
-  Opcode.kCheckClassIdRange: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
-  Opcode.kCheckBitTest: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
-  Opcode.kCheckCids: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.imm, Operand.imm]),
-  Opcode.kCheckCidsByRange: const Format(
-      Encoding.kABC, const [Operand.reg, Operand.imm, Operand.imm]),
-  Opcode.kCheckStack: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCheckStackAlwaysExit: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCheckFunctionTypeArgs: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kDebugStep: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kDebugBreak: const Format(
+  Opcode.kMoveSpecial: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.spe, Operand.none]),
+  Opcode.kSetFrame: const Format(
       Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kDeopt: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kDeoptRewind: const Format(
+  Opcode.kBooleanNegateTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kEqualsNull: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kNegateInt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kAddInt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kSubInt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kMulInt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kTruncDivInt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kModInt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kBitAndInt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kBitOrInt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kBitXorInt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kShlInt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kShrInt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCompareIntEq: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCompareIntGt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCompareIntLt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCompareIntGe: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCompareIntLe: const Format(
       Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
 };
 
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 24b30f5..9e3ea83 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -27,6 +27,7 @@
 import 'dbc.dart';
 import 'exceptions.dart';
 import 'local_vars.dart' show LocalVariables;
+import 'recognized_methods.dart' show RecognizedMethods;
 import '../constants_error_reporter.dart' show ForwardConstantEvaluationErrors;
 import '../metadata/bytecode.dart';
 
@@ -63,6 +64,7 @@
   final bool omitSourcePositions;
   final ErrorReporter errorReporter;
   final BytecodeMetadataRepository metadata = new BytecodeMetadataRepository();
+  final RecognizedMethods recognizedMethods;
 
   Class enclosingClass;
   Member enclosingMember;
@@ -97,7 +99,8 @@
       this.constantsBackend,
       this.strongMode,
       this.omitSourcePositions,
-      this.errorReporter) {
+      this.errorReporter)
+      : recognizedMethods = new RecognizedMethods(typeEnvironment) {
     component.addMetadataRepository(metadata);
   }
 
@@ -211,6 +214,10 @@
   Procedure get objectInstanceOf => _objectInstanceOf ??=
       libraryIndex.getMember('dart:core', 'Object', '_instanceOf');
 
+  Procedure _objectSimpleInstanceOf;
+  Procedure get objectSimpleInstanceOf => _objectSimpleInstanceOf ??=
+      libraryIndex.getMember('dart:core', 'Object', '_simpleInstanceOf');
+
   Procedure _objectAs;
   Procedure get objectAs =>
       _objectAs ??= libraryIndex.getMember('dart:core', 'Object', '_as');
@@ -598,13 +605,11 @@
   }
 
   void _genJumpIfFalse(bool negated, Label dest) {
-    asm.emitPushTrue();
     if (negated) {
-      asm.emitIfEqStrictTOS(); // if ((!condition) == true) ...
+      asm.emitJumpIfTrue(dest);
     } else {
-      asm.emitIfNeStrictTOS(); // if (condition != true) ...
+      asm.emitJumpIfFalse(dest);
     }
-    asm.emitJump(dest); // ... then jump dest
   }
 
   void _genJumpIfTrue(bool negated, Label dest) {
@@ -636,7 +641,15 @@
       return;
     }
 
-    // TODO(alexmarkov): generate _simpleInstanceOf if possible
+    if (type is InterfaceType && type.typeArguments.isEmpty) {
+      assert(type.classNode.typeParameters.isEmpty);
+      asm.emitPushConstant(cp.add(new ConstantType(type)));
+      final argDescIndex = cp.add(new ConstantArgDesc(2));
+      final icdataIndex = cp.add(new ConstantICData(
+          InvocationKind.method, objectSimpleInstanceOf.name, argDescIndex));
+      asm.emitInstanceCall(2, icdataIndex);
+      return;
+    }
 
     if (hasFreeTypeParameters([type])) {
       _genPushInstantiatorAndFunctionTypeArguments([type]);
@@ -658,6 +671,9 @@
     parentFunction = null;
     isClosure = false;
     hasErrors = false;
+    if ((node is Procedure && !node.isStatic) || node is Constructor) {
+      typeEnvironment.thisType = enclosingClass.thisType;
+    }
     final isFactory = node is Procedure && node.isFactory;
     if (node.isInstanceMember || node is Constructor || isFactory) {
       if (enclosingClass.typeParameters.isNotEmpty) {
@@ -725,9 +741,7 @@
     Label done = new Label();
 
     _genLoadVar(member.function.positionalParameters[0]);
-    asm.emitPushNull();
-    asm.emitIfNeStrictTOS();
-    asm.emitJump(done);
+    asm.emitJumpIfNotNull(done);
 
     asm.emitPushFalse();
     _genReturnTOS();
@@ -741,6 +755,7 @@
           cp, asm.bytecode, asm.exceptionsTable, nullableFields, closures);
     }
 
+    typeEnvironment.thisType = null;
     enclosingClass = null;
     enclosingMember = null;
     enclosingFunction = null;
@@ -855,8 +870,7 @@
         cp.add(new ConstantInstanceField(closureDelayedTypeArguments)));
     asm.emitStoreLocal(locals.functionTypeArgsVarIndexInFrame);
     asm.emitPushConstant(cp.add(const ConstantEmptyTypeArguments()));
-    asm.emitIfEqStrictTOS();
-    asm.emitJump(noDelayedTypeArgs);
+    asm.emitJumpIfEqStrict(noDelayedTypeArgs);
 
     // There are non-empty delayed type arguments, and they are stored
     // into function type args variable already.
@@ -1099,8 +1113,8 @@
 
   void _genAssertAssignable(DartType type, {String name = ''}) {
     assert(!typeEnvironment.isTop(type));
-    _genPushInstantiatorAndFunctionTypeArguments([type]);
     asm.emitPushConstant(cp.add(new ConstantType(type)));
+    _genPushInstantiatorAndFunctionTypeArguments([type]);
     asm.emitPushConstant(cp.add(new ConstantString(name)));
     bool isIntOk = typeEnvironment.isSubtypeOf(typeEnvironment.intType, type);
     int subtypeTestCacheCpIndex = cp.add(new ConstantSubtypeTestCache());
@@ -1207,8 +1221,7 @@
 
     // if (switch_var != 0) goto continuationLabel
     _genPushInt(0);
-    asm.emitIfNeStrictTOS();
-    asm.emitJump(continuationLabel);
+    asm.emitJumpIfNeStrict(continuationLabel);
 
     // Proceed to normal entry.
   }
@@ -1235,10 +1248,10 @@
       if (i != yieldPoints.length - 1) {
         asm.emitPush(switchVarIndexInFrame);
         _genPushInt(index);
-        asm.emitIfEqStrictTOS();
+        asm.emitJumpIfEqStrict(yieldPoints[i]);
+      } else {
+        asm.emitJump(yieldPoints[i]);
       }
-
-      asm.emitJump(yieldPoints[i]);
     }
   }
 
@@ -1692,17 +1705,15 @@
     final isOR = (node.operator == '||');
 
     bool negated = _genCondition(node.left);
-    asm.emitPushTrue();
     if (negated != isOR) {
       // OR: if (condition == true)
       // AND: if ((!condition) == true)
-      asm.emitIfEqStrictTOS();
+      asm.emitJumpIfTrue(shortCircuit);
     } else {
       // OR: if ((!condition) != true)
       // AND: if (condition != true)
-      asm.emitIfNeStrictTOS();
+      asm.emitJumpIfFalse(shortCircuit);
     }
-    asm.emitJump(shortCircuit);
 
     negated = _genCondition(node.right);
     if (negated) {
@@ -1760,11 +1771,56 @@
     _genStaticCall(mapFromLiteral, new ConstantArgDesc(2, numTypeArgs: 0), 2);
   }
 
+  void _genMethodInvocationUsingSpecializedBytecode(
+      Opcode opcode, MethodInvocation node) {
+    switch (opcode) {
+      case Opcode.kEqualsNull:
+        if (node.receiver is NullLiteral) {
+          node.arguments.positional.single.accept(this);
+        } else {
+          node.receiver.accept(this);
+        }
+        break;
+
+      case Opcode.kNegateInt:
+        node.receiver.accept(this);
+        break;
+
+      case Opcode.kAddInt:
+      case Opcode.kSubInt:
+      case Opcode.kMulInt:
+      case Opcode.kTruncDivInt:
+      case Opcode.kModInt:
+      case Opcode.kBitAndInt:
+      case Opcode.kBitOrInt:
+      case Opcode.kBitXorInt:
+      case Opcode.kShlInt:
+      case Opcode.kShrInt:
+      case Opcode.kCompareIntEq:
+      case Opcode.kCompareIntGt:
+      case Opcode.kCompareIntLt:
+      case Opcode.kCompareIntGe:
+      case Opcode.kCompareIntLe:
+        node.receiver.accept(this);
+        node.arguments.positional.single.accept(this);
+        break;
+
+      default:
+        throw 'Unexpected specialized bytecode $opcode';
+    }
+
+    asm.emitBytecode0(opcode);
+  }
+
   @override
   visitMethodInvocation(MethodInvocation node) {
+    final Opcode opcode = recognizedMethods.specializedBytecodeFor(node);
+    if (opcode != null) {
+      _genMethodInvocationUsingSpecializedBytecode(opcode, node);
+      return;
+    }
     final args = node.arguments;
     _genArguments(node.receiver, args);
-    // TODO(alexmarkov): fast path smi ops
     final argDescIndex =
         cp.add(new ConstantArgDesc.fromArguments(args, hasReceiver: true));
     final icdataIndex = cp.add(new ConstantICData(
@@ -2705,8 +2761,8 @@
 
       // if (:exception != null) rethrow (:exception, :stack_trace)
       final Label cont = new Label();
-      asm.emitIfEqNull(exceptionParam);
-      asm.emitJump(cont);
+      asm.emitPush(exceptionParam);
+      asm.emitJumpIfNull(cont);
 
       asm.emitPush(exceptionParam);
       asm.emitPush(stackTraceParam);
diff --git a/pkg/vm/lib/bytecode/recognized_methods.dart b/pkg/vm/lib/bytecode/recognized_methods.dart
new file mode 100644
index 0000000..b658fdf
--- /dev/null
+++ b/pkg/vm/lib/bytecode/recognized_methods.dart
@@ -0,0 +1,87 @@
+// 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 vm.bytecode.recognized_methods;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
+
+import 'dbc.dart';
+
+class RecognizedMethods {
+  static const binaryIntOps = <String, Opcode>{
+    '+': Opcode.kAddInt,
+    '-': Opcode.kSubInt,
+    '*': Opcode.kMulInt,
+    '~/': Opcode.kTruncDivInt,
+    '%': Opcode.kModInt,
+    '&': Opcode.kBitAndInt,
+    '|': Opcode.kBitOrInt,
+    '^': Opcode.kBitXorInt,
+    '<<': Opcode.kShlInt,
+    '>>': Opcode.kShrInt,
+    '==': Opcode.kCompareIntEq,
+    '>': Opcode.kCompareIntGt,
+    '<': Opcode.kCompareIntLt,
+    '>=': Opcode.kCompareIntGe,
+    '<=': Opcode.kCompareIntLe,
+  };
+
+  final TypeEnvironment typeEnv;
+
+  RecognizedMethods(this.typeEnv);
+
+  DartType staticType(Expression expr) {
+    // TODO(dartbug.com/34496): Remove this ugly try/catch once
+    // getStaticType() is reliable.
+    try {
+      return expr.getStaticType(typeEnv);
+    } catch (e) {
+      return const DynamicType();
+    }
+  }
+
+  bool isInt(Expression expr) => staticType(expr) == typeEnv.intType;
+
+  Opcode specializedBytecodeFor(MethodInvocation node) {
+    final args = node.arguments;
+    if (!args.named.isEmpty) {
+      return null;
+    }
+
+    final Expression receiver = node.receiver;
+    final String selector = node.name.name;
+
+    switch (args.positional.length) {
+      case 0:
+        return specializedBytecodeForUnaryOp(selector, receiver);
+      case 1:
+        return specializedBytecodeForBinaryOp(
+            selector, receiver, args.positional.single);
+      default:
+        return null;
+    }
+  }
+
+  Opcode specializedBytecodeForUnaryOp(String selector, Expression arg) {
+    if (selector == 'unary-' && isInt(arg)) {
+      return Opcode.kNegateInt;
+    }
+
+    return null;
+  }
+
+  Opcode specializedBytecodeForBinaryOp(
+      String selector, Expression a, Expression b) {
+    if (selector == '==' && (a is NullLiteral || b is NullLiteral)) {
+      return Opcode.kEqualsNull;
+    }
+
+    if (isInt(a) && isInt(b)) {
+      return binaryIntOps[selector];
+    }
+
+    return null;
+  }
+}
diff --git a/pkg/vm/lib/constants_error_reporter.dart b/pkg/vm/lib/constants_error_reporter.dart
index 3b7fb1d..b736b22 100644
--- a/pkg/vm/lib/constants_error_reporter.dart
+++ b/pkg/vm/lib/constants_error_reporter.dart
@@ -6,10 +6,10 @@
 /// [constants.ErrorReporter] which uses package:front_end to report errors.
 library vm.constants_error_reporter;
 
-import 'package:front_end/src/api_prototype/compilation_message.dart'
-    show Severity;
-import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
-import 'package:front_end/src/fasta/fasta_codes.dart' as codes;
+import 'package:front_end/src/api_unstable/vm.dart'
+    show CompilerContext, Severity;
+
+import 'package:front_end/src/api_unstable/vm.dart' as codes;
 
 import 'package:kernel/ast.dart'
     show Constant, DartType, FileUriNode, IntConstant, Procedure, TreeNode;
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index 00cfb12..7cdc7d7 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -15,11 +15,7 @@
 // that would replace api used below. This api was made private in
 // an effort to discourage further use.
 // ignore_for_file: implementation_imports
-import 'package:front_end/src/api_prototype/compiler_options.dart';
-import 'package:front_end/src/api_prototype/file_system.dart'
-    show FileSystemEntity;
-import 'package:front_end/src/api_prototype/front_end.dart';
-import 'package:front_end/src/fasta/kernel/utils.dart';
+import 'package:front_end/src/api_unstable/vm.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/binary/limited_ast_to_binary.dart';
@@ -275,14 +271,13 @@
       ..sdkSummary = sdkRoot.resolve(platformKernelDill)
       ..verbose = options['verbose']
       ..embedSourceText = options['embed-source-text']
-      ..onProblem =
-          (message, Severity severity, List<FormattedMessage> context) {
+      ..onDiagnostic = (DiagnosticMessage message) {
         bool printMessage;
-        switch (severity) {
+        switch (message.severity) {
           case Severity.error:
           case Severity.internalProblem:
             printMessage = true;
-            errors.add(message.formatted);
+            errors.addAll(message.plainTextFormatted);
             break;
           case Severity.warning:
             printMessage = true;
@@ -290,13 +285,10 @@
           case Severity.errorLegacyWarning:
           case Severity.context:
           case Severity.ignored:
-            throw 'Unexpected severity: $severity';
+            throw 'Unexpected severity: ${message.severity}';
         }
         if (printMessage) {
-          _outputStream.writeln(message.formatted);
-          for (FormattedMessage message in context) {
-            _outputStream.writeln(message.formatted);
-          }
+          printDiagnosticMessage(message, _outputStream.writeln);
         }
       };
     if (options.wasParsed('filesystem-root')) {
@@ -650,7 +642,8 @@
   file.write(_escapePath(output));
   file.write(':');
   for (Uri dep in component.uriToSource.keys) {
-    if (dep == null) continue;
+    // Skip empty or corelib dependencies.
+    if (dep == null || dep.scheme == 'org-dartlang-sdk') continue;
     file.write(' ');
     file.write(_escapePath(dep.toFilePath()));
   }
diff --git a/pkg/vm/lib/http_filesystem.dart b/pkg/vm/lib/http_filesystem.dart
index ed036cd..bae57bf 100644
--- a/pkg/vm/lib/http_filesystem.dart
+++ b/pkg/vm/lib/http_filesystem.dart
@@ -1,7 +1,7 @@
 import 'dart:async';
 import 'dart:io' as io;
 
-import 'package:front_end/src/api_unstable/build_integration.dart';
+import 'package:front_end/src/api_unstable/vm.dart';
 
 class HttpAwareFileSystem implements FileSystem {
   FileSystem original;
diff --git a/pkg/vm/lib/incremental_compiler.dart b/pkg/vm/lib/incremental_compiler.dart
index 4cfedcd..92136c2 100644
--- a/pkg/vm/lib/incremental_compiler.dart
+++ b/pkg/vm/lib/incremental_compiler.dart
@@ -6,8 +6,7 @@
 /// the flow, where incremental deltas can be rejected by VM.
 import 'dart:async';
 
-import 'package:front_end/src/api_prototype/compiler_options.dart';
-import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
+import 'package:front_end/src/api_unstable/vm.dart';
 import 'package:kernel/kernel.dart';
 
 const String kDebugProcedureName = ":Eval";
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 941890e..2903b15 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -7,17 +7,18 @@
 
 import 'dart:async';
 
-import 'package:front_end/src/base/processed_options.dart'
-    show ProcessedOptions;
-import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
-import 'package:front_end/src/fasta/fasta_codes.dart' as codes;
+import 'package:front_end/src/api_unstable/vm.dart'
+    show
+        CompilerContext,
+        CompilerOptions,
+        DiagnosticMessage,
+        DiagnosticMessageHandler,
+        ProcessedOptions,
+        Severity,
+        getMessageUri,
+        kernelForProgram,
+        printDiagnosticMessage;
 
-import 'package:front_end/src/api_prototype/compiler_options.dart'
-    show CompilerOptions, ProblemHandler;
-import 'package:front_end/src/api_prototype/kernel_generator.dart'
-    show kernelForProgram;
-import 'package:front_end/src/api_prototype/compilation_message.dart'
-    show Severity;
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/ast.dart' show Component, Field, StaticGet;
@@ -52,8 +53,8 @@
     bool enableConstantEvaluation: true}) async {
   // Replace error handler to detect if there are compilation errors.
   final errorDetector =
-      new ErrorDetector(previousErrorHandler: options.onProblem);
-  options.onProblem = errorDetector;
+      new ErrorDetector(previousErrorHandler: options.onDiagnostic);
+  options.onDiagnostic = errorDetector;
 
   final component = await kernelForProgram(source, options);
 
@@ -81,7 +82,7 @@
   }
 
   // Restore error handler (in case 'options' are reused).
-  options.onProblem = errorDetector.previousErrorHandler;
+  options.onDiagnostic = errorDetector.previousErrorHandler;
 
   return component;
 }
@@ -122,9 +123,8 @@
           compilerOptions.target, coreTypes, component);
     } else {
       devirtualization.transformComponent(coreTypes, component);
+      no_dynamic_invocations_annotator.transformComponent(component);
     }
-
-    no_dynamic_invocations_annotator.transformComponent(component);
   }
 }
 
@@ -189,47 +189,38 @@
 }
 
 class ErrorDetector {
-  final ProblemHandler previousErrorHandler;
+  final DiagnosticMessageHandler previousErrorHandler;
   bool hasCompilationErrors = false;
 
   ErrorDetector({this.previousErrorHandler});
 
-  void call(codes.FormattedMessage problem, Severity severity,
-      List<codes.FormattedMessage> context) {
-    if (severity == Severity.error) {
+  void call(DiagnosticMessage message) {
+    if (message.severity == Severity.error) {
       hasCompilationErrors = true;
     }
 
-    previousErrorHandler?.call(problem, severity, context);
+    previousErrorHandler?.call(message);
   }
 }
 
 class ErrorPrinter {
-  final ProblemHandler previousErrorHandler;
-  final compilationMessages = <Uri, List<List>>{};
+  final DiagnosticMessageHandler previousErrorHandler;
+  final compilationMessages = <Uri, List<DiagnosticMessage>>{};
 
   ErrorPrinter({this.previousErrorHandler});
 
-  void call(codes.FormattedMessage problem, Severity severity,
-      List<codes.FormattedMessage> context) {
-    final sourceUri = problem.locatedMessage.uri;
-    compilationMessages.putIfAbsent(sourceUri, () => [])
-      ..add([problem, context]);
-    previousErrorHandler?.call(problem, severity, context);
+  void call(DiagnosticMessage message) {
+    final sourceUri = getMessageUri(message);
+    (compilationMessages[sourceUri] ??= <DiagnosticMessage>[]).add(message);
+    previousErrorHandler?.call(message);
   }
 
   void printCompilationMessages(Uri baseUri) {
     final sortedUris = compilationMessages.keys.toList()
       ..sort((a, b) => '$a'.compareTo('$b'));
     for (final Uri sourceUri in sortedUris) {
-      for (final List errorTuple in compilationMessages[sourceUri]) {
-        final codes.FormattedMessage message = errorTuple.first;
-        print(message.formatted);
-
-        final List context = errorTuple.last;
-        for (final codes.FormattedMessage message in context?.reversed) {
-          print(message.formatted);
-        }
+      for (final DiagnosticMessage message in compilationMessages[sourceUri]) {
+        printDiagnosticMessage(message, print);
       }
     }
   }
diff --git a/pkg/vm/lib/metadata/procedure_attributes.dart b/pkg/vm/lib/metadata/procedure_attributes.dart
index 531f7d2..5b9f5ce 100644
--- a/pkg/vm/lib/metadata/procedure_attributes.dart
+++ b/pkg/vm/lib/metadata/procedure_attributes.dart
@@ -9,19 +9,28 @@
 /// Metadata for annotating procedures with various attributes.
 class ProcedureAttributesMetadata {
   final bool hasDynamicUses;
+  final bool hasThisUses;
   final bool hasNonThisUses;
   final bool hasTearOffUses;
 
   const ProcedureAttributesMetadata(
-      {this.hasDynamicUses, this.hasNonThisUses, this.hasTearOffUses});
+      {this.hasDynamicUses: true,
+      this.hasThisUses: true,
+      this.hasNonThisUses: true,
+      this.hasTearOffUses: true});
 
   const ProcedureAttributesMetadata.noDynamicUses()
-      : this(hasDynamicUses: false, hasNonThisUses: true, hasTearOffUses: true);
+      : this(hasDynamicUses: false);
 
   @override
-  String toString() => "hasDynamicUses:$hasDynamicUses,"
-      "hasNonThisUses:$hasNonThisUses,"
-      "hasTearOffUses:$hasTearOffUses";
+  String toString() {
+    final attrs = <String>[];
+    if (!hasDynamicUses) attrs.add('hasDynamicUses:false');
+    if (!hasThisUses) attrs.add('hasThisUses:false');
+    if (!hasNonThisUses) attrs.add('hasNonThisUses:false');
+    if (!hasTearOffUses) attrs.add('hasTearOffUses:false');
+    return attrs.join(',');
+  }
 }
 
 /// Repository for [ProcedureAttributesMetadata].
@@ -30,6 +39,7 @@
   static const int kDynamicUsesBit = 1 << 0;
   static const int kNonThisUsesBit = 1 << 1;
   static const int kTearOffUsesBit = 1 << 2;
+  static const int kThisUsesBit = 1 << 3;
 
   @override
   final String tag = 'vm.procedure-attributes.metadata';
@@ -45,6 +55,9 @@
     if (metadata.hasDynamicUses) {
       flags |= kDynamicUsesBit;
     }
+    if (metadata.hasThisUses) {
+      flags |= kThisUsesBit;
+    }
     if (metadata.hasNonThisUses) {
       flags |= kNonThisUsesBit;
     }
@@ -58,12 +71,14 @@
   ProcedureAttributesMetadata readFromBinary(Node node, BinarySource source) {
     final int flags = source.readByte();
 
-    final bool hasDynamicUses = (flags & kDynamicUsesBit) == kDynamicUsesBit;
-    final bool hasNonThisUses = (flags & kNonThisUsesBit) == kNonThisUsesBit;
-    final bool hasTearOffUses = (flags & kTearOffUsesBit) == kTearOffUsesBit;
+    final bool hasDynamicUses = (flags & kDynamicUsesBit) != 0;
+    final bool hasThisUses = (flags & kThisUsesBit) != 0;
+    final bool hasNonThisUses = (flags & kNonThisUsesBit) != 0;
+    final bool hasTearOffUses = (flags & kTearOffUsesBit) != 0;
 
     return new ProcedureAttributesMetadata(
         hasDynamicUses: hasDynamicUses,
+        hasThisUses: hasThisUses,
         hasNonThisUses: hasNonThisUses,
         hasTearOffUses: hasTearOffUses);
   }
diff --git a/pkg/vm/lib/transformations/mixin_deduplication.dart b/pkg/vm/lib/transformations/mixin_deduplication.dart
index 68ade75..19375aa 100644
--- a/pkg/vm/lib/transformations/mixin_deduplication.dart
+++ b/pkg/vm/lib/transformations/mixin_deduplication.dart
@@ -76,8 +76,12 @@
     }
 
     if (c.supertype != null) {
-      _transformSupertype(c);
+      c.supertype = _transformSupertype(c.supertype, c, true);
     }
+    if (c.mixedInType != null) {
+      throw 'All mixins should be transformed already.';
+    }
+    transformSupertypeList(c.implementedTypes, this);
 
     if (!c.isAnonymousMixin) {
       return c;
@@ -97,18 +101,24 @@
     return c;
   }
 
-  void _transformSupertype(Class c) {
-    Class oldSuper = c.superclass;
-    if (oldSuper == null) {
-      return;
-    }
+  @override
+  Supertype visitSupertype(Supertype node) {
+    return _transformSupertype(node, null, false);
+  }
+
+  Supertype _transformSupertype(
+      Supertype supertype, Class cls, bool isSuperclass) {
+    Class oldSuper = supertype.classNode;
     Class newSuper = visitClass(oldSuper);
     if (newSuper == null) {
       Class canonicalSuper = _duplicatedMixins[oldSuper];
       assert(canonicalSuper != null);
-      c.supertype = new Supertype(canonicalSuper, c.supertype.typeArguments);
-      _correctForwardingConstructors(c, oldSuper, canonicalSuper);
+      supertype = new Supertype(canonicalSuper, supertype.typeArguments);
+      if (isSuperclass) {
+        _correctForwardingConstructors(cls, oldSuper, canonicalSuper);
+      }
     }
+    return supertype;
   }
 
   @override
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index ee93bf3..8c406ea 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -227,6 +227,7 @@
         // TODO(alexmarkov): capture receiver type
         assertx((member is Procedure) && !member.isGetter && !member.isSetter);
         typeFlowAnalysis.addRawCall(new DirectSelector(member));
+        typeFlowAnalysis._tearOffTaken.add(member);
         return new Type.nullableAny();
       } else {
         // Call via getter.
@@ -345,6 +346,16 @@
           // Result of this invocation depends on the results of direct
           // invocations corresponding to each target.
           directInvocation.addDependentInvocation(this);
+
+          if (selector.callKind != CallKind.PropertyGet) {
+            if (selector is DynamicSelector) {
+              typeFlowAnalysis._calledViaDynamicSelector.add(target);
+            } else if (selector is VirtualSelector) {
+              typeFlowAnalysis._calledViaThis.add(target);
+            } else {
+              typeFlowAnalysis._calledViaInterfaceSelector.add(target);
+            }
+          }
         }
 
         result = result.union(type, typeFlowAnalysis.hierarchyCache);
@@ -1188,6 +1199,10 @@
 
   final Map<Member, Summary> _summaries = <Member, Summary>{};
   final Map<Field, _FieldValue> _fieldValues = <Field, _FieldValue>{};
+  final Set<Member> _tearOffTaken = new Set<Member>();
+  final Set<Member> _calledViaDynamicSelector = new Set<Member>();
+  final Set<Member> _calledViaInterfaceSelector = new Set<Member>();
+  final Set<Member> _calledViaThis = new Set<Member>();
 
   TypeFlowAnalysis(this.target, Component component, CoreTypes coreTypes,
       ClosedWorldClassHierarchy hierarchy, this.environment, this.libraryIndex,
@@ -1236,6 +1251,23 @@
 
   Args<Type> argumentTypes(Member member) => _summaries[member]?.argumentTypes;
 
+  bool isTearOffTaken(Member member) => _tearOffTaken.contains(member);
+
+  /// Returns true if this member is called dynamically.
+  /// Getters are not tracked. For fields, only setter is tracked.
+  bool isCalledDynamically(Member member) =>
+      _calledViaDynamicSelector.contains(member);
+
+  /// Returns true if this member is called via this call.
+  /// Getters are not tracked. For fields, only setter is tracked.
+  bool isCalledViaThis(Member member) => _calledViaThis.contains(member);
+
+  /// Returns true if this member is called via non-this call.
+  /// Getters are not tracked. For fields, only setter is tracked.
+  bool isCalledNotViaThis(Member member) =>
+      _calledViaDynamicSelector.contains(member) ||
+      _calledViaInterfaceSelector.contains(member);
+
   /// ---- Implementation of [CallHandler] interface. ----
 
   @override
@@ -1298,4 +1330,14 @@
     }
     return hierarchyCache.addAllocatedClass(c);
   }
+
+  @override
+  void recordMemberCalledViaInterfaceSelector(Member target) {
+    _calledViaInterfaceSelector.add(target);
+  }
+
+  @override
+  void recordMemberCalledViaThis(Member target) {
+    _calledViaThis.add(target);
+  }
 }
diff --git a/pkg/vm/lib/transformations/type_flow/calls.dart b/pkg/vm/lib/transformations/type_flow/calls.dart
index 958de82..de3cabe 100644
--- a/pkg/vm/lib/transformations/type_flow/calls.dart
+++ b/pkg/vm/lib/transformations/type_flow/calls.dart
@@ -131,6 +131,21 @@
   String toString() => '${_callKindPrefix}[$member]';
 }
 
+/// Virtual call (using 'this' as a receiver).
+class VirtualSelector extends InterfaceSelector {
+  VirtualSelector(Member member, {CallKind callKind = CallKind.Method})
+      : super(member, callKind: callKind);
+
+  @override
+  int get hashCode => (super.hashCode + 37) & kHashMask;
+
+  @override
+  bool operator ==(other) => other is VirtualSelector && super == (other);
+
+  @override
+  String toString() => 'virtual ${_callKindPrefix}[$member]';
+}
+
 /// Dynamic call.
 class DynamicSelector extends Selector {
   @override
diff --git a/pkg/vm/lib/transformations/type_flow/native_code.dart b/pkg/vm/lib/transformations/type_flow/native_code.dart
index 6d6fe93..8497461 100644
--- a/pkg/vm/lib/transformations/type_flow/native_code.dart
+++ b/pkg/vm/lib/transformations/type_flow/native_code.dart
@@ -24,6 +24,13 @@
 
   /// Add instantiation of the given class.
   ConcreteType addAllocatedClass(Class c);
+
+  /// Record the fact that given member is called via interface selector
+  /// (not dynamically, and not from `this`).
+  void recordMemberCalledViaInterfaceSelector(Member target);
+
+  /// Record the fact that given member is called from this.
+  void recordMemberCalledViaThis(Member target);
 }
 
 abstract class ParsedPragma {}
@@ -200,11 +207,17 @@
         addSelector(CallKind.PropertyGet);
         break;
       case PragmaEntryPointType.SetterOnly:
+        if (field.isFinal) {
+          throw "Error: can't use 'set' in entry-point pragma for final field "
+              "$field";
+        }
         addSelector(CallKind.PropertySet);
         break;
       case PragmaEntryPointType.Always:
         addSelector(CallKind.PropertyGet);
-        addSelector(CallKind.PropertySet);
+        if (!field.isFinal) {
+          addSelector(CallKind.PropertySet);
+        }
         break;
     }
 
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index c4a8931..e1030c7 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -638,9 +638,17 @@
   TypeExpr visitDirectMethodInvocation(DirectMethodInvocation node) {
     final receiver = _visit(node.receiver);
     final args = _visitArguments(receiver, node.arguments);
-    assertx(node.target is! Field);
-    assertx(!node.target.isGetter && !node.target.isSetter);
-    return _makeCall(node, new DirectSelector(node.target), args);
+    final target = node.target;
+    assertx(target is! Field);
+    assertx(!target.isGetter && !target.isSetter);
+    if (receiver is ThisExpression) {
+      _entryPointsListener.recordMemberCalledViaThis(target);
+    } else {
+      // Conservatively record direct invocations with non-this receiver
+      // as being done via interface selectors.
+      _entryPointsListener.recordMemberCalledViaInterfaceSelector(target);
+    }
+    return _makeCall(node, new DirectSelector(target), args);
   }
 
   @override
@@ -648,6 +656,8 @@
     final receiver = _visit(node.receiver);
     final args = new Args<TypeExpr>([receiver]);
     final target = node.target;
+    // No need to record this invocation as performed via this or via interface
+    // selector as PropertyGet invocations are not tracked at all.
     return _makeCall(
         node, new DirectSelector(target, callKind: CallKind.PropertyGet), args);
   }
@@ -659,6 +669,13 @@
     final args = new Args<TypeExpr>([receiver, value]);
     final target = node.target;
     assertx((target is Field) || ((target is Procedure) && target.isSetter));
+    if (receiver is ThisExpression) {
+      _entryPointsListener.recordMemberCalledViaThis(target);
+    } else {
+      // Conservatively record direct invocations with non-this receiver
+      // as being done via interface selectors.
+      _entryPointsListener.recordMemberCalledViaInterfaceSelector(target);
+    }
     _makeCall(
         node, new DirectSelector(target, callKind: CallKind.PropertySet), args);
     return value;
@@ -755,14 +772,21 @@
       // Call via field.
       final fieldValue = _makeCall(
           node,
-          new InterfaceSelector(target, callKind: CallKind.PropertyGet),
+          (node.receiver is ThisExpression)
+              ? new VirtualSelector(target, callKind: CallKind.PropertyGet)
+              : new InterfaceSelector(target, callKind: CallKind.PropertyGet),
           new Args<TypeExpr>([receiver]));
       _makeCall(
           null, DynamicSelector.kCall, new Args.withReceiver(args, fieldValue));
       return _staticType(node);
     } else {
       // TODO(alexmarkov): overloaded arithmetic operators
-      return _makeCall(node, new InterfaceSelector(target), args);
+      return _makeCall(
+          node,
+          (node.receiver is ThisExpression)
+              ? new VirtualSelector(target)
+              : new InterfaceSelector(target),
+          args);
     }
   }
 
@@ -775,8 +799,12 @@
       return _makeCall(
           node, new DynamicSelector(CallKind.PropertyGet, node.name), args);
     }
-    return _makeCall(node,
-        new InterfaceSelector(target, callKind: CallKind.PropertyGet), args);
+    return _makeCall(
+        node,
+        (node.receiver is ThisExpression)
+            ? new VirtualSelector(target, callKind: CallKind.PropertyGet)
+            : new InterfaceSelector(target, callKind: CallKind.PropertyGet),
+        args);
   }
 
   @override
@@ -790,8 +818,12 @@
           node, new DynamicSelector(CallKind.PropertySet, node.name), args);
     } else {
       assertx((target is Field) || ((target is Procedure) && target.isSetter));
-      _makeCall(node,
-          new InterfaceSelector(target, callKind: CallKind.PropertySet), args);
+      _makeCall(
+          node,
+          (node.receiver is ThisExpression)
+              ? new VirtualSelector(target, callKind: CallKind.PropertySet)
+              : new InterfaceSelector(target, callKind: CallKind.PropertySet),
+          args);
     }
     return value;
   }
@@ -808,7 +840,7 @@
       return new Type.empty();
     } else {
       if ((target is Field) || ((target is Procedure) && target.isGetter)) {
-        // Call via field.
+        // Call via field/getter.
         // TODO(alexmarkov): Consider cleaning up this code as it duplicates
         // processing in DirectInvocation.
         final fieldValue = _makeCall(
@@ -819,6 +851,7 @@
             new Args.withReceiver(args, fieldValue));
         return _staticType(node);
       } else {
+        _entryPointsListener.recordMemberCalledViaThis(target);
         return _makeCall(node, new DirectSelector(target), args);
       }
     }
@@ -851,6 +884,7 @@
         .getDispatchTarget(_superclass, node.name, setter: true);
     if (target != null) {
       assertx((target is Field) || ((target is Procedure) && target.isSetter));
+      _entryPointsListener.recordMemberCalledViaThis(target);
       _makeCall(node,
           new DirectSelector(target, callKind: CallKind.PropertySet), args);
     }
@@ -1202,6 +1236,12 @@
     final classId = (_classIds[c] ??= new IntClassId(++_classIdCounter));
     return new ConcreteType(classId, c.rawType);
   }
+
+  @override
+  void recordMemberCalledViaInterfaceSelector(Member target) {}
+
+  @override
+  void recordMemberCalledViaThis(Member target) {}
 }
 
 class CreateAllSummariesVisitor extends RecursiveVisitor<Null> {
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index 6233e44..42835d1 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -23,6 +23,7 @@
 import '../devirtualization.dart' show Devirtualization;
 import '../../metadata/direct_call.dart';
 import '../../metadata/inferred_type.dart';
+import '../../metadata/procedure_attributes.dart';
 import '../../metadata/unreachable.dart';
 
 const bool kDumpAllSummaries =
@@ -112,14 +113,18 @@
   final TypeFlowAnalysis _typeFlowAnalysis;
   final InferredTypeMetadataRepository _inferredTypeMetadata;
   final UnreachableNodeMetadataRepository _unreachableNodeMetadata;
+  final ProcedureAttributesMetadataRepository _procedureAttributesMetadata;
   final DartType _intType;
 
   AnnotateKernel(Component component, this._typeFlowAnalysis)
       : _inferredTypeMetadata = new InferredTypeMetadataRepository(),
         _unreachableNodeMetadata = new UnreachableNodeMetadataRepository(),
+        _procedureAttributesMetadata =
+            new ProcedureAttributesMetadataRepository(),
         _intType = _typeFlowAnalysis.environment.intType {
     component.addMetadataRepository(_inferredTypeMetadata);
     component.addMetadataRepository(_unreachableNodeMetadata);
+    component.addMetadataRepository(_procedureAttributesMetadata);
   }
 
   InferredType _convertType(Type type) {
@@ -205,6 +210,16 @@
 
         // TODO(alexmarkov): figure out how to pass receiver type.
       }
+
+      if (member.isInstanceMember &&
+          !(member is Procedure && member.isGetter)) {
+        final attrs = new ProcedureAttributesMetadata(
+            hasDynamicUses: _typeFlowAnalysis.isCalledDynamically(member),
+            hasThisUses: _typeFlowAnalysis.isCalledViaThis(member),
+            hasNonThisUses: _typeFlowAnalysis.isCalledNotViaThis(member),
+            hasTearOffUses: _typeFlowAnalysis.isTearOffTaken(member));
+        _procedureAttributesMetadata.mapping[member] = attrs;
+      }
     } else if (!member.isAbstract) {
       _setUnreachable(member);
     }
@@ -333,7 +348,7 @@
       }
       _usedClasses.add(c);
       visitIterable(c.supers, typeVisitor);
-      visitList(c.typeParameters, typeVisitor);
+      transformList(c.typeParameters, _pass1, c);
       transformList(c.annotations, _pass1, c);
       // Preserve NSM forwarders. They are overlooked by TFA / tree shaker
       // as they are abstract and don't have a body.
@@ -373,9 +388,9 @@
       }
 
       if (func != null) {
-        visitList(func.typeParameters, typeVisitor);
-        visitList(func.positionalParameters, typeVisitor);
-        visitList(func.namedParameters, typeVisitor);
+        transformList(func.typeParameters, _pass1, func);
+        transformList(func.positionalParameters, _pass1, func);
+        transformList(func.namedParameters, _pass1, func);
         func.returnType.accept(typeVisitor);
       }
 
@@ -386,7 +401,10 @@
   void addUsedTypedef(Typedef typedef) {
     if (_usedTypedefs.add(typedef)) {
       transformList(typedef.annotations, _pass1, typedef);
-      visitList(typedef.typeParameters, typeVisitor);
+      transformList(typedef.typeParameters, _pass1, typedef);
+      transformList(typedef.typeParametersOfFunctionType, _pass1, typedef);
+      transformList(typedef.positionalParameters, _pass1, typedef);
+      transformList(typedef.namedParameters, _pass1, typedef);
       typedef.type?.accept(typeVisitor);
     }
   }
@@ -957,6 +975,7 @@
   visitInstanceConstant(InstanceConstant constant) {
     instanceConstants.add(constant);
     shaker.addClassUsedInType(constant.klass);
+    visitList(constant.typeArguments, typeVisitor);
     constant.fieldValues.forEach((Reference fieldRef, Constant value) {
       shaker.addUsedMember(fieldRef.asField);
       analyzeConstant(value);
diff --git a/pkg/vm/test/bytecode/gen_bytecode_test.dart b/pkg/vm/test/bytecode/gen_bytecode_test.dart
index 14dd026..87ff84c 100644
--- a/pkg/vm/test/bytecode/gen_bytecode_test.dart
+++ b/pkg/vm/test/bytecode/gen_bytecode_test.dart
@@ -4,10 +4,8 @@
 
 import 'dart:io';
 
-import 'package:front_end/src/api_prototype/compiler_options.dart'
-    show CompilerOptions;
-import 'package:front_end/src/api_prototype/compilation_message.dart'
-    show CompilationMessage;
+import 'package:front_end/src/api_unstable/vm.dart'
+    show CompilerOptions, DiagnosticMessage;
 import 'package:kernel/ast.dart';
 import 'package:kernel/kernel.dart';
 import 'package:test/test.dart';
@@ -27,9 +25,8 @@
 
   final options = new CompilerOptions()
     ..strongMode = true
-    ..reportMessages = true
-    ..onError = (CompilationMessage error) {
-      fail("Compilation error: ${error}");
+    ..onDiagnostic = (DiagnosticMessage message) {
+      fail("Compilation error: ${message.plainTextFormatted.join('\n')}");
     };
 
   await runWithFrontEndCompilerContext(source, options, component, () {
diff --git a/pkg/vm/test/common_test_utils.dart b/pkg/vm/test/common_test_utils.dart
index 0ed04c7..5ceddf7 100644
--- a/pkg/vm/test/common_test_utils.dart
+++ b/pkg/vm/test/common_test_utils.dart
@@ -5,9 +5,12 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:front_end/src/api_prototype/front_end.dart';
-import 'package:front_end/src/compute_platform_binaries_location.dart'
-    show computePlatformBinariesLocation;
+import 'package:front_end/src/api_unstable/vm.dart'
+    show
+        CompilerOptions,
+        DiagnosticMessage,
+        computePlatformBinariesLocation,
+        kernelForProgram;
 import 'package:kernel/ast.dart';
 import 'package:kernel/text/ast_to_text.dart' show Printer;
 import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
@@ -35,9 +38,8 @@
     ..strongMode = true
     ..target = target
     ..linkedDependencies = <Uri>[platformKernel]
-    ..reportMessages = true
-    ..onError = (CompilationMessage error) {
-      fail("Compilation error: ${error}");
+    ..onDiagnostic = (DiagnosticMessage message) {
+      fail("Compilation error: ${message.plainTextFormatted.join('\n')}");
     };
 
   final Component component = await kernelForProgram(sourceUri, options);
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index fead08b..5f9c1e0 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -6,9 +6,8 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:front_end/src/api_prototype/compilation_message.dart';
-import 'package:front_end/src/api_prototype/compiler_options.dart';
-import 'package:front_end/src/compute_platform_binaries_location.dart';
+import 'package:front_end/src/api_unstable/vm.dart'
+    show CompilerOptions, DiagnosticMessage, computePlatformBinariesLocation;
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
 import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/binary/limited_ast_to_binary.dart';
@@ -33,9 +32,8 @@
     ..strongMode = true
     ..target = new VmTarget(new TargetFlags(strongMode: true))
     ..linkedDependencies = <Uri>[platformKernel]
-    ..reportMessages = true
-    ..onError = (CompilationMessage error) {
-      fail("Compilation error: ${error}");
+    ..onDiagnostic = (DiagnosticMessage message) {
+      fail("Compilation error: ${message.plainTextFormatted.join('\n')}");
     };
 
   group('basic', () {
diff --git a/pkg/vm/testcases/bytecode/asserts.dart.expect b/pkg/vm/testcases/bytecode/asserts.dart.expect
index d6a69ba..2194f84 100644
--- a/pkg/vm/testcases/bytecode/asserts.dart.expect
+++ b/pkg/vm/testcases/bytecode/asserts.dart.expect
@@ -9,9 +9,7 @@
   JumpIfNoAsserts      L1
   Push                 FP[-5]
   AssertBoolean        0
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   PushInt              0
   PushInt              0
   PushNull
@@ -37,9 +35,7 @@
   Push                 FP[-6]
   InstanceCall         1, CP#1
   AssertBoolean        0
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   PushInt              0
   PushInt              0
   Push                 FP[-5]
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index 9b27c2d..b5d1e82 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -78,8 +78,7 @@
   LoadContextVar       5
   StoreLocal           r5
   PushInt              0
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
   StoreContextVar      7
@@ -104,8 +103,8 @@
   PushNull
   ReturnTOS
 L4:
-  IfEqNull             r2
-  Jump                 L2
+  Push                 r2
+  JumpIfNull           L2
   Push                 r2
   Push                 r3
   Throw                1
@@ -167,9 +166,9 @@
   Push                 FP[-5]
   StoreContextVar      0
   Push                 FP[-5]
-  PushNull
-  PushNull
   PushConstant         CP#3
+  PushNull
+  PushNull
   PushConstant         CP#4
   AssertAssignable     0, CP#5
   Drop1
@@ -392,8 +391,7 @@
   LoadContextVar       2
   StoreLocal           r5
   PushInt              0
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfNeStrict       L1
   Push                 r4
   PopLocal             r6
 Try #0 start:
@@ -602,8 +600,7 @@
   LoadContextVar       6
   StoreLocal           r5
   PushInt              0
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
   StoreContextVar      8
@@ -628,8 +625,8 @@
   PushNull
   ReturnTOS
 L6:
-  IfEqNull             r2
-  Jump                 L2
+  Push                 r2
+  JumpIfNull           L2
   Push                 r2
   Push                 r3
   Throw                1
@@ -657,8 +654,8 @@
   PushNull
   ReturnTOS
 L7:
-  IfEqNull             r2
-  Jump                 L3
+  Push                 r2
+  JumpIfNull           L3
   Push                 r2
   Push                 r3
   Throw                1
@@ -712,8 +709,7 @@
   PopLocal             r4
   Push                 r5
   PushInt              1
-  IfEqStrictTOS
-  Jump                 L6
+  JumpIfEqStrict       L6
   Jump                 L7
 
 }
@@ -790,50 +786,50 @@
   PushNull
   StoreContextVar      9
   Push                 r0
-  Allocate             CP#28
+  Allocate             CP#22
   StoreLocal           r3
   Push                 r3
   PushNull
-  StoreFieldTOS        CP#29
+  StoreFieldTOS        CP#23
   Push                 r3
   PushNull
-  StoreFieldTOS        CP#31
+  StoreFieldTOS        CP#25
   Push                 r3
-  PushConstant         CP#33
-  StoreFieldTOS        CP#34
+  PushConstant         CP#27
+  StoreFieldTOS        CP#28
   Push                 r3
   PushConstant         CP#3
-  StoreFieldTOS        CP#36
+  StoreFieldTOS        CP#30
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#5
   StoreContextVar      10
   Push                 r0
   LoadContextVar       10
-  PushConstant         CP#38
+  PushConstant         CP#32
   IndirectStaticCall   1, CP#1
   PopLocal             r2
   Push                 r0
   Push                 r0
   LoadContextVar       10
-  PushConstant         CP#39
+  PushConstant         CP#33
   IndirectStaticCall   1, CP#1
   StoreContextVar      3
   Push                 r0
   Push                 r0
   LoadContextVar       10
-  PushConstant         CP#40
+  PushConstant         CP#34
   IndirectStaticCall   1, CP#1
   StoreContextVar      4
-  PushConstant         CP#41
+  PushConstant         CP#35
   Push                 r0
   LoadContextVar       10
-  PushConstant         CP#42
-  IndirectStaticCall   2, CP#7
+  PushConstant         CP#36
+  IndirectStaticCall   2, CP#14
   Drop1
   Push                 r0
   LoadContextVar       1
-  InstanceCall         1, CP#43
+  InstanceCall         1, CP#37
   ReturnTOS
   PushNull
   ReturnTOS
@@ -846,43 +842,37 @@
   [4] = Null
   [5] = InstanceField dart.core::_Closure::_context
   [6] = Reserved
-  [7] = ArgDesc num-args 2, num-type-args 0, names []
-  [8] = ICData target-name '<', arg-desc CP#7
-  [9] = ICData get target-name 'iterator', arg-desc CP#1
-  [10] = ICData target-name 'moveNext', arg-desc CP#1
-  [11] = ICData get target-name 'current', arg-desc CP#1
-  [12] = ICData target-name '+', arg-desc CP#7
-  [13] = ArgDesc num-args 0, num-type-args 0, names []
-  [14] = StaticICData target '#lib::foo', arg-desc CP#13
-  [15] = ArgDesc num-args 4, num-type-args 0, names []
-  [16] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#15
-  [17] = ICData target-name '+', arg-desc CP#7
-  [18] = ICData target-name '+', arg-desc CP#7
-  [19] = ICData target-name '+', arg-desc CP#7
-  [20] = ICData target-name '<', arg-desc CP#7
-  [21] = ICData target-name '+', arg-desc CP#7
-  [22] = ICData target-name '+', arg-desc CP#7
-  [23] = StaticICData target 'dart.async::_completeOnAsyncReturn', arg-desc CP#7
-  [24] = Type dynamic
-  [25] = ArgDesc num-args 3, num-type-args 0, names []
-  [26] = ICData target-name 'completeError', arg-desc CP#25
-  [27] = EndClosureFunctionScope
-  [28] = Class dart.core::_Closure
-  [29] = InstanceField dart.core::_Closure::_instantiator_type_arguments
-  [30] = Reserved
-  [31] = InstanceField dart.core::_Closure::_function_type_arguments
-  [32] = Reserved
-  [33] = EmptyTypeArguments
-  [34] = InstanceField dart.core::_Closure::_delayed_type_arguments
-  [35] = Reserved
-  [36] = InstanceField dart.core::_Closure::_function
-  [37] = Reserved
-  [38] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#1
-  [39] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#1
-  [40] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#1
-  [41] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
-  [42] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#7
-  [43] = ICData get target-name 'future', arg-desc CP#1
+  [7] = ICData get target-name 'iterator', arg-desc CP#1
+  [8] = ICData target-name 'moveNext', arg-desc CP#1
+  [9] = ICData get target-name 'current', arg-desc CP#1
+  [10] = ArgDesc num-args 0, num-type-args 0, names []
+  [11] = StaticICData target '#lib::foo', arg-desc CP#10
+  [12] = ArgDesc num-args 4, num-type-args 0, names []
+  [13] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#12
+  [14] = ArgDesc num-args 2, num-type-args 0, names []
+  [15] = ICData target-name '+', arg-desc CP#14
+  [16] = ICData target-name '+', arg-desc CP#14
+  [17] = StaticICData target 'dart.async::_completeOnAsyncReturn', arg-desc CP#14
+  [18] = Type dynamic
+  [19] = ArgDesc num-args 3, num-type-args 0, names []
+  [20] = ICData target-name 'completeError', arg-desc CP#19
+  [21] = EndClosureFunctionScope
+  [22] = Class dart.core::_Closure
+  [23] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [24] = Reserved
+  [25] = InstanceField dart.core::_Closure::_function_type_arguments
+  [26] = Reserved
+  [27] = EmptyTypeArguments
+  [28] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [29] = Reserved
+  [30] = InstanceField dart.core::_Closure::_function
+  [31] = Reserved
+  [32] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#1
+  [33] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#1
+  [34] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#1
+  [35] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
+  [36] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#14
+  [37] = ICData get target-name 'future', arg-desc CP#1
 }
 Closure CP#3 {
   EntryOptional        1, 3, 0
@@ -898,8 +888,7 @@
   LoadContextVar       5
   StoreLocal           r5
   PushInt              0
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
   StoreContextVar      7
@@ -927,16 +916,14 @@
   Push                 r4
   LoadContextVar       0
   PushInt              10
-  InstanceCall         2, CP#8
+  CompareIntLt
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L2
+  JumpIfFalse          L2
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextVar       0
-  InstanceCall         1, CP#9
+  InstanceCall         1, CP#7
   PopLocal             r8
   Push                 r4
   Push                 r8
@@ -946,10 +933,8 @@
   Push                 r4
   LoadContextVar       1
   StoreLocal           r8
-  InstanceCall         1, CP#10
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L3
+  InstanceCall         1, CP#8
+  JumpIfFalse          L3
   AllocateContext      1
   StoreLocal           r5
   Push                 r5
@@ -958,7 +943,7 @@
   PopLocal             r4
   Push                 r4
   Push                 r8
-  InstanceCall         1, CP#11
+  InstanceCall         1, CP#9
   StoreContextVar      0
   Push                 r4
   LoadContextParent
@@ -978,7 +963,7 @@
   LoadContextVar       0
   Push                 r4
   LoadContextVar       0
-  InstanceCall         2, CP#12
+  AddInt
   StoreContextVar      8
   Push                 r4
   LoadContextParent
@@ -992,8 +977,8 @@
   LoadContextParent
   Push                 r4
   StoreContextVar      6
-  PushConstant         CP#14
-  IndirectStaticCall   0, CP#13
+  PushConstant         CP#11
+  IndirectStaticCall   0, CP#10
   Push                 r4
   LoadContextParent
   LoadContextParent
@@ -1009,14 +994,14 @@
   LoadContextParent
   LoadContextParent
   LoadContextVar       10
-  PushConstant         CP#16
-  IndirectStaticCall   4, CP#15
+  PushConstant         CP#13
+  IndirectStaticCall   4, CP#12
   PopLocal             r10
   PushNull
   ReturnTOS
 L11:
-  IfEqNull             r2
-  Jump                 L4
+  Push                 r2
+  JumpIfNull           L4
   Push                 r2
   Push                 r3
   Throw                1
@@ -1035,8 +1020,8 @@
   LoadContextParent
   LoadContextVar       8
   Push                 r1
-  InstanceCall         2, CP#17
-  InstanceCall         2, CP#18
+  InstanceCall         2, CP#15
+  InstanceCall         2, CP#16
   StoreContextVar      0
   Push                 r4
   LoadContextParent
@@ -1050,7 +1035,7 @@
   Push                 r4
   LoadContextVar       0
   PushInt              1
-  InstanceCall         2, CP#19
+  AddInt
   StoreLocal           r8
   StoreContextVar      0
   Push                 r8
@@ -1066,20 +1051,18 @@
   CheckStack
   Push                 r8
   PushInt              10
-  InstanceCall         2, CP#20
+  CompareIntLt
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L7
+  JumpIfFalse          L7
   Push                 r4
   Push                 r4
   LoadContextVar       0
   Push                 r8
-  InstanceCall         2, CP#21
+  AddInt
   StoreContextVar      0
   Push                 r8
   PushInt              1
-  InstanceCall         2, CP#22
+  AddInt
   StoreLocal           r8
   Drop1
   Jump                 L8
@@ -1101,8 +1084,8 @@
   LoadContextVar       1
   Push                 r4
   LoadContextVar       2
-  PushConstant         CP#23
-  IndirectStaticCall   2, CP#7
+  PushConstant         CP#17
+  IndirectStaticCall   2, CP#14
   Drop1
   PushNull
   ReturnTOS
@@ -1126,7 +1109,7 @@
   LoadContextVar       1
   Push                 r8
   Push                 r9
-  InstanceCall         3, CP#26
+  InstanceCall         3, CP#20
   Drop1
   Jump                 L10
 L10:
@@ -1299,7 +1282,7 @@
   [10] = ICData target-name '+', arg-desc CP#9
   [11] = Type dynamic
   [12] = Type dart.core::Error
-  [13] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#7
+  [13] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#9
   [14] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#7
   [15] = ICData target-name '+', arg-desc CP#9
   [16] = String 'fin'
@@ -1347,8 +1330,7 @@
   LoadContextVar       7
   StoreLocal           r5
   PushInt              0
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
   StoreContextVar      9
@@ -1403,8 +1385,8 @@
   PushNull
   ReturnTOS
 L13:
-  IfEqNull             r2
-  Jump                 L2
+  Push                 r2
+  JumpIfNull           L2
   Push                 r2
   Push                 r3
   Throw                1
@@ -1441,14 +1423,10 @@
   StoreContextVar      1
   Push                 r4
   LoadContextVar       1
-  PushNull
-  PushNull
   PushConstant         CP#12
-  InstanceCall         4, CP#13
+  InstanceCall         2, CP#13
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L4
+  JumpIfFalse          L4
   Push                 r4
   LoadContextParent
   PushInt              42
@@ -1486,8 +1464,8 @@
   PushNull
   ReturnTOS
 L14:
-  IfEqNull             r2
-  Jump                 L6
+  Push                 r2
+  JumpIfNull           L6
   Push                 r2
   Push                 r3
   Throw                1
@@ -1564,8 +1542,8 @@
   PushNull
   ReturnTOS
 L15:
-  IfEqNull             r2
-  Jump                 L8
+  Push                 r2
+  JumpIfNull           L8
   Push                 r2
   Push                 r3
   Throw                1
@@ -1635,8 +1613,8 @@
   PushNull
   ReturnTOS
 L16:
-  IfEqNull             r2
-  Jump                 L10
+  Push                 r2
+  JumpIfNull           L10
   Push                 r2
   Push                 r3
   Throw                1
@@ -1703,8 +1681,8 @@
   PushNull
   ReturnTOS
 L17:
-  IfEqNull             r2
-  Jump                 L11
+  Push                 r2
+  JumpIfNull           L11
   Push                 r2
   Push                 r3
   Throw                1
@@ -1770,20 +1748,16 @@
   PopLocal             r4
   Push                 r5
   PushInt              1
-  IfEqStrictTOS
-  Jump                 L13
+  JumpIfEqStrict       L13
   Push                 r5
   PushInt              2
-  IfEqStrictTOS
-  Jump                 L14
+  JumpIfEqStrict       L14
   Push                 r5
   PushInt              3
-  IfEqStrictTOS
-  Jump                 L15
+  JumpIfEqStrict       L15
   Push                 r5
   PushInt              4
-  IfEqStrictTOS
-  Jump                 L16
+  JumpIfEqStrict       L16
   Jump                 L17
 
 }
@@ -1855,20 +1829,20 @@
   Push                 r0
   PushInt              3
   StoreContextVar      1
-  Allocate             CP#21
+  Allocate             CP#20
   StoreLocal           r3
   Push                 r3
   PushNull
-  StoreFieldTOS        CP#22
+  StoreFieldTOS        CP#21
   Push                 r3
   PushNull
-  StoreFieldTOS        CP#24
+  StoreFieldTOS        CP#23
   Push                 r3
-  PushConstant         CP#26
-  StoreFieldTOS        CP#27
+  PushConstant         CP#25
+  StoreFieldTOS        CP#26
   Push                 r3
   PushConstant         CP#0
-  StoreFieldTOS        CP#29
+  StoreFieldTOS        CP#28
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#1
@@ -1889,34 +1863,33 @@
   [7] = Null
   [8] = ArgDesc num-args 4, num-type-args 0, names []
   [9] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#8
-  [10] = ArgDesc num-args 2, num-type-args 0, names []
-  [11] = ICData target-name '+', arg-desc CP#10
-  [12] = Type dynamic
-  [13] = String 'fin'
+  [10] = Type dynamic
+  [11] = String 'fin'
+  [12] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [13] = StaticICData target 'dart.core::print', arg-desc CP#4
   [14] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [15] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [16] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [17] = StaticICData target 'dart.async::_completeOnAsyncReturn', arg-desc CP#10
-  [18] = ArgDesc num-args 3, num-type-args 0, names []
-  [19] = ICData target-name 'completeError', arg-desc CP#18
-  [20] = EndClosureFunctionScope
-  [21] = Class dart.core::_Closure
-  [22] = InstanceField dart.core::_Closure::_instantiator_type_arguments
-  [23] = Reserved
-  [24] = InstanceField dart.core::_Closure::_function_type_arguments
-  [25] = Reserved
-  [26] = EmptyTypeArguments
-  [27] = InstanceField dart.core::_Closure::_delayed_type_arguments
-  [28] = Reserved
-  [29] = InstanceField dart.core::_Closure::_function
-  [30] = Reserved
-  [31] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#4
-  [32] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#4
-  [33] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#4
-  [34] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
-  [35] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#10
-  [36] = ICData get target-name 'future', arg-desc CP#4
-  [37] = EndClosureFunctionScope
+  [15] = ArgDesc num-args 2, num-type-args 0, names []
+  [16] = StaticICData target 'dart.async::_completeOnAsyncReturn', arg-desc CP#15
+  [17] = ArgDesc num-args 3, num-type-args 0, names []
+  [18] = ICData target-name 'completeError', arg-desc CP#17
+  [19] = EndClosureFunctionScope
+  [20] = Class dart.core::_Closure
+  [21] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [22] = Reserved
+  [23] = InstanceField dart.core::_Closure::_function_type_arguments
+  [24] = Reserved
+  [25] = EmptyTypeArguments
+  [26] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [27] = Reserved
+  [28] = InstanceField dart.core::_Closure::_function
+  [29] = Reserved
+  [30] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#4
+  [31] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#4
+  [32] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#4
+  [33] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
+  [34] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#15
+  [35] = ICData get target-name 'future', arg-desc CP#4
+  [36] = EndClosureFunctionScope
 }
 Closure CP#6 {
   EntryOptional        1, 3, 0
@@ -1932,8 +1905,7 @@
   LoadContextVar       4
   StoreLocal           r5
   PushInt              0
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
   StoreContextVar      6
@@ -1984,8 +1956,8 @@
   PushNull
   ReturnTOS
 L7:
-  IfEqNull             r2
-  Jump                 L2
+  Push                 r2
+  JumpIfNull           L2
   Push                 r2
   Push                 r3
   Throw                1
@@ -2001,7 +1973,7 @@
   LoadContextVar       1
   Push                 r4
   LoadContextVar       0
-  InstanceCall         2, CP#11
+  AddInt
   StoreContextVar      1
   Jump                 L3
   Jump                 L4
@@ -2016,8 +1988,8 @@
   PopLocal             r4
   MoveSpecial          r8, exception
   MoveSpecial          r9, stackTrace
-  PushConstant         CP#13
-  PushConstant         CP#14
+  PushConstant         CP#11
+  PushConstant         CP#12
   IndirectStaticCall   1, CP#4
   Drop1
   Push                 r8
@@ -2030,8 +2002,8 @@
   Push                 r4
   LoadContextVar       7
   PopLocal             r4
+  PushConstant         CP#11
   PushConstant         CP#13
-  PushConstant         CP#15
   IndirectStaticCall   1, CP#4
   Drop1
   Push                 r4
@@ -2045,8 +2017,8 @@
   Push                 r4
   LoadContextVar       7
   PopLocal             r4
-  PushConstant         CP#13
-  PushConstant         CP#16
+  PushConstant         CP#11
+  PushConstant         CP#14
   IndirectStaticCall   1, CP#4
   Drop1
   Push                 r4
@@ -2057,8 +2029,8 @@
   LoadContextVar       0
   Push                 r4
   LoadContextVar       1
-  PushConstant         CP#17
-  IndirectStaticCall   2, CP#10
+  PushConstant         CP#16
+  IndirectStaticCall   2, CP#15
   Drop1
   PushNull
   ReturnTOS
@@ -2082,7 +2054,7 @@
   LoadContextVar       0
   Push                 r8
   Push                 r9
-  InstanceCall         3, CP#19
+  InstanceCall         3, CP#18
   Drop1
   Jump                 L6
 L6:
@@ -2137,50 +2109,50 @@
   PushNull
   StoreContextVar      7
   Push                 r0
-  Allocate             CP#21
+  Allocate             CP#20
   StoreLocal           r3
   Push                 r3
   PushNull
-  StoreFieldTOS        CP#22
+  StoreFieldTOS        CP#21
   Push                 r3
   PushNull
-  StoreFieldTOS        CP#24
+  StoreFieldTOS        CP#23
   Push                 r3
-  PushConstant         CP#26
-  StoreFieldTOS        CP#27
+  PushConstant         CP#25
+  StoreFieldTOS        CP#26
   Push                 r3
   PushConstant         CP#6
-  StoreFieldTOS        CP#29
+  StoreFieldTOS        CP#28
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#1
   StoreContextVar      8
   Push                 r0
   LoadContextVar       8
-  PushConstant         CP#31
+  PushConstant         CP#30
   IndirectStaticCall   1, CP#4
   PopLocal             r2
   Push                 r0
   Push                 r0
   LoadContextVar       8
-  PushConstant         CP#32
+  PushConstant         CP#31
   IndirectStaticCall   1, CP#4
   StoreContextVar      2
   Push                 r0
   Push                 r0
   LoadContextVar       8
-  PushConstant         CP#33
+  PushConstant         CP#32
   IndirectStaticCall   1, CP#4
   StoreContextVar      3
-  PushConstant         CP#34
+  PushConstant         CP#33
   Push                 r0
   LoadContextVar       8
-  PushConstant         CP#35
-  IndirectStaticCall   2, CP#10
+  PushConstant         CP#34
+  IndirectStaticCall   2, CP#15
   Drop1
   Push                 r0
   LoadContextVar       0
-  InstanceCall         1, CP#36
+  InstanceCall         1, CP#35
   ReturnTOS
   Push                 r0
   LoadContextParent
@@ -2363,8 +2335,7 @@
   LoadContextVar       5
   StoreLocal           r5
   PushInt              0
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
   StoreContextVar      7
@@ -2390,8 +2361,8 @@
   PushNull
   ReturnTOS
 L6:
-  IfEqNull             r2
-  Jump                 L3
+  Push                 r2
+  JumpIfNull           L3
   Push                 r2
   Push                 r3
   Throw                1
@@ -2401,9 +2372,7 @@
   PushInt              42
   InstanceCall         2, CP#10
   AssertBoolean        0
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L2
+  JumpIfTrue           L2
   PushInt              0
   PushInt              0
   PushNull
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
index c14b6ae..1d4b344 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
@@ -21,7 +21,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::_ScheduleImmediate
     : super core::Object::•()
     ;
 }
@@ -42,7 +42,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  constructor _() → void
+]  constructor _() → self::_NamespaceImpl
     : super core::Object::•()
     ;
 [@vm.bytecode=
@@ -118,22 +118,19 @@
   CheckStack
   PushConstant         CP#0
   PushStatic           CP#0
-  PushNull
-  InstanceCall         2, CP#2
+  EqualsNull
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
-  Allocate             CP#3
+  JumpIfFalse          L1
+  Allocate             CP#1
   StoreLocal           r1
   Push                 r1
-  PushConstant         CP#5
-  IndirectStaticCall   1, CP#4
+  PushConstant         CP#3
+  IndirectStaticCall   1, CP#2
   Drop1
+  PushConstant         CP#5
+  IndirectStaticCall   0, CP#4
   PushConstant         CP#7
-  IndirectStaticCall   0, CP#6
-  PushConstant         CP#8
-  IndirectStaticCall   2, CP#1
+  IndirectStaticCall   2, CP#6
   StoreStaticTOS       CP#0
 L1:
   PushConstant         CP#0
@@ -144,14 +141,13 @@
 }
 ConstantPool {
   [0] = StaticField #lib::_NamespaceImpl::_cachedNamespace
-  [1] = ArgDesc num-args 2, num-type-args 0, names []
-  [2] = ICData target-name '==', arg-desc CP#1
-  [3] = Class #lib::_NamespaceImpl
-  [4] = ArgDesc num-args 1, num-type-args 0, names []
-  [5] = StaticICData target '#lib::_NamespaceImpl::_', arg-desc CP#4
-  [6] = ArgDesc num-args 0, num-type-args 0, names []
-  [7] = StaticICData target '#lib::_NamespaceImpl::_getDefault', arg-desc CP#6
-  [8] = StaticICData target '#lib::_NamespaceImpl::_create', arg-desc CP#1
+  [1] = Class #lib::_NamespaceImpl
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [3] = StaticICData target '#lib::_NamespaceImpl::_', arg-desc CP#2
+  [4] = ArgDesc num-args 0, num-type-args 0, names []
+  [5] = StaticICData target '#lib::_NamespaceImpl::_getDefault', arg-desc CP#4
+  [6] = ArgDesc num-args 2, num-type-args 0, names []
+  [7] = StaticICData target '#lib::_NamespaceImpl::_create', arg-desc CP#6
 }
 ]  static get _namespace() → self::_NamespaceImpl {
     if(self::_NamespaceImpl::_cachedNamespace.{core::Object::==}(null)) {
@@ -196,7 +192,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::_Namespace
     : super core::Object::•()
     ;
 [@vm.bytecode=
@@ -277,7 +273,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::VMLibraryHooks
     : super core::Object::•()
     ;
 [@vm.bytecode=
@@ -305,16 +301,12 @@
   CheckStack
   PushConstant         CP#0
   PushStatic           CP#0
-  PushNull
-  InstanceCall         2, CP#2
+  EqualsNull
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
-  PushConstant         CP#3
-  PushStatic           CP#3
-  PushNull
-  InstanceCall         2, CP#4
+  JumpIfFalse          L1
+  PushConstant         CP#1
+  PushStatic           CP#1
+  EqualsNull
   AssertBoolean        0
   BooleanNegateTOS
   PopLocal             r0
@@ -325,12 +317,10 @@
 L2:
   Push                 r0
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L3
-  PushConstant         CP#3
-  PushStatic           CP#3
-  InstanceCall         1, CP#6
+  JumpIfFalse          L3
+  PushConstant         CP#1
+  PushStatic           CP#1
+  InstanceCall         1, CP#3
   StoreStaticTOS       CP#0
 L3:
   PushConstant         CP#0
@@ -341,12 +331,9 @@
 }
 ConstantPool {
   [0] = StaticField #lib::VMLibraryHooks::_cachedScript
-  [1] = ArgDesc num-args 2, num-type-args 0, names []
-  [2] = ICData target-name '==', arg-desc CP#1
-  [3] = StaticField #lib::VMLibraryHooks::_computeScriptUri
-  [4] = ICData target-name '==', arg-desc CP#1
-  [5] = ArgDesc num-args 1, num-type-args 0, names []
-  [6] = ICData dynamic target-name 'call', arg-desc CP#5
+  [1] = StaticField #lib::VMLibraryHooks::_computeScriptUri
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [3] = ICData dynamic target-name 'call', arg-desc CP#2
 }
 ]  static get platformScript() → dynamic {
     if(self::VMLibraryHooks::_cachedScript.{core::Object::==}(null) && !self::VMLibraryHooks::_computeScriptUri.{core::Object::==}(null)) {
@@ -453,9 +440,7 @@
   PushConstant         CP#1
   InstanceCall         2, CP#3
   AssertBoolean        0
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   PushConstant         CP#0
   PushStatic           CP#0
   PushConstant         CP#4
@@ -469,9 +454,7 @@
 L2:
   Push                 r1
   AssertBoolean        0
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L3
+  JumpIfTrue           L3
   PushConstant         CP#0
   PushStatic           CP#0
   PushConstant         CP#6
@@ -485,9 +468,7 @@
 L4:
   Push                 r0
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L5
+  JumpIfFalse          L5
   PushConstant         CP#0
   PushStatic           CP#0
   PushConstant         CP#9
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index af62c71..247038a 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -19,7 +19,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::C1
     : super core::Object::•()
     ;
 }
@@ -39,7 +39,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::C2
     : super core::Object::•()
     ;
 }
@@ -59,7 +59,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::C3
     : super core::Object::•()
     ;
 }
@@ -79,7 +79,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::C4
     : super core::Object::•()
     ;
 }
@@ -99,7 +99,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::C5
     : super core::Object::•()
     ;
 }
@@ -119,7 +119,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::C6
     : super core::Object::•()
     ;
 }
@@ -139,7 +139,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::C7
     : super core::Object::•()
     ;
 }
@@ -159,7 +159,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::C8
     : super core::Object::•()
     ;
 }
@@ -179,7 +179,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::A<self::A::T1, self::A::T2>
     : super core::Object::•()
     ;
 [@vm.bytecode=
@@ -367,8 +367,7 @@
   LoadFieldTOS         CP#3
   StoreLocal           r0
   PushConstant         CP#5
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfEqStrict       L1
   CheckFunctionTypeArgs 0, 2
   Jump                 L2
 L1:
@@ -420,8 +419,7 @@
   LoadFieldTOS         CP#3
   StoreLocal           r0
   PushConstant         CP#5
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfEqStrict       L1
   CheckFunctionTypeArgs 0, 2
   Jump                 L2
 L1:
@@ -501,7 +499,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 [@vm.bytecode=
@@ -521,69 +519,69 @@
   Push                 r0
   PushInt              3
   StoreContextVar      2
-  Allocate             CP#15
+  Allocate             CP#10
   StoreLocal           r4
   Push                 r4
   PushNull
-  StoreFieldTOS        CP#16
+  StoreFieldTOS        CP#11
   Push                 r4
   PushNull
-  StoreFieldTOS        CP#18
+  StoreFieldTOS        CP#13
   Push                 r4
-  PushConstant         CP#20
-  StoreFieldTOS        CP#21
+  PushConstant         CP#15
+  StoreFieldTOS        CP#16
   Push                 r4
   PushConstant         CP#0
-  StoreFieldTOS        CP#23
+  StoreFieldTOS        CP#18
   Push                 r4
   Push                 r0
   StoreFieldTOS        CP#1
   PopLocal             r3
   Push                 r3
   PushInt              10
-  InstanceCall         2, CP#28
+  InstanceCall         2, CP#24
   Drop1
   Push                 r3
   PushInt              11
-  InstanceCall         2, CP#29
+  InstanceCall         2, CP#25
   Drop1
   Push                 r2
-  PushConstant         CP#30
-  IndirectStaticCall   1, CP#11
+  PushConstant         CP#26
+  IndirectStaticCall   1, CP#7
   Drop1
   Push                 r0
   LoadContextVar       2
-  PushConstant         CP#31
-  IndirectStaticCall   1, CP#11
+  PushConstant         CP#27
+  IndirectStaticCall   1, CP#7
   Drop1
   Push                 r0
   LoadContextVar       1
-  PushConstant         CP#32
-  IndirectStaticCall   1, CP#11
+  PushConstant         CP#28
+  IndirectStaticCall   1, CP#7
   Drop1
   Push                 r0
   PushInt              42
   StoreContextVar      3
-  Allocate             CP#15
+  Allocate             CP#10
   StoreLocal           r3
   Push                 r3
   PushNull
-  StoreFieldTOS        CP#16
+  StoreFieldTOS        CP#11
   Push                 r3
   PushNull
+  StoreFieldTOS        CP#13
+  Push                 r3
+  PushConstant         CP#15
+  StoreFieldTOS        CP#16
+  Push                 r3
+  PushConstant         CP#29
   StoreFieldTOS        CP#18
   Push                 r3
-  PushConstant         CP#20
-  StoreFieldTOS        CP#21
-  Push                 r3
-  PushConstant         CP#33
-  StoreFieldTOS        CP#23
-  Push                 r3
   Push                 r0
   StoreFieldTOS        CP#1
   PopLocal             r2
   Push                 r2
-  InstanceCall         1, CP#36
+  InstanceCall         1, CP#32
   Drop1
   PushNull
   ReturnTOS
@@ -595,39 +593,35 @@
   [3] = Type dart.core::int
   [4] = String 'y'
   [5] = SubtypeTestCache
-  [6] = ArgDesc num-args 2, num-type-args 0, names []
-  [7] = ICData target-name '+', arg-desc CP#6
-  [8] = ICData target-name '>', arg-desc CP#6
-  [9] = ClosureFunction closure2 () → void;
-  [10] = ICData target-name '+', arg-desc CP#6
-  [11] = ArgDesc num-args 1, num-type-args 0, names []
-  [12] = ICData get target-name 'foo', arg-desc CP#11
-  [13] = ICData target-name '+', arg-desc CP#6
-  [14] = EndClosureFunctionScope
-  [15] = Class dart.core::_Closure
-  [16] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [6] = ClosureFunction closure2 () → void;
+  [7] = ArgDesc num-args 1, num-type-args 0, names []
+  [8] = ICData get target-name 'foo', arg-desc CP#7
+  [9] = EndClosureFunctionScope
+  [10] = Class dart.core::_Closure
+  [11] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [12] = Reserved
+  [13] = InstanceField dart.core::_Closure::_function_type_arguments
+  [14] = Reserved
+  [15] = EmptyTypeArguments
+  [16] = InstanceField dart.core::_Closure::_delayed_type_arguments
   [17] = Reserved
-  [18] = InstanceField dart.core::_Closure::_function_type_arguments
+  [18] = InstanceField dart.core::_Closure::_function
   [19] = Reserved
-  [20] = EmptyTypeArguments
-  [21] = InstanceField dart.core::_Closure::_delayed_type_arguments
-  [22] = Reserved
-  [23] = InstanceField dart.core::_Closure::_function
-  [24] = Reserved
-  [25] = ICData dynamic target-name 'call', arg-desc CP#11
-  [26] = StaticICData target 'dart.core::print', arg-desc CP#11
-  [27] = EndClosureFunctionScope
-  [28] = ICData dynamic target-name 'call', arg-desc CP#6
-  [29] = ICData dynamic target-name 'call', arg-desc CP#6
-  [30] = StaticICData target 'dart.core::print', arg-desc CP#11
-  [31] = StaticICData target 'dart.core::print', arg-desc CP#11
-  [32] = StaticICData target 'dart.core::print', arg-desc CP#11
-  [33] = ClosureFunction <anonymous closure> () → dart.core::Null;
-  [34] = ICData set target-name 'foo', arg-desc CP#6
-  [35] = EndClosureFunctionScope
-  [36] = ICData dynamic target-name 'call', arg-desc CP#11
+  [20] = ICData dynamic target-name 'call', arg-desc CP#7
+  [21] = StaticICData target 'dart.core::print', arg-desc CP#7
+  [22] = EndClosureFunctionScope
+  [23] = ArgDesc num-args 2, num-type-args 0, names []
+  [24] = ICData dynamic target-name 'call', arg-desc CP#23
+  [25] = ICData dynamic target-name 'call', arg-desc CP#23
+  [26] = StaticICData target 'dart.core::print', arg-desc CP#7
+  [27] = StaticICData target 'dart.core::print', arg-desc CP#7
+  [28] = StaticICData target 'dart.core::print', arg-desc CP#7
+  [29] = ClosureFunction <anonymous closure> () → dart.core::Null;
+  [30] = ICData set target-name 'foo', arg-desc CP#23
+  [31] = EndClosureFunctionScope
+  [32] = ICData dynamic target-name 'call', arg-desc CP#7
 }
-Closure CP#9 {
+Closure CP#6 {
   EntryFixed           1, 3
   CheckStack
   Push                 FP[-5]
@@ -639,16 +633,16 @@
   LoadContextParent
   LoadContextVar       1
   PushInt              2
-  InstanceCall         2, CP#10
+  AddInt
   StoreContextVar      2
   Push                 r0
   Push                 r0
   LoadContextParent
   LoadContextVar       0
-  InstanceCall         1, CP#12
+  InstanceCall         1, CP#8
   Push                 r0
   LoadContextVar       0
-  InstanceCall         2, CP#13
+  AddInt
   StoreContextVar      1
   PushNull
   ReturnTOS
@@ -671,9 +665,9 @@
   Push                 FP[-5]
   StoreContextVar      0
   Push                 FP[-5]
-  PushNull
-  PushNull
   PushConstant         CP#3
+  PushNull
+  PushNull
   PushConstant         CP#4
   AssertAssignable     1, CP#5
   Drop1
@@ -682,45 +676,43 @@
   Push                 r0
   LoadContextVar       0
   PushInt              1
-  InstanceCall         2, CP#7
+  AddInt
   StoreContextVar      1
   Push                 r0
   LoadContextParent
   LoadContextVar       1
   PushInt              5
-  InstanceCall         2, CP#8
+  CompareIntGt
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   Push                 r0
   PushInt              4
   StoreContextVar      1
-  Allocate             CP#15
+  Allocate             CP#10
   StoreLocal           r2
   Push                 r2
   PushNull
-  StoreFieldTOS        CP#16
+  StoreFieldTOS        CP#11
   Push                 r2
   PushNull
+  StoreFieldTOS        CP#13
+  Push                 r2
+  PushConstant         CP#15
+  StoreFieldTOS        CP#16
+  Push                 r2
+  PushConstant         CP#6
   StoreFieldTOS        CP#18
   Push                 r2
-  PushConstant         CP#20
-  StoreFieldTOS        CP#21
-  Push                 r2
-  PushConstant         CP#9
-  StoreFieldTOS        CP#23
-  Push                 r2
   Push                 r0
   StoreFieldTOS        CP#1
   PopLocal             r3
   Push                 r3
-  InstanceCall         1, CP#25
+  InstanceCall         1, CP#20
   Drop1
   Push                 r0
   LoadContextVar       1
-  PushConstant         CP#26
-  IndirectStaticCall   1, CP#11
+  PushConstant         CP#21
+  IndirectStaticCall   1, CP#7
   Drop1
 L1:
   PushNull
@@ -728,7 +720,7 @@
 
 }
 
-Closure CP#33 {
+Closure CP#29 {
   EntryFixed           1, 3
   CheckStack
   Push                 FP[-5]
@@ -738,7 +730,7 @@
   LoadContextVar       0
   Push                 r0
   LoadContextVar       3
-  InstanceCall         2, CP#34
+  InstanceCall         2, CP#30
   Drop1
   PushNull
   ReturnTOS
@@ -794,7 +786,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 [@vm.bytecode=
@@ -838,50 +830,48 @@
   Push                 r0
   LoadContextVar       0
   PushInt              10
-  InstanceCall         2, CP#4
+  CompareIntLt
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   Push                 r2
-  Allocate             CP#10
+  Allocate             CP#8
   StoreLocal           r3
   Push                 r3
   PushNull
+  StoreFieldTOS        CP#9
+  Push                 r3
+  PushNull
   StoreFieldTOS        CP#11
   Push                 r3
-  PushNull
-  StoreFieldTOS        CP#13
+  PushConstant         CP#13
+  StoreFieldTOS        CP#14
   Push                 r3
-  PushConstant         CP#15
+  PushConstant         CP#4
   StoreFieldTOS        CP#16
   Push                 r3
-  PushConstant         CP#5
-  StoreFieldTOS        CP#18
-  Push                 r3
   Push                 r0
-  StoreFieldTOS        CP#6
-  InstanceCall         2, CP#20
+  StoreFieldTOS        CP#5
+  InstanceCall         2, CP#18
   Drop1
   Push                 r4
-  Allocate             CP#10
+  Allocate             CP#8
   StoreLocal           r3
   Push                 r3
   PushNull
+  StoreFieldTOS        CP#9
+  Push                 r3
+  PushNull
   StoreFieldTOS        CP#11
   Push                 r3
-  PushNull
-  StoreFieldTOS        CP#13
+  PushConstant         CP#13
+  StoreFieldTOS        CP#14
   Push                 r3
-  PushConstant         CP#15
+  PushConstant         CP#19
   StoreFieldTOS        CP#16
   Push                 r3
-  PushConstant         CP#21
-  StoreFieldTOS        CP#18
-  Push                 r3
   Push                 r0
-  StoreFieldTOS        CP#6
-  InstanceCall         2, CP#27
+  StoreFieldTOS        CP#5
+  InstanceCall         2, CP#24
   Drop1
   Push                 r0
   CloneContext
@@ -890,7 +880,7 @@
   Push                 r0
   LoadContextVar       0
   PushInt              1
-  InstanceCall         2, CP#28
+  AddInt
   StoreLocal           r3
   StoreContextVar      0
   Push                 r3
@@ -911,69 +901,65 @@
   [1] = ArgDesc num-args 2, num-type-args 0, names []
   [2] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#1
   [3] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#1
-  [4] = ICData target-name '<', arg-desc CP#1
-  [5] = ClosureFunction <anonymous closure> () → dart.core::int;
-  [6] = InstanceField dart.core::_Closure::_context
-  [7] = Reserved
-  [8] = ICData target-name '+', arg-desc CP#1
-  [9] = EndClosureFunctionScope
-  [10] = Class dart.core::_Closure
-  [11] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [4] = ClosureFunction <anonymous closure> () → dart.core::int;
+  [5] = InstanceField dart.core::_Closure::_context
+  [6] = Reserved
+  [7] = EndClosureFunctionScope
+  [8] = Class dart.core::_Closure
+  [9] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [10] = Reserved
+  [11] = InstanceField dart.core::_Closure::_function_type_arguments
   [12] = Reserved
-  [13] = InstanceField dart.core::_Closure::_function_type_arguments
-  [14] = Reserved
-  [15] = EmptyTypeArguments
-  [16] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [13] = EmptyTypeArguments
+  [14] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [15] = Reserved
+  [16] = InstanceField dart.core::_Closure::_function
   [17] = Reserved
-  [18] = InstanceField dart.core::_Closure::_function
-  [19] = Reserved
-  [20] = ICData target-name 'add', arg-desc CP#1
-  [21] = ClosureFunction <anonymous closure> (dart.core::int ii) → dart.core::Null;
-  [22] = Type dart.core::int
-  [23] = String 'ii'
-  [24] = SubtypeTestCache
-  [25] = ICData target-name '+', arg-desc CP#1
-  [26] = EndClosureFunctionScope
-  [27] = ICData target-name 'add', arg-desc CP#1
-  [28] = ICData target-name '+', arg-desc CP#1
+  [18] = ICData target-name 'add', arg-desc CP#1
+  [19] = ClosureFunction <anonymous closure> (dart.core::int ii) → dart.core::Null;
+  [20] = Type dart.core::int
+  [21] = String 'ii'
+  [22] = SubtypeTestCache
+  [23] = EndClosureFunctionScope
+  [24] = ICData target-name 'add', arg-desc CP#1
 }
-Closure CP#5 {
+Closure CP#4 {
   EntryFixed           1, 2
   CheckStack
   Push                 FP[-5]
-  LoadFieldTOS         CP#6
+  LoadFieldTOS         CP#5
   PopLocal             r0
   Push                 r0
   LoadContextVar       0
   Push                 r0
   LoadContextParent
   LoadContextVar       0
-  InstanceCall         2, CP#8
+  AddInt
   ReturnTOS
   PushNull
   ReturnTOS
 
 }
 
-Closure CP#21 {
+Closure CP#19 {
   EntryFixed           2, 3
   CheckStack
   Push                 FP[-6]
-  LoadFieldTOS         CP#6
+  LoadFieldTOS         CP#5
   PopLocal             r0
   Push                 FP[-5]
+  PushConstant         CP#20
   PushNull
   PushNull
-  PushConstant         CP#22
-  PushConstant         CP#23
-  AssertAssignable     1, CP#24
+  PushConstant         CP#21
+  AssertAssignable     1, CP#22
   Drop1
   Push                 r0
   Push                 FP[-5]
   Push                 r0
   LoadContextParent
   LoadContextVar       0
-  InstanceCall         2, CP#25
+  AddInt
   StoreContextVar      0
   PushNull
   ReturnTOS
@@ -1001,39 +987,37 @@
   CheckStack
   Push                 r2
   InstanceCall         1, CP#2
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   AllocateContext      1
   PopLocal             r0
   Push                 r0
   Push                 r2
   InstanceCall         1, CP#3
   StoreContextVar      0
-  Allocate             CP#10
+  Allocate             CP#8
   StoreLocal           r4
   Push                 r4
   PushNull
+  StoreFieldTOS        CP#9
+  Push                 r4
+  PushNull
   StoreFieldTOS        CP#11
   Push                 r4
-  PushNull
-  StoreFieldTOS        CP#13
-  Push                 r4
-  PushConstant         CP#15
-  StoreFieldTOS        CP#16
+  PushConstant         CP#13
+  StoreFieldTOS        CP#14
   Push                 r4
   PushConstant         CP#4
-  StoreFieldTOS        CP#18
+  StoreFieldTOS        CP#16
   Push                 r4
   Push                 r0
   StoreFieldTOS        CP#5
   PopLocal             r3
   Push                 r3
-  InstanceCall         1, CP#20
+  InstanceCall         1, CP#18
   Drop1
   Push                 r0
   LoadContextVar       0
-  PushConstant         CP#21
+  PushConstant         CP#19
   IndirectStaticCall   1, CP#0
   Drop1
   Push                 r0
@@ -1052,21 +1036,19 @@
   [4] = ClosureFunction <anonymous closure> () → dart.core::Null;
   [5] = InstanceField dart.core::_Closure::_context
   [6] = Reserved
-  [7] = ArgDesc num-args 2, num-type-args 0, names []
-  [8] = ICData target-name '+', arg-desc CP#7
-  [9] = EndClosureFunctionScope
-  [10] = Class dart.core::_Closure
-  [11] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [7] = EndClosureFunctionScope
+  [8] = Class dart.core::_Closure
+  [9] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [10] = Reserved
+  [11] = InstanceField dart.core::_Closure::_function_type_arguments
   [12] = Reserved
-  [13] = InstanceField dart.core::_Closure::_function_type_arguments
-  [14] = Reserved
-  [15] = EmptyTypeArguments
-  [16] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [13] = EmptyTypeArguments
+  [14] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [15] = Reserved
+  [16] = InstanceField dart.core::_Closure::_function
   [17] = Reserved
-  [18] = InstanceField dart.core::_Closure::_function
-  [19] = Reserved
-  [20] = ICData dynamic target-name 'call', arg-desc CP#0
-  [21] = StaticICData target 'dart.core::print', arg-desc CP#0
+  [18] = ICData dynamic target-name 'call', arg-desc CP#0
+  [19] = StaticICData target 'dart.core::print', arg-desc CP#0
 }
 Closure CP#4 {
   EntryFixed           1, 3
@@ -1078,7 +1060,7 @@
   Push                 r0
   LoadContextVar       0
   PushInt              1
-  InstanceCall         2, CP#8
+  AddInt
   StoreContextVar      0
   PushNull
   ReturnTOS
@@ -1110,7 +1092,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 [@vm.bytecode=
@@ -1123,10 +1105,10 @@
   Push                 FP[-5]
   StoreContextVar      0
   Push                 FP[-5]
+  PushConstant         CP#0
   Push                 FP[-6]
-  LoadTypeArgumentsField CP#0
+  LoadTypeArgumentsField CP#1
   PushNull
-  PushConstant         CP#1
   PushConstant         CP#2
   AssertAssignable     0, CP#3
   Drop1
@@ -1134,7 +1116,7 @@
   StoreLocal           r2
   Push                 r2
   Push                 FP[-6]
-  LoadTypeArgumentsField CP#0
+  LoadTypeArgumentsField CP#1
   StoreFieldTOS        CP#9
   Push                 r2
   PushNull
@@ -1153,8 +1135,8 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsField #lib::D
-  [1] = Type #lib::D::T
+  [0] = Type #lib::D::T
+  [1] = TypeArgumentsField #lib::D
   [2] = String 't'
   [3] = SubtypeTestCache
   [4] = ClosureFunction <anonymous closure> () → #lib::D::T;
@@ -1198,27 +1180,27 @@
   Push                 r0
   PushInt              5
   StoreContextVar      0
-  Allocate             CP#9
+  Allocate             CP#7
   StoreLocal           r3
   Push                 r3
   PushNull
+  StoreFieldTOS        CP#8
+  Push                 r3
+  PushNull
   StoreFieldTOS        CP#10
   Push                 r3
-  PushNull
-  StoreFieldTOS        CP#12
-  Push                 r3
-  PushConstant         CP#14
-  StoreFieldTOS        CP#15
+  PushConstant         CP#12
+  StoreFieldTOS        CP#13
   Push                 r3
   PushConstant         CP#0
-  StoreFieldTOS        CP#17
+  StoreFieldTOS        CP#15
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#1
   PopLocal             r2
   Push                 r2
   PushInt              3
-  InstanceCall         2, CP#19
+  InstanceCall         2, CP#18
   Drop1
   Push                 r0
   LoadContextVar       0
@@ -1236,20 +1218,19 @@
   [3] = Type dart.core::int
   [4] = String 'y'
   [5] = SubtypeTestCache
-  [6] = ArgDesc num-args 2, num-type-args 0, names []
-  [7] = ICData target-name '+', arg-desc CP#6
-  [8] = EndClosureFunctionScope
-  [9] = Class dart.core::_Closure
-  [10] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [6] = EndClosureFunctionScope
+  [7] = Class dart.core::_Closure
+  [8] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [9] = Reserved
+  [10] = InstanceField dart.core::_Closure::_function_type_arguments
   [11] = Reserved
-  [12] = InstanceField dart.core::_Closure::_function_type_arguments
-  [13] = Reserved
-  [14] = EmptyTypeArguments
-  [15] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [12] = EmptyTypeArguments
+  [13] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [14] = Reserved
+  [15] = InstanceField dart.core::_Closure::_function
   [16] = Reserved
-  [17] = InstanceField dart.core::_Closure::_function
-  [18] = Reserved
-  [19] = ICData dynamic target-name 'call', arg-desc CP#6
+  [17] = ArgDesc num-args 2, num-type-args 0, names []
+  [18] = ICData dynamic target-name 'call', arg-desc CP#17
 }
 Closure CP#0 {
   EntryFixed           2, 3
@@ -1258,9 +1239,9 @@
   LoadFieldTOS         CP#1
   PopLocal             r0
   Push                 FP[-5]
-  PushNull
-  PushNull
   PushConstant         CP#3
+  PushNull
+  PushNull
   PushConstant         CP#4
   AssertAssignable     1, CP#5
   Drop1
@@ -1268,7 +1249,7 @@
   Push                 r0
   LoadContextVar       0
   Push                 FP[-5]
-  InstanceCall         2, CP#7
+  AddInt
   StoreContextVar      0
   PushNull
   ReturnTOS
@@ -1517,8 +1498,7 @@
   LoadFieldTOS         CP#3
   StoreLocal           r0
   PushConstant         CP#5
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfEqStrict       L1
   CheckFunctionTypeArgs 0, 2
   Jump                 L2
 L1:
@@ -1533,9 +1513,9 @@
   IndirectStaticCall   4, CP#8
   PopLocal             r0
   Push                 FP[-5]
+  PushConstant         CP#10
   PushNull
   Push                 r0
-  PushConstant         CP#10
   PushConstant         CP#11
   AssertAssignable     0, CP#12
   Drop1
diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart.expect b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
index 16ddfcb..3842a43 100644
--- a/pkg/vm/testcases/bytecode/field_initializers.dart.expect
+++ b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
@@ -42,7 +42,7 @@
   [6] = ArgDesc num-args 1, num-type-args 0, names []
   [7] = StaticICData target 'dart.core::Object::', arg-desc CP#6
 }
-]  constructor •(core::int foo4) → void
+]  constructor •(core::int foo4) → self::A
     : self::A::foo1 = null, self::A::foo4 = foo4, self::A::foo5 = 44, super core::Object::•()
     ;
 [@vm.bytecode=
@@ -61,11 +61,11 @@
   Push                 FP[-7]
   Push                 FP[-5]
   PushInt              1
-  InstanceCall         2, CP#7
+  AddInt
   StoreFieldTOS        CP#2
   Push                 FP[-7]
-  PushConstant         CP#9
-  IndirectStaticCall   1, CP#8
+  PushConstant         CP#7
+  IndirectStaticCall   1, CP#6
   Drop1
   PushNull
   ReturnTOS
@@ -78,12 +78,10 @@
   [3] = Reserved
   [4] = InstanceField #lib::A::foo1
   [5] = Reserved
-  [6] = ArgDesc num-args 2, num-type-args 0, names []
-  [7] = ICData target-name '+', arg-desc CP#6
-  [8] = ArgDesc num-args 1, num-type-args 0, names []
-  [9] = StaticICData target 'dart.core::Object::', arg-desc CP#8
+  [6] = ArgDesc num-args 1, num-type-args 0, names []
+  [7] = StaticICData target 'dart.core::Object::', arg-desc CP#6
 }
-]  constructor constr2(core::int x, core::int y) → void
+]  constructor constr2(core::int x, core::int y) → self::A
     : self::A::foo4 = null, self::A::foo1 = x, self::A::foo5 = y.{core::num::+}(1), super core::Object::•()
     ;
 [@vm.bytecode=
@@ -102,7 +100,7 @@
   [0] = ArgDesc num-args 2, num-type-args 0, names []
   [1] = StaticICData target '#lib::A::', arg-desc CP#0
 }
-]  constructor redirecting1() → void
+]  constructor redirecting1() → self::A
     : this self::A::•(45)
     ;
 [@vm.bytecode=
@@ -113,20 +111,18 @@
   Push                 FP[-7]
   Push                 FP[-6]
   Push                 FP[-5]
-  InstanceCall         2, CP#1
-  PushConstant         CP#3
-  IndirectStaticCall   3, CP#2
+  MulInt
+  PushConstant         CP#1
+  IndirectStaticCall   3, CP#0
   Drop1
   PushNull
   ReturnTOS
 }
 ConstantPool {
-  [0] = ArgDesc num-args 2, num-type-args 0, names []
-  [1] = ICData target-name '*', arg-desc CP#0
-  [2] = ArgDesc num-args 3, num-type-args 0, names []
-  [3] = StaticICData target '#lib::A::constr2', arg-desc CP#2
+  [0] = ArgDesc num-args 3, num-type-args 0, names []
+  [1] = StaticICData target '#lib::A::constr2', arg-desc CP#0
 }
-]  constructor redirecting2(core::int a, core::int b, core::int c) → void
+]  constructor redirecting2(core::int a, core::int b, core::int c) → self::A
     : this self::A::constr2(a, b.{core::num::*}(c))
     ;
 }
@@ -155,7 +151,7 @@
   [2] = ArgDesc num-args 2, num-type-args 0, names []
   [3] = StaticICData target '#lib::A::', arg-desc CP#2
 }
-]  constructor •() → void
+]  constructor •() → self::B
     : super self::A::•(49)
     ;
 [@vm.bytecode=
@@ -184,7 +180,7 @@
   [2] = ArgDesc num-args 4, num-type-args 0, names []
   [3] = StaticICData target '#lib::A::redirecting2', arg-desc CP#2
 }
-]  constructor c2(core::int i, core::int j) → void
+]  constructor c2(core::int i, core::int j) → self::B
     : self::B::foo6 = 50, super self::A::redirecting2(i, j, 51)
     ;
 }
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart.expect b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
index e0d510a..5358ccb 100644
--- a/pkg/vm/testcases/bytecode/instance_creation.dart.expect
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
@@ -60,7 +60,7 @@
   [7] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#0
   [8] = StaticICData target 'dart.core::print', arg-desc CP#0
 }
-]  constructor •() → void
+]  constructor •() → self::Base<self::Base::T1, self::Base::T2>
     : super core::Object::•() {
     core::print("Base: ${self::Base::T1}, ${self::Base::T2}");
   }
@@ -81,7 +81,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target '#lib::Base::', arg-desc CP#0
 }
-]  constructor •(core::String s) → void
+]  constructor •(core::String s) → self::A
     : super self::Base::•()
     ;
 }
@@ -126,7 +126,7 @@
   [5] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#0
   [6] = StaticICData target 'dart.core::print', arg-desc CP#0
 }
-]  constructor •() → void
+]  constructor •() → self::B<self::B::T>
     : super self::Base::•() {
     core::print("B: ${self::B::T}");
   }
@@ -167,7 +167,7 @@
   [3] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#0
   [4] = StaticICData target 'dart.core::print', arg-desc CP#0
 }
-]  constructor •(core::String s) → void
+]  constructor •(core::String s) → self::C
     : super core::Object::•() {
     core::print("C: ${s}");
   }
@@ -188,7 +188,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::E<self::E::K, self::E::V>
     : super core::Object::•()
     ;
 [@vm.bytecode=
@@ -227,7 +227,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target '#lib::E::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::F<self::F::K, self::F::V>
     : super self::E::•()
     ;
 [@vm.bytecode=
@@ -266,7 +266,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  constructor •() → void
+]  constructor •() → self::G<self::G::K, self::G::V>
     : super core::Object::•()
     ;
 [@vm.bytecode=
@@ -312,7 +312,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target '#lib::G::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::H<self::H::P1, self::H::P2, self::H::P3>
     : super self::G::•()
     ;
 }
@@ -332,7 +332,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  constructor •(dynamic param) → void
+]  constructor •(dynamic param) → self::I
     : super core::Object::•()
     ;
 [@vm.bytecode=
@@ -419,7 +419,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target '#lib::Base::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::TestTypeArgReuse<self::TestTypeArgReuse::P, self::TestTypeArgReuse::Q>
     : super self::Base::•()
     ;
 }
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index be1bb2e..ac3a176 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -111,7 +111,7 @@
   [4] = ArgDesc num-args 1, num-type-args 0, names []
   [5] = StaticICData target 'dart.core::Object::', arg-desc CP#4
 }
-]  const constructor •(core::int index, core::String _name) → void
+]  const constructor •(core::int index, core::String _name) → self::A
     : self::A::index = index, self::A::_name = _name, super core::Object::•()
     ;
 [@vm.bytecode=
@@ -154,7 +154,7 @@
   [2] = ArgDesc num-args 1, num-type-args 0, names []
   [3] = StaticICData target 'dart.core::Object::', arg-desc CP#2
 }
-]  const constructor •(core::int i) → void
+]  const constructor •(core::int i) → self::B
     : self::B::i = i, super core::Object::•()
     ;
 }
@@ -167,27 +167,25 @@
   Push                 FP[-8]
   Push                 FP[-7]
   Push                 FP[-6]
-  InstanceCall         2, CP#1
-  StoreFieldTOS        CP#2
+  AddInt
+  StoreFieldTOS        CP#0
   Push                 FP[-8]
   Push                 FP[-5]
   PushInt              5
-  InstanceCall         2, CP#4
-  PushConstant         CP#5
-  IndirectStaticCall   2, CP#0
+  MulInt
+  PushConstant         CP#3
+  IndirectStaticCall   2, CP#2
   Drop1
   PushNull
   ReturnTOS
 }
 ConstantPool {
-  [0] = ArgDesc num-args 2, num-type-args 0, names []
-  [1] = ICData target-name '+', arg-desc CP#0
-  [2] = InstanceField #lib::C::j
-  [3] = Reserved
-  [4] = ICData target-name '*', arg-desc CP#0
-  [5] = StaticICData target '#lib::B::', arg-desc CP#0
+  [0] = InstanceField #lib::C::j
+  [1] = Reserved
+  [2] = ArgDesc num-args 2, num-type-args 0, names []
+  [3] = StaticICData target '#lib::B::', arg-desc CP#2
 }
-]  const constructor •(core::int a, core::int b, core::int c) → void
+]  const constructor •(core::int a, core::int b, core::int c) → self::C
     : self::C::j = a.{core::num::+}(b), super self::B::•(c.{core::num::*}(5))
     ;
 }
@@ -222,7 +220,7 @@
   [5] = ArgDesc num-args 1, num-type-args 0, names []
   [6] = StaticICData target 'dart.core::Object::', arg-desc CP#5
 }
-]  const constructor •(dynamic x, [dynamic y = null]) → void
+]  const constructor •(dynamic x, [dynamic y = null]) → self::D
     : self::D::x = x, self::D::y = y, super core::Object::•()
     ;
 }
@@ -242,7 +240,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  const constructor •() → void
+]  const constructor •() → self::E<self::E::T>
     : super core::Object::•()
     ;
 }
@@ -262,7 +260,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target '#lib::E::', arg-desc CP#0
 }
-]  const constructor •() → void
+]  const constructor •() → self::F<self::F::P, self::F::Q>
     : super self::E::•()
     ;
 }
diff --git a/pkg/vm/testcases/bytecode/loops.dart.expect b/pkg/vm/testcases/bytecode/loops.dart.expect
index 1a03e54..fdb0b11 100644
--- a/pkg/vm/testcases/bytecode/loops.dart.expect
+++ b/pkg/vm/testcases/bytecode/loops.dart.expect
@@ -15,20 +15,18 @@
   Push                 r1
   Push                 FP[-5]
   InstanceCall         1, CP#1
-  InstanceCall         2, CP#3
+  CompareIntLt
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   Push                 r0
   Push                 FP[-5]
   Push                 r1
-  InstanceCall         2, CP#4
-  InstanceCall         2, CP#5
+  InstanceCall         2, CP#3
+  AddInt
   PopLocal             r0
   Push                 r1
   PushInt              1
-  InstanceCall         2, CP#6
+  AddInt
   StoreLocal           r1
   Drop1
   Jump                 L2
@@ -42,10 +40,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = ICData get target-name 'length', arg-desc CP#0
   [2] = ArgDesc num-args 2, num-type-args 0, names []
-  [3] = ICData target-name '<', arg-desc CP#2
-  [4] = ICData target-name '[]', arg-desc CP#2
-  [5] = ICData target-name '+', arg-desc CP#2
-  [6] = ICData target-name '+', arg-desc CP#2
+  [3] = ICData target-name '[]', arg-desc CP#2
 }
 ]static method test_for(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -66,30 +61,26 @@
   CheckStack
   Push                 r1
   PushInt              0
-  InstanceCall         2, CP#1
+  CompareIntGe
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   Push                 r1
   Push                 FP[-5]
-  InstanceCall         1, CP#3
-  InstanceCall         2, CP#4
+  InstanceCall         1, CP#1
+  CompareIntGe
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L2
+  JumpIfFalse          L2
   Jump                 L1
 L2:
   Push                 r0
   Push                 FP[-5]
   Push                 r1
-  InstanceCall         2, CP#5
-  InstanceCall         2, CP#6
+  InstanceCall         2, CP#3
+  AddInt
   PopLocal             r0
   Push                 r1
   PushInt              1
-  InstanceCall         2, CP#7
+  AddInt
   StoreLocal           r1
   Drop1
   Jump                 L3
@@ -100,14 +91,10 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = ArgDesc num-args 2, num-type-args 0, names []
-  [1] = ICData target-name '>=', arg-desc CP#0
-  [2] = ArgDesc num-args 1, num-type-args 0, names []
-  [3] = ICData get target-name 'length', arg-desc CP#2
-  [4] = ICData target-name '>=', arg-desc CP#0
-  [5] = ICData target-name '[]', arg-desc CP#0
-  [6] = ICData target-name '+', arg-desc CP#0
-  [7] = ICData target-name '+', arg-desc CP#0
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = ICData get target-name 'length', arg-desc CP#0
+  [2] = ArgDesc num-args 2, num-type-args 0, names []
+  [3] = ICData target-name '[]', arg-desc CP#2
 }
 ]static method test_for_break(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -127,37 +114,33 @@
   PushInt              0
   PopLocal             r0
   PushInt              100
-  InstanceCall         1, CP#1
+  NegateInt
   PopLocal             r1
 L4:
   CheckStack
   Push                 r1
   Push                 FP[-5]
-  InstanceCall         1, CP#2
-  InstanceCall         2, CP#4
+  InstanceCall         1, CP#1
+  CompareIntLt
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   Push                 r1
   PushInt              0
-  InstanceCall         2, CP#5
+  CompareIntLt
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L2
+  JumpIfFalse          L2
   Jump                 L3
 L2:
   Push                 r0
   Push                 FP[-5]
   Push                 r1
-  InstanceCall         2, CP#6
-  InstanceCall         2, CP#7
+  InstanceCall         2, CP#3
+  AddInt
   PopLocal             r0
 L3:
   Push                 r1
   PushInt              1
-  InstanceCall         2, CP#8
+  AddInt
   StoreLocal           r1
   Drop1
   Jump                 L4
@@ -169,14 +152,9 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ICData target-name 'unary-', arg-desc CP#0
-  [2] = ICData get target-name 'length', arg-desc CP#0
-  [3] = ArgDesc num-args 2, num-type-args 0, names []
-  [4] = ICData target-name '<', arg-desc CP#3
-  [5] = ICData target-name '<', arg-desc CP#3
-  [6] = ICData target-name '[]', arg-desc CP#3
-  [7] = ICData target-name '+', arg-desc CP#3
-  [8] = ICData target-name '+', arg-desc CP#3
+  [1] = ICData get target-name 'length', arg-desc CP#0
+  [2] = ArgDesc num-args 2, num-type-args 0, names []
+  [3] = ICData target-name '[]', arg-desc CP#2
 }
 ]static method test_for_continue(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -203,23 +181,21 @@
   Push                 r1
   Push                 FP[-5]
   InstanceCall         1, CP#1
-  InstanceCall         2, CP#3
+  CompareIntLt
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   Push                 r0
   Push                 FP[-5]
   Push                 r1
   PopLocal             r2
   Push                 r2
   PushInt              1
-  InstanceCall         2, CP#4
+  AddInt
   StoreLocal           r1
   PopLocal             r3
   Push                 r2
-  InstanceCall         2, CP#5
-  InstanceCall         2, CP#6
+  InstanceCall         2, CP#3
+  AddInt
   PopLocal             r0
   Jump                 L2
 L1:
@@ -232,10 +208,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = ICData get target-name 'length', arg-desc CP#0
   [2] = ArgDesc num-args 2, num-type-args 0, names []
-  [3] = ICData target-name '<', arg-desc CP#2
-  [4] = ICData target-name '+', arg-desc CP#2
-  [5] = ICData target-name '[]', arg-desc CP#2
-  [6] = ICData target-name '+', arg-desc CP#2
+  [3] = ICData target-name '[]', arg-desc CP#2
 }
 ]static method test_while(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -259,20 +232,18 @@
   Push                 FP[-5]
   Push                 r1
   InstanceCall         2, CP#1
-  InstanceCall         2, CP#2
+  AddInt
   PopLocal             r0
   Push                 r1
   PushInt              1
-  InstanceCall         2, CP#3
+  AddInt
   PopLocal             r1
   Push                 r1
   Push                 FP[-5]
-  InstanceCall         1, CP#5
-  InstanceCall         2, CP#6
+  InstanceCall         1, CP#3
+  CompareIntLt
   AssertBoolean        0
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   Push                 r0
   ReturnTOS
   PushNull
@@ -281,11 +252,8 @@
 ConstantPool {
   [0] = ArgDesc num-args 2, num-type-args 0, names []
   [1] = ICData target-name '[]', arg-desc CP#0
-  [2] = ICData target-name '+', arg-desc CP#0
-  [3] = ICData target-name '+', arg-desc CP#0
-  [4] = ArgDesc num-args 1, num-type-args 0, names []
-  [5] = ICData get target-name 'length', arg-desc CP#4
-  [6] = ICData target-name '<', arg-desc CP#0
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [3] = ICData get target-name 'length', arg-desc CP#2
 }
 ]static method test_do_while(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -310,15 +278,13 @@
   CheckStack
   Push                 r1
   InstanceCall         1, CP#2
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   Push                 r1
   InstanceCall         1, CP#3
   PopLocal             r2
   Push                 r0
   Push                 r2
-  InstanceCall         2, CP#5
+  AddInt
   PopLocal             r0
   Jump                 L2
 L1:
@@ -332,8 +298,6 @@
   [1] = ICData get target-name 'iterator', arg-desc CP#0
   [2] = ICData target-name 'moveNext', arg-desc CP#0
   [3] = ICData get target-name 'current', arg-desc CP#0
-  [4] = ArgDesc num-args 2, num-type-args 0, names []
-  [5] = ICData target-name '+', arg-desc CP#4
 }
 ]static method test_for_in(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -357,9 +321,7 @@
   CheckStack
   Push                 r2
   InstanceCall         1, CP#2
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   Push                 r2
   InstanceCall         1, CP#3
   PopLocal             r3
@@ -367,7 +329,7 @@
   PopLocal             r1
   Push                 r0
   Push                 r1
-  InstanceCall         2, CP#5
+  AddInt
   PopLocal             r0
   Jump                 L2
 L1:
@@ -381,8 +343,6 @@
   [1] = ICData get target-name 'iterator', arg-desc CP#0
   [2] = ICData target-name 'moveNext', arg-desc CP#0
   [3] = ICData get target-name 'current', arg-desc CP#0
-  [4] = ArgDesc num-args 2, num-type-args 0, names []
-  [5] = ICData target-name '+', arg-desc CP#4
 }
 ]static method test_for_in_with_outer_var(core::List<core::int> list) → core::int {
   core::int sum = 0;
diff --git a/pkg/vm/testcases/bytecode/super_calls.dart.expect b/pkg/vm/testcases/bytecode/super_calls.dart.expect
index c234538..34e7eb7 100644
--- a/pkg/vm/testcases/bytecode/super_calls.dart.expect
+++ b/pkg/vm/testcases/bytecode/super_calls.dart.expect
@@ -18,7 +18,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::Base1
     : super core::Object::•()
     ;
 [@vm.bytecode=
@@ -72,7 +72,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target '#lib::Base1::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::A
     : super self::Base1::•()
     ;
 [@vm.bytecode=
@@ -191,7 +191,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::Base2
     : super core::Object::•()
     ;
   abstract method foo<T extends core::Object = dynamic>(core::String a1, self::Base2::foo::T a2, core::int a3) → void;
@@ -214,7 +214,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target '#lib::Base2::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::B
     : super self::Base2::•()
     ;
 [@vm.bytecode=
diff --git a/pkg/vm/testcases/bytecode/switch.dart.expect b/pkg/vm/testcases/bytecode/switch.dart.expect
index bf66bbf..b26fc38 100644
--- a/pkg/vm/testcases/bytecode/switch.dart.expect
+++ b/pkg/vm/testcases/bytecode/switch.dart.expect
@@ -13,21 +13,15 @@
   Push                 r1
   PushInt              1
   InstanceCall         2, CP#1
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   Push                 r1
   PushInt              2
   InstanceCall         2, CP#2
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L2
+  JumpIfTrue           L2
   Push                 r1
   PushInt              3
   InstanceCall         2, CP#3
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L3
+  JumpIfTrue           L3
   Jump                 L4
 L1:
   PushInt              11
@@ -89,39 +83,27 @@
   Push                 r1
   PushInt              1
   InstanceCall         2, CP#1
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   Push                 r1
   PushInt              2
   InstanceCall         2, CP#2
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   Push                 r1
   PushInt              3
   InstanceCall         2, CP#3
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   Push                 r1
   PushInt              4
   InstanceCall         2, CP#4
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L2
+  JumpIfTrue           L2
   Push                 r1
   PushInt              5
   InstanceCall         2, CP#5
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L2
+  JumpIfTrue           L2
   Push                 r1
   PushInt              6
   InstanceCall         2, CP#6
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L2
+  JumpIfTrue           L2
   Jump                 L3
 L1:
   PushInt              11
@@ -188,39 +170,27 @@
   Push                 r1
   PushInt              1
   InstanceCall         2, CP#1
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   Push                 r1
   PushInt              2
   InstanceCall         2, CP#2
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   Push                 r1
   PushInt              3
   InstanceCall         2, CP#3
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   Push                 r1
   PushInt              4
   InstanceCall         2, CP#4
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L2
+  JumpIfTrue           L2
   Push                 r1
   PushInt              5
   InstanceCall         2, CP#5
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L2
+  JumpIfTrue           L2
   Push                 r1
   PushInt              6
   InstanceCall         2, CP#6
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L2
+  JumpIfTrue           L2
   Jump                 L3
 L1:
   PushInt              11
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index 2158d27..78ae07a 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -77,13 +77,9 @@
   MoveSpecial          r0, exception
   MoveSpecial          r1, stackTrace
   Push                 r0
-  PushNull
-  PushNull
   PushConstant         CP#3
-  InstanceCall         4, CP#5
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L2
+  InstanceCall         2, CP#5
+  JumpIfFalse          L2
   PushConstant         CP#6
   PushConstant         CP#7
   IndirectStaticCall   1, CP#1
@@ -91,13 +87,9 @@
   Jump                 L1
 L2:
   Push                 r0
-  PushNull
-  PushNull
   PushConstant         CP#8
-  InstanceCall         4, CP#9
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L3
+  InstanceCall         2, CP#9
+  JumpIfFalse          L3
   Push                 r0
   PopLocal             r2
   PushNull
@@ -120,13 +112,9 @@
   Jump                 L1
 L3:
   Push                 r0
-  PushNull
-  PushNull
   PushConstant         CP#13
-  InstanceCall         4, CP#14
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L4
+  InstanceCall         2, CP#14
+  JumpIfFalse          L4
   Push                 r0
   PopLocal             r2
   Push                 r1
@@ -200,17 +188,17 @@
   [1] = ArgDesc num-args 1, num-type-args 0, names []
   [2] = StaticICData target 'dart.core::print', arg-desc CP#1
   [3] = Type dart.core::TypeError
-  [4] = ArgDesc num-args 4, num-type-args 0, names []
-  [5] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#4
+  [4] = ArgDesc num-args 2, num-type-args 0, names []
+  [5] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#4
   [6] = String 'caught type error'
   [7] = StaticICData target 'dart.core::print', arg-desc CP#1
   [8] = Type dart.core::AssertionError
-  [9] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#4
+  [9] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#4
   [10] = String 'caught assertion error '
   [11] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#1
   [12] = StaticICData target 'dart.core::print', arg-desc CP#1
   [13] = Type dart.core::Error
-  [14] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#4
+  [14] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#4
   [15] = String 'caught error '
   [16] = String ' '
   [17] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#1
@@ -378,8 +366,8 @@
   [26] = String 'danger bar'
   [27] = StaticICData target 'dart.core::print', arg-desc CP#4
   [28] = Type dart.core::Error
-  [29] = ArgDesc num-args 4, num-type-args 0, names []
-  [30] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#29
+  [29] = ArgDesc num-args 2, num-type-args 0, names []
+  [30] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#29
   [31] = String 'error '
   [32] = String ', captured stack trace: '
   [33] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#4
@@ -446,13 +434,9 @@
   MoveSpecial          r2, exception
   MoveSpecial          r3, stackTrace
   Push                 r2
-  PushNull
-  PushNull
   PushConstant         CP#28
-  InstanceCall         4, CP#30
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L2
+  InstanceCall         2, CP#30
+  JumpIfFalse          L2
   Push                 r2
   PopLocal             r4
   PushNull
@@ -545,9 +529,7 @@
   Drop1
   Push                 FP[-5]
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L2
+  JumpIfFalse          L2
   Push                 r2
   Push                 r3
   Throw                1
@@ -593,9 +575,9 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 2, end 38, handler 38, needs-stack-trace, types [CP#3]
+  try-index 0, outer -1, start 2, end 36, handler 36, needs-stack-trace, types [CP#3]
   try-index 1, outer 0, start 2, end 7, handler 7, needs-stack-trace, types [CP#3]
-  try-index 2, outer 0, start 12, end 26, handler 26, types [CP#3]
+  try-index 2, outer 0, start 12, end 24, handler 24, types [CP#3]
 }
 ConstantPool {
   [0] = String 'try 1 > try 2'
@@ -642,19 +624,15 @@
   CheckStack
   Push                 r0
   PushInt              10
-  InstanceCall         2, CP#1
+  CompareIntLt
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
 Try #0 start:
   Push                 r0
   PushInt              5
-  InstanceCall         2, CP#2
+  CompareIntGt
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L2
+  JumpIfFalse          L2
   Jump                 L3
 L2:
   Jump                 L4
@@ -664,26 +642,26 @@
   MoveSpecial          r1, exception
   MoveSpecial          r2, stackTrace
   Push                 r0
-  PushConstant         CP#5
-  IndirectStaticCall   1, CP#4
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
   Drop1
   Push                 r1
   Push                 r2
   Throw                1
 L3:
   Push                 r0
-  PushConstant         CP#6
-  IndirectStaticCall   1, CP#4
+  PushConstant         CP#3
+  IndirectStaticCall   1, CP#1
   Drop1
   Jump                 L1
 L4:
   Push                 r0
-  PushConstant         CP#7
-  IndirectStaticCall   1, CP#4
+  PushConstant         CP#4
+  IndirectStaticCall   1, CP#1
   Drop1
   Push                 r0
   PushInt              1
-  InstanceCall         2, CP#8
+  AddInt
   StoreLocal           r0
   Drop1
   Jump                 L5
@@ -692,18 +670,14 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 12, end 21, handler 21, needs-stack-trace, types [CP#3]
+  try-index 0, outer -1, start 10, end 17, handler 17, needs-stack-trace, types [CP#0]
 }
 ConstantPool {
-  [0] = ArgDesc num-args 2, num-type-args 0, names []
-  [1] = ICData target-name '<', arg-desc CP#0
-  [2] = ICData target-name '>', arg-desc CP#0
-  [3] = Type dynamic
-  [4] = ArgDesc num-args 1, num-type-args 0, names []
-  [5] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [6] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [7] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [8] = ICData target-name '+', arg-desc CP#0
+  [0] = Type dynamic
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [3] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [4] = StaticICData target 'dart.core::print', arg-desc CP#1
 }
 ]static method testTryFinally1() → dynamic {
   #L1:
@@ -733,15 +707,11 @@
   Push                 r2
   PushInt              1
   InstanceCall         2, CP#1
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L1
+  JumpIfTrue           L1
   Push                 r2
   PushInt              2
   InstanceCall         2, CP#2
-  PushTrue
-  IfEqStrictTOS
-  Jump                 L2
+  JumpIfTrue           L2
   Jump                 L3
 L1:
   Push                 r0
@@ -859,8 +829,8 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 25, end 91, handler 91, needs-stack-trace, types [CP#25]
-  try-index 1, outer 0, start 34, end 61, handler 61, needs-stack-trace, types [CP#25]
+  try-index 0, outer -1, start 21, end 87, handler 87, needs-stack-trace, types [CP#25]
+  try-index 1, outer 0, start 30, end 57, handler 57, needs-stack-trace, types [CP#25]
 }
 ConstantPool {
   [0] = ArgDesc num-args 2, num-type-args 0, names []
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index 363540d..8e47afb 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -18,7 +18,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
@@ -38,7 +38,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target '#lib::A::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
@@ -58,7 +58,7 @@
   [0] = ArgDesc num-args 1, num-type-args 0, names []
   [1] = StaticICData target '#lib::B::', arg-desc CP#0
 }
-]  synthetic constructor •() → void
+]  synthetic constructor •() → self::C<self::C::T1, self::C::T2, self::C::T3>
     : super self::B::•()
     ;
 }
@@ -70,10 +70,10 @@
   CheckStack
   Push                 FP[-6]
   Push                 FP[-5]
+  PushConstant         CP#0
   Push                 FP[-6]
-  LoadTypeArgumentsField CP#0
+  LoadTypeArgumentsField CP#1
   PushNull
-  PushConstant         CP#1
   PushConstant         CP#2
   AssertAssignable     0, CP#3
   StoreFieldTOS        CP#4
@@ -85,8 +85,8 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsField #lib::D
-  [1] = Type dart.core::Map<#lib::D::P, #lib::D::Q>
+  [0] = Type dart.core::Map<#lib::D::P, #lib::D::Q>
+  [1] = TypeArgumentsField #lib::D
   [2] = String ''
   [3] = SubtypeTestCache
   [4] = InstanceField #lib::D::foo
@@ -94,7 +94,7 @@
   [6] = ArgDesc num-args 1, num-type-args 0, names []
   [7] = StaticICData target '#lib::C::', arg-desc CP#6
 }
-]  constructor •(dynamic tt) → void
+]  constructor •(dynamic tt) → self::D<self::D::P, self::D::Q>
     : self::D::foo = tt as{TypeError} core::Map<self::D::P, self::D::Q>, super self::C::•()
     ;
 [@vm.bytecode=
@@ -108,9 +108,7 @@
   PushConstant         CP#1
   InstanceCall         4, CP#3
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   PushConstant         CP#4
   PushConstant         CP#6
   IndirectStaticCall   1, CP#5
@@ -123,9 +121,7 @@
   PushConstant         CP#7
   InstanceCall         4, CP#8
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L2
+  JumpIfFalse          L2
   PushConstant         CP#9
   PushConstant         CP#10
   IndirectStaticCall   1, CP#5
@@ -133,10 +129,10 @@
 L2:
   Push                 FP[-6]
   Push                 FP[-5]
+  PushConstant         CP#11
   Push                 FP[-6]
   LoadTypeArgumentsField CP#0
   PushNull
-  PushConstant         CP#11
   PushConstant         CP#12
   AssertAssignable     0, CP#13
   InstanceCall         2, CP#15
@@ -182,9 +178,7 @@
   PushConstant         CP#0
   InstanceCall         4, CP#2
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   PushConstant         CP#3
   PushConstant         CP#5
   IndirectStaticCall   1, CP#4
@@ -197,9 +191,7 @@
   PushConstant         CP#7
   InstanceCall         4, CP#8
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L2
+  JumpIfFalse          L2
   PushConstant         CP#9
   PushConstant         CP#10
   IndirectStaticCall   1, CP#4
@@ -257,10 +249,10 @@
   Push                 r1
   PushInt              0
   Push                 FP[-5]
+  PushConstant         CP#2
   Push                 FP[-6]
   LoadTypeArgumentsField CP#0
   PushNull
-  PushConstant         CP#2
   PushConstant         CP#3
   AssertAssignable     0, CP#4
   StoreIndexedTOS
@@ -268,10 +260,10 @@
   IndirectStaticCall   2, CP#5
   PopLocal             r0
   Push                 FP[-5]
+  PushConstant         CP#2
   Push                 FP[-6]
   LoadTypeArgumentsField CP#0
   PushNull
-  PushConstant         CP#2
   PushConstant         CP#3
   AssertAssignable     0, CP#7
   ReturnTOS
@@ -344,14 +336,10 @@
   Entry                0
   CheckStack
   Push                 FP[-5]
-  PushNull
-  PushNull
   PushConstant         CP#0
-  InstanceCall         4, CP#2
+  InstanceCall         2, CP#2
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L1
+  JumpIfFalse          L1
   PushConstant         CP#3
   PushConstant         CP#5
   IndirectStaticCall   1, CP#4
@@ -361,38 +349,37 @@
   PushNull
   PushNull
   PushConstant         CP#6
-  InstanceCall         4, CP#7
+  InstanceCall         4, CP#8
   AssertBoolean        0
-  PushTrue
-  IfNeStrictTOS
-  Jump                 L2
-  PushConstant         CP#8
+  JumpIfFalse          L2
   PushConstant         CP#9
+  PushConstant         CP#10
   IndirectStaticCall   1, CP#4
   Drop1
 L2:
   Push                 FP[-5]
   PushNull
   PushNull
-  PushConstant         CP#10
-  InstanceCall         4, CP#11
+  PushConstant         CP#11
+  InstanceCall         4, CP#12
   ReturnTOS
   PushNull
   ReturnTOS
 }
 ConstantPool {
   [0] = Type #lib::B
-  [1] = ArgDesc num-args 4, num-type-args 0, names []
-  [2] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#1
+  [1] = ArgDesc num-args 2, num-type-args 0, names []
+  [2] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#1
   [3] = String '11'
   [4] = ArgDesc num-args 1, num-type-args 0, names []
   [5] = StaticICData target 'dart.core::print', arg-desc CP#4
   [6] = Type #lib::C<dart.core::int, dart.core::Object, dynamic>
-  [7] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#1
-  [8] = String '12'
-  [9] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [10] = Type #lib::A<dart.core::int>
-  [11] = ICData target-name 'dart.core::_as', arg-desc CP#1
+  [7] = ArgDesc num-args 4, num-type-args 0, names []
+  [8] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#7
+  [9] = String '12'
+  [10] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [11] = Type #lib::A<dart.core::int>
+  [12] = ICData target-name 'dart.core::_as', arg-desc CP#7
 }
 ]static method foo1(dynamic x) → dynamic {
   if(x is self::B) {
@@ -408,9 +395,9 @@
   Entry                1
   CheckStack
   Push                 FP[-5]
-  PushNull
-  PushNull
   PushConstant         CP#0
+  PushNull
+  PushNull
   PushConstant         CP#1
   AssertAssignable     0, CP#2
   StoreStaticTOS       CP#3
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 d2e41b1..e79a010 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
@@ -20,7 +20,7 @@
 ------------ #lib::B::testPropertySet ------------
 %this = _Parameter #0 [_T (#lib::B)+]
 %x = _Parameter #1 [_T ANY?]
-t2 = _Call set [#lib::B::foo] (%this, %x)
+t2 = _Call virtual set [#lib::B::foo] (%this, %x)
 t3 = _Call direct [#lib::use] (%x)
 RESULT: _T {}?
 ------------ #lib::B::testDynamicPropertySet ------------
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 fde6a80..6e4319f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
@@ -5,23 +5,23 @@
 @self::TypedefAnnotation::•(const <core::int>[1, 2, 3])
 typedef SomeType<T extends core::Object = dynamic> = (core::List<T>) → void;
 abstract class ClassAnnotation2 extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •() → void
+[@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) → void
+[@vm.unreachable.metadata=]  const constructor •(core::int x) → self::MethodAnnotation
     throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
 }
 abstract class TypedefAnnotation extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •(core::List<core::int> list) → void
+[@vm.unreachable.metadata=]  const constructor •(core::List<core::int> list) → self::TypedefAnnotation
     throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
 }
 abstract class VarAnnotation extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •() → void
+[@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) → void
+[@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 A extends core::Object {
@@ -29,10 +29,10 @@
 }
 @self::ClassAnnotation2::•()
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  @self::MethodAnnotation::•(42)
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  @self::MethodAnnotation::•(42)
   method instanceMethod() → void {}
 }
 static method foo([@vm.inferred-type.metadata=dart.core::Null?] (core::List<core::int>) → void a) → core::int {
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 5831363..4fe492d 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
@@ -4,18 +4,18 @@
 import "dart:typed_data" as typ;
 
 class _Vector extends core::Object {
-[@vm.inferred-type.metadata=dart.core::_Smi]  final field core::int _offset;
-[@vm.inferred-type.metadata=dart.core::_Smi]  final field core::int _length;
-[@vm.inferred-type.metadata=dart.typed_data::_Float64List]  final field core::List<core::double> _elements;
-  constructor •([@vm.inferred-type.metadata=dart.core::_Smi] core::int size) → void
+[@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::•()
     ;
-  operator [](core::int i) → core::double
+[@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] [@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?] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset}));
-  operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int i, core::double value) → void {
+[@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)";
   }
-  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
+[@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] 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?] i.{core::num::+}(1))
       result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]??] [@vm.inferred-type.metadata=dart.core::_Double] a.{self::_Vector::[]}(i)));
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 aebe06c..a64c4af 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
@@ -3,35 +3,35 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method foo() → core::int;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
-  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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  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 •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
-  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;
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 b75afef..3075294 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
@@ -4,12 +4,12 @@
 import "dart:async" as asy;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super 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 f9d4af3..461e7263 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 fd8c263..8c953da 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,77 +3,77 @@
 import "dart:core" as core;
 
 abstract class StreamSubscription extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::StreamSubscription
     : super core::Object::•()
     ;
 }
 class _BufferingStreamSubscription extends self::StreamSubscription {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::_BufferingStreamSubscription
     : super self::StreamSubscription::•()
     ;
 }
 class _BroadcastSubscription extends self::StreamSubscription {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::_BroadcastSubscription
     : super self::StreamSubscription::•()
     ;
 }
 abstract class Stream extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Stream
     : super core::Object::•()
     ;
   abstract method foobar((dynamic) → void onData, {core::Function onError = null}) → self::StreamSubscription;
 }
 abstract class _StreamImpl extends self::Stream {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::_StreamImpl
     : super self::Stream::•()
     ;
-  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 = null}) → self::StreamSubscription {
     return [@vm.inferred-type.metadata=!] this.{self::_StreamImpl::_createSubscription}();
   }
-  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 •() → void
+  synthetic constructor •() → self::_ControllerStream
     : super self::_StreamImpl::•()
     ;
-  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 •() → void
+  synthetic constructor •() → self::_GeneratedStreamImpl
     : super self::_StreamImpl::•()
     ;
 }
 abstract class StreamView extends self::Stream {
-[@vm.inferred-type.metadata=!]  final field self::Stream _stream;
-  constructor •([@vm.inferred-type.metadata=!] self::Stream stream) → void
+[@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::•()
     ;
-  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 = null}) → 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) → void
+  constructor •([@vm.inferred-type.metadata=!] self::Stream stream) → self::ByteStream
     : super self::StreamView::•(stream)
     ;
-  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);
   }
-  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);
   }
-  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 = null, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → dynamic {
     super.{self::StreamView::foobar}(onData, onError: onError);
   }
   get super_stream() → self::Stream
     return [@vm.inferred-type.metadata=!] super.{self::StreamView::_stream};
 }
 class _HandleErrorStream extends self::Stream {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::_HandleErrorStream
     : super self::Stream::•()
     ;
 }
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 a8d6be6..e1eda81 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,12 +3,12 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T1
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T2
     : super core::Object::•()
     ;
 }
@@ -16,49 +16,49 @@
   abstract method foo() → core::Object;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  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 •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  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 •() → void
+  synthetic constructor •() → self::DeepCaller1
     : super core::Object::•()
     ;
-  method barL1() → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1() → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL2] this.{self::DeepCaller1::barL2}();
-  method barL2() → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL2() → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL3] this.{self::DeepCaller1::barL3}();
-  method barL3() → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL3() → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL4] this.{self::DeepCaller1::barL4}();
-  method barL4() → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL4() → dynamic
     return self::field1;
 }
 class D extends core::Object {
-[@vm.inferred-type.metadata=!]  field core::Object field2 = [@vm.inferred-type.metadata=!] self::getValue();
-  synthetic constructor •() → void
+[@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 •() → void
+  synthetic constructor •() → self::DeepCaller2
     : super core::Object::•()
     ;
-  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=!] this.{self::DeepCaller2::barL2}(dd);
-  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=!] this.{self::DeepCaller2::barL3}(dd);
-  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=!] this.{self::DeepCaller2::barL4}(dd);
-  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;
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 9388a7d..dafde6a 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,28 +3,28 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T1
     : super core::Object::•()
     ;
 }
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
-  method foo() → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
     return new self::T1::•();
 }
 class Intermediate extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Intermediate
     : super core::Object::•()
     ;
-  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] aa.{self::A::foo}();
 }
 [@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
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 b6e35fd..97088fd 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,32 +3,32 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T1
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T2
     : super core::Object::•()
     ;
 }
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
-  method foo() → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
     return new self::T1::•();
 }
 abstract class C extends core::Object implements self::B {
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
 }
@@ -38,17 +38,17 @@
     ;
 }
 class E extends self::_E&D&C {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super self::D::•()
     ;
-  method foo() → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
     return new self::T2::•();
 }
 class Intermediate extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Intermediate
     : super core::Object::•()
     ;
-  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;
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 3fd5f9f..2cadebe 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,40 +3,40 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T1
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T2
     : super core::Object::•()
     ;
 }
 class T3 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T3
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  method foo() → dynamic
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
     return new self::T1::•();
-  method bar() → dynamic
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bar() → dynamic
     return new self::T2::•();
-  method bazz() → dynamic
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bazz() → dynamic
     return new self::T3::•();
 }
 class B extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  method foo() → dynamic
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
     return new self::T1::•();
-  method bar() → dynamic
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bar() → dynamic
     return new self::T2::•();
-  method bazz() → dynamic
+[@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;
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 10fdcc6..8557ca8 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,46 +3,46 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T1
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T2
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-[@vm.inferred-type.metadata=#lib::T1]  field dynamic field1 = new self::T1::•();
-[@vm.inferred-type.metadata=!]  field dynamic field2 = new self::T1::•();
-  synthetic constructor •() → void
+[@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
     : super core::Object::•()
     ;
 }
 class DeepCaller1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::DeepCaller1
     : super core::Object::•()
     ;
-  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] this.{self::DeepCaller1::barL2}(aa);
-  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] this.{self::DeepCaller1::barL3}(aa);
-  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] this.{self::DeepCaller1::barL4}(aa);
-  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 •() → void
+  synthetic constructor •() → self::DeepCaller2
     : super core::Object::•()
     ;
-  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=!] this.{self::DeepCaller2::barL2}(aa);
-  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=!] this.{self::DeepCaller2::barL3}(aa);
-  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=!] this.{self::DeepCaller2::barL4}(aa);
-  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;
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 88d3aa8..7f7b453 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,28 +3,28 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T1
     : super core::Object::•()
     ;
-  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 •() → void
+  synthetic constructor •() → self::T2
     : super core::Object::•()
     ;
 }
 class T3 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T3
     : super core::Object::•()
     ;
-  method run() → dynamic {
+[@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 {
-  final field self::Q::T result;
-  constructor •(self::Q::T result) → void
+[@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::•()
     ;
 }
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 240802d..9e1d95e 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,25 +6,25 @@
   abstract method foo() → void;
 }
 class T1 extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T1
     : super core::Object::•()
     ;
-  method foo() → void {}
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → void {}
 }
 class T2 extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T2
     : super core::Object::•()
     ;
-  method foo() → void {}
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → void {}
 }
 class Point extends core::Object {
-[@vm.inferred-type.metadata=!]  final field self::I x;
-  const constructor •([@vm.inferred-type.metadata=!] self::I x) → void
+[@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::•()
     ;
-  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});
-  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 {
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 d265afa..691d012 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
@@ -3,37 +3,37 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T1
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T2
     : super core::Object::•()
     ;
 }
 class T4 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T4
     : super core::Object::•()
     ;
 }
 class T5 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T5
     : super core::Object::•()
     ;
 }
 class T6 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T6
     : super core::Object::•()
     ;
 }
 class T7 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T7
     : super core::Object::•()
     ;
 }
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
@@ -41,71 +41,71 @@
   abstract method bazz(dynamic a1, dynamic a2, dynamic a3, [dynamic a4 = null, dynamic a5 = null]) → dynamic;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
-  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 [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:bar", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
-  no-such-method-forwarder method foo() → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method foo() → dynamic
     return [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
-  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
+[@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 [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("bazz", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  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 •() → void
+  synthetic constructor •() → self::D
     : super self::C::•()
     ;
   no-such-method-forwarder get bar() → dynamic
     return [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:bar", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
-  no-such-method-forwarder method foo() → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method foo() → dynamic
     return [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
-  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
+[@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 [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("bazz", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
 }
 class E extends core::Object implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::E
     : super core::Object::•()
     ;
-  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 [@vm.direct-call.metadata=#lib::E::noSuchMethod] [@vm.inferred-type.metadata=#lib::T4] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:bar", const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
 }
 class F extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::F
     : super core::Object::•()
     ;
-  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 •() → void
+  synthetic constructor •() → self::G
     : super core::Object::•()
     ;
-  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 •() → void
+  synthetic constructor •() → self::H
     : super core::Object::•()
     ;
-  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 = null, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic right = null}) → dynamic
     return new self::T6::•();
-  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::•();
   }
 }
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 eb9c442..f898084 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 •() → void
+  synthetic constructor •() → self::T0
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class T2 extends self::T0 {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T2
     : super self::T0::•()
     ;
-  method foo() → void {}
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → void {}
 }
 class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  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??] t0.{self::T0::foo}();
   }
 }
@@ -26,18 +26,18 @@
   abstract method method2(covariant dynamic arg) → void;
 }
 class C extends core::Object implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  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??] t0.{self::T0::foo}();
   }
 }
 class D extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::D
     : super core::Object::•()
     ;
-  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??] t0.{self::T0::foo}();
   }
 }
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 6c49846..3de865c 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
@@ -4,104 +4,104 @@
 import "package:expect/expect.dart" as exp;
 
 class T1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T1
     : super core::Object::•()
     ;
-  method doTest1() → void {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method doTest1() → void {
     self::ok = true;
   }
 }
 class A1 extends core::Object {
-[@vm.inferred-type.metadata=#lib::T1?]  field self::T1 foo = null;
-  synthetic constructor •() → void
+[@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::•()
     ;
-  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.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} = a5 as{TypeError} self::T1;
   }
 }
 class B1 extends core::Object {
-[@vm.inferred-type.metadata=#lib::A1]  field self::A1 aa1 = new self::A1::•();
-  synthetic constructor •() → void
+[@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 •() → void
+  synthetic constructor •() → self::T2
     : super core::Object::•()
     ;
-  method doTest2() → void {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method doTest2() → void {
     self::ok = true;
   }
 }
 class A2 extends core::Object {
-[@vm.inferred-type.metadata=#lib::T2?]  field dynamic foo = null;
-  synthetic constructor •() → void
+[@vm.inferred-type.metadata=#lib::T2?] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic foo = null;
+  synthetic constructor •() → self::A2
     : super core::Object::•()
     ;
-  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 = 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.direct-call.metadata=#lib::A2::foo] this.{self::A2::foo} = a6;
   }
 }
 abstract class B2Base extends core::Object {
-[@vm.inferred-type.metadata=#lib::A2]  field dynamic _aa = new self::A2::•();
-  synthetic constructor •() → void
+[@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
     : 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 •() → void
+  synthetic constructor •() → self::B2
     : super self::B2Base::•()
     ;
-  method doSuperCall() → void {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method doSuperCall() → void {
     [@vm.call-site-attributes.metadata=receiverType:dynamic] [@vm.direct-call.metadata=#lib::A2::call] [@vm.inferred-type.metadata=#lib::A2] super.{self::B2Base::aa2}.call(1, 2, 3, 4, 5, new self::T2::•());
   }
 }
 class T3 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::T3
     : super core::Object::•()
     ;
-  method doTest3() → void {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method doTest3() → void {
     self::ok = true;
   }
 }
 class A3 extends core::Object {
-[@vm.inferred-type.metadata=#lib::T3?]  field dynamic foo = null;
-  synthetic constructor •() → void
+[@vm.inferred-type.metadata=#lib::T3?] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic foo = null;
+  synthetic constructor •() → self::A3
     : super core::Object::•()
     ;
-  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 = 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.direct-call.metadata=#lib::A3::foo] this.{self::A3::foo} = a7;
   }
 }
 class B3 extends core::Object {
-[@vm.inferred-type.metadata=#lib::A3]  field self::A3 aa3 = new self::A3::•();
-  synthetic constructor •() → void
+[@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 •() → void
+  synthetic constructor •() → self::T4
     : super core::Object::•()
     ;
-  method doTest4() → void {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method doTest4() → void {
     self::ok = true;
   }
 }
 class A4 extends core::Object {
-[@vm.inferred-type.metadata=#lib::T4?]  field dynamic foo = null;
-  synthetic constructor •() → void
+[@vm.inferred-type.metadata=#lib::T4?] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic foo = null;
+  synthetic constructor •() → self::A4
     : super core::Object::•()
     ;
-  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 = 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.direct-call.metadata=#lib::A4::foo] this.{self::A4::foo} = a8;
   }
 }
 class B4 extends core::Object {
-[@vm.inferred-type.metadata=#lib::A4]  field dynamic _aa = new self::A4::•();
-  synthetic constructor •() → void
+[@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
     : super core::Object::•()
     ;
   get aa4() → dynamic
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 871430a..2f8a8ba 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,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
-  method foo() → core::int
+[@vm.procedure-attributes.metadata=hasThisUses:false]  method foo() → core::int
     return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] 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 {
-  field dynamic bazz;
-  constructor •(dynamic arg) → void
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic bazz;
+  constructor •(dynamic arg) → self::TearOffDynamicMethod
     : self::TearOffDynamicMethod::bazz = arg.foo, super core::Object::•() {
     this.{self::TearOffDynamicMethod::bazz}();
   }
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 1b2f0e8..f56b7cc 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
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method foo() → core::int;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
-  method foo() → core::int
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  method foo() → core::int
     return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int?] 1.{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() as{TypeError} core::num) as{TypeError} core::int;
-  method bar() → core::int
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bar() → core::int
     return 3;
 }
 class TearOffInterfaceMethod extends core::Object {
-  field dynamic bazz;
-  constructor •([@vm.inferred-type.metadata=#lib::B] self::A arg) → void
+[@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
     : self::TearOffInterfaceMethod::bazz = arg.{self::A::foo}, super core::Object::•()
     ;
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
index eed4b00..1410d58 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
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   abstract method foo() → core::int;
 }
 class B extends self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
-  method foo() → core::int
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo() → core::int
     return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int?] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
 }
 abstract class Base extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
-  method foo() → core::int
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  method foo() → core::int
     return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int?] 3.{core::num::+}([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
-  method doCall(dynamic x) → core::int
+[@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 •() → void
+  synthetic constructor •() → self::TearOffSuperMethod
     : super self::Base::•()
     ;
-  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?] this.{self::Base::doCall}(super.{self::Base::foo});
 }
 [@vm.inferred-type.metadata=#lib::B?]static field self::A aa = new self::B::•();
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 e5f135c..8f0cd57 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 •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
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 393e004..be8dcbf 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
@@ -7,7 +7,7 @@
 abstract class A extends core::Object implements self::I {
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/vm/tool/precompiler2 b/pkg/vm/tool/precompiler2
index 2339405..f364a47 100755
--- a/pkg/vm/tool/precompiler2
+++ b/pkg/vm/tool/precompiler2
@@ -9,7 +9,7 @@
 
 # Parse incoming arguments and extract the value of --packages option if any
 # was passed. Split options (--xyz) and non-options into two separate arrays.
-# All options will be passed to dart_bootstrap, while --packages will be
+# All options will be passed to gen_snapshot, while --packages will be
 # passed to Fasta.
 
 set -e
@@ -57,10 +57,11 @@
 SNAPSHOT_FILE="${ARGV[1]}"
 
 if [ $BUILD_ELF -eq 1 ]; then
-  DART_BOOTSTRAP_OUT="${SNAPSHOT_FILE}.S"
+  GEN_SNAPSHOT_OPTION="--snapshot-kind=app-aot-assembly"
+  GEN_SNAPSHOT_FILENAME="--assembly=${SNAPSHOT_FILE}.S"
 else
-  OPTIONS=("--use-blobs" "${OPTIONS[@]}")
-  DART_BOOTSTRAP_OUT="${SNAPSHOT_FILE}"
+  GEN_SNAPSHOT_OPTION="--snapshot-kind=app-aot-blobs"
+  GEN_SNAPSHOT_FILENAME="--blobs_container_filename=${SNAPSHOT_FILE}"
 fi
 
 function follow_links() {
@@ -100,15 +101,13 @@
      "$SOURCE_FILE"
 
 # Step 2: Generate snapshot from the Kernel binary.
-"$BIN_DIR"/dart_bootstrap                                                      \
-     --strong                                                                  \
-     --reify-generic-functions                                                 \
-     --snapshot-kind=app-aot                                                   \
-     --snapshot="$DART_BOOTSTRAP_OUT"                                          \
+"$BIN_DIR"/gen_snapshot                                                        \
+     "$GEN_SNAPSHOT_OPTION"                                                    \
+     "$GEN_SNAPSHOT_FILENAME"                                                  \
      "${OPTIONS[@]}"                                                           \
      "$SNAPSHOT_FILE.dill"
 
 # Step 3: Assemble the assembly file into an ELF object.
 if [ $BUILD_ELF -eq 1 ]; then
-    gcc -shared -o "$SNAPSHOT_FILE" "$DART_BOOTSTRAP_OUT"
+    gcc -shared -o "$SNAPSHOT_FILE" "${SNAPSHOT_FILE}.S"
 fi
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index 865e716..8bba438 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -184,6 +184,12 @@
   }
 }
 
+config("dart_shared_lib") {
+  if (dart_lib_export_symbols) {
+    defines = [ "DART_SHARED_LIB" ]
+  }
+}
+
 source_set("dart_api") {
   public_configs = [ ":dart_public_config" ]
   sources = [
@@ -204,6 +210,7 @@
     "vm:libdart_lib",
     "vm:libdart_vm",
   ]
+  extra_configs = [ ":dart_shared_lib" ]
   include_dirs = [ "." ]
   public_configs = [ ":dart_public_config" ]
   sources = [
@@ -215,7 +222,6 @@
     "vm/native_api_impl.cc",
     "vm/version.h",
   ]
-  defines = [ "DART_SHARED_LIB" ]
 }
 
 action("generate_version_cc_file") {
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 856dcae..a27e0fa 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -46,186 +46,6 @@
          ] + rebase_path(sources, root_build_dir)
 }
 
-template("gen_library_src_path") {
-  assert(defined(invoker.sources), "Need sources in $target_name")
-  assert(defined(invoker.output), "Need output in $target_name")
-  action(target_name) {
-    visibility = [ ":*" ]  # Only targets in this file can see this.
-    script = "../tools/gen_library_src_paths.py"
-    inputs = [
-               "../tools/gen_library_src_paths.py",
-               "builtin_in.cc",
-             ] + invoker.sources
-    outputs = [
-      invoker.output,
-    ]
-    name = invoker.name
-    kind = invoker.kind
-    library_name = "dart:${name}"
-    if (defined(invoker.library_name)) {
-      library_name = invoker.library_name
-    }
-    args = [
-             "--output",
-             rebase_path(invoker.output, root_build_dir),
-             "--input_cc",
-             rebase_path("builtin_in.cc", root_build_dir),
-             "--include",
-             "bin/builtin.h",
-             "--var_name",
-             "dart::bin::Builtin::${name}_${kind}_paths_",
-             "--library_name",
-             library_name,
-           ] + rebase_path(invoker.sources, root_build_dir)
-  }
-}
-
-gen_library_src_path("generate_builtin_cc_file") {
-  name = "_builtin"
-  kind = "source"
-  sources = builtin_sources
-  output = "$target_gen_dir/builtin_gen.cc"
-}
-
-rebased_io_sdk_sources = rebase_path(io_sdk_sources, ".", "../../sdk/lib/io")
-
-gen_library_src_path("generate_io_cc_file") {
-  name = "io"
-  kind = "source"
-  sources = [ "../../sdk/lib/io/io.dart" ] + rebased_io_sdk_sources
-  output = "$target_gen_dir/io_gen.cc"
-}
-
-gen_library_src_path("generate_io_patch_cc_file") {
-  name = "io"
-  kind = "patch"
-  sources = io_runtime_sources
-  output = "$target_gen_dir/io_patch_gen.cc"
-}
-
-rebased_http_sdk_sources =
-    rebase_path(http_sdk_sources, ".", "../../sdk/lib/_http")
-
-gen_library_src_path("generate_http_cc_file") {
-  name = "_http"
-  kind = "source"
-  sources = [ "../../sdk/lib/_http/http.dart" ] + rebased_http_sdk_sources
-  output = "$target_gen_dir/http_gen.cc"
-}
-
-rebased_cli_sdk_sources = rebase_path(cli_sdk_sources, ".", "../../sdk/lib/cli")
-
-gen_library_src_path("generate_cli_cc_file") {
-  name = "cli"
-  kind = "source"
-  sources = [ "../../sdk/lib/cli/cli.dart" ] + rebased_cli_sdk_sources
-  output = "$target_gen_dir/cli_gen.cc"
-}
-
-gen_library_src_path("generate_cli_patch_cc_file") {
-  name = "cli"
-  kind = "patch"
-  sources = cli_runtime_sources
-  output = "$target_gen_dir/cli_patch_gen.cc"
-}
-
-gen_library_src_path("generate_html_cc_file") {
-  name = "html"
-  kind = "source"
-  sources = [
-    "../../sdk/lib/html/dart2js/html_dart2js.dart",
-  ]
-  output = "$target_gen_dir/html_gen.cc"
-}
-
-gen_library_src_path("generate_html_common_cc_file") {
-  name = "html_common"
-  kind = "source"
-  sources = [
-    "../../sdk/lib/html/html_common/conversions.dart",
-    "../../sdk/lib/html/html_common/conversions_dart2js.dart",
-    "../../sdk/lib/html/html_common/css_class_set.dart",
-    "../../sdk/lib/html/html_common/device.dart",
-    "../../sdk/lib/html/html_common/filtered_element_list.dart",
-    "../../sdk/lib/html/html_common/html_common.dart",
-    "../../sdk/lib/html/html_common/lists.dart",
-  ]
-  output = "$target_gen_dir/html_common_gen.cc"
-}
-
-gen_library_src_path("generate_js_cc_file") {
-  name = "js"
-  kind = "source"
-  sources = [
-    "../../sdk/lib/js/dart2js/js_dart2js.dart",
-  ]
-  output = "$target_gen_dir/js_gen.cc"
-}
-
-gen_library_src_path("generate_js_util_cc_file") {
-  name = "js_util"
-  kind = "source"
-  sources = [
-    "../../sdk/lib/js_util/dart2js/js_util_dart2js.dart",
-  ]
-  output = "$target_gen_dir/js_util_gen.cc"
-}
-
-gen_library_src_path("generate_indexed_db_cc_file") {
-  name = "indexed_db"
-  kind = "source"
-  sources = [
-    "../../sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart",
-  ]
-  output = "$target_gen_dir/indexed_db_gen.cc"
-}
-
-gen_library_src_path("generate_web_gl_cc_file") {
-  name = "web_gl"
-  kind = "source"
-  sources = [
-    "../../sdk/lib/web_gl/dart2js/web_gl_dart2js.dart",
-  ]
-  output = "$target_gen_dir/web_gl_gen.cc"
-}
-
-gen_library_src_path("generate_metadata_cc_file") {
-  name = "metadata"
-  library_name = "metadata.dart"
-  kind = "source"
-  sources = [
-    "../../sdk/lib/html/html_common/metadata.dart",
-  ]
-  output = "$target_gen_dir/metadata_gen.cc"
-}
-
-gen_library_src_path("generate_web_sql_cc_file") {
-  name = "web_sql"
-  kind = "source"
-  sources = [
-    "../../sdk/lib/web_sql/dart2js/web_sql_dart2js.dart",
-  ]
-  output = "$target_gen_dir/web_sql_gen.cc"
-}
-
-gen_library_src_path("generate_svg_cc_file") {
-  name = "svg"
-  kind = "source"
-  sources = [
-    "../../sdk/lib/svg/dart2js/svg_dart2js.dart",
-  ]
-  output = "$target_gen_dir/svg_gen.cc"
-}
-
-gen_library_src_path("generate_web_audio_cc_file") {
-  name = "web_audio"
-  kind = "source"
-  sources = [
-    "../../sdk/lib/web_audio/dart2js/web_audio_dart2js.dart",
-  ]
-  output = "$target_gen_dir/web_audio_gen.cc"
-}
-
 config("libdart_builtin_config") {
   if (!is_win) {
     libs = [ "dl" ]
@@ -252,24 +72,7 @@
       configs -= [ "//build/config:symbol_visibility_hidden" ]
     }
     public_configs = [ ":libdart_builtin_config" ]
-    deps = [
-      ":generate_builtin_cc_file",
-      ":generate_cli_cc_file",
-      ":generate_cli_patch_cc_file",
-      ":generate_html_cc_file",
-      ":generate_html_common_cc_file",
-      ":generate_http_cc_file",
-      ":generate_indexed_db_cc_file",
-      ":generate_io_cc_file",
-      ":generate_io_patch_cc_file",
-      ":generate_js_cc_file",
-      ":generate_js_util_cc_file",
-      ":generate_metadata_cc_file",
-      ":generate_svg_cc_file",
-      ":generate_web_audio_cc_file",
-      ":generate_web_gl_cc_file",
-      ":generate_web_sql_cc_file",
-    ]
+    deps = []
     if (is_fuchsia) {
       public_deps = [
         "//zircon/public/lib/fdio",
@@ -336,32 +139,22 @@
     if (is_fuchsia) {
       configs -= [ "//build/config:symbol_visibility_hidden" ]
     }
-    deps = [
-             ":gen_resources_cc",
-             ":generate_builtin_cc_file",
-             ":generate_http_cc_file",
-             ":generate_io_cc_file",
-             ":generate_io_patch_cc_file",
-             ":generate_cli_cc_file",
-             ":generate_cli_patch_cc_file",
-           ] + extra_deps
+    deps = [ ":gen_resources_cc" ] + extra_deps
 
     sources = [
       # Include generated source files.
-      "$target_gen_dir/builtin_gen.cc",
-      "$target_gen_dir/cli_gen.cc",
-      "$target_gen_dir/cli_patch_gen.cc",
-      "$target_gen_dir/http_gen.cc",
-      "$target_gen_dir/io_gen.cc",
-      "$target_gen_dir/io_patch_gen.cc",
       "$target_gen_dir/resources_gen.cc",
       "address_sanitizer.cc",
       "builtin.cc",
       "builtin.h",
+      "error_exit.cc",
+      "error_exit.h",
       "gzip.cc",
       "gzip.h",
       "loader.cc",
       "loader.h",
+      "snapshot_utils.cc",
+      "snapshot_utils.h",
 
       # Very limited native resolver provided.
       "builtin_common.cc",
@@ -558,7 +351,6 @@
     custom_sources_filter = [
       "*_test.cc",
       "*_test.h",
-      "builtin.cc",
       "builtin_gen_snapshot.cc",
     ]
     if (!is_mac && !is_ios) {
@@ -621,21 +413,21 @@
   }
 }
 
-dart_io("embedded_dart_io") {
+dart_io("dart_io_api") {
   extra_configs = [ "..:dart_maybe_product_config" ]
   extra_sources = [
-    "builtin_nolib.cc",
-    "embedded_dart_io.cc",
-    "embedded_dart_io.h",
+    "builtin.cc",
+    "dart_io_api_impl.cc",
+    "../include/bin/dart_io_api.h",
   ]
 }
 
-dart_io("embedded_dart_io_product") {
+dart_io("dart_io_api_product") {
   extra_configs = [ "..:dart_product_config" ]
   extra_sources = [
-    "builtin_nolib.cc",
-    "embedded_dart_io.cc",
-    "embedded_dart_io.h",
+    "builtin.cc",
+    "dart_io_api_impl.cc",
+    "../include/bin/dart_io_api.h",
   ]
 }
 
@@ -645,13 +437,19 @@
 }
 
 gen_snapshot_action("generate_snapshot_bin") {
+  deps = [
+    "../vm:vm_platform",
+  ]
   vm_snapshot_data = "$target_gen_dir/vm_snapshot_data.bin"
   vm_snapshot_instructions = "$target_gen_dir/vm_snapshot_instructions.bin"
   isolate_snapshot_data = "$target_gen_dir/isolate_snapshot_data.bin"
   isolate_snapshot_instructions =
       "$target_gen_dir/isolate_snapshot_instructions.bin"
 
-  inputs = []
+  platform_dill = "$root_out_dir/vm_platform_strong.dill"
+  inputs = [
+    platform_dill,
+  ]
   outputs = [
     vm_snapshot_data,
     vm_snapshot_instructions,
@@ -668,6 +466,7 @@
         rebase_path(isolate_snapshot_data, root_build_dir),
     "--isolate_snapshot_instructions=" +
         rebase_path(isolate_snapshot_instructions, root_build_dir),
+    rebase_path(platform_dill),
   ]
 }
 
@@ -961,7 +760,7 @@
     extra_deps += [ "../observatory:standalone_observatory_archive" ]
   }
   extra_sources = [
-    "builtin_nolib.cc",
+    "builtin.cc",
     "dfe.cc",
     "dfe.h",
     "loader.cc",
@@ -985,7 +784,7 @@
     extra_deps += [ "../observatory:standalone_observatory_archive" ]
   }
   extra_sources = [
-    "builtin_nolib.cc",
+    "builtin.cc",
     "snapshot_empty.cc",
     "loader.cc",
     "loader.h",
@@ -1004,7 +803,7 @@
     extra_deps += [ "../observatory:standalone_observatory_archive" ]
   }
   extra_sources = [
-    "builtin_nolib.cc",
+    "builtin.cc",
     "snapshot_empty.cc",
     "loader.cc",
     "loader.h",
@@ -1018,68 +817,6 @@
   target_type = "static_library"
 }
 
-dart_executable("dart_bootstrap") {
-  extra_configs = [
-    "..:dart_precompiler_config",
-    "..:dart_nosnapshot_config",
-  ]
-  extra_deps = [
-    ":gen_resources_cc",
-    ":generate_builtin_cc_file",
-    ":generate_html_cc_file",
-    ":generate_html_common_cc_file",
-    ":generate_http_cc_file",
-    ":generate_indexed_db_cc_file",
-    ":generate_io_cc_file",
-    ":generate_io_patch_cc_file",
-    ":generate_js_cc_file",
-    ":generate_js_util_cc_file",
-    ":generate_metadata_cc_file",
-    ":generate_svg_cc_file",
-    ":generate_cli_cc_file",
-    ":generate_cli_patch_cc_file",
-    ":generate_web_audio_cc_file",
-    ":generate_web_gl_cc_file",
-    ":generate_web_sql_cc_file",
-    "..:libdart_nosnapshot_with_precompiler",
-  ]
-  extra_defines = [ "NO_OBSERVATORY" ]
-  extra_sources = [
-    "builtin.cc",
-    "builtin.h",
-    "dfe.cc",
-    "dfe.h",
-    "loader.cc",
-    "loader.h",
-    "gzip.cc",
-    "gzip.h",
-    "observatory_assets_empty.cc",
-    "snapshot_empty.cc",
-
-    # Include generated source files.
-    "$target_gen_dir/builtin_gen.cc",
-    "$target_gen_dir/html_common_gen.cc",
-    "$target_gen_dir/html_gen.cc",
-    "$target_gen_dir/http_gen.cc",
-    "$target_gen_dir/indexed_db_gen.cc",
-    "$target_gen_dir/io_gen.cc",
-    "$target_gen_dir/io_patch_gen.cc",
-    "$target_gen_dir/js_gen.cc",
-    "$target_gen_dir/js_util_gen.cc",
-    "$target_gen_dir/metadata_gen.cc",
-    "$target_gen_dir/resources_gen.cc",
-    "$target_gen_dir/svg_gen.cc",
-    "$target_gen_dir/cli_gen.cc",
-    "$target_gen_dir/cli_patch_gen.cc",
-    "$target_gen_dir/web_audio_gen.cc",
-    "$target_gen_dir/web_gl_gen.cc",
-    "$target_gen_dir/web_sql_gen.cc",
-  ]
-  if (!exclude_kernel_service) {
-    extra_deps += [ ":dart_kernel_platform_cc" ]
-  }
-}
-
 executable("process_test") {
   sources = [
     "process_test.cc",
@@ -1197,7 +934,7 @@
   heap_tests = rebase_path(heap_sources_tests, ".", "../vm/heap")
 
   sources = [
-              "builtin_nolib.cc",
+              "builtin.cc",
               "dfe.cc",
               "dfe.h",
               "error_exit.cc",
diff --git a/runtime/bin/builtin.cc b/runtime/bin/builtin.cc
index c60823d..a10ee81 100644
--- a/runtime/bin/builtin.cc
+++ b/runtime/bin/builtin.cc
@@ -8,96 +8,26 @@
 
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
-#include "bin/platform.h"
 
 namespace dart {
 namespace bin {
 
 Builtin::builtin_lib_props Builtin::builtin_libraries_[] = {
-    /* { url_, source_, patch_url_, patch_source_, has_natives_ } */
-    {DartUtils::kBuiltinLibURL, _builtin_source_paths_, NULL, NULL, true},
-    {DartUtils::kIOLibURL, io_source_paths_, DartUtils::kIOLibPatchURL,
-     io_patch_paths_, true},
-    {DartUtils::kHttpLibURL, _http_source_paths_, NULL, NULL, false},
-    {DartUtils::kCLILibURL, cli_source_paths_, DartUtils::kCLILibPatchURL,
-     cli_patch_paths_, true},
-
-#if defined(DART_NO_SNAPSHOT)
-    // Only include these libraries in the dart_bootstrap case for now.
-    {"dart:html", html_source_paths_, NULL, NULL, true},
-    {"dart:html_common", html_common_source_paths_, NULL, NULL, true},
-    {"dart:js", js_source_paths_, NULL, NULL, true},
-    {"dart:js_util", js_util_source_paths_, NULL, NULL, true},
-    {"dart:indexed_db", indexed_db_source_paths_, NULL, NULL, true},
-    {"dart:web_gl", web_gl_source_paths_, NULL, NULL, true},
-    {"metadata.dart", metadata_source_paths_, NULL, NULL, true},
-    {"dart:web_sql", web_sql_source_paths_, NULL, NULL, true},
-    {"dart:svg", svg_source_paths_, NULL, NULL, true},
-    {"dart:web_audio", web_audio_source_paths_, NULL, NULL, true},
-#endif  // defined(DART_NO_SNAPSHOT)
+    /* { url_, has_natives_ } */
+    {DartUtils::kBuiltinLibURL, true},
+    {DartUtils::kIOLibURL, true},
+    {DartUtils::kHttpLibURL, false},
+    {DartUtils::kCLILibURL, true},
 
     // End marker.
-    {NULL, NULL, NULL, NULL, false}};
+    {NULL, false}};
 
 Dart_Port Builtin::load_port_ = ILLEGAL_PORT;
 const int Builtin::num_libs_ =
     sizeof(Builtin::builtin_libraries_) / sizeof(Builtin::builtin_lib_props);
 
-// Patch all the specified patch files in the array 'patch_files' into the
-// library specified in 'library'.
-static void LoadPatchFiles(Dart_Handle library,
-                           const char* patch_uri,
-                           const char** patch_files) {
-  for (intptr_t j = 0; patch_files[j] != NULL; j += 2) {
-    // Use the sources linked in the binary.
-    const char* source = patch_files[j + 1];
-    Dart_Handle patch_src = Dart_NewStringFromUTF8(
-        reinterpret_cast<const uint8_t*>(source), strlen(source));
-
-    // Prepend the patch library URI to form a unique script URI for the patch.
-    const char* unprefixed_patch_file = strchr(patch_files[j], '/') + 1;
-    intptr_t len = snprintf(NULL, 0, "%s/%s", patch_uri, unprefixed_patch_file);
-    char* patch_filename = DartUtils::ScopedCString(len + 1);
-    snprintf(patch_filename, len + 1, "%s/%s", patch_uri,
-             unprefixed_patch_file);
-    Dart_Handle patch_file_uri = DartUtils::NewString(patch_filename);
-
-    DART_CHECK_VALID(Dart_LibraryLoadPatch(library, patch_file_uri, patch_src));
-  }
-}
-
-Dart_Handle Builtin::Source(BuiltinLibraryId id) {
-  ASSERT(static_cast<int>(id) >= 0);
-  ASSERT(static_cast<int>(id) < num_libs_);
-
-  // Try to read the source using the path specified for the uri.
-  const char* uri = builtin_libraries_[id].url_;
-  const char** source_paths = builtin_libraries_[id].source_paths_;
-  return GetSource(source_paths, uri);
-}
-
 Dart_Handle Builtin::PartSource(BuiltinLibraryId id, const char* part_uri) {
-  ASSERT(static_cast<int>(id) >= 0);
-  ASSERT(static_cast<int>(id) < num_libs_);
-
-  // Try to read the source using the path specified for the uri.
-  const char** source_paths = builtin_libraries_[id].source_paths_;
-  return GetSource(source_paths, part_uri);
-}
-
-Dart_Handle Builtin::GetSource(const char** source_paths, const char* uri) {
-  if (source_paths == NULL) {
-    return Dart_Null();  // No path mapping information exists for library.
-  }
-  for (intptr_t i = 0; source_paths[i] != NULL; i += 2) {
-    if (!strcmp(uri, source_paths[i])) {
-      // Use the sources linked in the binary.
-      const char* source = source_paths[i + 1];
-      return Dart_NewStringFromUTF8(reinterpret_cast<const uint8_t*>(source),
-                                    strlen(source));
-    }
-  }
-  return Dart_Null();  // Uri does not exist in path mapping information.
+  UNREACHABLE();
 }
 
 void Builtin::SetNativeResolver(BuiltinLibraryId id) {
@@ -114,24 +44,6 @@
   }
 }
 
-Dart_Handle Builtin::LoadLibrary(Dart_Handle url, BuiltinLibraryId id) {
-  ASSERT(static_cast<int>(id) >= 0);
-  ASSERT(static_cast<int>(id) < num_libs_);
-
-  Dart_Handle library = Dart_LoadLibrary(url, Dart_Null(), Source(id), 0, 0);
-  if (!Dart_IsError(library) && (builtin_libraries_[id].has_natives_)) {
-    // Setup the native resolver for built in library functions.
-    DART_CHECK_VALID(
-        Dart_SetNativeResolver(library, NativeLookup, NativeSymbol));
-  }
-  if (builtin_libraries_[id].patch_url_ != NULL) {
-    ASSERT(builtin_libraries_[id].patch_paths_ != NULL);
-    LoadPatchFiles(library, builtin_libraries_[id].patch_url_,
-                   builtin_libraries_[id].patch_paths_);
-  }
-  return library;
-}
-
 Builtin::BuiltinLibraryId Builtin::FindId(const char* url_string) {
   int id = 0;
   while (true) {
@@ -150,11 +62,7 @@
   ASSERT(static_cast<int>(id) < num_libs_);
 
   Dart_Handle url = DartUtils::NewString(builtin_libraries_[id].url_);
-  Dart_Handle library = Dart_LookupLibrary(url);
-  if (Dart_IsError(library)) {
-    library = LoadLibrary(url, id);
-  }
-  return library;
+  return Dart_LookupLibrary(url);
 }
 
 }  // namespace bin
diff --git a/runtime/bin/builtin.h b/runtime/bin/builtin.h
index 4823d91..bfe08d0 100644
--- a/runtime/bin/builtin.h
+++ b/runtime/bin/builtin.h
@@ -33,16 +33,12 @@
     kCLILibrary,
   };
 
-  // Get source corresponding to built in library specified in 'id'.
-  static Dart_Handle Source(BuiltinLibraryId id);
-
   // Get source of part file specified in 'uri'.
   static Dart_Handle PartSource(BuiltinLibraryId id, const char* part_uri);
 
   // Setup native resolver method built in library specified in 'id'.
   static void SetNativeResolver(BuiltinLibraryId id);
 
-  static Dart_Handle LoadLibrary(Dart_Handle url, BuiltinLibraryId id);
   static BuiltinLibraryId FindId(const char* url_string);
 
   // Check if built in library specified in 'id' is already loaded, if not
@@ -57,10 +53,6 @@
   }
 
  private:
-  // Map specified URI to an actual file name from 'source_paths' and read
-  // the file.
-  static Dart_Handle GetSource(const char** source_paths, const char* uri);
-
   // Native method support.
   static Dart_NativeFunction NativeLookup(Dart_Handle name,
                                           int argument_count,
@@ -68,31 +60,11 @@
 
   static const uint8_t* NativeSymbol(Dart_NativeFunction nf);
 
-  static const char* _builtin_source_paths_[];
-  static const char* _http_source_paths_[];
-  static const char* io_source_paths_[];
-  static const char* io_patch_paths_[];
-  static const char* html_source_paths_[];
-  static const char* html_common_source_paths_[];
-  static const char* js_source_paths_[];
-  static const char* js_util_source_paths_[];
-  static const char* indexed_db_source_paths_[];
-  static const char* web_gl_source_paths_[];
-  static const char* metadata_source_paths_[];
-  static const char* web_sql_source_paths_[];
-  static const char* cli_source_paths_[];
-  static const char* cli_patch_paths_[];
-  static const char* svg_source_paths_[];
-  static const char* web_audio_source_paths_[];
-
   static Dart_Port load_port_;
   static const int num_libs_;
 
   typedef struct {
     const char* url_;
-    const char** source_paths_;
-    const char* patch_url_;
-    const char** patch_paths_;
     bool has_natives_;
   } builtin_lib_props;
   static builtin_lib_props builtin_libraries_[];
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index ef0de2e..b91c95b 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -6,6 +6,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "include/bin/dart_io_api.h"
 #include "include/dart_api.h"
 #include "include/dart_tools_api.h"
 
@@ -13,7 +14,6 @@
 
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
-#include "bin/embedded_dart_io.h"
 #include "bin/file.h"
 #include "bin/io_natives.h"
 #include "bin/platform.h"
diff --git a/runtime/bin/builtin_nolib.cc b/runtime/bin/builtin_nolib.cc
deleted file mode 100644
index 2bf2599..0000000
--- a/runtime/bin/builtin_nolib.cc
+++ /dev/null
@@ -1,76 +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.
-
-#include <stdio.h>
-
-#include "include/dart_api.h"
-
-#include "bin/builtin.h"
-#include "bin/dartutils.h"
-#include "bin/io_natives.h"
-
-namespace dart {
-namespace bin {
-
-Builtin::builtin_lib_props Builtin::builtin_libraries_[] = {
-    /* { url_, source_, patch_url_, patch_source_, has_natives_ } */
-    {DartUtils::kBuiltinLibURL, NULL, NULL, NULL, true},
-    {DartUtils::kIOLibURL, NULL, NULL, NULL, true},
-    {DartUtils::kHttpLibURL, NULL, NULL, NULL, false},
-    {DartUtils::kCLILibURL, NULL, NULL, NULL, true},
-    // End marker.
-    {NULL, NULL, NULL, NULL, false}};
-
-Dart_Port Builtin::load_port_ = ILLEGAL_PORT;
-const int Builtin::num_libs_ =
-    sizeof(Builtin::builtin_libraries_) / sizeof(Builtin::builtin_lib_props);
-
-Dart_Handle Builtin::Source(BuiltinLibraryId id) {
-  return DartUtils::NewError("Unreachable code in Builtin::Source (%d).", id);
-}
-
-Dart_Handle Builtin::PartSource(BuiltinLibraryId id, const char* uri) {
-  return DartUtils::NewError("Unreachable code in Builtin::PartSource (%d).",
-                             id);
-}
-
-Dart_Handle Builtin::GetSource(const char** source_paths, const char* uri) {
-  return DartUtils::NewError("Unreachable code in Builtin::GetSource (%s).",
-                             uri);
-}
-
-void Builtin::SetNativeResolver(BuiltinLibraryId id) {
-  ASSERT(static_cast<int>(id) >= 0);
-  ASSERT(static_cast<int>(id) < num_libs_);
-
-  if (builtin_libraries_[id].has_natives_) {
-    Dart_Handle url = DartUtils::NewString(builtin_libraries_[id].url_);
-    Dart_Handle library = Dart_LookupLibrary(url);
-    ASSERT(!Dart_IsError(library));
-    // Setup the native resolver for built in library functions.
-    DART_CHECK_VALID(
-        Dart_SetNativeResolver(library, NativeLookup, NativeSymbol));
-  }
-}
-
-Dart_Handle Builtin::LoadLibrary(Dart_Handle url, BuiltinLibraryId id) {
-  return DartUtils::NewError("Unreachable code in Builtin::LoadLibrary (%d).",
-                             id);
-}
-
-Builtin::BuiltinLibraryId Builtin::FindId(const char* url_string) {
-  return kInvalidLibrary;
-}
-
-Dart_Handle Builtin::LoadAndCheckLibrary(BuiltinLibraryId id) {
-  ASSERT(static_cast<int>(id) >= 0);
-  ASSERT(static_cast<int>(id) < num_libs_);
-
-  Dart_Handle url = DartUtils::NewString(builtin_libraries_[id].url_);
-  Dart_Handle library = Dart_LookupLibrary(url);
-  return library;
-}
-
-}  // namespace bin
-}  // namespace dart
diff --git a/runtime/bin/embedded_dart_io.cc b/runtime/bin/dart_io_api_impl.cc
similarity index 76%
rename from runtime/bin/embedded_dart_io.cc
rename to runtime/bin/dart_io_api_impl.cc
index f13233a..d1a7bec 100644
--- a/runtime/bin/embedded_dart_io.cc
+++ b/runtime/bin/dart_io_api_impl.cc
@@ -2,11 +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 "bin/embedded_dart_io.h"
+#include "include/bin/dart_io_api.h"
 
 #include "bin/crypto.h"
 #include "bin/directory.h"
 #include "bin/eventhandler.h"
+#include "bin/io_natives.h"
 #include "bin/platform.h"
 #include "bin/process.h"
 #include "bin/thread.h"
@@ -45,5 +46,15 @@
   return Crypto::GetRandomBytes(length, buffer);
 }
 
+Dart_NativeFunction LookupIONative(Dart_Handle name,
+                                   int argument_count,
+                                   bool* auto_setup_scope) {
+  return IONativeLookup(name, argument_count, auto_setup_scope);
+}
+
+const uint8_t* LookupIONativeSymbol(Dart_NativeFunction nf) {
+  return IONativeSymbol(nf);
+}
+
 }  // namespace bin
 }  // namespace dart
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 86685dc..6eade2f 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -55,7 +55,6 @@
 dart::SimpleHashMap* DartUtils::environment_ = NULL;
 
 MagicNumberData appjit_magic_number = {8, {0xdc, 0xdc, 0xf6, 0xf6, 0, 0, 0, 0}};
-MagicNumberData snapshot_magic_number = {4, {0xf5, 0xf5, 0xdc, 0xdc}};
 MagicNumberData kernel_magic_number = {4, {0x90, 0xab, 0xcd, 0xef}};
 MagicNumberData kernel_list_magic_number = {
     7,
@@ -437,8 +436,6 @@
       RefCntReleaseScope<File> rs(file);
       intptr_t max_magic_length = 0;
       max_magic_length =
-          Utils::Maximum(max_magic_length, snapshot_magic_number.length);
-      max_magic_length =
           Utils::Maximum(max_magic_length, appjit_magic_number.length);
       max_magic_length =
           Utils::Maximum(max_magic_length, kernel_magic_number.length);
@@ -458,10 +455,6 @@
 
 DartUtils::MagicNumber DartUtils::SniffForMagicNumber(const uint8_t* buffer,
                                                       intptr_t buffer_length) {
-  if (CheckMagicNumber(buffer, buffer_length, snapshot_magic_number)) {
-    return kSnapshotMagicNumber;
-  }
-
   if (CheckMagicNumber(buffer, buffer_length, appjit_magic_number)) {
     return kAppJITMagicNumber;
   }
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 5bfaf6d..666d248 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -222,7 +222,6 @@
   static Dart_Handle ResolveScript(Dart_Handle url);
 
   enum MagicNumber {
-    kSnapshotMagicNumber,
     kAppJITMagicNumber,
     kKernelMagicNumber,
     kKernelListMagicNumber,
@@ -649,7 +648,6 @@
 };
 
 extern MagicNumberData appjit_magic_number;
-extern MagicNumberData snapshot_magic_number;
 extern MagicNumberData kernel_magic_number;
 extern MagicNumberData kernel_list_magic_number;
 extern MagicNumberData gzip_magic_number;
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 5e58c20..7e18fef 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -209,14 +209,17 @@
       *exit_code = 0;
       break;
     case Dart_KernelCompilationStatus_Error:
+      free(result.kernel);
       *error = result.error;  // Copy error message.
       *exit_code = kCompilationErrorExitCode;
       break;
     case Dart_KernelCompilationStatus_Crash:
+      free(result.kernel);
       *error = result.error;  // Copy error message.
       *exit_code = kDartFrontendErrorExitCode;
       break;
     case Dart_KernelCompilationStatus_Unknown:
+      free(result.kernel);
       *error = result.error;  // Copy error message.
       *exit_code = kErrorExitCode;
       break;
diff --git a/runtime/bin/eventhandler_fuchsia.cc b/runtime/bin/eventhandler_fuchsia.cc
index 79f067f..a74f0c2 100644
--- a/runtime/bin/eventhandler_fuchsia.cc
+++ b/runtime/bin/eventhandler_fuchsia.cc
@@ -10,7 +10,6 @@
 
 #include <errno.h>
 #include <fcntl.h>
-#include <lib/fdio/private.h>
 #include <poll.h>
 #include <pthread.h>
 #include <stdio.h>
@@ -194,18 +193,19 @@
                                uint32_t events,
                                uint64_t key) {
   LOG_INFO("IOHandle::AsyncWait: fd = %ld\n", fd_);
-  // The call to __fdio_fd_to_io() in the DescriptorInfo constructor may have
-  // returned NULL. If it did, propagate the problem up to Dart.
+  // The call to fdio_unsafe_fd_to_io() in the DescriptorInfo constructor may
+  // have returned NULL. If it did, propagate the problem up to Dart.
   if (fdio_ == NULL) {
-    LOG_ERR("__fdio_fd_to_io(%ld) returned NULL\n", fd_);
+    LOG_ERR("fdio_unsafe_fd_to_io(%ld) returned NULL\n", fd_);
     return false;
   }
 
   zx_handle_t handle;
   zx_signals_t signals;
-  __fdio_wait_begin(fdio_, events, &handle, &signals);
+  fdio_unsafe_wait_begin(fdio_, events, &handle, &signals);
   if (handle == ZX_HANDLE_INVALID) {
-    LOG_ERR("fd = %ld __fdio_wait_begin returned an invalid handle\n", fd_);
+    LOG_ERR("fd = %ld fdio_unsafe_wait_begin returned an invalid handle\n",
+            fd_);
     return false;
   }
 
@@ -248,7 +248,7 @@
 uint32_t IOHandle::WaitEnd(zx_signals_t observed) {
   MutexLocker ml(mutex_);
   uint32_t events = 0;
-  __fdio_wait_end(fdio_, observed, &events);
+  fdio_unsafe_wait_end(fdio_, observed, &events);
   return events;
 }
 
diff --git a/runtime/bin/eventhandler_fuchsia.h b/runtime/bin/eventhandler_fuchsia.h
index c0c1778..0ff514b 100644
--- a/runtime/bin/eventhandler_fuchsia.h
+++ b/runtime/bin/eventhandler_fuchsia.h
@@ -10,7 +10,7 @@
 #endif
 
 #include <errno.h>
-#include <lib/fdio/private.h>
+#include <lib/fdio/unsafe.h>
 #include <sys/socket.h>
 #include <unistd.h>
 #include <zircon/status.h>
@@ -37,7 +37,7 @@
         fd_(fd),
         handle_(ZX_HANDLE_INVALID),
         wait_key_(0),
-        fdio_(__fdio_fd_to_io(fd)) {}
+        fdio_(fdio_unsafe_fd_to_io(fd)) {}
 
   intptr_t fd() const { return fd_; }
 
@@ -63,7 +63,7 @@
  private:
   ~IOHandle() {
     if (fdio_ != NULL) {
-      __fdio_release(fdio_);
+      fdio_unsafe_release(fdio_);
     }
     delete mutex_;
   }
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 45e5b91..0bc02c0 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -8,11 +8,11 @@
 
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
-#include "bin/embedded_dart_io.h"
 #include "bin/io_buffer.h"
 #include "bin/namespace.h"
 #include "bin/typed_data_utils.h"
 #include "bin/utils.h"
+#include "include/bin/dart_io_api.h"
 #include "include/dart_api.h"
 #include "include/dart_tools_api.h"
 #include "platform/globals.h"
diff --git a/runtime/bin/file_support.cc b/runtime/bin/file_support.cc
index fe66cd9..dd07839 100644
--- a/runtime/bin/file_support.cc
+++ b/runtime/bin/file_support.cc
@@ -6,10 +6,10 @@
 
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
-#include "bin/embedded_dart_io.h"
 #include "bin/io_buffer.h"
 #include "bin/utils.h"
 
+#include "include/bin/dart_io_api.h"
 #include "include/dart_api.h"
 #include "include/dart_tools_api.h"
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 690cf4d..24da95d 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -22,6 +22,7 @@
 #include "bin/log.h"
 #include "bin/options.h"
 #include "bin/platform.h"
+#include "bin/snapshot_utils.h"
 #include "bin/thread.h"
 #include "bin/utils.h"
 #include "bin/vmservice_impl.h"
@@ -60,7 +61,7 @@
   }
 
 // The core snapshot to use when creating isolates. Normally NULL, but loaded
-// from a file when creating script snapshots.
+// from a file when creating AppJIT snapshots.
 const uint8_t* isolate_snapshot_data = NULL;
 const uint8_t* isolate_snapshot_instructions = NULL;
 
@@ -69,7 +70,7 @@
 enum SnapshotKind {
   kCore,
   kCoreJIT,
-  kScript,
+  kAppJIT,
   kAppAOTBlobs,
   kAppAOTAssembly,
   kVMAOTAssembly,
@@ -93,7 +94,7 @@
 static const char* kSnapshotKindNames[] = {
     "core",
     "core-jit",
-    "script",
+    "app-jit",
     "app-aot-blobs",
     "app-aot-assembly",
     "vm-aot-assembly",
@@ -101,14 +102,21 @@
 };
 
 #define STRING_OPTIONS_LIST(V)                                                 \
+  V(load_vm_snapshot_data, load_vm_snapshot_data_filename)                     \
+  V(load_vm_snapshot_instructions, load_vm_snapshot_instructions_filename)     \
+  V(load_isolate_snapshot_data, load_isolate_snapshot_data_filename)           \
+  V(load_isolate_snapshot_instructions,                                        \
+    load_isolate_snapshot_instructions_filename)                               \
   V(vm_snapshot_data, vm_snapshot_data_filename)                               \
   V(vm_snapshot_instructions, vm_snapshot_instructions_filename)               \
   V(isolate_snapshot_data, isolate_snapshot_data_filename)                     \
   V(isolate_snapshot_instructions, isolate_snapshot_instructions_filename)     \
   V(shared_data, shared_data_filename)                                         \
   V(shared_instructions, shared_instructions_filename)                         \
+  V(shared_blobs, shared_blobs_filename)                                       \
+  V(reused_instructions, reused_instructions_filename)                         \
+  V(blobs_container_filename, blobs_container_filename)                        \
   V(assembly, assembly_filename)                                               \
-  V(script_snapshot, script_snapshot_filename)                                 \
   V(dependencies, dependencies_filename)                                       \
   V(load_compilation_trace, load_compilation_trace_filename)                   \
   V(package_root, commandline_package_root)                                    \
@@ -150,14 +158,10 @@
          (snapshot_kind == kVMAOTAssembly);
 }
 
-static bool SnapshotKindAllowedFromKernel() {
-  return snapshot_kind != kScript;
-}
-
 // clang-format off
 static void PrintUsage() {
   Log::PrintErr(
-"Usage: gen_snapshot [<vm-flags>] [<options>] [<dart-script-file>]           \n"
+"Usage: gen_snapshot [<vm-flags>] [<options>] <dart-kernel-file>             \n"
 "                                                                            \n"
 "Common options:                                                             \n"
 "--package_root=<path>                                                       \n"
@@ -179,21 +183,14 @@
 "--snapshot_kind=core                                                        \n"
 "--vm_snapshot_data=<output-file>                                            \n"
 "--isolate_snapshot_data=<output-file>                                       \n"
-"[<dart-script-file>]                                                        \n"
+"[<dart-kernel-file>]                                                        \n"
 "                                                                            \n"
-"Writes a snapshot of <dart-script-file> to the specified snapshot files.    \n"
-"If no <dart-script-file> is passed, a generic snapshot of all the corelibs  \n"
+"Writes a snapshot of <dart-kernel-file> to the specified snapshot files.    \n"
+"If no <dart-kernel-file> is passed, a generic snapshot of all the corelibs  \n"
 "is created.                                                                 \n"
 "                                                                            \n"
-"To create a script snapshot with respect to a given core snapshot:          \n"
-"--snapshot_kind=script                                                      \n"
-"--vm_snapshot_data=<input-file>                                             \n"
-"--isolate_snapshot_data=<input-file>                                        \n"
-"--script_snapshot=<output-file>                                             \n"
-"<dart-script-file>                                                          \n"
-"                                                                            \n"
-"Writes a snapshot of <dart-script-file> to the specified snapshot files.    \n"
-"If no <dart-script-file> is passed, a generic snapshot of all the corelibs  \n"
+"Writes a snapshot of <dart-kernel-file> to the specified snapshot files.    \n"
+"If no <dart-kernel-file> is passed, a generic snapshot of all the corelibs  \n"
 "is created.                                                                 \n"
 "                                                                            \n"
 "To create an AOT application snapshot as blobs suitable for loading with    \n"
@@ -205,7 +202,7 @@
 "--isolate_snapshot_instructions=<output-file>                               \n"
 "[--obfuscate]                                                               \n"
 "[--save-obfuscation-map=<map-filename>]                                     \n"
-" <dart-script-file>                                                         \n"
+" <dart-kernel-file>                                                         \n"
 "                                                                            \n"
 "To create an AOT application snapshot as assembly suitable for compilation  \n"
 "as a static or dynamic library:                                             \n"
@@ -213,7 +210,7 @@
 "--assembly=<output-file>                                                    \n"
 "[--obfuscate]                                                               \n"
 "[--save-obfuscation-map=<map-filename>]                                     \n"
-"<dart-script-file>                                                          \n"
+"<dart-kernel-file>                                                          \n"
 "                                                                            \n"
 "AOT snapshots can be obfuscated: that is all identifiers will be renamed    \n"
 "during compilation. This mode is enabled with --obfuscate flag. Mapping     \n"
@@ -305,29 +302,51 @@
       }
       break;
     }
-    case kScript: {
-      if ((vm_snapshot_data_filename == NULL) ||
+    case kAppJIT: {
+      if ((load_vm_snapshot_data_filename == NULL) ||
           (isolate_snapshot_data_filename == NULL) ||
-          (script_snapshot_filename == NULL) || (*script_name == NULL)) {
+          ((isolate_snapshot_instructions_filename == NULL) &&
+           (reused_instructions_filename == NULL))) {
         Log::PrintErr(
-            "Building a script snapshot requires specifying input files for "
-            "--vm_snapshot_data and --isolate_snapshot_data, an output file "
-            "for --script_snapshot, and a Dart script.\n\n");
+            "Building an app JIT snapshot requires specifying input files for "
+            "--load_vm_snapshot_data and --load_vm_snapshot_instructions, an "
+            " output file for --isolate_snapshot_data, and either an output "
+            "file for --isolate_snapshot_instructions or an input file for "
+            "--reused_instructions.\n\n");
         return -1;
       }
       break;
     }
     case kAppAOTBlobs: {
-      if ((vm_snapshot_data_filename == NULL) ||
-          (vm_snapshot_instructions_filename == NULL) ||
-          (isolate_snapshot_data_filename == NULL) ||
-          (isolate_snapshot_instructions_filename == NULL) ||
-          (*script_name == NULL)) {
+      if (*script_name == NULL) {
+        Log::PrintErr(
+            "Building an AOT snapshot as blobs requires specifying "
+            " a kernel file.\n\n");
+        return -1;
+      }
+      if ((blobs_container_filename == NULL) &&
+          ((vm_snapshot_data_filename == NULL) ||
+           (vm_snapshot_instructions_filename == NULL) ||
+           (isolate_snapshot_data_filename == NULL) ||
+           (isolate_snapshot_instructions_filename == NULL))) {
         Log::PrintErr(
             "Building an AOT snapshot as blobs requires specifying output "
+            "file for --blobs_container_filename or "
             "files for --vm_snapshot_data, --vm_snapshot_instructions, "
-            "--isolate_snapshot_data and --isolate_snapshot_instructions and a "
-            "Dart script.\n\n");
+            "--isolate_snapshot_data and --isolate_snapshot_instructions.\n\n");
+        return -1;
+      }
+      if ((blobs_container_filename != NULL) &&
+          ((vm_snapshot_data_filename != NULL) ||
+           (vm_snapshot_instructions_filename != NULL) ||
+           (isolate_snapshot_data_filename != NULL) ||
+           (isolate_snapshot_instructions_filename != NULL))) {
+        Log::PrintErr(
+            "Building an AOT snapshot as blobs requires specifying output "
+            "file for --blobs_container_filename or "
+            "files for --vm_snapshot_data, --vm_snapshot_instructions, "
+            "--isolate_snapshot_data and --isolate_snapshot_instructions"
+            " not both.\n\n");
         return -1;
       }
       break;
@@ -336,16 +355,16 @@
       if ((assembly_filename == NULL) || (*script_name == NULL)) {
         Log::PrintErr(
             "Building an AOT snapshot as assembly requires specifying "
-            "an output file for --assembly and a Dart script.\n\n");
+            "an output file for --assembly and a kernel file.\n\n");
         return -1;
       }
       break;
     }
     case kVMAOTAssembly: {
-      if ((assembly_filename == NULL) || (*script_name != NULL)) {
+      if ((assembly_filename == NULL) || (*script_name == NULL)) {
         Log::PrintErr(
             "Building an AOT snapshot as assembly requires specifying "
-            "an output file for --assembly and a Dart script.\n\n");
+            "an output file for --assembly and a kernel file.\n\n");
         return -1;
       }
       break;
@@ -411,135 +430,6 @@
   }
 }
 
-class UriResolverIsolateScope {
- public:
-  UriResolverIsolateScope() {
-    ASSERT(isolate != NULL);
-    snapshotted_isolate_ = Dart_CurrentIsolate();
-    Dart_ExitIsolate();
-    Dart_EnterIsolate(isolate);
-    Dart_EnterScope();
-  }
-
-  ~UriResolverIsolateScope() {
-    ASSERT(snapshotted_isolate_ != NULL);
-    Dart_ExitScope();
-    Dart_ExitIsolate();
-    Dart_EnterIsolate(snapshotted_isolate_);
-  }
-
-  static Dart_Isolate isolate;
-
- private:
-  Dart_Isolate snapshotted_isolate_;
-
-  DISALLOW_COPY_AND_ASSIGN(UriResolverIsolateScope);
-};
-
-Dart_Isolate UriResolverIsolateScope::isolate = NULL;
-
-static void AddDependency(const char* uri_string) {
-  IsolateData* isolate_data =
-      reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
-  MallocGrowableArray<char*>* dependencies = isolate_data->dependencies();
-  if (dependencies != NULL) {
-    dependencies->Add(strdup(uri_string));
-  }
-}
-
-static Dart_Handle LoadUrlContents(const char* uri_string) {
-  bool failed = false;
-  char* error_string = NULL;
-  uint8_t* payload = NULL;
-  intptr_t payload_length = 0;
-  // Switch to the UriResolver Isolate and load the script.
-  {
-    UriResolverIsolateScope scope;
-
-    Dart_Handle resolved_uri = Dart_NewStringFromCString(uri_string);
-    Dart_Handle result =
-        Loader::LoadUrlContents(resolved_uri, &payload, &payload_length);
-    if (Dart_IsError(result)) {
-      failed = true;
-      error_string = strdup(Dart_GetError(result));
-    }
-  }
-  AddDependency(uri_string);
-  // Switch back to the isolate from which we generate the snapshot and
-  // create the source string for the specified uri.
-  Dart_Handle result;
-  if (!failed) {
-    result = Dart_NewStringFromUTF8(payload, payload_length);
-    free(payload);
-  } else {
-    result = Dart_NewApiError(error_string);
-    free(error_string);
-  }
-  return result;
-}
-
-static Dart_Handle ResolveUriInWorkingDirectory(const char* script_uri) {
-  bool failed = false;
-  char* result_string = NULL;
-
-  {
-    UriResolverIsolateScope scope;
-
-    // Run DartUtils::ResolveUriInWorkingDirectory in context of uri resolver
-    // isolate.
-    Dart_Handle result = DartUtils::ResolveUriInWorkingDirectory(
-        DartUtils::NewString(script_uri));
-    if (Dart_IsError(result)) {
-      failed = true;
-      result_string = strdup(Dart_GetError(result));
-    } else {
-      result_string = strdup(DartUtils::GetStringValue(result));
-    }
-  }
-
-  Dart_Handle result = failed ? Dart_NewApiError(result_string)
-                              : DartUtils::NewString(result_string);
-  free(result_string);
-  return result;
-}
-
-static Dart_Handle LoadSnapshotCreationScript(const char* script_name) {
-  // First resolve the specified script uri with respect to the original
-  // working directory.
-  Dart_Handle resolved_uri = ResolveUriInWorkingDirectory(script_name);
-  if (Dart_IsError(resolved_uri)) {
-    return resolved_uri;
-  }
-  // Now load the contents of the specified uri.
-  const char* resolved_uri_string = DartUtils::GetStringValue(resolved_uri);
-  Dart_Handle source = LoadUrlContents(resolved_uri_string);
-
-  if (Dart_IsError(source)) {
-    return source;
-  }
-  if ((snapshot_kind == kCore) || (snapshot_kind == kCoreJIT)) {
-    return Dart_LoadLibrary(resolved_uri, Dart_Null(), source, 0, 0);
-  } else {
-    return Dart_LoadScript(resolved_uri, Dart_Null(), source, 0, 0);
-  }
-}
-
-static Builtin::BuiltinLibraryId BuiltinId(const char* url) {
-  if (DartUtils::IsDartBuiltinLibURL(url)) {
-    return Builtin::kBuiltinLibrary;
-  }
-  if (DartUtils::IsDartIOLibURL(url)) {
-    return Builtin::kIOLibrary;
-  }
-  if (DartUtils::IsDartHttpLibURL(url)) {
-    return Builtin::kHttpLibrary;
-  }
-  if (DartUtils::IsDartCLILibURL(url)) {
-    return Builtin::kCLILibrary;
-  }
-  return Builtin::kInvalidLibrary;
-}
-
 // Generates a depfile like gcc -M -MF. Must be consumable by Ninja.
 class DependenciesFileWriter : public ValueObject {
  public:
@@ -564,19 +454,29 @@
         WriteDependenciesWithTarget(vm_snapshot_data_filename);
         // WriteDependenciesWithTarget(isolate_snapshot_data_filename);
         break;
-      case kScript:
-        WriteDependenciesWithTarget(script_snapshot_filename);
-        break;
       case kAppAOTAssembly:
         WriteDependenciesWithTarget(assembly_filename);
         break;
+      case kAppJIT:
+        WriteDependenciesWithTarget(isolate_snapshot_data_filename);
+        // WriteDependenciesWithTarget(isolate_snapshot_instructions_filename);
+        break;
       case kCoreJIT:
-      case kAppAOTBlobs:
         WriteDependenciesWithTarget(vm_snapshot_data_filename);
         // WriteDependenciesWithTarget(vm_snapshot_instructions_filename);
         // WriteDependenciesWithTarget(isolate_snapshot_data_filename);
         // WriteDependenciesWithTarget(isolate_snapshot_instructions_filename);
         break;
+      case kAppAOTBlobs:
+        if (blobs_container_filename != NULL) {
+          WriteDependenciesWithTarget(blobs_container_filename);
+        } else {
+          WriteDependenciesWithTarget(vm_snapshot_data_filename);
+          // WriteDependenciesWithTarget(vm_snapshot_instructions_filename);
+          // WriteDependenciesWithTarget(isolate_snapshot_data_filename);
+          // WriteDependenciesWithTarget(isolate_snapshot_instructions_filename);
+        }
+        break;
       default:
         UNREACHABLE();
     }
@@ -593,21 +493,6 @@
     WritePath(target);
     Write(": ");
 
-    if (snapshot_kind == kScript) {
-      if (vm_snapshot_data_filename != NULL) {
-        WritePath(vm_snapshot_data_filename);
-      }
-      if (vm_snapshot_instructions_filename != NULL) {
-        WritePath(vm_snapshot_instructions_filename);
-      }
-      if (isolate_snapshot_data_filename != NULL) {
-        WritePath(isolate_snapshot_data_filename);
-      }
-      if (isolate_snapshot_instructions_filename != NULL) {
-        WritePath(isolate_snapshot_instructions_filename);
-      }
-    }
-
     for (intptr_t i = 0; i < dependencies_->length(); i++) {
       WritePath(dependencies_->At(i));
     }
@@ -664,108 +549,17 @@
   dependencies->Clear();
 }
 
-static Dart_Handle CreateSnapshotLibraryTagHandler(Dart_LibraryTag tag,
-                                                   Dart_Handle library,
-                                                   Dart_Handle url) {
-  if (!Dart_IsLibrary(library)) {
-    return Dart_NewApiError("not a library");
+static void LoadBytecode() {
+  if (Dart_IsVMFlagSet("enable_interpreter") &&
+      ((snapshot_kind == kCoreJIT) || (snapshot_kind == kAppJIT))) {
+    Dart_Handle result = Dart_ReadAllBytecode();
+    CHECK_RESULT(result);
   }
-  Dart_Handle library_url = Dart_LibraryUrl(library);
-  if (Dart_IsError(library_url)) {
-    return Dart_NewApiError("accessing library url failed");
-  }
-  const char* library_url_string = DartUtils::GetStringValue(library_url);
-  const char* mapped_library_url_string =
-      DartUtils::MapLibraryUrl(library_url_string);
-  if (mapped_library_url_string != NULL) {
-    library_url = ResolveUriInWorkingDirectory(mapped_library_url_string);
-    library_url_string = DartUtils::GetStringValue(library_url);
-  }
-
-  if (!Dart_IsString(url)) {
-    return Dart_NewApiError("url is not a string");
-  }
-  const char* url_string = DartUtils::GetStringValue(url);
-  const char* mapped_url_string = DartUtils::MapLibraryUrl(url_string);
-
-  Builtin::BuiltinLibraryId libraryBuiltinId = BuiltinId(library_url_string);
-  if (tag == Dart_kCanonicalizeUrl) {
-    if (mapped_url_string) {
-      return url;
-    }
-    // Parts of internal libraries are handled internally.
-    if (libraryBuiltinId != Builtin::kInvalidLibrary) {
-      return url;
-    }
-    return Dart_DefaultCanonicalizeUrl(library_url, url);
-  }
-
-  Builtin::BuiltinLibraryId builtinId = BuiltinId(url_string);
-  if ((builtinId != Builtin::kInvalidLibrary) && (mapped_url_string == NULL)) {
-    // Special case for importing a builtin library that isn't remapped.
-    if (tag == Dart_kImportTag) {
-      return Builtin::LoadLibrary(url, builtinId);
-    }
-    ASSERT(tag == Dart_kSourceTag);
-    return DartUtils::NewError("Unable to part '%s' ", url_string);
-  }
-
-  if (libraryBuiltinId != Builtin::kInvalidLibrary) {
-    // Special case for parting sources of a builtin library.
-    if (tag == Dart_kSourceTag) {
-      intptr_t len = snprintf(NULL, 0, "%s/%s", library_url_string, url_string);
-      char* patch_filename = reinterpret_cast<char*>(malloc(len + 1));
-      snprintf(patch_filename, len + 1, "%s/%s", library_url_string,
-               url_string);
-      Dart_Handle prefixed_url = Dart_NewStringFromCString(patch_filename);
-      Dart_Handle result = Dart_LoadSource(
-          library, prefixed_url, Dart_Null(),
-          Builtin::PartSource(libraryBuiltinId, patch_filename), 0, 0);
-      free(patch_filename);
-      return result;
-    }
-    ASSERT(tag == Dart_kImportTag);
-    return DartUtils::NewError("Unable to import '%s' ", url_string);
-  }
-
-  Dart_Handle resolved_url = url;
-  if (mapped_url_string != NULL) {
-    // Mapped urls are relative to working directory.
-    resolved_url = ResolveUriInWorkingDirectory(mapped_url_string);
-    if (Dart_IsError(resolved_url)) {
-      return resolved_url;
-    }
-  }
-  const char* resolved_uri_string = DartUtils::GetStringValue(resolved_url);
-  Dart_Handle source = LoadUrlContents(resolved_uri_string);
-  if (Dart_IsError(source)) {
-    return source;
-  }
-  if (tag == Dart_kImportTag) {
-    return Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
-  } else {
-    ASSERT(tag == Dart_kSourceTag);
-    return Dart_LoadSource(library, url, Dart_Null(), source, 0, 0);
-  }
-}
-
-static Dart_Handle LoadGenericSnapshotCreationScript(
-    Builtin::BuiltinLibraryId id) {
-  Dart_Handle source = Builtin::Source(id);
-  if (Dart_IsError(source)) {
-    return source;  // source contains the error string.
-  }
-  Dart_Handle lib;
-  // Load the builtin library to make it available in the snapshot
-  // for importing.
-  lib = Builtin::LoadAndCheckLibrary(id);
-  ASSERT(!Dart_IsError(lib));
-  return lib;
 }
 
 static void LoadCompilationTrace() {
   if ((load_compilation_trace_filename != NULL) &&
-      (snapshot_kind == kCoreJIT)) {
+      ((snapshot_kind == kCoreJIT) || (snapshot_kind == kAppJIT))) {
     uint8_t* buffer = NULL;
     intptr_t size = 0;
     ReadFile(load_compilation_trace_filename, &buffer, &size);
@@ -805,6 +599,30 @@
   }
 }
 
+static std::unique_ptr<MappedMemory> MapFile(const char* filename,
+                                             File::MapType type,
+                                             const uint8_t** buffer) {
+  File* file = File::Open(NULL, filename, File::kRead);
+  if (file == NULL) {
+    Log::PrintErr("Failed to open: %s\n", filename);
+    exit(kErrorExitCode);
+  }
+  RefCntReleaseScope<File> rs(file);
+  intptr_t length = file->Length();
+  if (length == 0) {
+    // Can't map an empty file.
+    *buffer = NULL;
+    return NULL;
+  }
+  MappedMemory* mapping = file->Map(type, 0, length);
+  if (mapping == NULL) {
+    Log::PrintErr("Failed to read: %s\n", filename);
+    exit(kErrorExitCode);
+  }
+  *buffer = reinterpret_cast<const uint8_t*>(mapping->address());
+  return std::unique_ptr<MappedMemory>(mapping);
+}
+
 static void CreateAndWriteCoreJITSnapshot() {
   ASSERT(snapshot_kind == kCoreJIT);
   ASSERT(vm_snapshot_data_filename != NULL);
@@ -844,18 +662,38 @@
             isolate_snapshot_instructions_size);
 }
 
-static void CreateAndWriteScriptSnapshot() {
-  ASSERT(snapshot_kind == kScript);
-  ASSERT(script_snapshot_filename != NULL);
+static void CreateAndWriteAppJITSnapshot() {
+  ASSERT(snapshot_kind == kAppJIT);
+  ASSERT(isolate_snapshot_data_filename != NULL);
+  ASSERT((isolate_snapshot_instructions_filename != NULL) ||
+         (reused_instructions_filename != NULL));
 
-  // First create a snapshot.
-  uint8_t* buffer = NULL;
-  intptr_t size = 0;
-  Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size);
+  const uint8_t* reused_instructions = NULL;
+  std::unique_ptr<MappedMemory> mapped_reused_instructions;
+  if (reused_instructions_filename != NULL) {
+    mapped_reused_instructions = MapFile(reused_instructions_filename,
+                                         File::kReadOnly, &reused_instructions);
+  }
+
+  Dart_Handle result;
+  uint8_t* isolate_snapshot_data_buffer = NULL;
+  intptr_t isolate_snapshot_data_size = 0;
+  uint8_t* isolate_snapshot_instructions_buffer = NULL;
+  intptr_t isolate_snapshot_instructions_size = 0;
+
+  result = Dart_CreateAppJITSnapshotAsBlobs(
+      &isolate_snapshot_data_buffer, &isolate_snapshot_data_size,
+      &isolate_snapshot_instructions_buffer,
+      &isolate_snapshot_instructions_size, reused_instructions);
   CHECK_RESULT(result);
 
-  // Now write it out to the specified file.
-  WriteFile(script_snapshot_filename, buffer, size);
+  WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer,
+            isolate_snapshot_data_size);
+  if (reused_instructions_filename == NULL) {
+    WriteFile(isolate_snapshot_instructions_filename,
+              isolate_snapshot_instructions_buffer,
+              isolate_snapshot_instructions_size);
+  }
 }
 
 static void StreamingWriteCallback(void* callback_data,
@@ -870,30 +708,6 @@
   }
 }
 
-static std::unique_ptr<MappedMemory> MapFile(const char* filename,
-                                             File::MapType type,
-                                             const uint8_t** buffer) {
-  File* file = File::Open(NULL, filename, File::kRead);
-  if (file == NULL) {
-    Log::PrintErr("Failed to open: %s\n", filename);
-    exit(kErrorExitCode);
-  }
-  RefCntReleaseScope<File> rs(file);
-  intptr_t length = file->Length();
-  if (length == 0) {
-    // Can't map an empty file.
-    *buffer = NULL;
-    return NULL;
-  }
-  MappedMemory* mapping = file->Map(type, 0, length);
-  if (mapping == NULL) {
-    Log::PrintErr("Failed to read: %s\n", filename);
-    exit(kErrorExitCode);
-  }
-  *buffer = reinterpret_cast<const uint8_t*>(mapping->address());
-  return std::unique_ptr<MappedMemory>(mapping);
-}
-
 static void CreateAndWritePrecompiledSnapshot() {
   ASSERT(IsSnapshottingForPrecompilation());
   Dart_Handle result;
@@ -917,13 +731,29 @@
     const uint8_t* shared_instructions = NULL;
     std::unique_ptr<MappedMemory> mapped_shared_data;
     std::unique_ptr<MappedMemory> mapped_shared_instructions;
-    if (shared_data_filename != NULL) {
-      mapped_shared_data =
-          MapFile(shared_data_filename, File::kReadOnly, &shared_data);
-    }
-    if (shared_instructions_filename != NULL) {
-      mapped_shared_instructions = MapFile(
-          shared_instructions_filename, File::kReadOnly, &shared_instructions);
+    if (shared_blobs_filename != NULL) {
+      AppSnapshot* shared_blobs = NULL;
+      Log::PrintErr("Shared blobs in gen_snapshot are for testing only.\n");
+      shared_blobs = Snapshot::TryReadAppSnapshot(shared_blobs_filename);
+      if (shared_blobs == NULL) {
+        Log::PrintErr("Failed to load: %s\n", shared_blobs_filename);
+        Dart_ExitScope();
+        Dart_ShutdownIsolate();
+        exit(kErrorExitCode);
+      }
+      const uint8_t* ignored;
+      shared_blobs->SetBuffers(&ignored, &ignored, &shared_data,
+                               &shared_instructions);
+    } else {
+      if (shared_data_filename != NULL) {
+        mapped_shared_data =
+            MapFile(shared_data_filename, File::kReadOnly, &shared_data);
+      }
+      if (shared_instructions_filename != NULL) {
+        mapped_shared_instructions =
+            MapFile(shared_instructions_filename, File::kReadOnly,
+                    &shared_instructions);
+      }
     }
 
     uint8_t* vm_snapshot_data_buffer = NULL;
@@ -942,15 +772,24 @@
         &isolate_snapshot_instructions_size, shared_data, shared_instructions);
     CHECK_RESULT(result);
 
-    WriteFile(vm_snapshot_data_filename, vm_snapshot_data_buffer,
-              vm_snapshot_data_size);
-    WriteFile(vm_snapshot_instructions_filename,
-              vm_snapshot_instructions_buffer, vm_snapshot_instructions_size);
-    WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer,
-              isolate_snapshot_data_size);
-    WriteFile(isolate_snapshot_instructions_filename,
-              isolate_snapshot_instructions_buffer,
-              isolate_snapshot_instructions_size);
+    if (blobs_container_filename != NULL) {
+      Snapshot::WriteAppSnapshot(
+          blobs_container_filename, vm_snapshot_data_buffer,
+          vm_snapshot_data_size, vm_snapshot_instructions_buffer,
+          vm_snapshot_instructions_size, isolate_snapshot_data_buffer,
+          isolate_snapshot_data_size, isolate_snapshot_instructions_buffer,
+          isolate_snapshot_instructions_size);
+    } else {
+      WriteFile(vm_snapshot_data_filename, vm_snapshot_data_buffer,
+                vm_snapshot_data_size);
+      WriteFile(vm_snapshot_instructions_filename,
+                vm_snapshot_instructions_buffer, vm_snapshot_instructions_size);
+      WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer,
+                isolate_snapshot_data_size);
+      WriteFile(isolate_snapshot_instructions_filename,
+                isolate_snapshot_instructions_buffer,
+                isolate_snapshot_instructions_size);
+    }
   }
 
   // Serialize obfuscation map if requested.
@@ -964,39 +803,6 @@
   }
 }
 
-static void SetupForUriResolution() {
-  // Set up the library tag handler for this isolate.
-  Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler);
-  if (Dart_IsError(result)) {
-    Log::PrintErr("%s\n", Dart_GetError(result));
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-    exit(kErrorExitCode);
-  }
-  // This is a generic dart snapshot which needs builtin library setup.
-  Dart_Handle library =
-      LoadGenericSnapshotCreationScript(Builtin::kBuiltinLibrary);
-  CHECK_RESULT(library);
-}
-
-static void SetupForGenericSnapshotCreation() {
-  SetupForUriResolution();
-
-  Dart_Handle library = LoadGenericSnapshotCreationScript(Builtin::kIOLibrary);
-  CHECK_RESULT(library);
-  Dart_Handle standalone_library =
-      LoadGenericSnapshotCreationScript(Builtin::kCLILibrary);
-  CHECK_RESULT(standalone_library);
-  Dart_Handle result = Dart_FinalizeLoading(false);
-  if (Dart_IsError(result)) {
-    const char* err_msg = Dart_GetError(library);
-    Log::PrintErr("Errors encountered while loading: %s\n", err_msg);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-    exit(kErrorExitCode);
-  }
-}
-
 static Dart_Isolate CreateServiceIsolate(const char* script_uri,
                                          const char* main,
                                          const char* package_root,
@@ -1050,8 +856,6 @@
 
 static int GenerateSnapshotFromKernel(const uint8_t* kernel_buffer,
                                       intptr_t kernel_buffer_size) {
-  ASSERT(SnapshotKindAllowedFromKernel());
-
   char* error = NULL;
   IsolateData* isolate_data = new IsolateData(NULL, commandline_package_root,
                                               commandline_packages_file, NULL);
@@ -1067,12 +871,19 @@
     isolate_flags.entry_points = no_entry_points;
   }
 
-  // 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;
-  Dart_Isolate isolate = Dart_CreateIsolateFromKernel(
-      NULL, NULL, kernel_buffer, kernel_buffer_size, &isolate_flags,
-      isolate_data, &error);
+  Dart_Isolate isolate;
+  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);
+  } else {
+    isolate = Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data,
+                                 isolate_snapshot_instructions, NULL, NULL,
+                                 &isolate_flags, isolate_data, &error);
+  }
   if (isolate == NULL) {
     delete isolate_data;
     Log::PrintErr("%s\n", error);
@@ -1122,9 +933,22 @@
       CreateAndWriteCoreSnapshot();
       break;
     case kCoreJIT:
+      LoadBytecode();
       LoadCompilationTrace();
       CreateAndWriteCoreJITSnapshot();
       break;
+    case kAppJIT:
+      LoadBytecode();
+      LoadCompilationTrace();
+      CreateAndWriteAppJITSnapshot();
+      break;
+    case kVMAOTAssembly: {
+      File* file = OpenFile(assembly_filename);
+      RefCntReleaseScope<File> rs(file);
+      result = Dart_CreateVMAOTSnapshotAsAssembly(StreamingWriteCallback, file);
+      CHECK_RESULT(result);
+      break;
+    }
     default:
       UNREACHABLE();
   }
@@ -1172,13 +996,6 @@
     dfe.ReadScript(app_script_name, &kernel_buffer, &kernel_buffer_size);
   }
   if (kernel_buffer != NULL) {
-    if (!SnapshotKindAllowedFromKernel()) {
-      // TODO(sivachandra): Add check for the kernel program format (incremental
-      // vs batch).
-      Log::PrintErr(
-          "Can only generate core or aot snapshots from a kernel file.\n");
-      return kErrorExitCode;
-    }
     if (dependencies_filename != NULL) {
       Log::PrintErr("Depfiles are not supported in Dart 2.\n");
       return kErrorExitCode;
@@ -1205,7 +1022,7 @@
   if (IsSnapshottingForPrecompilation()) {
     vm_options.AddArgument("--precompilation");
   }
-  if (snapshot_kind == kCoreJIT) {
+  if (snapshot_kind == kCoreJIT || snapshot_kind == kAppJIT) {
     vm_options.AddArgument("--fields_may_be_reset");
     vm_options.AddArgument("--link_natives_lazily");
 #if !defined(PRODUCT)
@@ -1246,26 +1063,25 @@
   std::unique_ptr<MappedMemory> mapped_vm_snapshot_instructions;
   std::unique_ptr<MappedMemory> mapped_isolate_snapshot_data;
   std::unique_ptr<MappedMemory> mapped_isolate_snapshot_instructions;
-  if (snapshot_kind == kScript) {
+  if (load_vm_snapshot_data_filename != NULL) {
     mapped_vm_snapshot_data =
-        MapFile(vm_snapshot_data_filename, File::kReadOnly,
+        MapFile(load_vm_snapshot_data_filename, File::kReadOnly,
                 &init_params.vm_snapshot_data);
-
-    if (vm_snapshot_instructions_filename != NULL) {
-      mapped_vm_snapshot_instructions =
-          MapFile(vm_snapshot_instructions_filename, File::kReadExecute,
-                  &init_params.vm_snapshot_instructions);
-    }
-
+  }
+  if (load_vm_snapshot_instructions_filename != NULL) {
+    mapped_vm_snapshot_instructions =
+        MapFile(load_vm_snapshot_instructions_filename, File::kReadExecute,
+                &init_params.vm_snapshot_instructions);
+  }
+  if (load_isolate_snapshot_data_filename) {
     mapped_isolate_snapshot_data =
-        MapFile(isolate_snapshot_data_filename, File::kReadOnly,
+        MapFile(load_isolate_snapshot_data_filename, File::kReadOnly,
                 &isolate_snapshot_data);
-
-    if (isolate_snapshot_instructions_filename != NULL) {
-      mapped_isolate_snapshot_instructions =
-          MapFile(isolate_snapshot_instructions_filename, File::kReadExecute,
-                  &isolate_snapshot_instructions);
-    }
+  }
+  if (load_isolate_snapshot_instructions_filename != NULL) {
+    mapped_isolate_snapshot_instructions =
+        MapFile(load_isolate_snapshot_instructions_filename, File::kReadExecute,
+                &isolate_snapshot_instructions);
   }
 
   error = Dart_Initialize(&init_params);
@@ -1277,163 +1093,11 @@
 
   if (kernel_buffer != NULL) {
     return GenerateSnapshotFromKernel(kernel_buffer, kernel_buffer_size);
-  }
-
-  Dart_IsolateFlags flags;
-  Dart_IsolateFlagsInitialize(&flags);
-
-  IsolateData* isolate_data = new IsolateData(NULL, commandline_package_root,
-                                              commandline_packages_file, NULL);
-  Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data,
-                                            isolate_snapshot_instructions, NULL,
-                                            NULL, NULL, isolate_data, &error);
-  if (isolate == NULL) {
-    Log::PrintErr("Error: %s\n", error);
-    free(error);
-    exit(kErrorExitCode);
-  }
-
-  Dart_Handle result;
-  Dart_Handle library;
-  Dart_EnterScope();
-
-  if (snapshot_kind == kVMAOTAssembly) {
-    File* file = OpenFile(assembly_filename);
-    RefCntReleaseScope<File> rs(file);
-    result = Dart_CreateVMAOTSnapshotAsAssembly(StreamingWriteCallback, file);
-    CHECK_RESULT(result);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-    return 0;
-  }
-
-  result = Dart_SetEnvironmentCallback(DartUtils::EnvironmentCallback);
-  CHECK_RESULT(result);
-
-  // Load up the script before a snapshot is created.
-  if (app_script_name != NULL) {
-    // This is the case of a custom embedder (e.g: dartium) trying to
-    // create a full snapshot. The current isolate is set up so that we can
-    // invoke the dart uri resolution code like _resolveURI. App script is
-    // loaded into a separate isolate.
-    SetupForUriResolution();
-
-    // Prepare builtin and its dependent 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, false);
-    CHECK_RESULT(result);
-
-    // 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, commandline_packages_file);
-    CHECK_RESULT(result);
-
-    UriResolverIsolateScope::isolate = isolate;
-    Dart_ExitScope();
-    Dart_ExitIsolate();
-
-    // Now we create an isolate into which we load all the code that needs to
-    // be in the snapshot.
-    isolate_data = new IsolateData(app_script_name, commandline_package_root,
-                                   commandline_packages_file, NULL);
-    if (dependencies_filename != NULL) {
-      isolate_data->set_dependencies(new MallocGrowableArray<char*>());
-    }
-
-    if (IsSnapshottingForPrecompilation()) {
-      flags.obfuscate = obfuscate;
-      flags.entry_points = no_entry_points;
-    }
-
-    Dart_Isolate isolate = NULL;
-    isolate = Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data,
-                                 isolate_snapshot_instructions, NULL, NULL,
-                                 &flags, isolate_data, &error);
-    if (isolate == NULL) {
-      Log::PrintErr("%s\n", error);
-      free(error);
-      exit(kErrorExitCode);
-    }
-    Dart_EnterScope();
-    result = Dart_SetEnvironmentCallback(DartUtils::EnvironmentCallback);
-    CHECK_RESULT(result);
-
-    // Set up the library tag handler in such a manner that it will use the
-    // URL mapping specified on the command line to load the libraries.
-    result = Dart_SetLibraryTagHandler(CreateSnapshotLibraryTagHandler);
-    CHECK_RESULT(result);
-
-    if (commandline_packages_file != NULL) {
-      AddDependency(commandline_packages_file);
-    }
-
-    ASSERT(kernel_buffer == NULL);
-
-    // Load the specified script.
-    library = LoadSnapshotCreationScript(app_script_name);
-    CHECK_RESULT(library);
-
-    // Ensure that we mark all libraries as loaded.
-    result = Dart_FinalizeLoading(false);
-    CHECK_RESULT(result);
-
-    LoadCompilationTrace();
-
-    switch (snapshot_kind) {
-      case kCore:
-        CreateAndWriteCoreSnapshot();
-        break;
-      case kCoreJIT:
-        CreateAndWriteCoreJITSnapshot();
-        break;
-      case kScript:
-        CreateAndWriteScriptSnapshot();
-        break;
-      case kAppAOTBlobs:
-      case kAppAOTAssembly:
-        CreateAndWritePrecompiledSnapshot();
-        break;
-      default:
-        UNREACHABLE();
-    }
-
-    CreateAndWriteDependenciesFile();
-
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-
-    Dart_EnterIsolate(UriResolverIsolateScope::isolate);
-    Dart_ShutdownIsolate();
   } else {
-    SetupForGenericSnapshotCreation();
-    LoadCompilationTrace();
-    switch (snapshot_kind) {
-      case kCore:
-        CreateAndWriteCoreSnapshot();
-        break;
-      case kCoreJIT:
-        CreateAndWriteCoreJITSnapshot();
-        break;
-      default:
-        UNREACHABLE();
-        break;
-    }
-
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
+    Log::PrintErr("Invalid input script specified : %s\n",
+                  (app_script_name == NULL) ? "null Script" : app_script_name);
+    return kErrorExitCode;
   }
-  error = Dart_Cleanup();
-  if (error != NULL) {
-    Log::PrintErr("VM cleanup failed: %s\n", error);
-    free(error);
-  }
-  EventHandler::Stop();
-  return 0;
 }
 
 }  // namespace bin
diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc
index b3a9074..902405c 100644
--- a/runtime/bin/loader.cc
+++ b/runtime/bin/loader.cc
@@ -446,10 +446,7 @@
       dart_result = Dart_LoadSource(library, uri, resolved_uri, source, 0, 0);
     } break;
     case Dart_kScriptTag:
-      if (payload_type == DartUtils::kSnapshotMagicNumber) {
-        dart_result = Dart_LoadScriptFromSnapshot(payload, payload_length);
-        reload_extensions = true;
-      } else if (payload_type == DartUtils::kKernelMagicNumber) {
+      if (payload_type == DartUtils::kKernelMagicNumber) {
         // TODO(27590): This code path is only hit when trying to spawn
         // isolates. We currently do not have support for neither
         // `Isolate.spawn()` nor `Isolate.spawnUri()` with kernel-based
@@ -859,35 +856,6 @@
   if (tag == Dart_kCanonicalizeUrl) {
     // These will be handled internally.
     return url;
-  } else if (tag == Dart_kImportTag) {
-    Builtin::BuiltinLibraryId id = Builtin::FindId(url_string);
-    if (id == Builtin::kInvalidLibrary) {
-      return DartUtils::NewError(
-          "The built-in library '%s' is not available"
-          " on the stand-alone VM.\n",
-          url_string);
-    }
-    return Builtin::LoadLibrary(url, id);
-  } else {
-    ASSERT(tag == Dart_kSourceTag);
-    Builtin::BuiltinLibraryId id = Builtin::FindId(library_url_string);
-    if (id == Builtin::kInvalidLibrary) {
-      return DartUtils::NewError(
-          "The built-in library '%s' is not available"
-          " on the stand-alone VM. Trying to load"
-          " '%s'.\n",
-          library_url_string, url_string);
-    }
-    // Prepend the library URI to form a unique script URI for the part.
-    intptr_t len = snprintf(NULL, 0, "%s/%s", library_url_string, url_string);
-    char* part_uri = reinterpret_cast<char*>(malloc(len + 1));
-    snprintf(part_uri, len + 1, "%s/%s", library_url_string, url_string);
-    Dart_Handle part_uri_obj = DartUtils::NewString(part_uri);
-    Dart_Handle result =
-        Dart_LoadSource(library, part_uri_obj, Dart_Null(),
-                        Builtin::PartSource(id, part_uri), 0, 0);
-    free(part_uri);
-    return result;
   }
   // All cases should have been handled above.
   UNREACHABLE();
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 133b9c7..c91941b 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -6,6 +6,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "include/bin/dart_io_api.h"
 #include "include/dart_api.h"
 #include "include/dart_embedder_api.h"
 #include "include/dart_tools_api.h"
@@ -15,7 +16,6 @@
 #include "bin/dartutils.h"
 #include "bin/dfe.h"
 #include "bin/directory.h"
-#include "bin/embedded_dart_io.h"
 #include "bin/error_exit.h"
 #include "bin/eventhandler.h"
 #include "bin/extensions.h"
@@ -34,9 +34,7 @@
 #include "platform/growable_array.h"
 #include "platform/hashmap.h"
 #include "platform/text_buffer.h"
-#if !defined(DART_PRECOMPILER)
 #include "bin/gzip.h"
-#endif
 
 #include "vm/flags.h"
 
@@ -201,51 +199,6 @@
   }
 }
 
-static Dart_Isolate IsolateSetupHelperAotCompilationDart2(
-    const char* script_uri,
-    const char* main,
-    const char* package_root,
-    const char* packages_config,
-    Dart_IsolateFlags* flags,
-    char** error,
-    int* exit_code) {
-  uint8_t* payload = NULL;
-  intptr_t payload_length = -1;
-  if (File::GetType(NULL, script_uri, true) == File::kIsFile) {
-    ReadFile(script_uri, &payload, &payload_length);
-  }
-  if (payload == NULL ||
-      DartUtils::SniffForMagicNumber(payload, payload_length) !=
-          DartUtils::kKernelMagicNumber) {
-    FATAL1(
-        "Dart 2.0 AOT compilations only accept Kernel IR files as "
-        "input ('%s' is not a valid Kernel IR file).\n",
-        script_uri);
-  }
-
-  auto isolate_data = new IsolateData(script_uri, NULL, NULL, NULL);
-  // Kernel buffer released by ~IsolateData during isolate shutdown.
-  isolate_data->set_kernel_buffer(payload, payload_length,
-                                  true /*take ownership*/);
-
-  // We bootstrap the isolate from the Kernel file (instead of using a
-  // potentially linked-in kernel file).
-  Dart_Isolate isolate = Dart_CreateIsolateFromKernel(
-      script_uri, main, payload, payload_length, flags, isolate_data, error);
-  if (isolate == NULL) {
-    free(payload);
-    return NULL;
-  }
-
-  Dart_EnterScope();
-  Dart_Handle library = Dart_LoadScriptFromKernel(payload, payload_length);
-  CHECK_RESULT(library);
-  Dart_ExitScope();
-  Dart_ExitIsolate();
-
-  return isolate;
-}
-
 static Dart_Isolate IsolateSetupHelper(Dart_Isolate isolate,
                                        bool is_main_isolate,
                                        const char* script_uri,
@@ -342,6 +295,7 @@
     Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
     Builtin::SetNativeResolver(Builtin::kIOLibrary);
     Builtin::SetNativeResolver(Builtin::kCLILibrary);
+    VmService::SetNativeResolver();
   }
   if (isolate_run_app_snapshot) {
     Dart_Handle result = Loader::ReloadNativeExtensions();
@@ -462,7 +416,7 @@
     app_snapshot->SetBuffers(
         &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
         &isolate_snapshot_data, &isolate_snapshot_instructions);
-    IsolateData* isolate_data =
+    isolate_data =
         new IsolateData(uri, package_root, packages_config, app_snapshot);
     isolate = Dart_CreateIsolate(
         DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data,
@@ -470,12 +424,16 @@
         app_isolate_shared_instructions, flags, isolate_data, error);
   }
   if (isolate == NULL) {
+    // Clear error from app snapshot and re-trying from kernel file.
+    free(*error);
+    *error = NULL;
+    delete isolate_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);
-    IsolateData* isolate_data =
-        new IsolateData(uri, package_root, packages_config, NULL);
+    isolate_data = new IsolateData(uri, package_root, packages_config, NULL);
     isolate_data->set_kernel_buffer(const_cast<uint8_t*>(kernel_service_buffer),
                                     kernel_service_buffer_size,
                                     false /* take_ownership */);
@@ -508,27 +466,23 @@
                                                  char** error,
                                                  int* exit_code) {
   ASSERT(script_uri != NULL);
-
-#if defined(DART_PRECOMPILED_RUNTIME)
-  // AOT: All isolates start from the app snapshot.
-  bool skip_library_load = true;
-  const uint8_t* isolate_snapshot_data = app_isolate_snapshot_data;
-  const uint8_t* isolate_snapshot_instructions =
-      app_isolate_snapshot_instructions;
-#else
-  // JIT: Service isolate uses the core libraries snapshot.
-  bool skip_library_load = false;
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   Dart_Isolate isolate = NULL;
   IsolateData* isolate_data =
       new IsolateData(script_uri, package_root, packages_config, NULL);
+  bool skip_library_load = true;
+
 #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(
       script_uri, main, isolate_snapshot_data, isolate_snapshot_instructions,
       app_isolate_shared_data, app_isolate_shared_instructions, flags,
       isolate_data, error);
 #else
+  // JIT: Service isolate uses the core libraries snapshot.
+
   // Set the flag to load the vmservice library. If not set, the kernel
   // loader might skip loading it. This is flag is not relevant for the
   // non-kernel flow.
@@ -552,11 +506,10 @@
                                            kernel_buffer_size, flags,
                                            isolate_data, error);
   } else {
-    *error = strdup("Platform kernel not available to create service isolate.");
+    *error = strdup("Platform file not available to create service isolate.");
     delete isolate_data;
     return NULL;
   }
-  skip_library_load = true;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   if (isolate == NULL) {
     delete isolate_data;
@@ -650,7 +603,7 @@
   Dart_Isolate isolate = NULL;
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (!isolate_run_app_snapshot) {
+  if (!isolate_run_app_snapshot && (isolate_snapshot_data == NULL)) {
     const uint8_t* platform_kernel_buffer = NULL;
     intptr_t platform_kernel_buffer_size = 0;
     dfe.LoadPlatform(&platform_kernel_buffer, &platform_kernel_buffer_size);
@@ -814,16 +767,6 @@
   Process::GetRSSInformation(&(info->max_rss), &(info->current_rss));
 }
 
-static void GenerateAppAOTSnapshot() {
-  if (Options::use_blobs()) {
-    Snapshot::GenerateAppAOTAsBlobs(Options::snapshot_filename(),
-                                    app_isolate_shared_data,
-                                    app_isolate_shared_instructions);
-  } else {
-    Snapshot::GenerateAppAOTAsAssembly(Options::snapshot_filename());
-  }
-}
-
 #define CHECK_RESULT(result)                                                   \
   if (Dart_IsError(result)) {                                                  \
     const int exit_code = Dart_IsCompilationError(result)                      \
@@ -858,9 +801,12 @@
   file->Release();
 }
 
-static Dart_QualifiedFunctionName standalone_entry_points[] = {
-    {NULL, NULL, NULL}  // Must be terminated with NULL entries.
-};
+static void LoadBytecode() {
+  if (Dart_IsVMFlagSet("enable_interpreter")) {
+    Dart_Handle result = Dart_ReadAllBytecode();
+    CHECK_RESULT(result);
+  }
+}
 
 bool RunMainIsolate(const char* script_name, CommandLineOptions* dart_options) {
   // Call CreateIsolateAndSetup which creates an isolate and loads up
@@ -872,21 +818,9 @@
   Dart_IsolateFlags flags;
   Dart_IsolateFlagsInitialize(&flags);
 
-  if (Options::gen_snapshot_kind() == kAppAOT) {
-    flags.obfuscate = Options::obfuscate();
-    flags.entry_points = standalone_entry_points;
-  }
-
-  Dart_Isolate isolate = NULL;
-  if (Options::gen_snapshot_kind() == kAppAOT) {
-    isolate = IsolateSetupHelperAotCompilationDart2(
-        script_name, "main", Options::package_root(), Options::packages_file(),
-        &flags, &error, &exit_code);
-  } else {
-    isolate = CreateIsolateAndSetupHelper(
-        is_main_isolate, script_name, "main", Options::package_root(),
-        Options::packages_file(), &flags, &error, &exit_code);
-  }
+  Dart_Isolate isolate = CreateIsolateAndSetupHelper(
+      is_main_isolate, script_name, "main", Options::package_root(),
+      Options::packages_file(), &flags, &error, &exit_code);
 
   if (isolate == NULL) {
     delete[] isolate_name;
@@ -915,7 +849,7 @@
 
   IsolateData* isolate_data =
       reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate));
-  if (Options::gen_snapshot_kind() == kScript) {
+  if (Options::gen_snapshot_kind() == kKernel) {
     if (vm_run_app_snapshot) {
       Log::PrintErr("Cannot create a script snapshot from an app snapshot.\n");
       // The snapshot would contain references to the app snapshot instead of
@@ -931,17 +865,8 @@
     // lookup the main entry point exported from the root library.
     result = Dart_LibraryImportLibrary(DartUtils::LookupBuiltinLib(), root_lib,
                                        Dart_Null());
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    if (Options::gen_snapshot_kind() == kAppAOT) {
-      // Load the embedder's portion of the VM service's Dart code so it will
-      // be included in the app snapshot.
-      if (!VmService::LoadForGenPrecompiled(dfe.UseDartFrontend())) {
-        Log::PrintErr("VM service loading failed: %s\n",
-                      VmService::GetErrorMessage());
-        Platform::Exit(kErrorExitCode);
-      }
-    }
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
     if (Options::compile_all()) {
       result = Dart_CompileAll();
       CHECK_RESULT(result);
@@ -955,86 +880,69 @@
       Dart_ShutdownIsolate();
       return false;
     }
-
-    if (Options::gen_snapshot_kind() == kAppAOT) {
-      result = Dart_Precompile();
-      CHECK_RESULT(result);
-
-      if (Options::obfuscate() &&
-          (Options::obfuscation_map_filename() != NULL)) {
-        uint8_t* buffer = NULL;
-        intptr_t size = 0;
-        result = Dart_GetObfuscationMap(&buffer, &size);
-        CHECK_RESULT(result);
-        WriteFile(Options::obfuscation_map_filename(), buffer, size);
-      }
-    }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-    if (Options::gen_snapshot_kind() == kAppAOT) {
-      GenerateAppAOTSnapshot();
-    } else {
-      if (Dart_IsNull(root_lib)) {
-        ErrorExit(kErrorExitCode, "Unable to find root library for '%s'\n",
-                  script_name);
-      }
+    if (Dart_IsNull(root_lib)) {
+      ErrorExit(kErrorExitCode, "Unable to find root library for '%s'\n",
+                script_name);
+    }
 
-      if (Options::gen_snapshot_kind() == kAppJIT) {
-        result = Dart_SortClasses();
-        CHECK_RESULT(result);
-      }
-
-      if (Options::load_compilation_trace_filename() != NULL) {
-        uint8_t* buffer = NULL;
-        intptr_t size = 0;
-        ReadFile(Options::load_compilation_trace_filename(), &buffer, &size);
-        result = Dart_LoadCompilationTrace(buffer, size);
-        CHECK_RESULT(result);
-      }
-
-      // Create a closure for the main entry point which is in the exported
-      // namespace of the root library or invoke a getter of the same name
-      // in the exported namespace and return the resulting closure.
-      Dart_Handle main_closure =
-          Dart_GetField(root_lib, Dart_NewStringFromCString("main"));
-      CHECK_RESULT(main_closure);
-      if (!Dart_IsClosure(main_closure)) {
-        ErrorExit(kErrorExitCode,
-                  "Unable to find 'main' in root library '%s'\n", script_name);
-      }
-
-      // Call _startIsolate in the isolate library to enable dispatching the
-      // initial startup message.
-      const intptr_t kNumIsolateArgs = 2;
-      Dart_Handle isolate_args[kNumIsolateArgs];
-      isolate_args[0] = main_closure;                        // entryPoint
-      isolate_args[1] = CreateRuntimeOptions(dart_options);  // args
-
-      Dart_Handle isolate_lib =
-          Dart_LookupLibrary(Dart_NewStringFromCString("dart:isolate"));
-      result = Dart_Invoke(isolate_lib,
-                           Dart_NewStringFromCString("_startMainIsolate"),
-                           kNumIsolateArgs, isolate_args);
+    if (Options::gen_snapshot_kind() == kAppJIT) {
+      result = Dart_SortClasses();
       CHECK_RESULT(result);
+      LoadBytecode();
+    }
 
-      // Keep handling messages until the last active receive port is closed.
-      result = Dart_RunLoop();
-      // Generate an app snapshot after execution if specified.
-      if (Options::gen_snapshot_kind() == kAppJIT) {
-        if (!Dart_IsCompilationError(result)) {
-          Snapshot::GenerateAppJIT(Options::snapshot_filename());
-        }
-      }
+    if (Options::load_compilation_trace_filename() != NULL) {
+      uint8_t* buffer = NULL;
+      intptr_t size = 0;
+      ReadFile(Options::load_compilation_trace_filename(), &buffer, &size);
+      result = Dart_LoadCompilationTrace(buffer, size);
       CHECK_RESULT(result);
+    }
 
-      if (Options::save_compilation_trace_filename() != NULL) {
-        uint8_t* buffer = NULL;
-        intptr_t size = 0;
-        result = Dart_SaveCompilationTrace(&buffer, &size);
-        CHECK_RESULT(result);
-        WriteFile(Options::save_compilation_trace_filename(), buffer, size);
+    // Create a closure for the main entry point which is in the exported
+    // namespace of the root library or invoke a getter of the same name
+    // in the exported namespace and return the resulting closure.
+    Dart_Handle main_closure =
+        Dart_GetField(root_lib, Dart_NewStringFromCString("main"));
+    CHECK_RESULT(main_closure);
+    if (!Dart_IsClosure(main_closure)) {
+      ErrorExit(kErrorExitCode, "Unable to find 'main' in root library '%s'\n",
+                script_name);
+    }
+
+    // Call _startIsolate in the isolate library to enable dispatching the
+    // initial startup message.
+    const intptr_t kNumIsolateArgs = 2;
+    Dart_Handle isolate_args[kNumIsolateArgs];
+    isolate_args[0] = main_closure;                        // entryPoint
+    isolate_args[1] = CreateRuntimeOptions(dart_options);  // args
+
+    Dart_Handle isolate_lib =
+        Dart_LookupLibrary(Dart_NewStringFromCString("dart:isolate"));
+    result =
+        Dart_Invoke(isolate_lib, Dart_NewStringFromCString("_startMainIsolate"),
+                    kNumIsolateArgs, isolate_args);
+    CHECK_RESULT(result);
+
+    // Keep handling messages until the last active receive port is closed.
+    result = Dart_RunLoop();
+    // Generate an app snapshot after execution if specified.
+    if (Options::gen_snapshot_kind() == kAppJIT) {
+      if (!Dart_IsCompilationError(result)) {
+        Snapshot::GenerateAppJIT(Options::snapshot_filename());
       }
     }
+    CHECK_RESULT(result);
+
+    if (Options::save_compilation_trace_filename() != NULL) {
+      uint8_t* buffer = NULL;
+      intptr_t size = 0;
+      result = Dart_SaveCompilationTrace(&buffer, &size);
+      CHECK_RESULT(result);
+      WriteFile(Options::save_compilation_trace_filename(), buffer, size);
+    }
   }
 
   WriteDepsFile(isolate);
@@ -1051,7 +959,7 @@
 #undef CHECK_RESULT
 
 // Observatory assets are only needed in the regular dart binary.
-#if !defined(DART_PRECOMPILER) && !defined(NO_OBSERVATORY)
+#if !defined(NO_OBSERVATORY)
 extern unsigned int observatory_assets_archive_len;
 extern const uint8_t* observatory_assets_archive;
 
@@ -1067,9 +975,9 @@
   free(decompressed);
   return tar_file;
 }
-#else   // !defined(DART_PRECOMPILER)
+#else   // !defined(NO_OBSERVATORY)
 static Dart_GetVMServiceAssetsArchive GetVMServiceAssetsArchiveCallback = NULL;
-#endif  // !defined(DART_PRECOMPILER)
+#endif  // !defined(NO_OBSERVATORY)
 
 void main(int argc, char** argv) {
   char* script_name;
@@ -1178,9 +1086,6 @@
     vm_options.AddArgument("--collect_code=false");
 #endif
   }
-  if (Options::gen_snapshot_kind() == kAppAOT) {
-    vm_options.AddArgument("--precompilation");
-  }
 #if defined(DART_PRECOMPILED_RUNTIME)
   vm_options.AddArgument("--precompilation");
 #endif
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index 38e7fa6..a7181f5 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -25,7 +25,10 @@
 
 // These strings must match the enum SnapshotKind in main_options.h.
 static const char* kSnapshotKindNames[] = {
-    "none", "script", "app-aot", "app-jit", NULL,
+    "none",
+    "kernel",
+    "app-jit",
+    NULL,
 };
 
 SnapshotKind Options::gen_snapshot_kind_ = kNone;
@@ -147,7 +150,7 @@
 "  These snapshot options are used to generate a snapshot of the loaded\n"
 "  Dart script:\n"
 "    <snapshot-kind> controls the kind of snapshot, it could be\n"
-"                    script(default), app-aot or app-jit\n"
+"                    kernel(default) or app-jit\n"
 "    <file_name> specifies the file into which the snapshot is written\n"
 "--version\n"
 "  Print the VM version.\n");
@@ -178,7 +181,7 @@
 "  These snapshot options are used to generate a snapshot of the loaded\n"
 "  Dart script:\n"
 "    <snapshot-kind> controls the kind of snapshot, it could be\n"
-"                    script(default), app-aot or app-jit\n"
+"                    kernel(default) or app-jit\n"
 "    <file_name> specifies the file into which the snapshot is written\n"
 "--version\n"
 "  Print the VM version.\n"
@@ -461,7 +464,7 @@
 
   // If --snapshot is given without --snapshot-kind, default to script snapshot.
   if ((snapshot_filename_ != NULL) && (gen_snapshot_kind_ == kNone)) {
-    gen_snapshot_kind_ = kScript;
+    gen_snapshot_kind_ = kKernel;
   }
 
   return 0;
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index 11681ae..057cfed 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -24,7 +24,6 @@
   V(depfile, depfile)                                                          \
   V(depfile_output_filename, depfile_output_filename)                          \
   V(shared_blobs, shared_blobs_filename)                                       \
-  V(save_obfuscation_map, obfuscation_map_filename)                            \
   V(save_compilation_trace, save_compilation_trace_filename)                   \
   V(load_compilation_trace, load_compilation_trace_filename)                   \
   V(root_certs_file, root_certs_file)                                          \
@@ -39,8 +38,6 @@
   V(parse_all, parse_all)                                                      \
   V(disable_service_origin_check, vm_service_dev_mode)                         \
   V(deterministic, deterministic)                                              \
-  V(use_blobs, use_blobs)                                                      \
-  V(obfuscate, obfuscate)                                                      \
   V(trace_loading, trace_loading)                                              \
   V(short_socket_read, short_socket_read)                                      \
   V(short_socket_write, short_socket_write)                                    \
@@ -68,8 +65,7 @@
 // This enum must match the strings in kSnapshotKindNames in main_options.cc.
 enum SnapshotKind {
   kNone,
-  kScript,
-  kAppAOT,
+  kKernel,
   kAppJIT,
 };
 
diff --git a/runtime/bin/namespace_fuchsia.cc b/runtime/bin/namespace_fuchsia.cc
index aa375dc..030ba76 100644
--- a/runtime/bin/namespace_fuchsia.cc
+++ b/runtime/bin/namespace_fuchsia.cc
@@ -10,7 +10,6 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <lib/fdio/namespace.h>
-#include <lib/fdio/private.h>
 #include <zircon/status.h>
 
 #include "bin/file.h"
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 7afd0ee..d379d2d 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -315,11 +315,11 @@
 
     // This runs in the original process.
 
-    // Be sure to listen for exit-codes, now we have a child-process.
-    ExitCodeHandler::ProcessStarted();
-
-    // Register the child process if not detached.
+    // If the child process is not started in detached mode, be sure to
+    // listen for exit-codes, now that we have a non detached child process
+    // and also Register this child process.
     if (Process::ModeIsAttached(mode_)) {
+      ExitCodeHandler::ProcessStarted();
       err = RegisterProcess(pid);
       if (err != 0) {
         return err;
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index d8bdd8b..08a7dcb 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -11,7 +11,6 @@
 #include <fcntl.h>
 #include <lib/fdio/io.h>
 #include <lib/fdio/namespace.h>
-#include <lib/fdio/private.h>
 #include <lib/fdio/spawn.h>
 #include <lib/fdio/util.h>
 #include <poll.h>
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index b889c28..825bc1d 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -315,11 +315,11 @@
 
     // This runs in the original process.
 
-    // Be sure to listen for exit-codes, now we have a child-process.
-    ExitCodeHandler::ProcessStarted();
-
-    // Register the child process if not detached.
+    // If the child process is not started in detached mode, be sure to
+    // listen for exit-codes, now that we have a non detached child process
+    // and also Register this child process.
     if (Process::ModeIsAttached(mode_)) {
+      ExitCodeHandler::ProcessStarted();
       err = RegisterProcess(pid);
       if (err != 0) {
         return err;
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index d997e01..d83443a 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -309,11 +309,11 @@
 
     // This runs in the original process.
 
-    // Be sure to listen for exit-codes, now we have a child-process.
-    ExitCodeHandler::ProcessStarted();
-
-    // Register the child process if not detached.
+    // If the child process is not started in detached mode, be sure to
+    // listen for exit-codes, now that we have a non detached child process
+    // and also Register this child process.
     if (Process::ModeIsAttached(mode_)) {
+      ExitCodeHandler::ProcessStarted();
       err = RegisterProcess(pid);
       if (err != 0) {
         return err;
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index b7616aa..c90c210 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -150,8 +150,15 @@
     isolate = Dart_CreateIsolate(
         DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data,
         isolate_snapshot_instructions, NULL, NULL, flags, isolate_data, error);
+    if (*error != NULL) {
+      free(*error);
+      *error = NULL;
+    }
   }
   if (isolate == NULL) {
+    delete isolate_data;
+    isolate_data = NULL;
+
     bin::dfe.Init();
     bin::dfe.LoadKernelService(&kernel_service_buffer,
                                &kernel_service_buffer_size);
@@ -268,25 +275,16 @@
   bin::TimerUtils::InitOnce();
   bin::EventHandler::Start();
 
-  const char* error;
-  if (!start_kernel_isolate) {
-    int extra_argc = dart_argc + 3;
-    const char** extra_argv = new const char*[extra_argc];
-    for (intptr_t i = 0; i < dart_argc; i++) {
-      extra_argv[i] = dart_argv[i];
-    }
-    extra_argv[dart_argc] = "--no-strong";
-    extra_argv[dart_argc + 1] = "--no-reify_generic_functions";
-    extra_argv[dart_argc + 2] = "--no-sync-async";
-    error = Flags::ProcessCommandLineFlags(extra_argc, extra_argv);
-    delete[] extra_argv;
-    ASSERT(error == NULL);
-  } else {
-    error = Flags::ProcessCommandLineFlags(dart_argc, dart_argv);
-    ASSERT(error == NULL);
-  }
+  const char* error = Flags::ProcessCommandLineFlags(dart_argc, dart_argv);
+  ASSERT(error == NULL);
 
-  error = Dart::InitOnce(
+  TesterState::vm_snapshot_data = dart::bin::vm_snapshot_data;
+  TesterState::create_callback = CreateIsolateAndSetup;
+  TesterState::cleanup_callback = CleanupIsolate;
+  TesterState::argv = dart_argv;
+  TesterState::argc = dart_argc;
+
+  error = Dart::Init(
       dart::bin::vm_snapshot_data, dart::bin::vm_snapshot_instructions,
       CreateIsolateAndSetup /* create */, NULL /* shutdown */,
       CleanupIsolate /* cleanup */, NULL /* thread_exit */,
@@ -304,9 +302,10 @@
   error = Dart::Cleanup();
   ASSERT(error == NULL);
 
+  TestCaseBase::RunAllRaw();
+
   bin::EventHandler::Stop();
 
-  TestCaseBase::RunAllRaw();
   // Print a warning message if no tests or benchmarks were matched.
   if (run_matches == 0) {
     bin::Log::PrintErr("No tests matched: %s\n", run_filter);
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index 2ff01c2..7af4d65 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.cc
@@ -248,6 +248,7 @@
   return NULL;
 }
 
+#if !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM) && !defined(TESTING)
 static void WriteSnapshotFile(const char* filename,
                               const uint8_t* buffer,
                               const intptr_t size) {
@@ -263,20 +264,21 @@
   }
   file->Release();
 }
+#endif
 
 static bool WriteInt64(File* file, int64_t size) {
   return file->WriteFully(&size, sizeof(size));
 }
 
-static void WriteAppSnapshot(const char* filename,
-                             uint8_t* vm_data_buffer,
-                             intptr_t vm_data_size,
-                             uint8_t* vm_instructions_buffer,
-                             intptr_t vm_instructions_size,
-                             uint8_t* isolate_data_buffer,
-                             intptr_t isolate_data_size,
-                             uint8_t* isolate_instructions_buffer,
-                             intptr_t isolate_instructions_size) {
+void Snapshot::WriteAppSnapshot(const char* filename,
+                                uint8_t* vm_data_buffer,
+                                intptr_t vm_data_size,
+                                uint8_t* vm_instructions_buffer,
+                                intptr_t vm_instructions_size,
+                                uint8_t* isolate_data_buffer,
+                                intptr_t isolate_data_size,
+                                uint8_t* isolate_instructions_buffer,
+                                intptr_t isolate_instructions_size) {
   File* file = File::Open(NULL, filename, File::kWriteTruncate);
   if (file == NULL) {
     ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
@@ -354,21 +356,9 @@
 #endif  // !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM) && !defined(TESTING)
 }
 
-void Snapshot::GenerateScript(const char* snapshot_filename) {
-  // First create a snapshot.
-  uint8_t* buffer = NULL;
-  intptr_t size = 0;
-  Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size);
-  if (Dart_IsError(result)) {
-    ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
-  }
-
-  WriteSnapshotFile(snapshot_filename, buffer, size);
-}
-
 void Snapshot::GenerateAppJIT(const char* snapshot_filename) {
 #if defined(TARGET_ARCH_IA32)
-  // Snapshots with code are not supported on IA32 or DBC.
+  // Snapshots with code are not supported on IA32.
   uint8_t* isolate_buffer = NULL;
   intptr_t isolate_size = 0;
 
@@ -387,7 +377,7 @@
   intptr_t isolate_instructions_size = 0;
   Dart_Handle result = Dart_CreateAppJITSnapshotAsBlobs(
       &isolate_data_buffer, &isolate_data_size, &isolate_instructions_buffer,
-      &isolate_instructions_size);
+      &isolate_instructions_size, NULL);
   if (Dart_IsError(result)) {
     ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
   }
diff --git a/runtime/bin/snapshot_utils.h b/runtime/bin/snapshot_utils.h
index c1d6edf..8f5bb1b 100644
--- a/runtime/bin/snapshot_utils.h
+++ b/runtime/bin/snapshot_utils.h
@@ -31,7 +31,6 @@
   static void GenerateKernel(const char* snapshot_filename,
                              const char* script_name,
                              const char* package_config);
-  static void GenerateScript(const char* snapshot_filename);
   static void GenerateAppJIT(const char* snapshot_filename);
   static void GenerateAppAOTAsBlobs(const char* snapshot_filename,
                                     const uint8_t* shared_data,
@@ -39,6 +38,15 @@
   static void GenerateAppAOTAsAssembly(const char* snapshot_filename);
 
   static AppSnapshot* TryReadAppSnapshot(const char* script_name);
+  static void WriteAppSnapshot(const char* filename,
+                               uint8_t* vm_data_buffer,
+                               intptr_t vm_data_size,
+                               uint8_t* vm_instructions_buffer,
+                               intptr_t vm_instructions_size,
+                               uint8_t* isolate_data_buffer,
+                               intptr_t isolate_data_size,
+                               uint8_t* isolate_instructions_buffer,
+                               intptr_t isolate_instructions_size);
 
  private:
   DISALLOW_ALLOCATION();
diff --git a/runtime/bin/vmservice/loader.dart b/runtime/bin/vmservice/loader.dart
index de7f452..6f03a08 100644
--- a/runtime/bin/vmservice/loader.dart
+++ b/runtime/bin/vmservice/loader.dart
@@ -992,26 +992,6 @@
 
   // Handle the request specified in the tag.
   switch (tag) {
-    case _Dart_kScriptTag:
-      {
-        Uri uri = Uri.parse(request[4]);
-        // Remember the root script.
-        loaderState._rootScript = uri;
-        _handleResourceRequest(
-            loaderState, sp, traceLoading, tag, uri, uri, null);
-      }
-      break;
-    case _Dart_kSourceTag:
-    case _Dart_kImportTag:
-      {
-        // The url of the file being loaded.
-        var uri = Uri.parse(request[4]);
-        // The library that is importing/parting the file.
-        String libraryUrl = request[5];
-        _handleResourceRequest(
-            loaderState, sp, traceLoading, tag, uri, uri, libraryUrl);
-      }
-      break;
     case _Dart_kInitLoader:
       {
         String packageRoot = request[4];
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index f512dfb..02f4567 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -170,6 +170,14 @@
   return true;
 }
 
+void VmService::SetNativeResolver() {
+  Dart_Handle url = DartUtils::NewString(kVMServiceIOLibraryUri);
+  Dart_Handle library = Dart_LookupLibrary(url);
+  if (!Dart_IsError(library)) {
+    Dart_SetNativeResolver(library, VmServiceIONativeResolver, NULL);
+  }
+}
+
 bool VmService::Setup(const char* server_ip,
                       intptr_t server_port,
                       bool running_precompiled,
diff --git a/runtime/bin/vmservice_impl.h b/runtime/bin/vmservice_impl.h
index 2dc00d0..04b0633 100644
--- a/runtime/bin/vmservice_impl.h
+++ b/runtime/bin/vmservice_impl.h
@@ -23,6 +23,8 @@
                     bool trace_loading,
                     bool deterministic);
 
+  static void SetNativeResolver();
+
   // Error message if startup failed.
   static const char* GetErrorMessage();
 
diff --git a/runtime/bin/embedded_dart_io.h b/runtime/include/bin/dart_io_api.h
similarity index 67%
rename from runtime/bin/embedded_dart_io.h
rename to runtime/include/bin/dart_io_api.h
index 2eb3f71..3684ae6 100644
--- a/runtime/bin/embedded_dart_io.h
+++ b/runtime/include/bin/dart_io_api.h
@@ -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.
 
-#ifndef RUNTIME_BIN_EMBEDDED_DART_IO_H_
-#define RUNTIME_BIN_EMBEDDED_DART_IO_H_
+#ifndef RUNTIME_INCLUDE_BIN_DART_IO_API_H_
+#define RUNTIME_INCLUDE_BIN_DART_IO_API_H_
 
 #include "include/dart_tools_api.h"
 
@@ -43,7 +43,18 @@
 // Dart_InitializeParams.entropy_source.
 bool GetEntropy(uint8_t* buffer, intptr_t length);
 
+// Performs a lookup of the I/O Dart_NativeFunction with a specified 'name' and
+// 'argument_count'. Returns NULL if no I/O native function with a matching
+// name and parameter count is found.
+Dart_NativeFunction LookupIONative(Dart_Handle name,
+                                   int argument_count,
+                                   bool* auto_setup_scope);
+
+// Returns the symbol for I/O native function 'nf'. Returns NULL if 'nf' is not
+// a valid I/O native function.
+const uint8_t* LookupIONativeSymbol(Dart_NativeFunction nf);
+
 }  // namespace bin
 }  // namespace dart
 
-#endif  // RUNTIME_BIN_EMBEDDED_DART_IO_H_
+#endif  // RUNTIME_INCLUDE_BIN_DART_IO_API_H_
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index a8df732..93dcaf1 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -553,17 +553,15 @@
  * for each part.
  */
 
-#define DART_FLAGS_CURRENT_VERSION (0x00000007)
+#define DART_FLAGS_CURRENT_VERSION (0x00000009)
 
 typedef struct {
   int32_t version;
   bool enable_type_checks;
   bool enable_asserts;
   bool enable_error_on_bad_type;
-  bool enable_error_on_bad_override;
   bool use_field_guards;
   bool use_osr;
-  bool use_dart_frontend;
   bool obfuscate;
   Dart_QualifiedFunctionName* entry_points;
   bool load_vmservice_library;
@@ -603,7 +601,7 @@
  *   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
- *   Dart_LoadScript or Dart_LoadScriptFromSnapshot.
+ *   Dart_LoadScript or Dart_LoadScriptFromKernel.
  * \param main The name of the main entry point this isolate will
  *   eventually run.  This is provided for advisory purposes only to
  *   improve debugging messages.  The main function is not invoked by
@@ -1024,37 +1022,6 @@
                     intptr_t* isolate_snapshot_data_size);
 
 /**
- * Creates a snapshot of the application script loaded in the isolate.
- *
- * A script snapshot can be used for implementing fast startup of applications
- * (skips the script tokenizing and parsing process). A Snapshot of the script
- * can only be created before any dart code has executed.
- *
- * Requires there to be a current isolate which already has loaded script.
- *
- * \param buffer Returns a pointer to a buffer containing
- *   the snapshot. This buffer is scope allocated and is only valid
- *   until the next call to Dart_ExitScope.
- * \param size Returns the size of the buffer.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
-Dart_CreateScriptSnapshot(uint8_t** script_snapshot_buffer,
-                          intptr_t* script_snapshot_size);
-
-/**
- * Returns whether the buffer contains a snapshot created by
- * Dart_Create*Snapshot.
- *
- * \param buffer Pointer to a buffer that might contain a snapshot.
- * \param buffer_size Size of the buffer.
- *
- * \return Whether the buffer contains a snapshot (core, app or script).
- */
-DART_EXPORT bool Dart_IsSnapshot(const uint8_t* buffer, intptr_t buffer_size);
-
-/**
  * Returns whether the buffer contains a kernel file.
  *
  * \param buffer Pointer to a buffer that might contain a kernel binary.
@@ -1065,17 +1032,6 @@
 DART_EXPORT bool Dart_IsKernel(const uint8_t* buffer, intptr_t buffer_size);
 
 /**
- * Returns true if snapshot_buffer contains a Dart2 snapshot.
- *
- * \param snapshot_buffer Pointer to a buffer that contains the snapshot
- *   that needs to be checked.
- * \param snapshot_size Size of the buffer.
- *
- * \returns true if the snapshot is a Dart2 snapshot, false otherwise.
- */
-DART_EXPORT bool Dart_IsDart2Snapshot(const uint8_t* snapshot_buffer);
-
-/**
  * Make isolate runnable.
  *
  * When isolates are spawned, this function is used to indicate that
@@ -2971,22 +2927,6 @@
                 intptr_t col_offset);
 
 /**
- * Loads the root script for current isolate from a script snapshot. The
- * snapshot must have been created by Dart_CreateScriptSnapshot from a VM with
- * the same version.
- *
- * \param buffer A buffer which contains a snapshot of the script. May be
- *    released when this function returns.
- * \param buffer_len Length of the passed in buffer.
- *
- * \return If no error occurs, the Library object corresponding to the root
- *   script is returned. Otherwise an error handle is returned.
- */
-DART_EXPORT Dart_Handle
-Dart_LoadScriptFromSnapshot(const uint8_t* script_snapshot_buffer,
-                            intptr_t script_snapshot_size);
-
-/**
  * Loads the root library for the current isolate.
  *
  * Requires there to be no current root library.
@@ -3470,7 +3410,8 @@
 Dart_CreateAppJITSnapshotAsBlobs(uint8_t** isolate_snapshot_data_buffer,
                                  intptr_t* isolate_snapshot_data_size,
                                  uint8_t** isolate_snapshot_instructions_buffer,
-                                 intptr_t* isolate_snapshot_instructions_size);
+                                 intptr_t* isolate_snapshot_instructions_size,
+                                 const uint8_t* reused_instructions);
 
 /**
  * Like Dart_CreateAppJITSnapshotAsBlobs, but also creates a new VM snapshot.
diff --git a/runtime/lib/async_sources.gni b/runtime/lib/async_sources.gni
index 1620f74..914aa9b 100644
--- a/runtime/lib/async_sources.gni
+++ b/runtime/lib/async_sources.gni
@@ -3,10 +3,14 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file contains all sources for the dart:async library.
-async_runtime_sources = [
+
+async_runtime_cc_files = [ "async.cc" ]
+
+async_runtime_dart_files = [
   "async_patch.dart",
   "deferred_load_patch.dart",
   "schedule_microtask_patch.dart",
   "timer_patch.dart",
-  "async.cc",
 ]
+
+async_runtime_sources = async_runtime_cc_files + async_runtime_dart_files
diff --git a/runtime/lib/collection_sources.gni b/runtime/lib/collection_sources.gni
index 8ad022c..1fa63d3 100644
--- a/runtime/lib/collection_sources.gni
+++ b/runtime/lib/collection_sources.gni
@@ -2,10 +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.
 
-collection_runtime_sources = [
+collection_runtime_cc_files = [ "linked_hash_map.cc" ]
+
+collection_runtime_dart_files = [
   # collection_patch.dart needs to be the first dart file because it contains
   # imports.
   "collection_patch.dart",
   "compact_hash.dart",
-  "linked_hash_map.cc",
 ]
+
+collection_runtime_sources =
+    collection_runtime_cc_files + collection_runtime_dart_files
diff --git a/runtime/lib/core_sources.gni b/runtime/lib/core_sources.gni
index 2f9a7a9..4c57dc4 100644
--- a/runtime/lib/core_sources.gni
+++ b/runtime/lib/core_sources.gni
@@ -3,55 +3,61 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # Sources visible via default library.
-core_runtime_sources = [
+
+core_runtime_cc_files = [
+  "array.cc",
+  "bool.cc",
+  "date.cc",
+  "double.cc",
+  "errors.cc",
+  "function.cc",
+  "growable_array.cc",
+  "identical.cc",
+  "integers.cc",
+  "invocation_mirror.h",
+  "object.cc",
+  "regexp.cc",
+  "stacktrace.cc",
+  "stacktrace.h",
+  "stopwatch.cc",
+  "string.cc",
+  "uri.cc",
+  "weak_property.cc",
+]
+
+core_runtime_dart_files = [
   "core_patch.dart",
 
   # The above file needs to be first as it imports required libraries.
-  "array.cc",
   "array.dart",
   "array_patch.dart",
   "bigint_patch.dart",
-  "bool.cc",
   "bool_patch.dart",
-  "date.cc",
   "date_patch.dart",
-  "double.cc",
   "double.dart",
   "double_patch.dart",
-  "errors.cc",
   "errors_patch.dart",
   "expando_patch.dart",
-  "function.cc",
   "function.dart",
   "function_patch.dart",
-  "growable_array.cc",
   "growable_array.dart",
-  "identical.cc",
   "identical_patch.dart",
   "immutable_map.dart",
-  "integers.cc",
   "integers.dart",
   "integers_patch.dart",
-  "invocation_mirror.h",
   "invocation_mirror_patch.dart",
   "lib_prefix.dart",
   "map_patch.dart",
   "null_patch.dart",
-  "object.cc",
   "object_patch.dart",
-  "regexp.cc",
   "regexp_patch.dart",
-  "stacktrace.cc",
   "stacktrace.dart",
-  "stacktrace.h",
-  "stopwatch.cc",
   "stopwatch_patch.dart",
-  "string.cc",
   "string_buffer_patch.dart",
   "string_patch.dart",
   "type_patch.dart",
-  "uri.cc",
   "uri_patch.dart",
-  "weak_property.cc",
   "weak_property.dart",
 ]
+
+core_runtime_sources = core_runtime_cc_files + core_runtime_dart_files
diff --git a/runtime/lib/developer_sources.gni b/runtime/lib/developer_sources.gni
index c6f3c29..61f02f62 100644
--- a/runtime/lib/developer_sources.gni
+++ b/runtime/lib/developer_sources.gni
@@ -3,14 +3,19 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # Sources visible via dart:developer library.
-developer_runtime_sources = [
+developer_runtime_cc_files = [
   "developer.cc",
+  "profiler.cc",
+  "timeline.cc",
+]
 
+developer_runtime_dart_files = [
   # developer.dart needs to be the first dart file because it contains
   # imports.
   "developer.dart",
-  "profiler.cc",
   "profiler.dart",
-  "timeline.cc",
   "timeline.dart",
 ]
+
+developer_runtime_sources =
+    developer_runtime_cc_files + developer_runtime_dart_files
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index 3ed0f6d..d5567fb 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -618,9 +618,3 @@
 
   toString() => "Error: field '$_name' is already initialized.";
 }
-
-@patch
-class _ConstantExpressionError {
-  @patch
-  _throw(error) => throw error;
-}
diff --git a/runtime/lib/internal_sources.gni b/runtime/lib/internal_sources.gni
index 61c4e15..d5550bc 100644
--- a/runtime/lib/internal_sources.gni
+++ b/runtime/lib/internal_sources.gni
@@ -3,12 +3,16 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # Sources that patch the library "dart:_internal".
-internal_runtime_sources = [
+internal_runtime_cc_files = [ "class_id.cc" ]
+
+internal_runtime_dart_files = [
   "internal_patch.dart",
 
   # The above file needs to be first as it imports required libraries.
   "class_id.dart",
-  "class_id.cc",
   "print_patch.dart",
   "symbol_patch.dart",
 ]
+
+internal_runtime_sources =
+    internal_runtime_cc_files + internal_runtime_dart_files
diff --git a/runtime/lib/isolate_sources.gni b/runtime/lib/isolate_sources.gni
index d01a351..021e4eb 100644
--- a/runtime/lib/isolate_sources.gni
+++ b/runtime/lib/isolate_sources.gni
@@ -3,8 +3,11 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file contains all sources for the dart:isolate library.
-isolate_runtime_sources = [
+isolate_runtime_cc_files = [ "isolate.cc" ]
+
+isolate_runtime_dart_files = [
   "isolate_patch.dart",
-  "isolate.cc",
   "timer_impl.dart",
 ]
+
+isolate_runtime_sources = isolate_runtime_cc_files + isolate_runtime_dart_files
diff --git a/runtime/lib/math_sources.gni b/runtime/lib/math_sources.gni
index 65a07ca..33f089e 100644
--- a/runtime/lib/math_sources.gni
+++ b/runtime/lib/math_sources.gni
@@ -2,7 +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.
 
-math_runtime_sources = [
-  "math.cc",
-  "math_patch.dart",
-]
+math_runtime_cc_files = [ "math.cc" ]
+
+math_runtime_dart_files = [ "math_patch.dart" ]
+
+math_runtime_sources = math_runtime_cc_files + math_runtime_dart_files
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index c2927d9..249efd3 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -149,11 +149,8 @@
     // * Whether a parameters has been declared as final.
     // * Any metadata associated with the parameter.
     Object& result = Object::Handle();
-    if (func.kernel_offset() > 0) {
-      result = kernel::BuildParameterDescriptor(func);
-    } else {
-      result = Parser::ParseFunctionParameters(func);
-    }
+    ASSERT(func.kernel_offset() > 0);
+    result = kernel::BuildParameterDescriptor(func);
     if (result.IsError()) {
       Exceptions::PropagateError(Error::Cast(result));
       UNREACHABLE();
@@ -356,7 +353,10 @@
   args.SetAt(1, str);
   str = lib.url();
   const char* censored_libraries[] = {
-      "dart:_builtin", "dart:_vmservice", NULL,
+      "dart:_builtin",
+      "dart:_vmservice",
+      "dart:vmservice_io",
+      NULL,
   };
   for (intptr_t i = 0; censored_libraries[i] != NULL; i++) {
     if (str.Equals(censored_libraries[i])) {
diff --git a/runtime/lib/mirrors_sources.gni b/runtime/lib/mirrors_sources.gni
index c3e500c..c3a51c5 100644
--- a/runtime/lib/mirrors_sources.gni
+++ b/runtime/lib/mirrors_sources.gni
@@ -3,13 +3,17 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # Implementation sources.
-mirrors_runtime_sources = [
+mirrors_runtime_cc_files = [
   "mirrors.cc",
   "mirrors.h",
+]
 
+mirrors_runtime_dart_files = [
   # mirrors_patch.dart needs to be the first dart file because it contains
   # imports.
   "mirrors_patch.dart",
   "mirrors_impl.dart",
   "mirror_reference.dart",
 ]
+
+mirrors_runtime_sources = mirrors_runtime_cc_files + mirrors_runtime_dart_files
diff --git a/runtime/lib/typed_data_sources.gni b/runtime/lib/typed_data_sources.gni
index 4fdebb62..9892c8f 100644
--- a/runtime/lib/typed_data_sources.gni
+++ b/runtime/lib/typed_data_sources.gni
@@ -3,8 +3,12 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # Sources visible via dart:typed_data library.
-typed_data_runtime_sources = [
+typed_data_runtime_cc_files = [
   "typed_data.cc",
-  "typed_data_patch.dart",
   "simd128.cc",
 ]
+
+typed_data_runtime_dart_files = [ "typed_data_patch.dart" ]
+
+typed_data_runtime_sources =
+    typed_data_runtime_cc_files + typed_data_runtime_dart_files
diff --git a/runtime/observatory/lib/src/elements/objectpool_view.dart b/runtime/observatory/lib/src/elements/objectpool_view.dart
index 85b546d..71ce7a0 100644
--- a/runtime/observatory/lib/src/elements/objectpool_view.dart
+++ b/runtime/observatory/lib/src/elements/objectpool_view.dart
@@ -159,6 +159,7 @@
 
   List<Element> _createEntry(M.ObjectPoolEntry entry) {
     switch (entry.kind) {
+      case M.ObjectPoolEntryKind.nativeEntryData:
       case M.ObjectPoolEntryKind.object:
         return [anyRef(_isolate, entry.asObject, _objects, queue: _r.queue)];
       case M.ObjectPoolEntryKind.immediate:
diff --git a/runtime/observatory/lib/src/models/objects/objectpool.dart b/runtime/observatory/lib/src/models/objects/objectpool.dart
index fb99d60..ba65961 100644
--- a/runtime/observatory/lib/src/models/objects/objectpool.dart
+++ b/runtime/observatory/lib/src/models/objects/objectpool.dart
@@ -12,7 +12,7 @@
   Iterable<ObjectPoolEntry> get entries;
 }
 
-enum ObjectPoolEntryKind { object, immediate, nativeEntry }
+enum ObjectPoolEntryKind { object, immediate, nativeEntryData, nativeEntry }
 
 abstract class ObjectPoolEntry {
   int get offset;
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 6500551..a0dcf7a4 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -3534,6 +3534,10 @@
   ScriptLine getLine(int line) {
     assert(_loaded);
     assert(line >= 1);
+    var index = (line - lineOffset - 1);
+    if (lines.length < index) {
+      return null;
+    }
     return lines[line - lineOffset - 1];
   }
 
@@ -3983,6 +3987,7 @@
     M.ObjectPoolEntryKind kind = stringToObjectPoolEntryKind(map['kind']);
     int offset = map['offset'];
     switch (kind) {
+      case M.ObjectPoolEntryKind.nativeEntryData:
       case M.ObjectPoolEntryKind.object:
         return new ObjectPoolEntry._fromObject(map['value'], offset);
       default:
@@ -4004,6 +4009,8 @@
       return M.ObjectPoolEntryKind.object;
     case 'Immediate':
       return M.ObjectPoolEntryKind.immediate;
+    case 'NativeEntryData':
+      return M.ObjectPoolEntryKind.nativeEntryData;
     case 'NativeFunction':
     case 'NativeFunctionWrapper':
       return M.ObjectPoolEntryKind.nativeEntry;
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 4a11b98..7bf83e5 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -13,7 +13,7 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(10));
+    expect(result['minor'], equals(11));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
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 2b7dffe..60a5aeb 100644
--- a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
@@ -71,7 +71,6 @@
 
 void allEventsHaveIsolateNumber(List events) {
   for (Map event in events) {
-    print(event);
     if (event['ph'] == 'M') {
       // Skip meta-data events.
       continue;
diff --git a/runtime/observatory/tests/service/invoke_test.dart b/runtime/observatory/tests/service/invoke_test.dart
index baed16c..bf8ffb9 100644
--- a/runtime/observatory/tests/service/invoke_test.dart
+++ b/runtime/observatory/tests/service/invoke_test.dart
@@ -46,16 +46,13 @@
     await field.load();
     Instance banana = field.staticValue;
 
-    dynamic result = await isolate.invokeRpc("invoke", {
-      "receiverId": lib.id,
-      "selector": "libraryFunction",
-      "argumentIds": []
-    });
+    dynamic result = await isolate.invokeRpc("invoke",
+        {"targetId": lib.id, "selector": "libraryFunction", "argumentIds": []});
     print(result);
     expect(result.valueAsString, equals('foobar1'));
 
     result = await isolate.invokeRpc("invoke", {
-      "receiverId": cls.id,
+      "targetId": cls.id,
       "selector": "classFunction",
       "argumentIds": [apple.id]
     });
@@ -63,7 +60,7 @@
     expect(result.valueAsString, equals('foobar2apple'));
 
     result = await isolate.invokeRpc("invoke", {
-      "receiverId": instance.id,
+      "targetId": instance.id,
       "selector": "instanceFunction",
       "argumentIds": [apple.id, banana.id]
     });
@@ -72,14 +69,14 @@
 
     // Wrong arity.
     await expectError(() => isolate.invokeRpc("invoke", {
-          "receiverId": instance.id,
+          "targetId": instance.id,
           "selector": "instanceFunction",
           "argumentIds": [apple.id]
         }));
 
     // No such target.
     await expectError(() => isolate.invokeRpc("invoke", {
-          "receiverId": instance.id,
+          "targetId": instance.id,
           "selector": "functionDoesNotExist",
           "argumentIds": [apple.id]
         }));
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index ddff9c6..2840080 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -15,8 +15,8 @@
 [ $arch == arm ]
 process_service_test: Pass, Fail # Issue 24344
 
-[ $arch == arm64 ]
-get_object_rpc_test: RuntimeError
+[ $builder_tag == optimization_counter_threshold ]
+pause_on_unhandled_async_exceptions_test: Pass, RuntimeError # http://dartbug.com/34673
 
 [ $compiler == app_jit ]
 bad_reload_test: RuntimeError # Issue 27806
@@ -67,9 +67,6 @@
 dev_fs_http_put_weird_char_test: Skip # Windows disallows carriage returns in paths
 dev_fs_weird_char_test: Skip # Windows disallows question mark in paths
 
-[ $builder_tag == optimization_counter_threshold && $compiler != dartk ]
-pause_on_unhandled_async_exceptions_test: Pass, RuntimeError # Issue 33365
-
 [ $compiler == none && $runtime == vm && $system == fuchsia ]
 *: Skip # Not yet triaged.
 
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 35be1d2..6e261ad 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -109,9 +109,11 @@
 [ $compiler == dartk ]
 add_breakpoint_rpc_test: SkipByDesign # non-kernel specific version of add_breakpoint_rpc_kernel_test.
 bad_reload_test: RuntimeError # Issue 34025
+coverage_optimized_function_test: Pass, Slow
 evaluate_activation_in_method_class_test: RuntimeError
 evaluate_activation_test/instance: RuntimeError # http://dartbug.com/20047
 evaluate_activation_test/scope: RuntimeError # http://dartbug.com/20047
+pause_on_unhandled_async_exceptions2_test: Pass, Slow
 step_through_arithmetic_test: RuntimeError # probably constant evaluator pre-evaluating e.g. 1+2
 unused_changes_in_last_reload_test: RuntimeError
 
@@ -135,6 +137,11 @@
 eval_test: Pass, Slow
 
 [ $arch == x64 && $compiler == dartk && $mode == release && $system == windows ]
+code_test: RuntimeError
+get_object_rpc_test: RuntimeError
+get_stack_rpc_test: RuntimeError
+
+[ $arch == x64 && $compiler == dartk && $system == windows ]
 regexp_function_test: Pass, Crash # Issue http://dartbug.com/34422
 
 [ $compiler == app_jitk && $mode == debug ]
@@ -144,13 +151,12 @@
 [ $compiler == dartk && $mode == debug ]
 isolate_lifecycle_test: Skip # Flaky.
 pause_idle_isolate_test: Skip # Flaky
+rewind_optimized_out_test: Pass, Slow
 
 [ $compiler == dartk && $system == windows ]
 break_on_default_constructor_test: Skip # Issues 32137 and 32138.
-coverage_leaf_function_test: RuntimeError
 coverage_optimized_function_test: Skip # Timeout
 field_script_test: Skip # Timeout
-get_source_report_test: RuntimeError
 get_vm_timeline_rpc_test: Skip # Issue 32137.
 issue_25465_test: Skip # Issues 32137 and 32138.
 issue_30555_test: Skip # Issues 32137 and 32138.
@@ -186,9 +192,6 @@
 [ $compiler == dartk && $system == windows && $strong ]
 add_breakpoint_rpc_kernel_test: Skip # Timeout
 breakpoint_in_parts_class_test: Skip # Timeout
-code_test: RuntimeError
-get_object_rpc_test: RuntimeError
-get_stack_rpc_test: RuntimeError
 next_through_call_on_static_field_in_class_test: Skip # Timeout
 next_through_closure_test: Skip # Timeout
 next_through_for_each_loop_test: Skip # Timeout
@@ -204,9 +207,6 @@
 step_through_property_set_test: Skip # Timeout
 
 [ $compiler == dartk && $system == windows && !$strong ]
-code_test: RuntimeError
-get_object_rpc_test: RuntimeError
-get_stack_rpc_test: RuntimeError
 next_through_simple_async_test: Skip # Timeout
 step_test: Skip # Timeout
 step_through_constructor_test: Skip # Timeout
diff --git a/runtime/runtime_args.gni b/runtime/runtime_args.gni
index 3f5fbeb..23894e2 100644
--- a/runtime/runtime_args.gni
+++ b/runtime/runtime_args.gni
@@ -84,6 +84,9 @@
   # Whether the VM includes the kernel service in all modes (debug, release,
   # product).
   exclude_kernel_service = false
+
+  # Whether libdart should export the symbols of the Dart API.
+  dart_lib_export_symbols = true
 }
 
 declare_args() {
diff --git a/runtime/tests/vm/dart/appjit_bytecode_simple_test.dart b/runtime/tests/vm/dart/appjit_bytecode_simple_test.dart
new file mode 100644
index 0000000..6600482
--- /dev/null
+++ b/runtime/tests/vm/dart/appjit_bytecode_simple_test.dart
@@ -0,0 +1,12 @@
+// 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.
+
+// Verify that app-jit snapshot contains dependencies between classes and CHA
+// optimized code.
+
+import 'dart:async';
+
+import 'snapshot_test_helper.dart';
+
+Future<void> main() => runAppJitBytecodeTest();
diff --git a/runtime/tests/vm/dart/appjit_bytecode_simple_test_body.dart b/runtime/tests/vm/dart/appjit_bytecode_simple_test_body.dart
new file mode 100644
index 0000000..a882e9a
--- /dev/null
+++ b/runtime/tests/vm/dart/appjit_bytecode_simple_test_body.dart
@@ -0,0 +1,8 @@
+// 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.
+
+void main(List<String> args) {
+  final isTraining = args.contains("--train");
+  print(isTraining ? 'OK(Trained)' : 'OK(Run)');
+}
diff --git a/runtime/tests/vm/dart/generic_field_invocation_test.dart b/runtime/tests/vm/dart/generic_field_invocation_test.dart
new file mode 100644
index 0000000..6149695
--- /dev/null
+++ b/runtime/tests/vm/dart/generic_field_invocation_test.dart
@@ -0,0 +1,20 @@
+// 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 verifies that we invoke closure in fields correctly when going
+// through the slow NSM path rather than the field invocation dispatchers.
+//
+// VMOptions=--no-lazy-dispatchers
+
+import 'package:expect/expect.dart';
+
+class C {
+  dynamic field;
+}
+
+main() {
+  var c = C();
+  c.field = <T>(T x) => x.hashCode;
+  Expect.equals(3, c.field<dynamic>(3));
+}
diff --git a/runtime/tests/vm/dart/script_determinism_test.dart b/runtime/tests/vm/dart/script_determinism_test.dart
deleted file mode 100644
index 4b51b4f..0000000
--- a/runtime/tests/vm/dart/script_determinism_test.dart
+++ /dev/null
@@ -1,22 +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.
-
-// Verify creating a script snapshot twice generates the same bits.
-
-import 'dart:async';
-import 'snapshot_test_helper.dart';
-
-int fib(int n) {
-  if (n <= 1) return 1;
-  return fib(n - 1) + fib(n - 2);
-}
-
-Future<void> main(List<String> args) async {
-  if (args.contains('--child')) {
-    print(fib(35));
-    return;
-  }
-
-  await checkDeterministicSnapshot("script", "");
-}
diff --git a/runtime/tests/vm/dart/snapshot_test_helper.dart b/runtime/tests/vm/dart/snapshot_test_helper.dart
index 2eced21..ef65c1f 100644
--- a/runtime/tests/vm/dart/snapshot_test_helper.dart
+++ b/runtime/tests/vm/dart/snapshot_test_helper.dart
@@ -116,3 +116,27 @@
     await temp.delete(recursive: true);
   }
 }
+
+Future<void> runAppJitBytecodeTest() async {
+  final Directory temp = Directory.systemTemp.createTempSync();
+  final snapshotPath = p.join(temp.path, 'app.jit');
+  final testPath = Platform.script
+      .toFilePath()
+      .replaceAll(new RegExp(r'_test.dart$'), '_test_body.dart');
+
+  try {
+    final trainingResult = await runDartBinary('TRAINING RUN', [
+      '--enable_interpreter',
+      '--snapshot=$snapshotPath',
+      '--snapshot-kind=app-jit',
+      testPath,
+      '--train'
+    ]);
+    expectOutput("OK(Trained)", trainingResult);
+    final runResult = await runDartBinary(
+        'RUN FROM SNAPSHOT', ['--enable_interpreter', snapshotPath]);
+    expectOutput("OK(Run)", runResult);
+  } finally {
+    await temp.delete(recursive: true);
+  }
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 6730986..40f0a5f 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -64,7 +64,6 @@
 cc/Mixin_PrivateSuperResolution: Skip
 cc/Mixin_PrivateSuperResolutionCrossLibraryShouldFail: Skip
 dart/appjit_determinism_test: Pass, Fail # Issue 31427 - Lingering non-determinism.
-dart/script_determinism_test: Pass, Fail # Issue 31427 - Lingering non-determinism.
 
 [ $compiler == fasta ]
 dart/data_uri_import_test/badencodeddate: CompileTimeError
@@ -83,6 +82,10 @@
 dart/data_uri_spawn_test: SkipByDesign # Isolate.spawnUri
 dart/issue32950_test: SkipByDesign # uses spawnUri.
 
+[ $runtime == vm && $mode == product && $compiler == dartk ]
+cc/GenKernelKernelReadAllBytecode: Crash
+cc/CorelibIsolateStartup: Timeout, Pass
+
 [ $runtime != vm ]
 dart/hello_fuchsia_test: SkipByDesign # This is a test for fuchsia OS
 dart/snapshot_version_test: SkipByDesign # Spawns processes
@@ -101,6 +104,10 @@
 cc/Service_Profile: Skip
 cc/GenKernelKernelLoadKernel: Skip  # Issue 34542.
 cc/GenKernelKernelReadAllBytecode: Skip  # Issue 34393.
+dart/appjit_bytecode_simple_test: Skip  # Issue 34393.
+
+[ $system == windows && $arch == ia32 ]
+cc/BitTestImmediate: Crash # Issue 34723
 
 [ !$strong ]
 dart/callee_side_type_checks_test: SkipByDesign
@@ -139,7 +146,7 @@
 dart/data_uri_import_test/utf16: Crash
 dart/data_uri_import_test/wrongmime: Crash
 
-[ $arch == x64 && ($compiler == dartk || $compiler == dartkb) && $system == windows && $strong ]
+[ $arch == x64 && ($compiler == dartk || $compiler == dartkb) && $system == windows && $strong && $mode == release ]
 cc/Profiler_BasicSourcePosition: Fail # http://dartbug.com/33224
 cc/Profiler_CodeTicks: Fail # dartbug.com/33337
 
@@ -161,6 +168,9 @@
 cc/PrintJSON: Crash
 cc/Service_TokenStream: Crash
 
+[ ($compiler == dartk || $compiler == dartkb) && $mode == debug && $runtime == vm ]
+dart/appjit_cha_deopt_test: Pass, RuntimeError # Issue 34627
+
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
@@ -219,6 +229,8 @@
 cc/Profiler_FunctionTicks: Fail, Pass
 cc/Profiler_ToggleRecordAllocation: Fail, Pass
 cc/Profiler_TrivialRecordAllocation: Fail, Pass
+
+[ $arch == x64 && ($compiler == dartk || $compiler == dartkb) && $system == windows && $mode == release ]
 cc/Service_Address: Fail
 cc/Service_Code: Fail
 
@@ -235,7 +247,6 @@
 
 [ ($compiler == dartk || $compiler == dartkb) && ($arch == simarm || $arch == simarm64 || $arch == simdbc || $arch == simdbc64) ]
 dart/appjit*: SkipSlow # DFE too slow
-dart/script_determinism_test: SkipSlow # DFE too slow
 
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
@@ -310,6 +321,9 @@
 cc/RegExp_TwoByteString: Skip # TODO(vegorov) These tests don't seem to work if FLAG_interpret_irregexp is switched on by default because they attempt to call regexp functions directly instead of going through JSSyntaxRegExp_ExecuteMatch.
 cc/RegenerateAllocStubs: Skip # This test is meaningless for DBC as allocation stubs are not used.
 
+[ $arch == simdbc || $arch == simdbc64 || $compiler == dartkb ]
+dart/generic_field_invocation_test: SkipByDesign # DBC and KBC interpreters do not support --no_lazy_dispatchers
+
 [ $compiler == dart2analyzer || $compiler == dart2js ]
 dart/data_uri*test: Skip # Data uri's not supported by dart2js or the analyzer.
 
@@ -348,6 +362,36 @@
 cc/SourcePosition_TryCatchFinally: SkipByDesign
 cc/SourcePosition_While: SkipByDesign
 cc/SourcePosition_WhileContinueBreak: SkipByDesign
+cc/CompileFunctionOnHelperThread: SkipByDesign
+cc/CompileFunction: SkipByDesign
+cc/InvokeDynamic_CompileError: SkipByDesign
+cc/InvokeStatic_CompileError: SkipByDesign
+cc/DartEntry: SkipByDesign
+cc/FindCodeObject: SkipByDesign
+cc/Parser_TopLevel: SkipByDesign
+cc/DartDynamicResolve: SkipByDesign
+cc/DartStaticResolve: SkipByDesign
+cc/AllocateNewObjectCodegen: SkipByDesign
+cc/InstanceCallCodegen: SkipByDesign
+cc/StaticCallCodegen: SkipByDesign
+cc/SimpleReturnCodegen: SkipByDesign
+cc/SmiReturnCodegen: SkipByDesign
+cc/SimpleStaticCallCodegen: SkipByDesign
+cc/StaticCallReturnParameterCodegen: SkipByDesign
+cc/StaticCallReturnParameterCodegen: SkipByDesign
+cc/StaticCallSmiParamSumCodegen: SkipByDesign
+cc/SmiAddCodegen: SkipByDesign
+cc/GenericAddCodegen: SkipByDesign
+cc/SmiBinaryOpCodegen: SkipByDesign
+cc/BoolNotCodegen: SkipByDesign
+cc/BoolAndCodegen: SkipByDesign
+cc/BinaryOpCodegen: SkipByDesign
+cc/SmiUnaryOpCodegen: SkipByDesign
+cc/DoubleUnaryOpCodegen: SkipByDesign
+cc/ParseClassDefinition: SkipByDesign
+cc/CompileScript: SkipByDesign
+cc/DartAPI_LoadLibraryPatch_1: SkipByDesign
+cc/StackMapCodegen: SkipByDesign
 
 [ $compiler == precompiler || $mode == product ]
 cc/CoreSnapshotSize: SkipByDesign # Imports dart:mirrors
@@ -357,7 +401,6 @@
 
 [ $hot_reload || $hot_reload_rollback ]
 dart/appjit*: SkipByDesign # Cannot reload with URI pointing to app snapshot.
-dart/script_determinism_test: SkipByDesign # Cannot reload with URI pointing to script snapshot.
 dart/slow_path_shared_stub_test: SkipSlow # Too slow with --slow-path-triggers-gc flag and not relevant outside precompiled.
 dart/spawn_infinite_loop_test: Skip # We can shutdown an isolate before it reloads.
 dart/spawn_shutdown_test: Skip # We can shutdown an isolate before it reloads.
diff --git a/runtime/tools/dartfuzz/README.md b/runtime/tools/dartfuzz/README.md
index ba2ce55..5e05c29 100644
--- a/runtime/tools/dartfuzz/README.md
+++ b/runtime/tools/dartfuzz/README.md
@@ -32,6 +32,7 @@
     dart dartfuzz_test.dart
 
     run_dartfuzz_test.py  [--help]
+                          [--isolates ISOLATES ]
                           [--repeat REPEAT]
                           [--true_divergence]
                           [--mode1 MODE]
@@ -40,19 +41,25 @@
 where
 
     --help            : prints help and exits
+    --isolates        : number of isolates in the session (1 by default)
     --repeat          : number of tests to run (1000 by default)
-    --show-stats      : show session statistics (true by default)
+    --show-stats      : show statistics during session (true by default)
     --true-divergence : only report true divergences (true by default)
     --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)
-        aot-[debug-]x64   = Dart AOT (x64)
-        aot-[debug-]arm64 = Dart AOT (simarm64)
-        js                = dart2js + JS
+        jit-[debug-]ia32    = Dart JIT (ia32)
+        jit-[debug-]x64     = Dart JIT (x64)
+        jit-[debug-]arm32   = Dart JIT (simarm)
+        jit-[debug-]arm64   = Dart JIT (simarm64)
+        aot-[debug-]x64     = Dart AOT (x64)
+        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)
+        js                  = dart2js + JS
+
+If no modes are given, a random JIT and/or AOT 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
diff --git a/runtime/tools/dartfuzz/dartfuzz.dart b/runtime/tools/dartfuzz/dartfuzz.dart
index 06790d0..d2986d7 100644
--- a/runtime/tools/dartfuzz/dartfuzz.dart
+++ b/runtime/tools/dartfuzz/dartfuzz.dart
@@ -10,7 +10,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.0';
+const String version = '1.2';
 
 // Restriction on statement and expression depths.
 const int stmtDepth = 5;
@@ -58,7 +58,7 @@
 
 // Interesting characters.
 const interestingChars =
-    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#&()+-';
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#&()+- ';
 
 // Class that represents Dart types.
 class DartType {
@@ -85,6 +85,13 @@
   DartType.INT_STRING_MAP
 ];
 
+// Class that represents Dart library methods.
+class DartLib {
+  final String name;
+  final List<DartType> proto;
+  const DartLib(this.name, this.proto);
+}
+
 // Naming conventions.
 const varName = 'var';
 const paramName = 'par';
@@ -375,16 +382,12 @@
     emit('-${rand.nextInt(100)}');
   }
 
-  void emitInterestingInt() {
-    int i = rand.nextInt(interestingIntegers.length);
-    emit('${interestingIntegers[i]}');
-  }
-
   void emitInt() {
     switch (rand.nextInt(4)) {
       // favors small positive int
       case 0:
-        emitInterestingInt();
+        emit(
+            '${interestingIntegers[rand.nextInt(interestingIntegers.length)]}');
         break;
       case 1:
         emitSmallNegativeInt();
@@ -420,71 +423,52 @@
   }
 
   void emitChar() {
-    emit(interestingChars[rand.nextInt(interestingChars.length)]);
+    switch (rand.nextInt(10)) {
+      // favors regular char
+      case 0:
+        emit('\\u2665');
+        break;
+      case 1:
+        emit('\\u{1f600}'); // rune
+        break;
+      default:
+        emit(interestingChars[rand.nextInt(interestingChars.length)]);
+        break;
+    }
   }
 
   void emitString() {
-    switch (rand.nextInt(4)) {
-      // favors non-null
-      case 0:
-        emit('null');
-        break;
-      default:
-        {
-          emit("'");
-          int l = rand.nextInt(8);
-          for (int i = 0; i < l; i++) {
-            emitChar();
-          }
-          emit("'");
-          break;
-        }
+    emit("'");
+    int l = rand.nextInt(8);
+    for (int i = 0; i < l; i++) {
+      emitChar();
     }
+    emit("'");
   }
 
   void emitIntList() {
-    switch (rand.nextInt(4)) {
-      // favors non-null
-      case 0:
-        emit('null');
-        break;
-      default:
-        {
-          emit('[ ');
-          int l = 1 + rand.nextInt(4);
-          for (int i = 0; i < l; i++) {
-            emitInt();
-            if (i != (l - 1)) {
-              emit(', ');
-            }
-          }
-          emit(' ]');
-          break;
-        }
+    emit('[ ');
+    int l = 1 + rand.nextInt(4);
+    for (int i = 0; i < l; i++) {
+      emitInt();
+      if (i != (l - 1)) {
+        emit(', ');
+      }
     }
+    emit(' ]');
   }
 
   void emitIntStringMap() {
-    switch (rand.nextInt(4)) {
-      // favors non-null
-      case 0:
-        emit('null');
-        break;
-      default:
-        {
-          emit('{ ');
-          int l = 1 + rand.nextInt(4);
-          for (int i = 0; i < l; i++) {
-            emit('$i : ');
-            emitString();
-            if (i != (l - 1)) {
-              emit(', ');
-            }
-          }
-          emit(' }');
-          break;
-        }
+    emit('{ ');
+    int l = 1 + rand.nextInt(4);
+    for (int i = 0; i < l; i++) {
+      emit('$i : ');
+      emitString();
+      if (i != (l - 1)) {
+        emit(', ');
+      }
     }
+    emit(' }');
   }
 
   void emitLiteral(DartType tp) {
@@ -548,28 +532,115 @@
   }
 
   void emitExprList(int depth, List<DartType> proto) {
+    emit('(');
     for (int i = 1; i < proto.length; i++) {
       emitExpr(depth, proto[i]);
       if (i != (proto.length - 1)) {
         emit(', ');
       }
     }
+    emit(')');
   }
 
+  // Emit expression with unary operator: (~(x))
+  void emitUnaryExpr(int depth, DartType tp) {
+    if (tp == DartType.BOOL || tp == DartType.INT || tp == DartType.DOUBLE) {
+      emit('(');
+      emitUnaryOp(tp);
+      emit('(');
+      emitExpr(depth + 1, tp);
+      emit('))');
+    } else {
+      emitTerminal(tp); // resort to terminal
+    }
+  }
+
+  // Emit expression with binary operator: (x + y)
+  void emitBinaryExpr(int depth, DartType tp) {
+    if (tp == DartType.BOOL) {
+      // For boolean, allow type switch with relational op.
+      if (rand.nextInt(2) == 0) {
+        DartType deeper_tp = getType();
+        emit('(');
+        emitExpr(depth + 1, deeper_tp);
+        emitRelOp(deeper_tp);
+        emitExpr(depth + 1, deeper_tp);
+        emit(')');
+        return;
+      }
+    }
+    emit('(');
+    emitExpr(depth + 1, tp);
+    emitBinaryOp(tp);
+    emitExpr(depth + 1, tp);
+    emit(')');
+  }
+
+  // Emit expression with ternary operator: (b ? x : y)
+  void emitTernaryExpr(int depth, DartType tp) {
+    emit('(');
+    emitExpr(depth + 1, DartType.BOOL);
+    emit(' ? ');
+    emitExpr(depth + 1, tp);
+    emit(' : ');
+    emitExpr(depth + 1, tp);
+    emit(')');
+  }
+
+  // Emit expression with pre/post-increment/decrement operator: (x++)
+  void emitPreOrPostExpr(int depth, DartType tp) {
+    if (tp == DartType.INT) {
+      int r = rand.nextInt(2);
+      emit('(');
+      if (r == 0) emitPreOrPostOp(tp);
+      emitScalarVar(tp);
+      if (r == 1) emitPreOrPostOp(tp);
+      emit(')');
+    } else {
+      emitTerminal(tp); // resort to terminal
+    }
+  }
+
+  // Emit library call.
+  void emitLibraryCall(int depth, DartType tp) {
+    if (tp == DartType.INT_STRING_MAP) {
+      emitTerminal(tp); // resort to terminal
+      return;
+    }
+    DartLib lib = oneOf(getLibrary(tp));
+    List<DartType> proto = lib.proto;
+    // Receiver.
+    if (proto[0] != null) {
+      DartType deeper_tp = proto[0];
+      emit('(');
+      emitExpr(depth + 1, deeper_tp);
+      emit(').');
+    }
+    // Call.
+    emit('${lib.name}');
+    // Parameters.
+    if (proto.length == 1) {
+      emit('()');
+    } else if (proto[1] != null) {
+      emitExprList(depth + 1, proto);
+    }
+  }
+
+  // Helper for a method call.
   bool pickedCall(
       int depth, DartType tp, String name, List<List<DartType>> protos, int m) {
     for (int i = m - 1; i >= 0; i--) {
       if (tp == protos[i][0]) {
-        emit('$name$i(');
+        emit('$name$i');
         emitExprList(depth + 1, protos[i]);
-        emit(')');
         return true;
       }
     }
     return false;
   }
 
-  void emitCall(int depth, DartType tp) {
+  // Emit method call within the program.
+  void emitMethodCall(int depth, DartType tp) {
     // Only call backward to avoid infinite recursion.
     if (currentClass == null) {
       // Outside a class: call backward in global methods.
@@ -591,70 +662,7 @@
     emitTerminal(tp); // resort to terminal.
   }
 
-  // Emit expression with unary operator: (~(x))
-  void emitUnaryExpr(int depth, DartType tp) {
-    if (tp == DartType.BOOL || tp == DartType.INT || tp == DartType.DOUBLE) {
-      emit('(');
-      emitUnaryOp(tp);
-      emit('(');
-      emitExpr(depth + 1, tp);
-      emit('))');
-    } else {
-      emitTerminal(tp); // resort to terminal
-    }
-  }
-
-  // Emit expression with binary operator: (x + y)
-  void emitBinaryExpr(int depth, DartType tp) {
-    if (tp == DartType.BOOL || tp == DartType.INT || tp == DartType.DOUBLE) {
-      emit('(');
-      emitExpr(depth + 1, tp);
-      emitBinaryOp(tp);
-      emitExpr(depth + 1, tp);
-      emit(')');
-    } else {
-      emitTerminal(tp); // resort to terminal
-    }
-  }
-
-  // Emit expression with pre/post-increment/decrement operator: (x++)
-  void emitPreOrPostExpr(int depth, DartType tp) {
-    if (tp == DartType.INT) {
-      int r = rand.nextInt(2);
-      emit('(');
-      if (r == 0) emitPreOrPostOp(tp);
-      emitScalarVar(tp);
-      if (r == 1) emitPreOrPostOp(tp);
-      emit(')');
-    } else {
-      emitTerminal(tp); // resort to terminal
-    }
-  }
-
-  // Emit type converting expression.
-  void emitTypeConv(int depth, DartType tp) {
-    if (tp == DartType.BOOL) {
-      DartType deeper_tp = getType();
-      emit('(');
-      emitExpr(depth + 1, deeper_tp);
-      emitRelOp(deeper_tp);
-      emitExpr(depth + 1, deeper_tp);
-      emit(')');
-    } else if (tp == DartType.INT) {
-      emit('(');
-      emitExpr(depth + 1, DartType.DOUBLE);
-      emit(').toInt()');
-    } else if (tp == DartType.DOUBLE) {
-      emit('(');
-      emitExpr(depth + 1, DartType.INT);
-      emit(').toDouble()');
-    } else {
-      emitTerminal(tp); // resort to terminal
-    }
-  }
-
   // Emit expression.
-  // TODO: add many more constructs
   void emitExpr(int depth, DartType tp) {
     // Continuing nested expressions becomes less likely as the depth grows.
     if (rand.nextInt(depth + 1) > exprDepth) {
@@ -662,7 +670,7 @@
       return;
     }
     // Possibly nested expression.
-    switch (rand.nextInt(6)) {
+    switch (rand.nextInt(7)) {
       case 0:
         emitUnaryExpr(depth, tp);
         break;
@@ -670,13 +678,16 @@
         emitBinaryExpr(depth, tp);
         break;
       case 2:
-        emitPreOrPostExpr(depth, tp);
+        emitTernaryExpr(depth, tp);
         break;
       case 3:
-        emitTypeConv(depth, tp);
+        emitPreOrPostExpr(depth, tp);
         break;
       case 4:
-        emitCall(depth, tp);
+        emitLibraryCall(depth, tp);
+        break;
+      case 5:
+        emitMethodCall(depth, tp);
         break;
       default:
         emitTerminal(tp);
@@ -688,11 +699,6 @@
   // Operators.
   //
 
-  // Emit one of the given choices.
-  T oneOf<T>(List<T> choices) {
-    return choices[rand.nextInt(choices.length)];
-  }
-
   // Emit same type in-out assignment operator.
   void emitAssignOp(DartType tp) {
     if (tp == DartType.INT) {
@@ -707,12 +713,14 @@
         ' ^= ',
         ' >>= ',
         ' <<= ',
+        ' ??= ',
         ' = '
       ]));
     } else if (tp == DartType.DOUBLE) {
-      emit(oneOf(const <String>[' += ', ' -= ', ' *= ', ' /= ', ' = ']));
+      emit(oneOf(
+          const <String>[' += ', ' -= ', ' *= ', ' /= ', ' ??= ', ' = ']));
     } else {
-      emit(' = ');
+      emit(oneOf(const <String>[' ??= ', ' = ']));
     }
   }
 
@@ -744,16 +752,19 @@
         ' | ',
         ' ^ ',
         ' >> ',
-        ' << '
+        ' << ',
+        ' ?? '
       ]));
     } else if (tp == DartType.DOUBLE) {
-      emit(oneOf(const <String>[' + ', ' - ', ' * ', ' / ']));
+      emit(oneOf(const <String>[' + ', ' - ', ' * ', ' / ', ' ?? ']));
+    } else if (tp == DartType.STRING || tp == DartType.INT_LIST) {
+      emit(oneOf(const <String>[' + ', ' ?? ']));
     } else {
-      assert(false);
+      emit(' ?? ');
     }
   }
 
-  // Emit increment operator.
+  // Emit same type in-out increment operator.
   void emitPreOrPostOp(DartType tp) {
     if (tp == DartType.INT) {
       emit(oneOf(const <String>['++', '--']));
@@ -772,9 +783,106 @@
   }
 
   //
+  // Library methods.
+  //
+
+  // Get list of library methods, organized by return type.
+  // Proto list:
+  //   [ receiver-type (null denotes none),
+  //     param1 type (null denotes getter),
+  //     param2 type,
+  //     ...
+  //   ]
+  List<DartLib> getLibrary(DartType tp) {
+    if (tp == DartType.BOOL) {
+      return const [
+        DartLib('isEven', [DartType.INT, null]),
+        DartLib('isOdd', [DartType.INT, null]),
+        DartLib('isEmpty', [DartType.STRING, null]),
+        DartLib('isEmpty', [DartType.INT_STRING_MAP, null]),
+        DartLib('isNotEmpty', [DartType.STRING, null]),
+        DartLib('isNotEmpty', [DartType.INT_STRING_MAP, null]),
+        DartLib('endsWith', [DartType.STRING, DartType.STRING]),
+        DartLib('remove', [DartType.INT_LIST, DartType.INT]),
+        DartLib('containsValue', [DartType.INT_STRING_MAP, DartType.STRING]),
+        DartLib('containsKey', [DartType.INT_STRING_MAP, DartType.INT]),
+      ];
+    } else if (tp == DartType.INT) {
+      return const [
+        DartLib('bitLength', [DartType.INT, null]),
+        DartLib('sign', [DartType.INT, null]),
+        DartLib('abs', [DartType.INT]),
+        DartLib('round', [DartType.INT]),
+        DartLib('round', [DartType.DOUBLE]),
+        DartLib('floor', [DartType.INT]),
+        DartLib('floor', [DartType.DOUBLE]),
+        DartLib('ceil', [DartType.INT]),
+        DartLib('ceil', [DartType.DOUBLE]),
+        DartLib('truncate', [DartType.INT]),
+        DartLib('truncate', [DartType.DOUBLE]),
+        DartLib('toInt', [DartType.DOUBLE]),
+        DartLib('toUnsigned', [DartType.INT, DartType.INT]),
+        DartLib('toSigned', [DartType.INT, DartType.INT]),
+        DartLib('modInverse', [DartType.INT, DartType.INT]),
+        DartLib('modPow', [DartType.INT, DartType.INT, DartType.INT]),
+        DartLib('length', [DartType.STRING, null]),
+        DartLib('length', [DartType.INT_LIST, null]),
+        DartLib('length', [DartType.INT_STRING_MAP, null]),
+        DartLib('codeUnitAt', [DartType.STRING, DartType.INT]),
+        DartLib('compareTo', [DartType.STRING, DartType.STRING]),
+        DartLib('removeLast', [DartType.INT_LIST]),
+        DartLib('removeAt', [DartType.INT_LIST, DartType.INT]),
+        DartLib('indexOf', [DartType.INT_LIST, DartType.INT]),
+        DartLib('lastIndexOf', [DartType.INT_LIST, DartType.INT]),
+      ];
+    } else if (tp == DartType.DOUBLE) {
+      return const [
+        DartLib('sign', [DartType.DOUBLE, null]),
+        DartLib('abs', [DartType.DOUBLE]),
+        DartLib('toDouble', [DartType.INT]),
+        DartLib('roundToDouble', [DartType.INT]),
+        DartLib('roundToDouble', [DartType.DOUBLE]),
+        DartLib('floorToDouble', [DartType.INT]),
+        DartLib('floorToDouble', [DartType.DOUBLE]),
+        DartLib('ceilToDouble', [DartType.INT]),
+        DartLib('ceilToDouble', [DartType.DOUBLE]),
+        DartLib('truncateToDouble', [DartType.INT]),
+        DartLib('truncateToDouble', [DartType.DOUBLE]),
+        DartLib('remainder', [DartType.DOUBLE, DartType.DOUBLE]),
+      ];
+    } else if (tp == DartType.STRING) {
+      return const [
+        DartLib('toString', [DartType.BOOL]),
+        DartLib('toString', [DartType.INT]),
+        DartLib('toString', [DartType.DOUBLE]),
+        DartLib('toRadixString', [DartType.INT, DartType.INT]),
+        DartLib('trim', [DartType.STRING]),
+        DartLib('trimLeft', [DartType.STRING]),
+        DartLib('trimRight', [DartType.STRING]),
+        DartLib('toLowerCase', [DartType.STRING]),
+        DartLib('toUpperCase', [DartType.STRING]),
+        DartLib('substring', [DartType.STRING, DartType.INT]),
+        DartLib('replaceRange',
+            [DartType.STRING, DartType.INT, DartType.INT, DartType.STRING]),
+        DartLib('remove', [DartType.INT_STRING_MAP, DartType.INT]),
+        // Avoid (OOM divergences, unless we restrict parameters):
+        // DartLib('padLeft', [DartType.STRING, DartType.INT]),
+        // DartLib('padRight', [DartType.STRING, DartType.INT]),
+      ];
+    } else if (tp == DartType.INT_LIST) {
+      return const [
+        DartLib('sublist', [DartType.INT_LIST, DartType.INT])
+      ];
+    } else {
+      assert(false);
+    }
+  }
+
+  //
   // Types.
   //
 
+  // Get a random value type.
   DartType getType() {
     switch (rand.nextInt(6)) {
       case 0:
@@ -854,6 +962,11 @@
     }
   }
 
+  // Emits one of the given choices.
+  T oneOf<T>(List<T> choices) {
+    return choices[rand.nextInt(choices.length)];
+  }
+
   // Random seed used to generate program.
   final int seed;
 
@@ -872,7 +985,7 @@
   // Types of global variables.
   List<DartType> globalVars;
 
-  // Prototypes of all global functions (first element is return type).
+  // Prototypes of all global methods (first element is return type).
   List<List<DartType>> globalMethods;
 
   // Types of fields over all classes.
@@ -908,7 +1021,7 @@
     new DartFuzz(seed, file).run();
     file.closeSync();
   } catch (e) {
-    print('Usage: dart dartfuzz.dart [OPTIONS] FILENAME');
-    print(parser.usage);
+    print('Usage: dart dartfuzz.dart [OPTIONS] FILENAME\n${parser.usage}\n$e');
+    exitCode = 255;
   }
 }
diff --git a/runtime/tools/dartfuzz/dartfuzz_test.dart b/runtime/tools/dartfuzz/dartfuzz_test.dart
index b6da502..a1c5dfe 100644
--- a/runtime/tools/dartfuzz/dartfuzz_test.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_test.dart
@@ -4,6 +4,7 @@
 
 import 'dart:convert';
 import 'dart:io';
+import 'dart:isolate';
 import 'dart:math';
 
 import 'package:args/args.dart';
@@ -19,9 +20,9 @@
 
 /// Result of running a test.
 class TestResult {
-  TestResult(this.code, this.output);
-  ResultCode code;
-  String output;
+  const TestResult(this.code, this.output);
+  final ResultCode code;
+  final String output;
 }
 
 /// Command runner.
@@ -44,16 +45,20 @@
 
 /// Abstraction for running one test in a particular mode.
 abstract class TestRunner {
-  String description();
-  TestResult run(String fileName);
+  TestResult run();
+  String description;
 
   // Factory.
   static TestRunner getTestRunner(
-      Map<String, String> env, String top, String mode) {
-    if (mode.startsWith('jit')) return new TestRunnerJIT(env, top, mode);
-    if (mode.startsWith('aot')) return new TestRunnerAOT(env, top, mode);
-    if (mode.startsWith('js')) return new TestRunnerJS(env, top, mode);
-    throw ('unknown mode: $mode');
+      String mode, String top, String tmp, Map<String, String> env) {
+    if (mode.startsWith('jit'))
+      return new TestRunnerJIT(getTag(mode), top, tmp, env);
+    if (mode.startsWith('aot'))
+      return new TestRunnerAOT(getTag(mode), top, tmp, env);
+    if (mode.startsWith('kbc'))
+      return new TestRunnerKBC(mode, getTag(mode), top, tmp, env);
+    if (mode.startsWith('js')) return new TestRunnerJS(top, tmp, env);
+    throw ('unknown runner in mode: $mode');
   }
 
   // Convert mode to tag.
@@ -72,111 +77,163 @@
 
 /// Concrete test runner of Dart JIT.
 class TestRunnerJIT implements TestRunner {
-  TestRunnerJIT(Map<String, String> e, String top, String mode) {
-    tag = TestRunner.getTag(mode);
-    env = Map<String, String>.from(e);
-    env['PATH'] = "$top/out/$tag:${env['PATH']}";
-  }
-  String description() {
-    return "JIT-${tag}";
+  TestRunnerJIT(String tag, String top, String tmp, Map<String, String> e) {
+    description = 'JIT-${tag}';
+    dart = '$top/out/$tag/dart';
+    fileName = '$tmp/fuzz.dart';
+    env = e;
   }
 
-  TestResult run(String fileName) {
-    return runCommand(['dart', fileName], env);
+  TestResult run() {
+    return runCommand([dart, fileName], env);
   }
 
-  String tag;
+  String description;
+  String dart;
+  String fileName;
   Map<String, String> env;
 }
 
 /// Concrete test runner of Dart AOT.
 class TestRunnerAOT implements TestRunner {
-  TestRunnerAOT(Map<String, String> e, String top, String mode) {
-    tag = TestRunner.getTag(mode);
+  TestRunnerAOT(String tag, String top, String tmp, Map<String, String> e) {
+    description = 'AOT-${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['PATH'] = "$top/pkg/vm/tool:${env['PATH']}";
     env['DART_CONFIGURATION'] = tag;
   }
-  String description() {
-    return "AOT-${tag}";
-  }
 
-  TestResult run(String fileName) {
-    TestResult result = runCommand(['precompiler2', fileName, 'snapshot'], env);
+  TestResult run() {
+    TestResult result = runCommand([precompiler, fileName, snapshot], env);
     if (result.code != ResultCode.success) {
       return result;
     }
-    return runCommand(['dart_precompiled_runtime2', 'snapshot'], env);
+    return runCommand([dart, snapshot], env);
   }
 
-  String tag;
+  String description;
+  String precompiler;
+  String dart;
+  String fileName;
+  String snapshot;
+  Map<String, String> env;
+}
+
+/// Concrete test runner of bytecode.
+class TestRunnerKBC implements TestRunner {
+  TestRunnerKBC(
+      String mode, String tag, String top, String tmp, Map<String, String> e) {
+    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';
+    env = e;
+    cmd = [dart];
+    if (mode.startsWith('kbc-int')) {
+      description = 'KBC-INT-${tag}';
+      cmd += ['--enable-interpreter', '--compilation-counter-threshold=-1'];
+    } else if (mode.startsWith('kbc-mix')) {
+      description = 'KBC-MIX-${tag}';
+      cmd += ['--enable-interpreter'];
+    } else if (mode.startsWith('kbc-cmp')) {
+      description = 'KBC-CMP-${tag}';
+      cmd += ['--use-bytecode-compiler'];
+    } else {
+      throw ('unknown KBC mode: $mode');
+    }
+    cmd += [dill];
+  }
+
+  TestResult run() {
+    TestResult result = runCommand(
+        [generate, '--gen-bytecode', platform, '-o', dill, fileName], env);
+    if (result.code != ResultCode.success) {
+      return result;
+    }
+    return runCommand(cmd, env);
+  }
+
+  String description;
+  String generate;
+  String platform;
+  String dill;
+  String dart;
+  String fileName;
+  List<String> cmd;
   Map<String, String> env;
 }
 
 /// Concrete test runner of Dart2JS.
 class TestRunnerJS implements TestRunner {
-  TestRunnerJS(Map<String, String> e, String top, String mode) {
-    env = Map<String, String>.from(e);
-    env['PATH'] = "$top/out/ReleaseX64/dart-sdk/bin:${env['PATH']}";
-  }
-  String description() {
-    return "Dart2JS";
+  TestRunnerJS(String top, String tmp, Map<String, String> e) {
+    description = 'Dart2JS';
+    dart2js = '$top/out/ReleaseX64/dart-sdk/bin/dart2js';
+    fileName = '$tmp/fuzz.dart';
+    js = '$tmp/out.js';
+    env = e;
   }
 
-  TestResult run(String fileName) {
-    TestResult result = runCommand(['dart2js', fileName], env);
+  TestResult run() {
+    TestResult result = runCommand([dart2js, fileName, '-o', js], env);
     if (result.code != ResultCode.success) {
       return result;
     }
-    return runCommand(['nodejs', 'out.js'], env);
+    return runCommand(['nodejs', js], env);
   }
 
+  String description;
+  String dart2js;
+  String fileName;
+  String js;
   Map<String, String> env;
 }
 
-/// Class to run a fuzz testing session.
+/// Class to run fuzz testing.
 class DartFuzzTest {
   DartFuzzTest(this.env, this.repeat, this.trueDivergence, this.showStats,
       this.top, this.mode1, this.mode2);
 
-  bool runSession() {
-    setupSession();
+  int run() {
+    setup();
 
-    print('\n**\n**** Dart Fuzz Testing\n**\n');
-    print('Fuzz Version : ${version}');
-    print('#Tests       : ${repeat}');
-    print('Exec-Mode 1  : ${runner1.description()}');
-    print('Exec-Mode 2  : ${runner2.description()}');
-    print('Dart Dev     : ${top}');
-    print('Orig Dir     : ${orgDir.path}');
-    print('Temp Dir     : ${tmpDir.path}\n');
+    print('\n${isolate}: start');
+    if (showStats) {
+      showStatistics();
+    }
 
-    showStatistics();
     for (int i = 0; i < repeat; i++) {
       numTests++;
       seed = rand.nextInt(1 << 32);
       generateTest();
       runTest();
-      showStatistics();
+      if (showStats) {
+        showStatistics();
+      } else if ((i & 31) == 31) {
+        print('\n${isolate}: busy @${numTests}....');
+      }
     }
 
-    cleanupSession();
-    if (numDivergences != 0) {
-      print('\n\nfailure\n');
-      return false;
-    }
-    print('\n\nsuccess\n');
-    return true;
+    print('\n${isolate}: done');
+    showStatistics();
+    print('');
+
+    cleanup();
+    return numDivergences;
   }
 
-  void setupSession() {
+  void setup() {
     rand = new Random();
-    orgDir = Directory.current;
     tmpDir = Directory.systemTemp.createTempSync('dart_fuzz');
-    Directory.current = tmpDir;
-    fileName = 'fuzz.dart';
-    runner1 = TestRunner.getTestRunner(env, top, mode1);
-    runner2 = TestRunner.getTestRunner(env, top, mode2);
+    fileName = '${tmpDir.path}/fuzz.dart';
+    runner1 = TestRunner.getTestRunner(mode1, top, tmpDir.path, env);
+    runner2 = TestRunner.getTestRunner(mode2, top, tmpDir.path, env);
+    isolate = 'Isolate (${tmpDir.path}) '
+        '${runner1.description} - ${runner2.description}';
+
     numTests = 0;
     numSuccess = 0;
     numNotRun = 0;
@@ -184,16 +241,13 @@
     numDivergences = 0;
   }
 
-  void cleanupSession() {
-    Directory.current = orgDir;
+  void cleanup() {
     tmpDir.delete(recursive: true);
   }
 
   void showStatistics() {
-    if (showStats) {
-      stdout.write('\rTests: $numTests Success: $numSuccess Not-Run: '
-          '$numNotRun: Time-Out: $numTimeOut Divergences: $numDivergences');
-    }
+    stdout.write('\rTests: $numTests Success: $numSuccess Not-Run: '
+        '$numNotRun: Time-Out: $numTimeOut Divergences: $numDivergences');
   }
 
   void generateTest() {
@@ -203,8 +257,8 @@
   }
 
   void runTest() {
-    TestResult result1 = runner1.run(fileName);
-    TestResult result2 = runner2.run(fileName);
+    TestResult result1 = runner1.run();
+    TestResult result2 = runner2.run();
     checkDivergence(result1, result2);
   }
 
@@ -247,9 +301,10 @@
   void reportDivergence(
       TestResult result1, TestResult result2, bool outputDivergence) {
     numDivergences++;
-    print('\n\nDIVERGENCE on generated program $version:$seed\n');
-    if (outputDivergence) {
-      print('out1:\n${result1.output}\n\nout2:\n${result2.output}\n');
+    print(
+        '\n${isolate}: !DIVERGENCE! $version:$seed (output=${outputDivergence})');
+    if (showStats && outputDivergence) {
+      print('out1:\n${result1.output}\nout2:\n${result2.output}\n');
     }
   }
 
@@ -262,13 +317,13 @@
   final String mode1;
   final String mode2;
 
-  // Session.
+  // Test.
   Random rand;
-  Directory orgDir;
   Directory tmpDir;
   String fileName;
   TestRunner runner1;
   TestRunner runner2;
+  String isolate;
   int seed;
 
   // Stats.
@@ -279,41 +334,159 @@
   int numDivergences;
 }
 
+/// Class to start fuzz testing session.
+class DartFuzzTestSession {
+  DartFuzzTestSession(this.isolates, this.repeat, this.trueDivergence,
+      this.showStats, String tp, this.mode1, this.mode2)
+      : top = getTop(tp) {}
+
+  start() async {
+    print('\n**\n**** Dart Fuzz Testing Session\n**\n');
+    print('Fuzz Version    : ${version}');
+    print('Isolates        : ${isolates}');
+    print('Tests           : ${repeat}');
+    print('True Divergence : ${trueDivergence}');
+    print('Show Stats      : ${showStats}');
+    print('Dart Dev        : ${top}');
+    // Fork.
+    List<ReceivePort> ports = new List();
+    for (int i = 0; i < isolates; i++) {
+      ReceivePort r = new ReceivePort();
+      ports.add(r);
+      port = r.sendPort;
+      await Isolate.spawn(run, this);
+    }
+    // Join.
+    int divergences = 0;
+    for (int i = 0; i < isolates; i++) {
+      var d = await ports[i].first;
+      divergences += d;
+    }
+    if (divergences == 0) {
+      print('\nsuccess\n');
+    } else {
+      print('\nfailure ($divergences divergences)\n');
+      exitCode = 1;
+    }
+  }
+
+  static run(DartFuzzTestSession session) {
+    int divergences = 0;
+    try {
+      final m1 = getMode(session.mode1, null);
+      final m2 = getMode(session.mode2, m1);
+      final fuzz = new DartFuzzTest(Platform.environment, session.repeat,
+          session.trueDivergence, session.showStats, session.top, m1, m2);
+      divergences = fuzz.run();
+    } catch (e) {
+      print('Isolate: $e');
+    }
+    session.port.send(divergences);
+  }
+
+  // Picks a top directory (command line, environment, or current).
+  static String getTop(String top) {
+    if (top == null || top == '') {
+      top = Platform.environment['DART_TOP'];
+    }
+    if (top == null || top == '') {
+      top = Directory.current.path;
+    }
+    return top;
+  }
+
+  // Picks a mode (command line or random).
+  static String getMode(String mode, String other) {
+    // Random when not set.
+    if (mode == null || mode == '') {
+      // Pick a mode at random (cluster), different from other.
+      const cluster_modes = 16;
+      Random rand = new Random();
+      do {
+        mode = modes[rand.nextInt(cluster_modes)];
+      } while (mode == other);
+    }
+    // Verify mode.
+    if (modes.contains(mode)) {
+      return mode;
+    }
+    throw ('unknown mode: $mode');
+  }
+
+  // Context.
+  final int isolates;
+  final int repeat;
+  final bool trueDivergence;
+  final bool showStats;
+  final String top;
+  final String mode1;
+  final String mode2;
+
+  // Passes each port to isolate.
+  SendPort port;
+
+  // Supported modes.
+  static const List<String> modes = [
+    // Cluster options:
+    'jit-debug-ia32',
+    'jit-debug-x64',
+    'jit-debug-arm32',
+    'jit-debug-arm64',
+    'jit-ia32',
+    'jit-x64',
+    'jit-arm32',
+    'jit-arm64',
+    'aot-debug-x64',
+    'aot-x64',
+    'kbc-int-debug-x64',
+    'kbc-cmp-debug-x64',
+    'kbc-mix-debug-x64',
+    'kbc-int-x64',
+    'kbc-cmp-x64',
+    'kbc-mix-x64',
+    // Times out often:
+    'aot-arm64',
+    'aot-debug-arm64',
+    // Too many divergences (due to arithmetic):
+    'js'
+  ];
+}
+
 /// Main driver for a fuzz testing session.
 main(List<String> arguments) {
   // Set up argument parser.
   final parser = new ArgParser()
+    ..addOption('isolates', help: 'number of isolates to use', defaultsTo: '1')
     ..addOption('repeat', help: 'number of tests to run', defaultsTo: '1000')
     ..addFlag('true-divergence',
         negatable: true, help: 'only report true divergences', defaultsTo: true)
     ..addFlag('show-stats',
         negatable: true, help: 'show session statistics', defaultsTo: true)
-    ..addOption('dart-top',
-        help: 'explicit value for \$DART_TOP', defaultsTo: '')
-    ..addOption('mode1', help: 'execution mode 1', defaultsTo: 'jit-x64')
-    ..addOption('mode2', help: 'execution mode 2', defaultsTo: 'aot-x64');
+    ..addOption('dart-top', help: 'explicit value for \$DART_TOP')
+    ..addOption('mode1', help: 'execution mode 1')
+    ..addOption('mode2', help: 'execution mode 2')
+    // Undocumented options for cluster runs.
+    ..addOption('shards',
+        help: 'number of shards used in cluster run', defaultsTo: '1')
+    ..addOption('shard', help: 'shard id in cluster run', defaultsTo: '1');
 
-  // Start fuzz testing session.
+  // Starts fuzz testing session.
   try {
-    final env = Platform.environment;
     final results = parser.parse(arguments);
-    final repeat = int.parse(results['repeat']);
-    final trueDivergence = results['true-divergence'];
-    final showStats = results['show-stats'];
-    final mode1 = results['mode1'];
-    final mode2 = results['mode2'];
-    var top = results['dart-top'];
-    if (top == null || top == '') {
-      top = env['DART_TOP'];
+    final shards = int.parse(results['shards']);
+    final shard = int.parse(results['shard']);
+    if (shards > 1) {
+      print('\nSHARD $shard OF $shards');
     }
-    if (top == null || top == '') {
-      top = Directory.current.path;
-    }
-    final session = new DartFuzzTest(
-        env, repeat, trueDivergence, showStats, top, mode1, mode2);
-    if (!session.runSession()) {
-      exitCode = 1;
-    }
+    new DartFuzzTestSession(
+            int.parse(results['isolates']),
+            int.parse(results['repeat']),
+            results['true-divergence'],
+            results['show-stats'],
+            results['dart-top'],
+            results['mode1'],
+            results['mode2'])
+        .start();
   } catch (e) {
     print('Usage: dart dartfuzz_test.dart [OPTIONS]\n${parser.usage}\n$e');
     exitCode = 255;
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index ebb800a..28be7bd 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -81,226 +81,18 @@
   include_dirs = [ ".." ]
 }
 
-template("process_library_source") {
-  assert(defined(invoker.libsources), "Need libsources in $target_name")
-  assert(defined(invoker.output), "Need output in $target_name")
-  action(target_name) {
-    visibility = [ ":*" ]  # Only targets in this file can see this.
-    libsources = invoker.libsources
-
-    script = invoker.script
-    inputs = invoker.inputs + libsources
-    outputs = [
-      invoker.output,
-    ]
-    args = invoker.args + rebase_path(libsources, root_build_dir)
-  }
-}
-
-template("generate_library_source") {
-  assert(defined(invoker.libname), "Need libname in $target_name")
-  assert(defined(invoker.libsources), "Need libsources in $target_name")
-  assert(defined(invoker.kind), "Need kind in $target_name")
-  assert(defined(invoker.output), "Need output in $target_name")
-
-  process_library_source(target_name) {
-    libname = invoker.libname
-    libsources = invoker.libsources
-    kind = invoker.kind
-    script = "../tools/gen_library_src_paths.py"
-    inputs = [
-      "../lib/libgen_in.cc",
-    ]
-    output = invoker.output
-    args = [
-      "--output",
-      rebase_path(invoker.output, root_build_dir),
-      "--input_cc",
-      rebase_path("../lib/libgen_in.cc", root_build_dir),
-      "--include",
-      "vm/bootstrap.h",
-      "--var_name",
-      "dart::Bootstrap::${libname}_${kind}_paths_",
-      "--library_name",
-      "dart:${libname}",
-    ]
-  }
-}
-
-# This templates expects invoker.sources to be a list of lists.
-# The lists contain the following information about each library:
-#   library name (string)
-#   library sources (list of strings)
-#   library source base path (string)
-#   filename (string)
-#   do_patch (boolean)
-#
-# If do_patch is true, the lists additionally contains
-#   patch sources (list of strings)
-#   patch source base path (string)
-#
-# The template iterates over the list, and generates generate_library_source
-# actions for each. After that, it generates targets to compile the generated
-# sources to make libdart_lib_*.
-template("generate_core_libraries") {
-  assert(defined(invoker.sources), "Need sources in $target_name")
-  assert(defined(invoker.allsources), "Need allsources in $target_name")
-  liboutputs = []
-  libdeps = []
-  foreach(lib, invoker.sources) {
-    libname = lib[0]
-    filename = lib[3]
-    do_patch = lib[4]
-    generate_library_source("generate_${filename}_cc_file") {
-      libname = libname
-      libsources = rebase_path(lib[1], ".", lib[2])
-      kind = "source"
-      output = "$target_gen_dir/${filename}_gen.cc"
-    }
-    if (do_patch) {
-      generate_library_source("generate_${filename}_patch_cc_file") {
-        libname = libname
-        libsources = rebase_path(lib[5], ".", lib[6])
-        kind = "patch"
-        output = "$target_gen_dir/${filename}_patch_gen.cc"
-      }
-    }
-
-    liboutputs += [ "$target_gen_dir/${filename}_gen.cc" ]
-    libdeps += [ ":generate_${filename}_cc_file" ]
-    if (do_patch) {
-      liboutputs += [ "$target_gen_dir/${filename}_patch_gen.cc" ]
-      libdeps += [ ":generate_${filename}_patch_cc_file" ]
-    }
-  }
-
-  all_libsources = rebase_path(invoker.allsources, ".", "../lib")
-
-  library_for_all_configs("libdart_lib") {
-    target_type = "source_set"
-    include_dirs = [ ".." ]
-    sources = all_libsources
-    snapshot_sources = [ "bootstrap_nocore.cc" ]
-    nosnapshot_sources = [ "bootstrap.cc" ] + liboutputs
-    nosnapshot_deps = libdeps
-  }
-}
-
-generate_core_libraries("core_libraries") {
-  sources = [
-    [
-      "async",
-      async_sdk_sources,
-      "../../sdk/lib/async",
-      "async",
-      true,
-      async_runtime_sources,
-      "../lib",
-    ],
-    [
-      "collection",
-      collection_sdk_sources,
-      "../../sdk/lib/collection",
-      "collection",
-      true,
-      collection_runtime_sources,
-      "../lib",
-    ],
-    [
-      "convert",
-      convert_sdk_sources,
-      "../../sdk/lib/convert",
-      "convert",
-      true,
-      convert_runtime_sources,
-      "../lib",
-    ],
-    [
-      "core",
-      core_sdk_sources,
-      "../../sdk/lib/core",
-      "core",
-      true,
-      core_runtime_sources,
-      "../lib",
-    ],
-    [
-      "developer",
-      developer_sdk_sources,
-      "../../sdk/lib/developer",
-      "developer",
-      true,
-      developer_runtime_sources,
-      "../lib",
-    ],
-    [
-      "_internal",
-      internal_sdk_sources,
-      "../../sdk/lib/internal",
-      "internal",
-      true,
-      internal_runtime_sources,
-      "../lib",
-    ],
-    [
-      "isolate",
-      isolate_sdk_sources,
-      "../../sdk/lib/isolate",
-      "isolate",
-      true,
-      isolate_runtime_sources,
-      "../lib",
-    ],
-    [
-      "math",
-      math_sdk_sources,
-      "../../sdk/lib/math",
-      "math",
-      true,
-      math_runtime_sources,
-      "../lib",
-    ],
-    [
-      "mirrors",
-      mirrors_sdk_sources,
-      "../../sdk/lib/mirrors",
-      "mirrors",
-      true,
-      mirrors_runtime_sources,
-      "../lib",
-    ],
-    [
-      "profiler",
-      profiler_sdk_sources,
-      "../../sdk/lib/profiler",
-      "profiler",
-      false,
-    ],
-    [
-      "typed_data",
-      typed_data_sdk_sources,
-      "../../sdk/lib/typed_data",
-      "typed_data",
-      true,
-      typed_data_runtime_sources,
-      "../lib",
-    ],
-    [
-      "_vmservice",
-      vmservice_sdk_sources,
-      "../../sdk/lib/vmservice",
-      "vmservice",
-      true,
-      vmservice_runtime_sources,
-      "../lib",
-    ],
-  ]
+library_for_all_configs("libdart_lib") {
+  target_type = "source_set"
+  include_dirs = [ ".." ]
   allsources = async_runtime_sources + collection_runtime_sources +
                convert_runtime_sources + core_runtime_sources +
                developer_runtime_sources + internal_runtime_sources +
                isolate_runtime_sources + math_runtime_sources +
                mirrors_runtime_sources + profiler_runtime_sources +
                typed_data_runtime_sources + vmservice_runtime_sources
+  sources = [ "bootstrap.cc" ] + rebase_path(allsources, ".", "../lib")
+  snapshot_sources = []
+  nosnapshot_sources = []
 }
 
 compile_platform("vm_legacy_platform") {
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index e699f47..8a06fff 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -22,9 +22,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, use_dart_frontend);
-DECLARE_FLAG(bool, strong);
-
 Benchmark* Benchmark::first_ = NULL;
 Benchmark* Benchmark::tail_ = NULL;
 const char* Benchmark::executable_ = NULL;
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index cf862ab..484dcd5 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -6,7 +6,6 @@
 
 #include "include/dart_api.h"
 
-#include "vm/bootstrap_natives.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_api_impl.h"
@@ -23,18 +22,13 @@
 struct BootstrapLibProps {
   ObjectStore::BootstrapLibraryId index;
   const char* uri;
-  const char** source_paths;
-  const char* patch_uri;
-  const char** patch_paths;
 };
 
 enum { kPathsUriOffset = 0, kPathsSourceOffset = 1, kPathsEntryLength = 2 };
 
-const char** Bootstrap::profiler_patch_paths_ = NULL;
-
+#if !defined(DART_PRECOMPILED_RUNTIME)
 #define MAKE_PROPERTIES(CamelName, name)                                       \
-  {ObjectStore::k##CamelName, "dart:" #name, Bootstrap::name##_source_paths_,  \
-   "dart:" #name "-patch", Bootstrap::name##_patch_paths_},
+  {ObjectStore::k##CamelName, "dart:" #name},
 
 static const BootstrapLibProps bootstrap_libraries[] = {
     FOR_EACH_BOOTSTRAP_LIBRARY(MAKE_PROPERTIES)};
@@ -42,186 +36,6 @@
 #undef MAKE_PROPERTIES
 
 static const intptr_t kBootstrapLibraryCount = ARRAY_SIZE(bootstrap_libraries);
-
-static RawString* GetLibrarySourceByIndex(intptr_t index,
-                                          const String& uri,
-                                          bool patch) {
-  ASSERT(index >= 0 && index < kBootstrapLibraryCount);
-
-  // Try to read the source using the path specified for the uri.
-  const char** source_paths = patch ? bootstrap_libraries[index].patch_paths
-                                    : bootstrap_libraries[index].source_paths;
-  if (source_paths == NULL) {
-    return String::null();  // No path mapping information exists for library.
-  }
-  const char* source_data = NULL;
-  for (intptr_t i = 0; source_paths[i] != NULL; i += kPathsEntryLength) {
-    if (uri.Equals(source_paths[i + kPathsUriOffset])) {
-      source_data = source_paths[i + kPathsSourceOffset];
-      break;
-    }
-  }
-  if (source_data == NULL) {
-    return String::null();  // Uri does not exist in path mapping information.
-  }
-
-  const uint8_t* utf8_array = NULL;
-  intptr_t file_length = -1;
-
-  if (source_data != NULL) {
-    file_length = strlen(source_data);
-    utf8_array = reinterpret_cast<const uint8_t*>(source_data);
-  } else {
-    return String::null();
-  }
-  ASSERT(utf8_array != NULL);
-  ASSERT(file_length >= 0);
-  return String::FromUTF8(utf8_array, file_length);
-}
-
-static RawString* GetLibrarySource(Zone* zone,
-                                   const Library& lib,
-                                   const String& uri,
-                                   bool patch) {
-  // First check if this is a valid bootstrap library and find its index in
-  // the 'bootstrap_libraries' table above.
-  intptr_t index;
-  const String& lib_uri = String::Handle(lib.url());
-  for (index = 0; index < kBootstrapLibraryCount; ++index) {
-    if (lib_uri.Equals(bootstrap_libraries[index].uri)) {
-      break;
-    }
-  }
-  if (index == kBootstrapLibraryCount) {
-    return String::null();  // The library is not a bootstrap library.
-  }
-
-  const Array& strings = Array::Handle(zone, Array::New(3));
-  strings.SetAt(0, lib_uri);
-  strings.SetAt(1, Symbols::Slash());
-  strings.SetAt(2, uri);
-  const String& part_uri = String::Handle(zone, String::ConcatAll(strings));
-
-  return GetLibrarySourceByIndex(index, part_uri, patch);
-}
-
-static RawError* Compile(const Library& library, const Script& script) {
-  bool update_lib_status = (script.kind() == RawScript::kScriptTag ||
-                            script.kind() == RawScript::kLibraryTag);
-  if (update_lib_status) {
-    library.SetLoadInProgress();
-  }
-  const Error& error = Error::Handle(Compiler::Compile(library, script));
-  if (update_lib_status) {
-    if (error.IsNull()) {
-      library.SetLoaded();
-    } else {
-      // Compilation errors are not Dart instances, so just mark the library
-      // as having failed to load without providing an error instance.
-      library.SetLoadError(Object::null_instance());
-    }
-  }
-  return error.raw();
-}
-
-static Dart_Handle LoadPartSource(Thread* thread,
-                                  const Library& lib,
-                                  const String& uri) {
-  Zone* zone = thread->zone();
-  const String& part_source =
-      String::Handle(zone, GetLibrarySource(zone, lib, uri, false));
-  const String& lib_uri = String::Handle(zone, lib.url());
-  if (part_source.IsNull()) {
-    return Api::NewError("Unable to read part file '%s' of library '%s'",
-                         uri.ToCString(), lib_uri.ToCString());
-  }
-
-  // Prepend the library URI to form a unique script URI for the part.
-  const Array& strings = Array::Handle(zone, Array::New(3));
-  strings.SetAt(0, lib_uri);
-  strings.SetAt(1, Symbols::Slash());
-  strings.SetAt(2, uri);
-  const String& part_uri = String::Handle(zone, String::ConcatAll(strings));
-
-  // Create a script object and compile the part.
-  const Script& part_script = Script::Handle(
-      zone, Script::New(part_uri, part_source, RawScript::kSourceTag));
-  const Error& error = Error::Handle(zone, Compile(lib, part_script));
-  return Api::NewHandle(thread, error.raw());
-}
-
-static Dart_Handle BootstrapLibraryTagHandler(Dart_LibraryTag tag,
-                                              Dart_Handle library,
-                                              Dart_Handle uri) {
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  // This handler calls into the VM directly and does not use the Dart
-  // API so we transition back to VM.
-  TransitionNativeToVM transition(thread);
-  if (!Dart_IsLibrary(library)) {
-    return Api::NewError("not a library");
-  }
-  if (!Dart_IsString(uri)) {
-    return Api::NewError("uri is not a string");
-  }
-  if (tag == Dart_kCanonicalizeUrl) {
-    // In the bootstrap loader we do not try and do any canonicalization.
-    return uri;
-  }
-  const String& uri_str = Api::UnwrapStringHandle(zone, uri);
-  ASSERT(!uri_str.IsNull());
-  if (tag == Dart_kImportTag) {
-    // We expect the core bootstrap libraries to only import other
-    // core bootstrap libraries.
-    // We have precreated all the bootstrap library objects hence
-    // we do not expect to be called back with the tag set to kImportTag.
-    // The bootstrap process explicitly loads all the libraries one by one.
-    return Api::NewError("Invalid import of '%s' in a bootstrap library",
-                         uri_str.ToCString());
-  }
-  ASSERT(tag == Dart_kSourceTag);
-  const Library& lib = Api::UnwrapLibraryHandle(zone, library);
-  ASSERT(!lib.IsNull());
-  return LoadPartSource(thread, lib, uri_str);
-}
-
-static RawError* LoadPatchFiles(Thread* thread,
-                                const Library& lib,
-                                intptr_t index) {
-  const char** patch_files = bootstrap_libraries[index].patch_paths;
-  if (patch_files == NULL) return Error::null();
-
-  Zone* zone = thread->zone();
-  String& patch_uri = String::Handle(
-      zone, Symbols::New(thread, bootstrap_libraries[index].patch_uri));
-  String& patch_file_uri = String::Handle(zone);
-  String& source = String::Handle(zone);
-  Script& script = Script::Handle(zone);
-  Error& error = Error::Handle(zone);
-  const Array& strings = Array::Handle(zone, Array::New(3));
-  strings.SetAt(0, patch_uri);
-  strings.SetAt(1, Symbols::Slash());
-  for (intptr_t j = 0; patch_files[j] != NULL; j += kPathsEntryLength) {
-    patch_file_uri = String::New(patch_files[j + kPathsUriOffset]);
-    source = GetLibrarySourceByIndex(index, patch_file_uri, true);
-    if (source.IsNull()) {
-      const String& message = String::Handle(
-          String::NewFormatted("Unable to find dart patch source for %s",
-                               patch_file_uri.ToCString()));
-      return ApiError::New(message);
-    }
-    // Prepend the patch library URI to form a unique script URI for the patch.
-    strings.SetAt(2, patch_file_uri);
-    patch_file_uri = String::ConcatAll(strings);
-    script = Script::New(patch_file_uri, source, RawScript::kPatchTag);
-    error = lib.Patch(script);
-    if (!error.IsNull()) {
-      return error.raw();
-    }
-  }
-  return Error::null();
-}
-
 static void Finish(Thread* thread) {
   Bootstrap::SetupNativeResolver();
   if (!ClassFinalizer::ProcessPendingClasses()) {
@@ -260,56 +74,6 @@
   Compiler::CompileClass(cls);
 }
 
-static RawError* BootstrapFromSource(Thread* thread) {
-  Isolate* isolate = thread->isolate();
-  Zone* zone = thread->zone();
-  String& uri = String::Handle(zone);
-  String& source = String::Handle(zone);
-  Script& script = Script::Handle(zone);
-  Library& lib = Library::Handle(zone);
-  Error& error = Error::Handle(zone);
-
-  // Set the library tag handler for the isolate to the bootstrap
-  // library tag handler so that we can load all the bootstrap libraries.
-  Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler();
-  isolate->set_library_tag_handler(BootstrapLibraryTagHandler);
-
-  // Load, compile and patch bootstrap libraries.
-  for (intptr_t i = 0; i < kBootstrapLibraryCount; ++i) {
-    ObjectStore::BootstrapLibraryId id = bootstrap_libraries[i].index;
-    uri = Symbols::New(thread, bootstrap_libraries[i].uri);
-    lib = isolate->object_store()->bootstrap_library(id);
-    ASSERT(!lib.IsNull());
-    ASSERT(lib.raw() == Library::LookupLibrary(thread, uri));
-    source = GetLibrarySourceByIndex(i, uri, false);
-    if (source.IsNull()) {
-      const String& message = String::Handle(String::NewFormatted(
-          "Unable to find dart source for %s", uri.ToCString()));
-      error ^= ApiError::New(message);
-      break;
-    }
-    script = Script::New(uri, source, RawScript::kLibraryTag);
-    error = Compile(lib, script);
-    if (!error.IsNull()) {
-      break;
-    }
-    // If a patch exists, load and patch the script.
-    error = LoadPatchFiles(thread, lib, i);
-    if (!error.IsNull()) {
-      break;
-    }
-  }
-
-  if (error.IsNull()) {
-    Finish(thread);
-  }
-  // Restore the library tag handler for the isolate.
-  isolate->set_library_tag_handler(saved_tag_handler);
-
-  return error.raw();
-}
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
 static RawError* BootstrapFromKernel(Thread* thread,
                                      const uint8_t* kernel_buffer,
                                      intptr_t kernel_buffer_size) {
@@ -362,14 +126,6 @@
 
   return Error::null();
 }
-#else
-static RawError* BootstrapFromKernel(Thread* thread,
-                                     const uint8_t* kernel_buffer,
-                                     intptr_t kernel_buffer_size) {
-  UNREACHABLE();
-  return Error::null();
-}
-#endif
 
 RawError* Bootstrap::DoBootstrapping(const uint8_t* kernel_buffer,
                                      intptr_t kernel_buffer_size) {
@@ -395,9 +151,14 @@
     }
   }
 
-  return (kernel_buffer == NULL)
-             ? BootstrapFromSource(thread)
-             : BootstrapFromKernel(thread, kernel_buffer, kernel_buffer_size);
+  return BootstrapFromKernel(thread, kernel_buffer, kernel_buffer_size);
 }
+#else
+RawError* Bootstrap::DoBootstrapping(const uint8_t* kernel_buffer,
+                                     intptr_t kernel_buffer_size) {
+  UNREACHABLE();
+  return Error::null();
+}
+#endif
 
 }  // namespace dart
diff --git a/runtime/vm/bootstrap.h b/runtime/vm/bootstrap.h
index 88e2407..895f9d1 100644
--- a/runtime/vm/bootstrap.h
+++ b/runtime/vm/bootstrap.h
@@ -29,38 +29,6 @@
 
   static void SetupNativeResolver();
   static bool IsBootstrapResolver(Dart_NativeEntryResolver resolver);
-
-  // Source path mapping for library URI and 'parts'.
-  static const char* async_source_paths_[];
-  static const char* core_source_paths_[];
-  static const char* collection_source_paths_[];
-  static const char* convert_source_paths_[];
-  static const char* developer_source_paths_[];
-  static const char* _internal_source_paths_[];
-  static const char* isolate_source_paths_[];
-  static const char* json_source_paths_[];
-  static const char* math_source_paths_[];
-  static const char* mirrors_source_paths_[];
-  static const char* profiler_source_paths_[];
-  static const char* typed_data_source_paths_[];
-  static const char* utf_source_paths_[];
-  static const char* _vmservice_source_paths_[];
-
-  // Source path mapping for patch URI and 'parts'.
-  static const char* async_patch_paths_[];
-  static const char* core_patch_paths_[];
-  static const char* collection_patch_paths_[];
-  static const char* convert_patch_paths_[];
-  static const char* developer_patch_paths_[];
-  static const char* _internal_patch_paths_[];
-  static const char* isolate_patch_paths_[];
-  static const char* math_patch_paths_[];
-  static const char* mirrors_patch_paths_[];
-  static const char* typed_data_patch_paths_[];
-  static const char* _vmservice_patch_paths_[];
-
-  // NULL patch paths for libraries that do not have patch files.
-  static const char** profiler_patch_paths_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/bootstrap_nocore.cc b/runtime/vm/bootstrap_nocore.cc
deleted file mode 100644
index 2b3d6b5..0000000
--- a/runtime/vm/bootstrap_nocore.cc
+++ /dev/null
@@ -1,160 +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.
-
-#include "vm/bootstrap.h"
-
-#include "include/dart_api.h"
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-#include "vm/class_finalizer.h"
-#include "vm/compiler/jit/compiler.h"
-#include "vm/kernel_loader.h"
-#endif
-#include "vm/object.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-#include "vm/object_store.h"
-#endif
-
-namespace dart {
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-#define MAKE_PROPERTIES(CamelName, name)                                       \
-  {ObjectStore::k##CamelName, "dart:" #name},
-
-struct BootstrapLibProps {
-  ObjectStore::BootstrapLibraryId index;
-  const char* uri;
-};
-
-static BootstrapLibProps bootstrap_libraries[] = {
-    FOR_EACH_BOOTSTRAP_LIBRARY(MAKE_PROPERTIES)};
-
-#undef MAKE_PROPERTIES
-
-static const intptr_t bootstrap_library_count = ARRAY_SIZE(bootstrap_libraries);
-
-static void Finish(Thread* thread) {
-  Bootstrap::SetupNativeResolver();
-  ClassFinalizer::ProcessPendingClasses();
-
-  // Eagerly compile the _Closure class as it is the class of all closure
-  // instances. This allows us to just finalize function types without going
-  // through the hoops of trying to compile their scope class.
-  ObjectStore* object_store = thread->isolate()->object_store();
-  Zone* zone = thread->zone();
-  Class& cls = Class::Handle(zone, object_store->closure_class());
-  Compiler::CompileClass(cls);
-
-#if defined(DEBUG)
-  // Verify that closure field offsets are identical in Dart and C++.
-  const Array& fields = Array::Handle(zone, cls.fields());
-  ASSERT(fields.Length() == 6);
-  Field& field = Field::Handle(zone);
-  field ^= fields.At(0);
-  ASSERT(field.Offset() == Closure::instantiator_type_arguments_offset());
-  field ^= fields.At(1);
-  ASSERT(field.Offset() == Closure::function_type_arguments_offset());
-  field ^= fields.At(2);
-  ASSERT(field.Offset() == Closure::delayed_type_arguments_offset());
-  field ^= fields.At(3);
-  ASSERT(field.Offset() == Closure::function_offset());
-  field ^= fields.At(4);
-  ASSERT(field.Offset() == Closure::context_offset());
-  field ^= fields.At(5);
-  ASSERT(field.Offset() == Closure::hash_offset());
-#endif  // defined(DEBUG)
-
-  // Eagerly compile Bool class, bool constants are used from within compiler.
-  cls = object_store->bool_class();
-  Compiler::CompileClass(cls);
-}
-
-RawError* BootstrapFromKernel(Thread* thread,
-                              const uint8_t* kernel_buffer,
-                              intptr_t kernel_buffer_size) {
-  Zone* zone = thread->zone();
-  const char* error = nullptr;
-  kernel::Program* program = kernel::Program::ReadFromBuffer(
-      kernel_buffer, kernel_buffer_size, &error);
-  if (program == nullptr) {
-    const intptr_t kMessageBufferSize = 512;
-    char message_buffer[kMessageBufferSize];
-    Utils::SNPrint(message_buffer, kMessageBufferSize,
-                   "Can't load Kernel binary: %s.", error);
-    const String& msg = String::Handle(String::New(message_buffer, Heap::kOld));
-    return ApiError::New(msg, Heap::kOld);
-  }
-  kernel::KernelLoader loader(program);
-  Isolate* isolate = thread->isolate();
-
-  // Load the bootstrap libraries in order (see object_store.h).
-  Library& library = Library::Handle(zone);
-  String& dart_name = String::Handle(zone);
-  for (intptr_t i = 0; i < bootstrap_library_count; ++i) {
-    ObjectStore::BootstrapLibraryId id = bootstrap_libraries[i].index;
-    library = isolate->object_store()->bootstrap_library(id);
-    dart_name = library.url();
-    for (intptr_t j = 0; j < program->library_count(); ++j) {
-      const String& kernel_name = loader.LibraryUri(j);
-      if (kernel_name.Equals(dart_name)) {
-        loader.LoadLibrary(j);
-        break;
-      }
-    }
-  }
-
-  // Finish bootstrapping, including class finalization.
-  Finish(thread);
-
-  // The platform binary may contain other libraries (e.g., dart:_builtin or
-  // dart:io) that will not be bundled with application.  Load them now.
-  const Object& result = Object::Handle(loader.LoadProgram());
-  delete program;
-  if (result.IsError()) {
-    return Error::Cast(result).raw();
-  }
-
-  // The builtin library should be registered with the VM.
-  dart_name = String::New("dart:_builtin");
-  library = Library::LookupLibrary(thread, dart_name);
-  isolate->object_store()->set_builtin_library(library);
-
-  return Error::null();
-}
-
-RawError* Bootstrap::DoBootstrapping(const uint8_t* kernel_buffer,
-                                     intptr_t kernel_buffer_size) {
-  Thread* thread = Thread::Current();
-  Isolate* isolate = thread->isolate();
-  Zone* zone = thread->zone();
-  String& uri = String::Handle(zone);
-  Library& lib = Library::Handle(zone);
-
-  HANDLESCOPE(thread);
-
-  // Ensure there are library objects for all the bootstrap libraries.
-  for (intptr_t i = 0; i < bootstrap_library_count; ++i) {
-    ObjectStore::BootstrapLibraryId id = bootstrap_libraries[i].index;
-    uri = Symbols::New(thread, bootstrap_libraries[i].uri);
-    lib = isolate->object_store()->bootstrap_library(id);
-    ASSERT(lib.raw() == Library::LookupLibrary(thread, uri));
-    if (lib.IsNull()) {
-      lib = Library::NewLibraryHelper(uri, false);
-      lib.SetLoadRequested();
-      lib.Register(thread);
-      isolate->object_store()->set_bootstrap_library(id, lib);
-    }
-  }
-
-  return BootstrapFromKernel(thread, kernel_buffer, kernel_buffer_size);
-}
-#else
-RawError* Bootstrap::DoBootstrapping(const uint8_t* kernel_buffer,
-                                     intptr_t kernel_buffer_size) {
-  UNREACHABLE();
-  return Error::null();
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-}  // namespace dart
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index c2cceac..d85cb3c 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -449,23 +449,6 @@
     return;
   }
 
-  if (!FLAG_strong && Isolate::Current()->error_on_bad_override()) {
-    // Verify that the target is compatible with the redirecting factory.
-    Error& error = Error::Handle();
-    if (!target.HasCompatibleParametersWith(factory, &error)) {
-      const Script& script = Script::Handle(target_class.script());
-      type = NewFinalizedMalformedType(
-          error, script, target.token_pos(),
-          "constructor '%s' has incompatible parameters with "
-          "redirecting factory '%s'",
-          String::Handle(target.name()).ToCString(),
-          String::Handle(factory.name()).ToCString());
-      factory.SetRedirectionType(type);
-      ASSERT(factory.RedirectionTarget() == Function::null());
-      return;
-    }
-  }
-
   // Verify that the target is const if the redirecting factory is const.
   if (factory.is_const() && !target.is_const()) {
     ReportError(target_class, target.token_pos(),
@@ -1484,50 +1467,6 @@
   }
 }
 
-// Check if an instance field, getter, or method of same name exists
-// in any super class.
-static RawClass* FindSuperOwnerOfInstanceMember(const Class& cls,
-                                                const String& name,
-                                                const String& getter_name) {
-  Class& super_class = Class::Handle();
-  Function& function = Function::Handle();
-  Field& field = Field::Handle();
-  super_class = cls.SuperClass();
-  while (!super_class.IsNull()) {
-    function = super_class.LookupFunction(name);
-    if (!function.IsNull() && !function.is_static()) {
-      return super_class.raw();
-    }
-    function = super_class.LookupFunction(getter_name);
-    if (!function.IsNull() && !function.is_static()) {
-      return super_class.raw();
-    }
-    field = super_class.LookupField(name);
-    if (!field.IsNull() && !field.is_static()) {
-      return super_class.raw();
-    }
-    super_class = super_class.SuperClass();
-  }
-  return Class::null();
-}
-
-// Check if an instance method of same name exists in any super class.
-static RawClass* FindSuperOwnerOfFunction(const Class& cls,
-                                          const String& name) {
-  Class& super_class = Class::Handle();
-  Function& function = Function::Handle();
-  super_class = cls.SuperClass();
-  while (!super_class.IsNull()) {
-    function = super_class.LookupFunction(name);
-    if (!function.IsNull() && !function.is_static() &&
-        !function.IsMethodExtractor()) {
-      return super_class.raw();
-    }
-    super_class = super_class.SuperClass();
-  }
-  return Class::null();
-}
-
 // Resolve the upper bounds of the type parameters of class cls.
 void ClassFinalizer::ResolveUpperBounds(const Class& cls) {
   const intptr_t num_type_params = cls.NumTypeParameters();
@@ -1605,9 +1544,7 @@
   // functions of a class, so we do not need to consider fields as implicitly
   // generating getters and setters.
   // Most overriding conflicts are only static warnings, i.e. they are not
-  // reported as compile-time errors by the vm. However, in non-strong mode,
-  // signature conflicts in overrides can be reported if the flag
-  // --error_on_bad_override is specified.
+  // reported as compile-time errors by the vm.
   // Static warning examples are:
   // - a static getter 'v' conflicting with an inherited instance setter 'v='.
   // - a static setter 'v=' conflicting with an inherited instance member 'v'.
@@ -1628,10 +1565,6 @@
   Array& array = Array::Handle(zone, cls.fields());
   Field& field = Field::Handle(zone);
   AbstractType& type = AbstractType::Handle(zone);
-  String& name = String::Handle(zone);
-  String& getter_name = String::Handle(zone);
-  String& other_name = String::Handle(zone);
-  Class& super_class = Class::Handle(zone);
   const intptr_t num_fields = array.Length();
   const bool track_exactness = FLAG_strong && isolate->use_field_guards();
   for (intptr_t i = 0; i < num_fields; i++) {
@@ -1643,200 +1576,19 @@
       field.set_static_type_exactness_state(
           StaticTypeExactnessState::Unitialized());
     }
-    name = field.name();
-    if (field.is_static()) {
-      getter_name = Field::GetterSymbol(name);
-      super_class = FindSuperOwnerOfInstanceMember(cls, name, getter_name);
-      if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(zone, cls.Name());
-        const String& super_cls_name = String::Handle(zone, super_class.Name());
-        ReportError(cls, field.token_pos(),
-                    "static field '%s' of class '%s' conflicts with "
-                    "instance member '%s' of super class '%s'",
-                    name.ToCString(), class_name.ToCString(), name.ToCString(),
-                    super_cls_name.ToCString());
-      }
-      // An implicit setter is not generated for a static field, therefore, we
-      // cannot rely on the code below handling the static setter case to report
-      // a conflict with an instance setter. So we check explicitly here.
-      other_name = Field::SetterSymbol(name);
-      super_class = FindSuperOwnerOfFunction(cls, other_name);
-      if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(zone, cls.Name());
-        const String& super_cls_name = String::Handle(zone, super_class.Name());
-        ReportError(cls, field.token_pos(),
-                    "static field '%s' of class '%s' conflicts with "
-                    "instance setter '%s=' of super class '%s'",
-                    name.ToCString(), class_name.ToCString(), name.ToCString(),
-                    super_cls_name.ToCString());
-      }
-
-    } else {
-      // Instance field. Check whether the field overrides a method
-      // (but not getter).
-      super_class = FindSuperOwnerOfFunction(cls, name);
-      if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(zone, cls.Name());
-        const String& super_cls_name = String::Handle(zone, super_class.Name());
-        ReportError(cls, field.token_pos(),
-                    "field '%s' of class '%s' conflicts with method '%s' "
-                    "of super class '%s'",
-                    name.ToCString(), class_name.ToCString(), name.ToCString(),
-                    super_cls_name.ToCString());
-      }
-    }
-    if (field.is_static() && (field.StaticValue() != Object::null()) &&
-        (field.StaticValue() != Object::sentinel().raw())) {
-      // The parser does not preset the value if the type is a type parameter or
-      // is parameterized unless the value is null.
-      Error& error = Error::Handle(zone);
-      if (type.IsMalformedOrMalbounded()) {
-        error = type.error();
-      } else {
-        ASSERT(type.IsInstantiated());
-      }
-      const Instance& const_value = Instance::Handle(zone, field.StaticValue());
-      if (!error.IsNull() ||
-          (!type.IsDynamicType() &&
-           !const_value.IsInstanceOf(type, Object::null_type_arguments(),
-                                     Object::null_type_arguments(), &error))) {
-        if (isolate->error_on_bad_type()) {
-          const AbstractType& const_value_type =
-              AbstractType::Handle(zone, const_value.GetType(Heap::kNew));
-          const String& const_value_type_name =
-              String::Handle(zone, const_value_type.UserVisibleName());
-          const String& type_name =
-              String::Handle(zone, type.UserVisibleName());
-          ReportErrors(error, cls, field.token_pos(),
-                       "error initializing static %s field '%s': "
-                       "type '%s' is not a subtype of type '%s'",
-                       field.is_const() ? "const" : "final", name.ToCString(),
-                       const_value_type_name.ToCString(),
-                       type_name.ToCString());
-        } else {
-          // Do not report an error yet, even in checked mode, since the field
-          // may not actually be used.
-          // Also, we may be generating a snapshot in production mode that will
-          // later be executed in checked mode, in which case an error needs to
-          // be reported, should the field be accessed.
-          // Therefore, we undo the optimization performed by the parser, i.e.
-          // we create an implicit static final getter and reset the field value
-          // to the sentinel value.
-          const Function& getter = Function::Handle(
-              zone, Function::New(
-                        getter_name, RawFunction::kImplicitStaticFinalGetter,
-                        /* is_static = */ true,
-                        /* is_const = */ field.is_const(),
-                        /* is_abstract = */ false,
-                        /* is_external = */ false,
-                        /* is_native = */ false, cls, field.token_pos()));
-          getter.set_result_type(type);
-          getter.set_is_debuggable(false);
-          getter.set_kernel_offset(field.kernel_offset());
-          cls.AddFunction(getter);
-          field.SetStaticValue(Object::sentinel(), true);
-        }
-      }
-    }
-  }
-  // If we check for bad overrides, collect interfaces, super interfaces, and
-  // super classes of this class.
-  GrowableArray<const Class*> interfaces(zone, 4);
-  if (isolate->error_on_bad_override() && !FLAG_strong) {
-    CollectInterfaces(cls, &interfaces);
-    // Include superclasses in list of interfaces and super interfaces.
-    super_class = cls.SuperClass();
-    while (!super_class.IsNull()) {
-      interfaces.Add(&Class::ZoneHandle(zone, super_class.raw()));
-      CollectInterfaces(super_class, &interfaces);
-      super_class = super_class.SuperClass();
-    }
   }
   // Resolve function signatures and check for conflicts in super classes and
   // interfaces.
   array = cls.functions();
   Function& function = Function::Handle(zone);
-  Function& overridden_function = Function::Handle(zone);
   const intptr_t num_functions = array.Length();
-  Error& error = Error::Handle(zone);
   for (intptr_t i = 0; i < num_functions; i++) {
     function ^= array.At(i);
     FinalizeSignature(cls, function);
-    name = function.name();
-    // Report signature conflicts only.
-    if (isolate->error_on_bad_override() && !FLAG_strong &&
-        !function.is_static() && !function.IsGenerativeConstructor()) {
-      // A constructor cannot override anything.
-      for (intptr_t i = 0; i < interfaces.length(); i++) {
-        const Class* interface = interfaces.At(i);
-        // All interfaces should have been finalized since override checks
-        // rely on all interface members to be finalized.
-        ASSERT(interface->is_finalized());
-        overridden_function = interface->LookupDynamicFunction(name);
-        if (!overridden_function.IsNull() &&
-            !function.HasCompatibleParametersWith(overridden_function,
-                                                  &error)) {
-          const String& class_name = String::Handle(zone, cls.Name());
-          const String& interface_name =
-              String::Handle(zone, interface->Name());
-          ReportErrors(error, cls, function.token_pos(),
-                       "class '%s' overrides method '%s' of super class or "
-                       "interface '%s' with incompatible parameters",
-                       class_name.ToCString(), name.ToCString(),
-                       interface_name.ToCString());
-        }
-      }
-    }
-    if (function.IsImplicitGetterFunction() ||
-        function.IsImplicitSetterFunction() ||
-        function.IsImplicitStaticFieldInitializer()) {
-      // Cache the field object in the function data_ field.
-      if (function.IsImplicitSetterFunction()) {
-        other_name = Field::NameFromSetter(name);
-      } else {
-        other_name = Field::NameFromGetter(name);
-      }
-      field = cls.LookupFieldAllowPrivate(other_name);
-      ASSERT(!field.IsNull());
-      function.set_accessor_field(field);
-    }
     if (function.IsSetterFunction() || function.IsImplicitSetterFunction()) {
-      if (function.is_static()) {
-        super_class = FindSuperOwnerOfFunction(cls, name);
-        if (!super_class.IsNull()) {
-          const String& class_name = String::Handle(zone, cls.Name());
-          const String& super_cls_name =
-              String::Handle(zone, super_class.Name());
-          ReportError(cls, function.token_pos(),
-                      "static setter '%s=' of class '%s' conflicts with "
-                      "instance setter '%s=' of super class '%s'",
-                      name.ToCString(), class_name.ToCString(),
-                      name.ToCString(), super_cls_name.ToCString());
-        }
-      }
       continue;
     }
-    if (function.IsGetterFunction() || function.IsImplicitGetterFunction()) {
-      getter_name = name.raw();
-      name = Field::NameFromGetter(getter_name);
-    } else {
-      getter_name = Field::GetterSymbol(name);
-    }
     if (function.is_static()) {
-      super_class = FindSuperOwnerOfInstanceMember(cls, name, getter_name);
-      if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(zone, cls.Name());
-        const String& super_cls_name = String::Handle(zone, super_class.Name());
-        ReportError(
-            cls, function.token_pos(),
-            "static %s '%s' of class '%s' conflicts with "
-            "instance member '%s' of super class '%s'",
-            (function.IsGetterFunction() || function.IsImplicitGetterFunction())
-                ? "getter"
-                : "method",
-            name.ToCString(), class_name.ToCString(), name.ToCString(),
-            super_cls_name.ToCString());
-      }
       if (function.IsRedirectingFactory()) {
         // The function may be a still unresolved redirecting factory. Do not
         // yet try to resolve it in order to avoid cycles in class finalization.
@@ -1849,32 +1601,6 @@
           function.SetRedirectionType(type);
         }
       }
-    } else if (function.IsGetterFunction() ||
-               function.IsImplicitGetterFunction()) {
-      super_class = FindSuperOwnerOfFunction(cls, name);
-      if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(zone, cls.Name());
-        const String& super_cls_name = String::Handle(zone, super_class.Name());
-        ReportError(cls, function.token_pos(),
-                    "getter '%s' of class '%s' conflicts with "
-                    "method '%s' of super class '%s'",
-                    name.ToCString(), class_name.ToCString(), name.ToCString(),
-                    super_cls_name.ToCString());
-      }
-    } else if (!function.IsSetterFunction() &&
-               !function.IsImplicitSetterFunction()) {
-      // A function cannot conflict with a setter, since they cannot
-      // have the same name. Thus, we do not need to check setters.
-      super_class = FindSuperOwnerOfFunction(cls, getter_name);
-      if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(zone, cls.Name());
-        const String& super_cls_name = String::Handle(zone, super_class.Name());
-        ReportError(cls, function.token_pos(),
-                    "method '%s' of class '%s' conflicts with "
-                    "getter '%s' of super class '%s'",
-                    name.ToCString(), class_name.ToCString(), name.ToCString(),
-                    super_cls_name.ToCString());
-      }
     }
   }
 }
@@ -2787,15 +2513,6 @@
   if (!super.IsNull()) {
     FinalizeClass(super);
   }
-  // Ensure interfaces are finalized in case we check for bad overrides.
-  Isolate* isolate = Isolate::Current();
-  if (isolate->error_on_bad_override() && !FLAG_strong) {
-    GrowableArray<const Class*> interfaces(4);
-    CollectInterfaces(cls, &interfaces);
-    for (intptr_t i = 0; i < interfaces.length(); i++) {
-      FinalizeClass(*interfaces.At(i));
-    }
-  }
   if (cls.IsMixinApplication()) {
     // Copy instance methods and fields from the mixin class.
     // This has to happen before the check whether the methods of
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index ba822e0..2d39211 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -558,6 +558,7 @@
       s->Push(func->ptr()->code_);
     } else if (s->kind() == Snapshot::kFullJIT) {
       NOT_IN_PRECOMPILED(s->Push(func->ptr()->unoptimized_code_));
+      NOT_IN_PRECOMPILED(s->Push(func->ptr()->bytecode_));
       s->Push(func->ptr()->code_);
       s->Push(func->ptr()->ic_data_array_);
     }
@@ -587,6 +588,7 @@
         s->WriteRef(func->ptr()->code_);
       } else if (s->kind() == Snapshot::kFullJIT) {
         NOT_IN_PRECOMPILED(s->WriteRef(func->ptr()->unoptimized_code_));
+        NOT_IN_PRECOMPILED(s->WriteRef(func->ptr()->bytecode_));
         s->WriteRef(func->ptr()->code_);
         s->WriteRef(func->ptr()->ic_data_array_);
       }
@@ -646,6 +648,8 @@
       } else if (kind == Snapshot::kFullJIT) {
         NOT_IN_PRECOMPILED(func->ptr()->unoptimized_code_ =
                                reinterpret_cast<RawCode*>(d->ReadRef()));
+        NOT_IN_PRECOMPILED(func->ptr()->bytecode_ =
+                               reinterpret_cast<RawCode*>(d->ReadRef()));
         func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef());
         func->ptr()->ic_data_array_ = reinterpret_cast<RawArray*>(d->ReadRef());
       }
@@ -705,6 +709,10 @@
         if (func.HasCode() && !code.IsDisabled()) {
           func.SetInstructions(code);  // Set entrypoint.
           func.SetWasCompiled(true);
+#if !defined(DART_PRECOMPILED_RUNTIME)
+        } else if (func.HasBytecode() && !code.IsDisabled()) {
+          func.SetInstructions(code);  // Set entrypoint.
+#endif                                 // !defined(DART_PRECOMPILED_RUNTIME)
         } else {
           func.ClearCode();  // Set code and entrypoint to lazy compile stub.
         }
@@ -1854,7 +1862,8 @@
     uint8_t* entry_bits = pool->ptr()->entry_bits();
     for (intptr_t i = 0; i < length; i++) {
       auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
-      if (entry_type == ObjectPool::kTaggedObject) {
+      if ((entry_type == ObjectPool::kTaggedObject) ||
+          (entry_type == ObjectPool::kNativeEntryData)) {
         s->Push(pool->ptr()->data()[i].raw_obj_);
       }
     }
@@ -1903,6 +1912,22 @@
             s->Write<intptr_t>(entry.raw_value_);
             break;
           }
+          case ObjectPool::kNativeEntryData: {
+            RawObject* raw = entry.raw_obj_;
+            RawTypedData* raw_data = reinterpret_cast<RawTypedData*>(raw);
+            // kNativeEntryData object pool entries are for linking natives for
+            // the interpreter. Before writing these entries into the snapshot,
+            // we need to unlink them by nulling out the 'trampoline' and
+            // 'native_function' fields.
+            NativeEntryData::Payload* payload =
+                NativeEntryData::FromTypedArray(raw_data);
+            if (payload->kind == MethodRecognizer::kUnknown) {
+              payload->trampoline = NULL;
+              payload->native_function = NULL;
+            }
+            s->WriteRef(raw);
+            break;
+          }
           case ObjectPool::kNativeFunction:
           case ObjectPool::kNativeFunctionWrapper: {
             // Write nothing. Will initialize with the lazy link entry.
@@ -1950,6 +1975,7 @@
         pool->ptr()->entry_bits()[j] = entry_bits;
         RawObjectPool::Entry& entry = pool->ptr()->data()[j];
         switch (ObjectPool::TypeBits::decode(entry_bits)) {
+          case ObjectPool::kNativeEntryData:
           case ObjectPool::kTaggedObject:
             entry.raw_obj_ = d->ReadRef();
             break;
@@ -5529,7 +5555,7 @@
   // allocations (e.g., FinalizeVMIsolate) before allocating new pages.
   heap_->old_space()->AbandonBumpAllocation();
 
-  Symbols::InitOnceFromSnapshot(isolate());
+  Symbols::InitFromSnapshot(isolate());
 
   Object::set_vm_isolate_snapshot_object_table(refs);
 
diff --git a/runtime/vm/code_observers.cc b/runtime/vm/code_observers.cc
index d8a9de9..7832900 100644
--- a/runtime/vm/code_observers.cc
+++ b/runtime/vm/code_observers.cc
@@ -47,7 +47,7 @@
   return false;
 }
 
-void CodeObservers::DeleteAll() {
+void CodeObservers::Cleanup() {
   for (intptr_t i = 0; i < observers_length_; i++) {
     delete observers_[i];
   }
@@ -56,9 +56,10 @@
   observers_ = NULL;
 }
 
-void CodeObservers::InitOnce() {
-  ASSERT(mutex_ == NULL);
-  mutex_ = new Mutex();
+void CodeObservers::Init() {
+  if (mutex_ == NULL) {
+    mutex_ = new Mutex();
+  }
   ASSERT(mutex_ != NULL);
   OS::RegisterCodeObservers();
 }
diff --git a/runtime/vm/code_observers.h b/runtime/vm/code_observers.h
index f789675..aa6221d 100644
--- a/runtime/vm/code_observers.h
+++ b/runtime/vm/code_observers.h
@@ -53,7 +53,7 @@
 
 class CodeObservers : public AllStatic {
  public:
-  static void InitOnce();
+  static void Init();
 
   static void Register(CodeObserver* observer);
 
@@ -68,7 +68,7 @@
   // Returns true if there is at least one active code observer.
   static bool AreActive();
 
-  static void DeleteAll();
+  static void Cleanup();
 
   static Mutex* mutex() { return mutex_; }
 
diff --git a/runtime/vm/code_patcher.cc b/runtime/vm/code_patcher.cc
index dfa7d1e..dfe3393 100644
--- a/runtime/vm/code_patcher.cc
+++ b/runtime/vm/code_patcher.cc
@@ -29,6 +29,14 @@
 }
 
 bool MatchesPattern(uword addr, int16_t* pattern, intptr_t size) {
+  // When breaking within generated code in GDB, it may overwrite individual
+  // instructions with trap instructions, which can cause this test to fail.
+  //
+  // Ignoring trap instructions would work well enough within GDB alone, but it
+  // doesn't work in RR, because the check for the trap instrution itself will
+  // cause replay to diverge from the original record.
+  if (FLAG_support_rr) return true;
+
   uint8_t* bytes = reinterpret_cast<uint8_t*>(addr);
   for (intptr_t i = 0; i < size; i++) {
     int16_t val = pattern[i];
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 3607520..c0d761c 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -64,7 +64,6 @@
     max_speculative_inlining_attempts,
     1,
     "Max number of attempts with speculative inlining (precompilation only)");
-DEFINE_FLAG(int, precompiler_rounds, 1, "Number of precompiler iterations");
 
 DECLARE_FLAG(bool, print_flow_graph);
 DECLARE_FLAG(bool, print_flow_graph_optimized);
@@ -88,121 +87,6 @@
 #if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) &&                  \
     !defined(TARGET_ARCH_IA32)
 
-class DartPrecompilationPipeline : public DartCompilationPipeline {
- public:
-  explicit DartPrecompilationPipeline(Zone* zone,
-                                      FieldTypeMap* field_map = NULL)
-      : zone_(zone),
-        result_type_(CompileType::None()),
-        field_map_(field_map),
-        class_(Class::Handle(zone)),
-        fields_(Array::Handle(zone)),
-        field_(Field::Handle(zone)) {}
-
-  virtual void FinalizeCompilation(FlowGraph* flow_graph) {
-    if ((field_map_ != NULL) &&
-        flow_graph->function().IsGenerativeConstructor()) {
-      const Function& constructor = flow_graph->function();
-      for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
-           !block_it.Done(); block_it.Advance()) {
-        ForwardInstructionIterator it(block_it.Current());
-        for (; !it.Done(); it.Advance()) {
-          StoreInstanceFieldInstr* store = it.Current()->AsStoreInstanceField();
-          if (store != NULL) {
-            if (!store->field().IsNull() && store->field().is_final()) {
-#ifndef PRODUCT
-              if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-                THR_Print("Found store to %s <- %s\n",
-                          store->field().ToCString(),
-                          store->value()->Type()->ToCString());
-              }
-#endif  // !PRODUCT
-              RecordFieldStore(constructor, store->field(),
-                               store->value()->Type());
-            }
-          }
-        }
-      }
-
-      // Final fields which were not initialized in this constructor are
-      // implicitly initialized with null.
-      class_ = flow_graph->function().Owner();
-      fields_ = class_.fields();
-      for (intptr_t i = 0; i < fields_.Length(); ++i) {
-        field_ ^= fields_.At(i);
-        if (!field_.is_static() && field_.is_final()) {
-          FieldTypePair* entry = field_map_->Lookup(&field_);
-          if ((entry == nullptr) ||
-              (entry->field_info.constructor != constructor.raw())) {
-#ifndef PRODUCT
-              if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-                THR_Print("Implicit initialization %s <- null\n",
-                          field_.ToCString());
-              }
-#endif  // !PRODUCT
-              CompileType null_type = CompileType::Null();
-              RecordFieldStore(constructor, field_, &null_type);
-          }
-        }
-      }
-    }
-
-    CompileType result_type = CompileType::None();
-    for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
-         !block_it.Done(); block_it.Advance()) {
-      ForwardInstructionIterator it(block_it.Current());
-      for (; !it.Done(); it.Advance()) {
-        ReturnInstr* return_instr = it.Current()->AsReturn();
-        if (return_instr != NULL) {
-          result_type.Union(return_instr->InputAt(0)->Type());
-        }
-      }
-    }
-    result_type_ = result_type;
-  }
-
-  void RecordFieldStore(const Function& constructor,
-                        const Field& field,
-                        CompileType* value_type) {
-    FieldTypePair* entry = field_map_->Lookup(&field);
-    if (entry == NULL) {
-      field_map_->Insert(
-          FieldTypePair(&Field::Handle(zone_, field.raw()),  // Re-wrap.
-                        value_type->ToCid(), constructor.raw()));
-#ifndef PRODUCT
-      if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-        THR_Print(" initial type = %s\n", value_type->ToCString());
-      }
-#endif  // !PRODUCT
-      return;
-    }
-    CompileType type = CompileType::FromCid(entry->field_info.cid);
-#ifndef PRODUCT
-    if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-      THR_Print(" old type = %s\n", type.ToCString());
-    }
-#endif  // !PRODUCT
-    type.Union(value_type);
-#ifndef PRODUCT
-    if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-      THR_Print(" new type = %s\n", type.ToCString());
-    }
-#endif  // !PRODUCT
-    entry->field_info.cid = type.ToCid();
-    entry->field_info.constructor = constructor.raw();
-  }
-
-  CompileType result_type() { return result_type_; }
-
- private:
-  Zone* zone_;
-  CompileType result_type_;
-  FieldTypeMap* field_map_;
-  Class& class_;
-  Array& fields_;
-  Field& field_;
-};
-
 class PrecompileParsedFunctionHelper : public ValueObject {
  public:
   PrecompileParsedFunctionHelper(Precompiler* precompiler,
@@ -291,7 +175,6 @@
       typeargs_to_retain_(),
       types_to_retain_(),
       consts_to_retain_(),
-      field_type_map_(),
       error_(Error::Handle()),
       get_runtime_type_is_unique_(false) {}
 
@@ -320,47 +203,26 @@
       // as well as other type checks.
       HierarchyInfo hierarchy_info(T);
 
-      // Precompile static initializers to compute result type information.
-      PrecompileStaticInitializers();
-      ASSERT(Error::Handle(Z, T->sticky_error()).IsNull());
-
-      // Precompile constructors to compute type information for final fields.
+      // Precompile constructors to compute information such as
+      // optimized instruction count (used in inlining heuristics).
       ClassFinalizer::ClearAllCode();
       PrecompileConstructors();
 
-      for (intptr_t round = 0; round < FLAG_precompiler_rounds; round++) {
-        if (FLAG_trace_precompiler) {
-          THR_Print("Precompiler round %" Pd "\n", round);
-        }
+      ClassFinalizer::ClearAllCode();
 
-        if (round > 0) {
-          ResetPrecompilerState();
-        }
+      CollectDynamicFunctionNames();
 
-        // TODO(rmacnak): We should be able to do a more thorough job and drop
-        // some
-        //  - implicit static closures
-        //  - field initializers
-        //  - invoke-field-dispatchers
-        //  - method-extractors
-        // that are needed in early iterations but optimized away in later
-        // iterations.
-        ClassFinalizer::ClearAllCode();
+      // Start with the allocations and invocations that happen from C++.
+      AddRoots();
+      AddAnnotatedRoots();
 
-        CollectDynamicFunctionNames();
+      // Compile newly found targets and add their callees until we reach a
+      // fixed point.
+      Iterate();
 
-        // Start with the allocations and invocations that happen from C++.
-        AddRoots();
-        AddAnnotatedRoots();
-
-        // Compile newly found targets and add their callees until we reach a
-        // fixed point.
-        Iterate();
-
-        // Replace the default type testing stubs installed on [Type]s with new
-        // [Type]-specialized stubs.
-        AttachOptimizedTypeTestingStub();
-      }
+      // Replace the default type testing stubs installed on [Type]s with new
+      // [Type]-specialized stubs.
+      AttachOptimizedTypeTestingStub();
 
       I->set_compilation_allowed(false);
 
@@ -430,61 +292,6 @@
   }
 }
 
-static void CompileStaticInitializerIgnoreErrors(const Field& field) {
-  ASSERT(Error::Handle(Thread::Current()->zone(),
-                       Thread::Current()->sticky_error())
-             .IsNull());
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    const Function& initializer =
-        Function::Handle(Precompiler::CompileStaticInitializer(
-            field, /* compute_type = */ true));
-    // This function may have become a canonical signature function. Clear
-    // its code while we have a chance.
-    initializer.ClearCode();
-    initializer.ClearICDataArray();
-  } else {
-    // Ignore compile-time errors here. If the field is actually used,
-    // the error will be reported later during Iterate().
-    Thread::Current()->clear_sticky_error();
-  }
-  ASSERT(Error::Handle(Thread::Current()->zone(),
-                       Thread::Current()->sticky_error())
-             .IsNull());
-}
-
-void Precompiler::PrecompileStaticInitializers() {
-  class StaticInitializerVisitor : public ClassVisitor {
-   public:
-    explicit StaticInitializerVisitor(Zone* zone)
-        : fields_(Array::Handle(zone)),
-          field_(Field::Handle(zone)),
-          function_(Function::Handle(zone)) {}
-    void Visit(const Class& cls) {
-      fields_ = cls.fields();
-      for (intptr_t j = 0; j < fields_.Length(); j++) {
-        field_ ^= fields_.At(j);
-        if (field_.is_static() && field_.is_final() &&
-            field_.has_initializer() && !field_.is_const()) {
-          if (FLAG_trace_precompiler) {
-            THR_Print("Precompiling initializer for %s\n", field_.ToCString());
-          }
-          CompileStaticInitializerIgnoreErrors(field_);
-        }
-      }
-    }
-
-   private:
-    Array& fields_;
-    Field& field_;
-    Function& function_;
-  };
-
-  HANDLESCOPE(T);
-  StaticInitializerVisitor visitor(Z);
-  ProgramVisitor::VisitClasses(&visitor);
-}
-
 void Precompiler::PrecompileConstructors() {
   class ConstructorVisitor : public FunctionVisitor {
    public:
@@ -500,8 +307,7 @@
       if (FLAG_trace_precompiler) {
         THR_Print("Precompiling constructor %s\n", function.ToCString());
       }
-      CompileFunction(precompiler_, Thread::Current(), zone_, function,
-                      precompiler_->field_type_map());
+      CompileFunction(precompiler_, Thread::Current(), zone_, function);
     }
 
    private:
@@ -512,22 +318,6 @@
   HANDLESCOPE(T);
   ConstructorVisitor visitor(this, zone_);
   ProgramVisitor::VisitFunctions(&visitor);
-
-  FieldTypeMap::Iterator it(field_type_map_.GetIterator());
-  for (FieldTypePair* current = it.Next(); current != NULL;
-       current = it.Next()) {
-    const intptr_t cid = current->field_info.cid;
-    current->field->set_guarded_cid(cid);
-    current->field->set_is_nullable(cid == kNullCid || cid == kDynamicCid);
-    // TODO(vegorov) we can actually compute the length in the same way we
-    // compute cids.
-    current->field->set_guarded_list_length(Field::kNoFixedLength);
-    if (FLAG_trace_precompiler) {
-      THR_Print(
-          "Field %s <- Type %s\n", current->field->ToCString(),
-          Class::Handle(T->isolate()->class_table()->At(cid)).ToCString());
-    }
-  }
 }
 
 void Precompiler::AddRoots() {
@@ -989,8 +779,8 @@
           THR_Print("Precompiling initializer for %s\n", field.ToCString());
         }
         ASSERT(Dart::vm_snapshot_kind() != Snapshot::kFullAOT);
-        const Function& initializer = Function::Handle(
-            Z, CompileStaticInitializer(field, /* compute_type = */ true));
+        const Function& initializer =
+            Function::Handle(Z, CompileStaticInitializer(field));
         ASSERT(!initializer.IsNull());
         field.SetPrecompiledInitializer(initializer);
         AddCalleesOf(initializer);
@@ -999,8 +789,7 @@
   }
 }
 
-RawFunction* Precompiler::CompileStaticInitializer(const Field& field,
-                                                   bool compute_type) {
+RawFunction* Precompiler::CompileStaticInitializer(const Field& field) {
   ASSERT(field.is_static());
   Thread* thread = Thread::Current();
   StackZone stack_zone(thread);
@@ -1016,7 +805,7 @@
     parsed_function->AllocateVariables();
   }
 
-  DartPrecompilationPipeline pipeline(zone);
+  DartCompilationPipeline pipeline;
   PrecompileParsedFunctionHelper helper(/* precompiler = */ NULL,
                                         parsed_function,
                                         /* optimized = */ true);
@@ -1027,19 +816,6 @@
     UNREACHABLE();
   }
 
-  if (compute_type && field.is_final()) {
-    intptr_t result_cid = pipeline.result_type().ToCid();
-    if (result_cid != kDynamicCid) {
-#ifndef PRODUCT
-      if (FLAG_trace_precompiler && FLAG_support_il_printer) {
-        THR_Print("Setting guarded_cid of %s to %s\n", field.ToCString(),
-                  pipeline.result_type().ToCString());
-      }
-#endif  // !PRODUCT
-      field.set_guarded_cid(result_cid);
-    }
-  }
-
   if ((FLAG_disassemble || FLAG_disassemble_optimized) &&
       FlowGraphPrinter::ShouldPrint(parsed_function->function())) {
     Code& code = Code::Handle(parsed_function->function().CurrentCode());
@@ -1064,7 +840,7 @@
     // remembering it because it won't be used again.
     Function& initializer = Function::Handle();
     if (!field.HasPrecompiledInitializer()) {
-      initializer = CompileStaticInitializer(field, /* compute_type = */ false);
+      initializer = CompileStaticInitializer(field);
     } else {
       initializer ^= field.PrecompiledInitializer();
     }
@@ -1123,7 +899,7 @@
     parsed_function->AllocateVariables();
 
     // Non-optimized code generator.
-    DartPrecompilationPipeline pipeline(Thread::Current()->zone());
+    DartCompilationPipeline pipeline;
     PrecompileParsedFunctionHelper helper(/* precompiler = */ NULL,
                                           parsed_function,
                                           /* optimized = */ false);
@@ -1381,7 +1157,7 @@
           }
         } else if (function.kind() == RawFunction::kRegularFunction) {
           selector2 = Field::LookupGetterSymbol(selector);
-          if (IsSent(selector2)) {
+          if (IsSent(selector2) && kernel::IsTearOffTaken(function, Z)) {
             // Closurization.
             // Function is foo and somewhere get:foo is called.
             function2 = function.ImplicitClosureFunction();
@@ -2422,40 +2198,6 @@
 }
 
 
-void Precompiler::ResetPrecompilerState() {
-  changed_ = false;
-  function_count_ = 0;
-  class_count_ = 0;
-  selector_count_ = 0;
-  dropped_function_count_ = 0;
-  dropped_field_count_ = 0;
-  ASSERT(pending_functions_.Length() == 0);
-  sent_selectors_.Clear();
-  enqueued_functions_.Clear();
-
-  classes_to_retain_.Clear();
-  consts_to_retain_.Clear();
-  fields_to_retain_.Clear();
-  functions_to_retain_.Clear();
-  typeargs_to_retain_.Clear();
-  types_to_retain_.Clear();
-
-  Library& lib = Library::Handle(Z);
-  Class& cls = Class::Handle(Z);
-
-  for (intptr_t i = 0; i < libraries_.Length(); i++) {
-    lib ^= libraries_.At(i);
-    ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
-    while (it.HasNext()) {
-      cls = it.GetNextClass();
-      if (cls.IsDynamicClass()) {
-        continue;  // class 'dynamic' is in the read-only VM isolate.
-      }
-      cls.set_is_allocated(false);
-    }
-  }
-}
-
 void PrecompileParsedFunctionHelper::FinalizeCompilation(
     Assembler* assembler,
     FlowGraphCompiler* graph_compiler,
@@ -2773,14 +2515,13 @@
 RawError* Precompiler::CompileFunction(Precompiler* precompiler,
                                        Thread* thread,
                                        Zone* zone,
-                                       const Function& function,
-                                       FieldTypeMap* field_type_map) {
+                                       const Function& function) {
   VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, "CompileFunction", function);
 
   ASSERT(FLAG_precompiled_mode);
   const bool optimized = function.IsOptimizable();  // False for natives.
-  DartPrecompilationPipeline pipeline(zone, field_type_map);
+  DartCompilationPipeline pipeline;
   return PrecompileFunctionHelper(precompiler, &pipeline, function, optimized);
 }
 
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index cfa8b7e..c07ff41 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -229,113 +229,6 @@
 
 typedef DirectChainedHashMap<InstanceKeyValueTrait> InstanceSet;
 
-struct PrecompilerFieldInfo {
-  intptr_t cid;
-
-  // The most recently compiled constructor which stored the field.
-  // Used in DartPrecompilationPipeline::FinalizeCompilation to find out if
-  // this field was not initialized in the constructor being compiled.
-  const RawFunction* constructor;
-
-  bool operator==(const PrecompilerFieldInfo& other) const {
-    return (cid == other.cid) && (constructor == other.constructor);
-  }
-
-  bool operator!=(const PrecompilerFieldInfo& other) const {
-    return !(*this == other);
-  }
-};
-
-struct FieldTypePair {
-  // Typedefs needed for the DirectChainedHashMap template.
-  typedef const Field* Key;
-  typedef PrecompilerFieldInfo Value;
-  typedef FieldTypePair Pair;
-
-  static Key KeyOf(Pair kv) { return kv.field; }
-
-  static Value ValueOf(Pair kv) { return kv.field_info; }
-
-  static inline intptr_t Hashcode(Key key) { return key->token_pos().value(); }
-
-  static inline bool IsKeyEqual(Pair pair, Key key) {
-    return pair.field->raw() == key->raw();
-  }
-
-  FieldTypePair(const Field* f, intptr_t cid, const RawFunction* constructor)
-      : field(f), field_info({cid, constructor}) {}
-
-  FieldTypePair() : field(nullptr), field_info({-1, nullptr}) {}
-
-  const Field* field;
-  PrecompilerFieldInfo field_info;
-};
-
-typedef DirectChainedHashMap<FieldTypePair> FieldTypeMap;
-
-struct IntptrPair {
-  // Typedefs needed for the DirectChainedHashMap template.
-  typedef intptr_t Key;
-  typedef intptr_t Value;
-  typedef IntptrPair Pair;
-
-  static Key KeyOf(Pair kv) { return kv.key_; }
-
-  static Value ValueOf(Pair kv) { return kv.value_; }
-
-  static inline intptr_t Hashcode(Key key) { return key; }
-
-  static inline bool IsKeyEqual(Pair pair, Key key) { return pair.key_ == key; }
-
-  IntptrPair(intptr_t key, intptr_t value) : key_(key), value_(value) {}
-
-  IntptrPair() : key_(kIllegalCid), value_(kIllegalCid) {}
-
-  Key key_;
-  Value value_;
-};
-
-typedef DirectChainedHashMap<IntptrPair> CidMap;
-
-struct FunctionFeedbackKey {
-  FunctionFeedbackKey() : owner_cid_(kIllegalCid), token_(0), kind_(0) {}
-  FunctionFeedbackKey(intptr_t owner_cid, intptr_t token, intptr_t kind)
-      : owner_cid_(owner_cid), token_(token), kind_(kind) {}
-
-  intptr_t owner_cid_;
-  intptr_t token_;
-  intptr_t kind_;
-};
-
-struct FunctionFeedbackPair {
-  // Typedefs needed for the DirectChainedHashMap template.
-  typedef FunctionFeedbackKey Key;
-  typedef ParsedJSONObject* Value;
-  typedef FunctionFeedbackPair Pair;
-
-  static Key KeyOf(Pair kv) { return kv.key_; }
-
-  static Value ValueOf(Pair kv) { return kv.value_; }
-
-  static inline intptr_t Hashcode(Key key) {
-    return key.token_ ^ key.owner_cid_ ^ key.kind_;
-  }
-
-  static inline bool IsKeyEqual(Pair pair, Key key) {
-    return (pair.key_.owner_cid_ == key.owner_cid_) &&
-           (pair.key_.token_ == key.token_) && (pair.key_.kind_ == key.kind_);
-  }
-
-  FunctionFeedbackPair(Key key, Value value) : key_(key), value_(value) {}
-
-  FunctionFeedbackPair() : key_(), value_(NULL) {}
-
-  Key key_;
-  Value value_;
-};
-
-typedef DirectChainedHashMap<FunctionFeedbackPair> FunctionFeedbackMap;
-
 class Precompiler : public ValueObject {
  public:
   static RawError* CompileAll();
@@ -343,22 +236,18 @@
   static RawError* CompileFunction(Precompiler* precompiler,
                                    Thread* thread,
                                    Zone* zone,
-                                   const Function& function,
-                                   FieldTypeMap* field_type_map = NULL);
+                                   const Function& function);
 
   static RawObject* EvaluateStaticInitializer(const Field& field);
   static RawObject* ExecuteOnce(SequenceNode* fragment);
 
-  static RawFunction* CompileStaticInitializer(const Field& field,
-                                               bool compute_type);
+  static RawFunction* CompileStaticInitializer(const Field& field);
 
   // Returns true if get:runtimeType is not overloaded by any class.
   bool get_runtime_type_is_unique() const {
     return get_runtime_type_is_unique_;
   }
 
-  FieldTypeMap* field_type_map() { return &field_type_map_; }
-
  private:
   explicit Precompiler(Thread* thread);
 
@@ -401,7 +290,6 @@
 
   void BindStaticCalls();
   void SwitchICCalls();
-  void ResetPrecompilerState();
 
   void Obfuscate();
 
@@ -442,9 +330,6 @@
   TypeArgumentsSet typeargs_to_retain_;
   AbstractTypeSet types_to_retain_;
   InstanceSet consts_to_retain_;
-  FieldTypeMap field_type_map_;
-  CidMap feedback_cid_map_;
-  FunctionFeedbackMap function_feedback_map_;
   Error& error_;
 
   bool get_runtime_type_is_unique_;
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index 6c918ea..1f56574 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -1615,9 +1615,34 @@
   and_(TMP, LR, Operand(TMP, LSR, RawObject::kBarrierOverlapShift));
   ldr(LR, Address(THR, Thread::write_barrier_mask_offset()));
   tst(TMP, Operand(LR));
-  mov(TMP, Operand(value), NE);
-  ldr(LR, Address(THR, Thread::write_barrier_wrappers_offset(object)), NE);
-  blx(LR, NE);
+  if (value != kWriteBarrierValueReg) {
+    // Unlikely. Only non-graph intrinsics.
+    // TODO(rmacnak): Shuffle registers in intrinsics.
+    Label restore_and_done;
+    b(&restore_and_done, ZERO);
+    Register objectForCall = object;
+    if (object != kWriteBarrierValueReg) {
+      Push(kWriteBarrierValueReg);
+    } else {
+      COMPILE_ASSERT(R2 != kWriteBarrierValueReg);
+      COMPILE_ASSERT(R3 != kWriteBarrierValueReg);
+      objectForCall = (value == R2) ? R3 : R2;
+      PushList((1 << kWriteBarrierValueReg) | (1 << objectForCall));
+      mov(objectForCall, Operand(object));
+    }
+    mov(kWriteBarrierValueReg, Operand(value));
+    ldr(LR, Address(THR, Thread::write_barrier_wrappers_offset(objectForCall)));
+    blx(LR);
+    if (object != kWriteBarrierValueReg) {
+      Pop(kWriteBarrierValueReg);
+    } else {
+      PopList((1 << kWriteBarrierValueReg) | (1 << objectForCall));
+    }
+    Bind(&restore_and_done);
+  } else {
+    ldr(LR, Address(THR, Thread::write_barrier_wrappers_offset(object)), NE);
+    blx(LR, NE);
+  }
   if (!lr_reserved) Pop(LR);
   Bind(&done);
 #else
@@ -1632,12 +1657,12 @@
     StoreIntoObjectFilter(object, value, &done, can_be_smi, kJumpToNoUpdate);
     RegList regs = 0;
     regs |= (1 << LR);
-    if (value != R0) {
-      regs |= (1 << R0);  // Preserve R0.
+    if (value != kWriteBarrierObjectReg) {
+      regs |= (1 << kWriteBarrierObjectReg);
     }
     PushList(regs);
-    if (object != R0) {
-      mov(R0, Operand(object));
+    if (object != kWriteBarrierObjectReg) {
+      mov(kWriteBarrierObjectReg, Operand(object));
     }
     ldr(LR, Address(THR, Thread::write_barrier_entry_point_offset()));
     blx(LR);
@@ -2523,7 +2548,6 @@
 
 void Assembler::BranchLinkToRuntime() {
   ldr(IP, Address(THR, Thread::call_to_runtime_entry_point_offset()));
-  ldr(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
   blx(IP);
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 0f44233..cdd45c8 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -661,7 +661,6 @@
 
 void Assembler::BranchLinkToRuntime() {
   ldr(LR, Address(THR, Thread::call_to_runtime_entry_point_offset()));
-  ldr(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
   blr(LR);
 }
 
@@ -1004,12 +1003,33 @@
   ldr(TMP2, FieldAddress(value, Object::tags_offset()), kUnsignedByte);
   and_(TMP, TMP2, Operand(TMP, LSR, RawObject::kBarrierOverlapShift));
   tst(TMP, Operand(BARRIER_MASK));
-  b(&done, EQ);
+  b(&done, ZERO);
 
   if (!lr_reserved) Push(LR);
-  mov(TMP2, value);
-  ldr(LR, Address(THR, Thread::write_barrier_wrappers_offset(object)));
+  Register objectForCall = object;
+  if (value != kWriteBarrierValueReg) {
+    // Unlikely. Only non-graph intrinsics.
+    // TODO(rmacnak): Shuffle registers in intrinsics.
+    if (object != kWriteBarrierValueReg) {
+      Push(kWriteBarrierValueReg);
+    } else {
+      COMPILE_ASSERT(R2 != kWriteBarrierValueReg);
+      COMPILE_ASSERT(R3 != kWriteBarrierValueReg);
+      objectForCall = (value == R2) ? R3 : R2;
+      PushPair(kWriteBarrierValueReg, objectForCall);
+      mov(objectForCall, object);
+    }
+    mov(kWriteBarrierValueReg, value);
+  }
+  ldr(LR, Address(THR, Thread::write_barrier_wrappers_offset(objectForCall)));
   blr(LR);
+  if (value != kWriteBarrierValueReg) {
+    if (object != kWriteBarrierValueReg) {
+      Pop(kWriteBarrierValueReg);
+    } else {
+      PopPair(kWriteBarrierValueReg, objectForCall);
+    }
+  }
   if (!lr_reserved) Pop(LR);
   Bind(&done);
 #else
@@ -1168,6 +1188,11 @@
 
 void Assembler::SetupDartSP() {
   mov(SP, CSP);
+#if defined(TARGET_OS_FUCHSIA)
+  // Make any future signal handlers fail fast. Verifies our assumption in
+  // EnterFrame.
+  LoadImmediate(CSP, 0);
+#endif
 }
 
 void Assembler::RestoreCSP() {
@@ -1187,9 +1212,12 @@
   // TODO(26472): It would be safer to use CSP as the Dart stack pointer, but
   // this requires adjustments to stack handling to maintain the 16-byte
   // alignment.
+  // Note Fuchsia does not have signal handlers; see also SetupDartSP.
+#if !defined(TARGET_OS_FUCHSIA)
   const intptr_t kMaxDartFrameSize = 4096;
   sub(TMP, SP, Operand(kMaxDartFrameSize));
   andi(CSP, TMP, Immediate(~15));
+#endif
 
   PushPair(FP, LR);  // low: FP, high: LR.
   mov(FP, SP);
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index 082f20f..1f528e18 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -2097,7 +2097,6 @@
 }
 
 void Assembler::CallToRuntime() {
-  movl(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
   call(Address(THR, Thread::call_to_runtime_entry_point_offset()));
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index 24384ca..a719c6b 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -101,9 +101,7 @@
 }
 
 void Assembler::CallToRuntime() {
-  movq(TMP, Address(THR, Thread::call_to_runtime_entry_point_offset()));
-  movq(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
-  call(TMP);
+  call(Address(THR, Thread::call_to_runtime_entry_point_offset()));
 }
 
 void Assembler::CallNullErrorShared(bool save_fpu_registers) {
@@ -1298,8 +1296,28 @@
   andl(TMP, Address(THR, Thread::write_barrier_mask_offset()));
   testb(FieldAddress(value, Object::tags_offset()), TMP);
   j(ZERO, &done, kNearJump);
-  movq(TMP, value);
-  call(Address(THR, Thread::write_barrier_wrappers_offset(object)));
+
+  Register objectForCall = object;
+  if (value != kWriteBarrierValueReg) {
+    // Unlikely. Only non-graph intrinsics.
+    // TODO(rmacnak): Shuffle registers in intrinsics.
+    pushq(kWriteBarrierValueReg);
+    if (object == kWriteBarrierValueReg) {
+      COMPILE_ASSERT(RBX != kWriteBarrierValueReg);
+      COMPILE_ASSERT(RCX != kWriteBarrierValueReg);
+      objectForCall = (value == RBX) ? RCX : RBX;
+      pushq(objectForCall);
+      movq(objectForCall, object);
+    }
+    movq(kWriteBarrierValueReg, value);
+  }
+  call(Address(THR, Thread::write_barrier_wrappers_offset(objectForCall)));
+  if (value != kWriteBarrierValueReg) {
+    if (object == kWriteBarrierValueReg) {
+      popq(objectForCall);
+    }
+    popq(kWriteBarrierValueReg);
+  }
   Bind(&done);
 #else
   movq(dest, value);
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc
index a1da9ee..a51753b 100644
--- a/runtime/vm/compiler/assembler/disassembler_kbc.cc
+++ b/runtime/vm/compiler/assembler/disassembler_kbc.cc
@@ -128,18 +128,21 @@
   Apply(&buf, &size, pc, op2, bc, "");
 }
 
-static void FormatA_X(char* buf,
-                      intptr_t size,
-                      uword pc,
-                      uint32_t op,
-                      Fmt op1,
-                      Fmt op2,
-                      Fmt op3) {
-  const int32_t a = (op & 0xFF00) >> 8;
-  const int32_t bc = static_cast<int32_t>(op) >> 16;
-  Apply(&buf, &size, pc, op1, a, ", ");
-  Apply(&buf, &size, pc, op2, bc, "");
-}
+// TODO(alexmarkov) This format is currently unused. Restore it if needed, or
+// remove it once bytecode instruction set is finalized.
+//
+// static void FormatA_X(char* buf,
+//                      intptr_t size,
+//                      uword pc,
+//                      uint32_t op,
+//                      Fmt op1,
+//                      Fmt op2,
+//                      Fmt op3) {
+//  const int32_t a = (op & 0xFF00) >> 8;
+//  const int32_t bc = static_cast<int32_t>(op) >> 16;
+//  Apply(&buf, &size, pc, op1, a, ", ");
+//  Apply(&buf, &size, pc, op2, bc, "");
+// }
 
 static void FormatX(char* buf,
                     intptr_t size,
@@ -178,20 +181,23 @@
   Apply(&buf, &size, pc, op3, c, "");
 }
 
-static void FormatA_B_Y(char* buf,
-                        intptr_t size,
-                        uword pc,
-                        uint32_t op,
-                        Fmt op1,
-                        Fmt op2,
-                        Fmt op3) {
-  const int32_t a = (op >> 8) & 0xFF;
-  const int32_t b = (op >> 16) & 0xFF;
-  const int32_t y = static_cast<int8_t>((op >> 24) & 0xFF);
-  Apply(&buf, &size, pc, op1, a, ", ");
-  Apply(&buf, &size, pc, op2, b, ", ");
-  Apply(&buf, &size, pc, op3, y, "");
-}
+// TODO(alexmarkov) This format is currently unused. Restore it if needed, or
+// remove it once bytecode instruction set is finalized.
+//
+// static void FormatA_B_Y(char* buf,
+//                        intptr_t size,
+//                        uword pc,
+//                        uint32_t op,
+//                        Fmt op1,
+//                        Fmt op2,
+//                        Fmt op3) {
+//  const int32_t a = (op >> 8) & 0xFF;
+//  const int32_t b = (op >> 16) & 0xFF;
+//  const int32_t y = static_cast<int8_t>((op >> 24) & 0xFF);
+//  Apply(&buf, &size, pc, op1, a, ", ");
+//  Apply(&buf, &size, pc, op2, b, ", ");
+//  Apply(&buf, &size, pc, op3, y, "");
+// }
 
 #define BYTECODE_FORMATTER(name, encoding, op1, op2, op3)                      \
   static void Format##name(char* buf, intptr_t size, uword pc, uint32_t op) {  \
@@ -210,11 +216,8 @@
   switch (KernelBytecode::DecodeOpcode(instr)) {
     case KernelBytecode::kLoadConstant:
     case KernelBytecode::kPushConstant:
-    case KernelBytecode::kStaticCall:
     case KernelBytecode::kIndirectStaticCall:
     case KernelBytecode::kInstanceCall:
-    case KernelBytecode::kInstanceCall1Opt:
-    case KernelBytecode::kInstanceCall2Opt:
     case KernelBytecode::kStoreStaticTOS:
     case KernelBytecode::kPushStatic:
     case KernelBytecode::kAllocate:
diff --git a/runtime/vm/compiler/assembler/disassembler_x86.cc b/runtime/vm/compiler/assembler/disassembler_x86.cc
index 6e7089e..b6c2324 100644
--- a/runtime/vm/compiler/assembler/disassembler_x86.cc
+++ b/runtime/vm/compiler/assembler/disassembler_x86.cc
@@ -443,7 +443,7 @@
         int scale, index, base;
         get_sib(sib, &scale, &index, &base);
         int disp = (mod == 2) ? *reinterpret_cast<int32_t*>(modrmp + 2)
-                              : *reinterpret_cast<char*>(modrmp + 2);
+                              : *reinterpret_cast<int8_t*>(modrmp + 2);
         if (index == 4 && (base & 7) == 4 && scale == 0 /*times_1*/) {
           Print("[%s", NameOfCPURegister(base));
           PrintDisp(disp, "]");
@@ -456,7 +456,7 @@
       } else {
         // No sib.
         int disp = (mod == 2) ? *reinterpret_cast<int32_t*>(modrmp + 1)
-                              : *reinterpret_cast<char*>(modrmp + 1);
+                              : *reinterpret_cast<int8_t*>(modrmp + 1);
         Print("[%s", NameOfCPURegister(rm));
         PrintDisp(disp, "]");
         return (mod == 2) ? 5 : 2;
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 6c3cb3a..031d45d 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -168,10 +168,9 @@
   }
 
   ASSERT(deopt_env() != NULL);
-
-  __ Push(CODE_REG);
+  __ ldr(LR, Address(THR, Thread::deoptimize_entry_offset()));
+  __ blx(LR);
   ASSERT(kReservedCpuRegisters & (1 << LR));
-  __ BranchLink(*StubCode::Deoptimize_entry());
   set_pc_offset(assembler->CodeSize());
 #undef __
 }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 998842a..dae6ac5 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -165,8 +165,8 @@
   }
 
   ASSERT(deopt_env() != NULL);
-  __ Push(CODE_REG);
-  __ BranchLink(*StubCode::Deoptimize_entry());
+  __ ldr(LR, Address(THR, Thread::deoptimize_entry_offset()));
+  __ blr(LR);
   set_pc_offset(assembler->CodeSize());
 #undef __
 }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index ae17719..0e7bd3f 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -165,9 +165,7 @@
   }
 
   ASSERT(deopt_env() != NULL);
-
-  __ pushq(CODE_REG);
-  __ Call(*StubCode::Deoptimize_entry());
+  __ call(Address(THR, Thread::deoptimize_entry_offset()));
   set_pc_offset(assembler->CodeSize());
   __ int3();
 #undef __
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 0dd586c..9a8878c 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -2167,9 +2167,9 @@
 
     case Token::kBIT_NOT:
       if (value.IsSmi()) {
-        result = Integer::New(~Smi::Cast(value).Value());
+        result = Integer::New(~Smi::Cast(value).Value(), Heap::kOld);
       } else if (value.IsMint()) {
-        result = Integer::New(~Mint::Cast(value).value());
+        result = Integer::New(~Mint::Cast(value).value(), Heap::kOld);
       }
       break;
 
@@ -3994,7 +3994,7 @@
   if ((compiler->is_optimizing() || compiler->function().HasBytecode()) &&
       HasICData()) {
     ASSERT(HasICData());
-    if (ic_data()->NumberOfUsedChecks() > 0) {
+    if (compiler->is_optimizing() && (ic_data()->NumberOfUsedChecks() > 0)) {
       const ICData& unary_ic_data =
           ICData::ZoneHandle(zone, ic_data()->AsUnaryClassChecks());
       compiler->GenerateInstanceCall(deopt_id(), token_pos(), locs(),
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index ca93a55..b30532f 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -6165,7 +6165,7 @@
  public:
   UnaryUint32OpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id)
       : UnaryIntegerOpInstr(op_kind, value, deopt_id) {
-    ASSERT(op_kind == Token::kBIT_NOT);
+    ASSERT(IsSupported(op_kind));
   }
 
   virtual bool ComputeCanDeoptimize() const { return false; }
@@ -6179,6 +6179,10 @@
     return kUnboxedUint32;
   }
 
+  static bool IsSupported(Token::Kind op_kind) {
+    return op_kind == Token::kBIT_NOT;
+  }
+
   DECLARE_INSTRUCTION(UnaryUint32Op)
 
  private:
@@ -6420,9 +6424,9 @@
     SetInputAt(1, right);
   }
 
-  static bool IsSupported(Token::Kind op, Value* left, Value* right) {
+  static bool IsSupported(Token::Kind op_kind, Value* left, Value* right) {
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
-    switch (op) {
+    switch (op_kind) {
       case Token::kADD:
       case Token::kSUB:
       case Token::kMUL:
@@ -6473,6 +6477,7 @@
                       intptr_t deopt_id)
       : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
     mark_truncating();
+    ASSERT(IsSupported(op_kind));
   }
 
   virtual bool ComputeCanDeoptimize() const { return false; }
@@ -6486,6 +6491,20 @@
 
   virtual CompileType ComputeType() const;
 
+  static bool IsSupported(Token::Kind op_kind) {
+    switch (op_kind) {
+      case Token::kADD:
+      case Token::kSUB:
+      case Token::kMUL:
+      case Token::kBIT_AND:
+      case Token::kBIT_OR:
+      case Token::kBIT_XOR:
+        return true;
+      default:
+        return false;
+    }
+  }
+
   DECLARE_INSTRUCTION(BinaryUint32Op)
 
  private:
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index f84d17a..eaff0db 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -1523,9 +1523,15 @@
 
   switch (class_id()) {
     case kArrayCid:
+#if defined(CONCURRENT_MARKING)
+      locs->set_in(2, ShouldEmitStoreBarrier()
+                          ? Location::RegisterLocation(kWriteBarrierValueReg)
+                          : Location::RegisterOrConstant(value()));
+#else
       locs->set_in(2, ShouldEmitStoreBarrier()
                           ? Location::WritableRegister()
                           : Location::RegisterOrConstant(value()));
+#endif
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -2212,7 +2218,7 @@
   } else {
 #if defined(CONCURRENT_MARKING)
     summary->set_in(1, ShouldEmitStoreBarrier()
-                           ? Location::RequiresRegister()
+                           ? Location::RegisterLocation(kWriteBarrierValueReg)
                            : Location::RegisterOrConstant(value()));
 #else
     summary->set_in(1, ShouldEmitStoreBarrier()
@@ -2426,7 +2432,7 @@
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 #if defined(CONCURRENT_MARKING)
-  locs->set_in(0, Location::RequiresRegister());
+  locs->set_in(0, Location::RegisterLocation(kWriteBarrierValueReg));
 #else
   locs->set_in(0, value()->NeedsWriteBarrier() ? Location::WritableRegister()
                                                : Location::RequiresRegister());
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 41fcd15..456bf79 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -1366,9 +1366,15 @@
   }
   switch (class_id()) {
     case kArrayCid:
+#if defined(CONCURRENT_MARKING)
+      locs->set_in(2, ShouldEmitStoreBarrier()
+                          ? Location::RegisterLocation(kWriteBarrierValueReg)
+                          : Location::RegisterOrConstant(value()));
+#else
       locs->set_in(2, ShouldEmitStoreBarrier()
                           ? Location::WritableRegister()
                           : Location::RegisterOrConstant(value()));
+#endif
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1932,7 +1938,7 @@
   } else {
 #if defined(CONCURRENT_MARKING)
     summary->set_in(1, ShouldEmitStoreBarrier()
-                           ? Location::RequiresRegister()
+                           ? Location::RegisterLocation(kWriteBarrierValueReg)
                            : Location::RegisterOrConstant(value()));
 #else
     summary->set_in(1, ShouldEmitStoreBarrier()
@@ -2129,7 +2135,7 @@
   LocationSummary* locs =
       new (zone) LocationSummary(zone, 1, 1, LocationSummary::kNoCall);
 #if defined(CONCURRENT_MARKING)
-  locs->set_in(0, Location::RequiresRegister());
+  locs->set_in(0, Location::RegisterLocation(kWriteBarrierValueReg));
 #else
   locs->set_in(0, value()->NeedsWriteBarrier() ? Location::WritableRegister()
                                                : Location::RequiresRegister());
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index f0cfb7b..687ecd0 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1405,9 +1405,15 @@
   }
   switch (class_id()) {
     case kArrayCid:
+#if defined(CONCURRENT_MARKING)
+      locs->set_in(2, ShouldEmitStoreBarrier()
+                          ? Location::RegisterLocation(kWriteBarrierValueReg)
+                          : Location::RegisterOrConstant(value()));
+#else
       locs->set_in(2, ShouldEmitStoreBarrier()
                           ? Location::WritableRegister()
                           : Location::RegisterOrConstant(value()));
+#endif
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1921,7 +1927,7 @@
   } else {
 #if defined(CONCURRENT_MARKING)
     summary->set_in(1, ShouldEmitStoreBarrier()
-                           ? Location::RequiresRegister()
+                           ? Location::RegisterLocation(kWriteBarrierValueReg)
                            : Location::RegisterOrConstant(value()));
 #else
     summary->set_in(1, ShouldEmitStoreBarrier()
@@ -2130,7 +2136,7 @@
   LocationSummary* locs =
       new (zone) LocationSummary(zone, 1, 1, LocationSummary::kNoCall);
 #if defined(CONCURRENT_MARKING)
-  locs->set_in(0, Location::RequiresRegister());
+  locs->set_in(0, Location::RegisterLocation(kWriteBarrierValueReg));
 #else
   locs->set_in(0, value()->NeedsWriteBarrier() ? Location::WritableRegister()
                                                : Location::RequiresRegister());
@@ -6011,6 +6017,7 @@
 }
 
 DEFINE_BACKEND(UnaryUint32Op, (SameAsFirstInput, Register value)) {
+  ASSERT(instr->op_kind() == Token::kBIT_NOT);
   __ notl(value);
 }
 
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 2d35fbd..804441e 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -958,43 +958,29 @@
         InlineExitCollector* exit_collector =
             new (Z) InlineExitCollector(caller_graph_, call);
         FlowGraph* callee_graph;
-        if (UseKernelFrontEndFor(parsed_function)) {
-          Code::EntryKind entry_kind = Code::EntryKind::kNormal;
-          if (StaticCallInstr* instr = call_data->call->AsStaticCall()) {
-            entry_kind = instr->entry_kind();
-          } else if (InstanceCallInstr* instr =
-                         call_data->call->AsInstanceCall()) {
-            entry_kind = instr->entry_kind();
-          } else if (PolymorphicInstanceCallInstr* instr =
-                         call_data->call->AsPolymorphicInstanceCall()) {
-            entry_kind = instr->instance_call()->entry_kind();
-          } else if (ClosureCallInstr* instr =
-                         call_data->call->AsClosureCall()) {
-            entry_kind = instr->entry_kind();
-          }
-          kernel::FlowGraphBuilder builder(
-              parsed_function, ic_data_array, /* not building var desc */ NULL,
-              exit_collector,
-              /* optimized = */ true, Compiler::kNoOSRDeoptId,
-              caller_graph_->max_block_id() + 1,
-              entry_kind == Code::EntryKind::kUnchecked);
-          {
-            CSTAT_TIMER_SCOPE(thread(), graphinliner_build_timer);
-            callee_graph = builder.BuildGraph();
+        Code::EntryKind entry_kind = Code::EntryKind::kNormal;
+        if (StaticCallInstr* instr = call_data->call->AsStaticCall()) {
+          entry_kind = instr->entry_kind();
+        } else if (InstanceCallInstr* instr =
+                       call_data->call->AsInstanceCall()) {
+          entry_kind = instr->entry_kind();
+        } else if (PolymorphicInstanceCallInstr* instr =
+                       call_data->call->AsPolymorphicInstanceCall()) {
+          entry_kind = instr->instance_call()->entry_kind();
+        } else if (ClosureCallInstr* instr = call_data->call->AsClosureCall()) {
+          entry_kind = instr->entry_kind();
+        }
+        kernel::FlowGraphBuilder builder(
+            parsed_function, ic_data_array, /* not building var desc */ NULL,
+            exit_collector,
+            /* optimized = */ true, Compiler::kNoOSRDeoptId,
+            caller_graph_->max_block_id() + 1,
+            entry_kind == Code::EntryKind::kUnchecked);
+        {
+          CSTAT_TIMER_SCOPE(thread(), graphinliner_build_timer);
+          callee_graph = builder.BuildGraph();
 
-            CalleeGraphValidator::Validate(callee_graph);
-          }
-        } else {
-          FlowGraphBuilder builder(*parsed_function, *ic_data_array,
-                                   /* not building var desc */ NULL,
-                                   exit_collector, Compiler::kNoOSRDeoptId);
-          builder.SetInitialBlockId(caller_graph_->max_block_id());
-          {
-            CSTAT_TIMER_SCOPE(thread(), graphinliner_build_timer);
-            callee_graph = builder.BuildGraph();
-
-            CalleeGraphValidator::Validate(callee_graph);
-          }
+          CalleeGraphValidator::Validate(callee_graph);
         }
 #if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) &&                  \
     !defined(TARGET_ARCH_IA32)
@@ -1368,10 +1354,6 @@
     *in_cache = false;
     ParsedFunction* parsed_function =
         new (Z) ParsedFunction(thread(), function);
-    if (!UseKernelFrontEndFor(parsed_function)) {
-      Parser::ParseFunction(parsed_function);
-      parsed_function->AllocateVariables();
-    }
     return parsed_function;
   }
 
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index 2319532..71fd853 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -1552,9 +1552,12 @@
   // TODO(johnmccutchan): Consider Smi operations, to avoid unnecessary tagging
   // & untagged of intermediate results.
   // TODO(johnmccutchan): Consider phis.
-  return def->IsBoxInt64() || def->IsUnboxInt64() || def->IsBinaryInt64Op() ||
-         def->IsShiftInt64Op() || def->IsSpeculativeShiftInt64Op() ||
-         def->IsUnaryInt64Op();
+  return def->IsBoxInt64() || def->IsUnboxInt64() || def->IsShiftInt64Op() ||
+         def->IsSpeculativeShiftInt64Op() ||
+         (def->IsBinaryInt64Op() && BinaryUint32OpInstr::IsSupported(
+                                        def->AsBinaryInt64Op()->op_kind())) ||
+         (def->IsUnaryInt64Op() &&
+          UnaryUint32OpInstr::IsSupported(def->AsUnaryInt64Op()->op_kind()));
 }
 
 void IntegerInstructionSelector::FindPotentialUint32Definitions() {
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 6f63f4d..dca0c12 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -1251,24 +1251,26 @@
   const Field& field = this->StaticField();
   const Isolate* isolate = Isolate::Current();
   if (isolate->can_use_strong_mode_types() || isolate->type_checks()) {
-    cid = kIllegalCid;
+    cid = kIllegalCid;  // Abstract type is known, calculate cid lazily.
     abstract_type = &AbstractType::ZoneHandle(field.type());
     TraceStrongModeType(this, *abstract_type);
   }
   ASSERT(field.is_static());
-  if (field.is_final()) {
-    if (!FLAG_fields_may_be_reset) {
-      const Instance& obj = Instance::Handle(field.StaticValue());
-      if ((obj.raw() != Object::sentinel().raw()) &&
-          (obj.raw() != Object::transition_sentinel().raw()) && !obj.IsNull()) {
-        is_nullable = CompileType::kNonNullable;
-        cid = obj.GetClassId();
-      }
-    } else if (field.guarded_cid() != kIllegalCid) {
-      cid = field.guarded_cid();
-      if (!IsNullableCid(cid)) is_nullable = CompileType::kNonNullable;
+  if (field.is_final() && !FLAG_fields_may_be_reset) {
+    const Instance& obj = Instance::Handle(field.StaticValue());
+    if ((obj.raw() != Object::sentinel().raw()) &&
+        (obj.raw() != Object::transition_sentinel().raw()) && !obj.IsNull()) {
+      is_nullable = CompileType::kNonNullable;
+      cid = obj.GetClassId();
+      abstract_type = nullptr;  // Cid is known, calculate abstract type lazily.
     }
   }
+  if ((field.guarded_cid() != kIllegalCid) &&
+      (field.guarded_cid() != kDynamicCid)) {
+    cid = field.guarded_cid();
+    is_nullable = field.is_nullable();
+    abstract_type = nullptr;  // Cid is known, calculate abstract type lazily.
+  }
   return CompileType(is_nullable, cid, abstract_type);
 }
 
@@ -1304,27 +1306,28 @@
   }
 
   const Isolate* isolate = Isolate::Current();
-  CompileType compile_type_annotation = CompileType::None();
+  bool is_nullable = CompileType::kNullable;
+  intptr_t cid = kDynamicCid;
+  const AbstractType* abstract_type = NULL;
   if (isolate->can_use_strong_mode_types() ||
       (isolate->type_checks() &&
        (type().IsFunctionType() || type().HasResolvedTypeClass()))) {
-    const AbstractType* abstract_type = &type();
+    cid = kIllegalCid;  // Abstract type is known, calculate cid lazily.
+    abstract_type = &type();
     TraceStrongModeType(this, *abstract_type);
-    compile_type_annotation = CompileType::FromAbstractType(*abstract_type);
   }
-
-  CompileType compile_type_cid = CompileType::None();
-  if ((field_ != NULL) && (field_->guarded_cid() != kIllegalCid)) {
-    bool is_nullable = field_->is_nullable();
-    intptr_t field_cid = field_->guarded_cid();
-
-    compile_type_cid = CompileType(is_nullable, field_cid, NULL);
+  if ((field_ != NULL) && (field_->guarded_cid() != kIllegalCid) &&
+      (field_->guarded_cid() != kDynamicCid)) {
+    cid = field_->guarded_cid();
+    is_nullable = field_->is_nullable();
+    abstract_type = nullptr;  // Cid is known, calculate abstract type lazily.
   } else {
-    compile_type_cid = CompileType::FromCid(result_cid_);
+    cid = result_cid_;
+    if ((cid != kIllegalCid) && (cid != kDynamicCid)) {
+      abstract_type = nullptr;  // Cid is known, calculate abstract type lazily.
+    }
   }
-
-  return *CompileType::ComputeRefinedType(&compile_type_cid,
-                                          &compile_type_annotation);
+  return CompileType(is_nullable, cid, abstract_type);
 }
 
 CompileType LoadCodeUnitsInstr::ComputeType() const {
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
index 2499872..7caef9d 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
@@ -163,6 +163,9 @@
     if (stacktrace_var_ != nullptr) {
       ++num_locals;
     }
+    if (scratch_var_ != nullptr) {
+      ++num_locals;
+    }
     if (parsed_function()->has_arg_desc_var()) {
       ++num_locals;
     }
@@ -191,6 +194,10 @@
       stacktrace_var_->set_index(VariableIndex(-idx));
       ++idx;
     }
+    if (scratch_var_ != nullptr) {
+      scratch_var_->set_index(VariableIndex(-idx));
+      ++idx;
+    }
     if (parsed_function()->has_arg_desc_var()) {
       parsed_function()->arg_desc_var()->set_index(VariableIndex(-idx));
       ++idx;
@@ -330,12 +337,12 @@
 
 void BytecodeFlowGraphBuilder::BuildInstruction(KernelBytecode::Opcode opcode) {
   switch (opcode) {
-#define BUILD_BYTECODE_CASE(bytecode)                                          \
-  case KernelBytecode::k##bytecode:                                            \
-    Build##bytecode();                                                         \
+#define BUILD_BYTECODE_CASE(name, encoding, op1, op2, op3)                     \
+  case KernelBytecode::k##name:                                                \
+    Build##name();                                                             \
     break;
 
-    FOR_EACH_BYTECODE_IN_FLOW_GRAPH_BUILDER(BUILD_BYTECODE_CASE)
+    KERNEL_BYTECODES_LIST(BUILD_BYTECODE_CASE)
 
 #undef BUILD_BYTECODE_CASE
     default:
@@ -406,9 +413,7 @@
 
   const KBCInstr frame_instr =
       InstructionAt(pc_ + 1 + num_load_const, KernelBytecode::kFrame);
-  const intptr_t num_temps = (num_opt_named_params > 0) ? 1 : 0;
-  const intptr_t num_extra_locals =
-      KernelBytecode::DecodeD(frame_instr) + num_temps;
+  const intptr_t num_extra_locals = KernelBytecode::DecodeD(frame_instr);
   const intptr_t num_params =
       num_fixed_params + num_opt_pos_params + num_opt_named_params;
   const intptr_t total_locals = num_params + num_extra_locals;
@@ -444,7 +449,9 @@
   if (num_opt_named_params > 0) {
     default_values->EnsureLength(num_opt_named_params, nullptr);
     raw_parameters->EnsureLength(num_params, nullptr);
-    temp_var = LocalVariableAt(total_locals - 1);
+
+    ASSERT(scratch_var_ != nullptr);
+    temp_var = scratch_var_;
 
     for (intptr_t i = 0; i < num_opt_named_params; ++i, ++param) {
       const KBCInstr load_name_instr =
@@ -957,10 +964,9 @@
   LoadStackSlots(5);
 
   const String& dst_name = String::Cast(PopConstant().value());
-  const AbstractType& dst_type = AbstractType::Cast(PopConstant().value());
-
   Value* function_type_args = Pop();
   Value* instantiator_type_args = Pop();
+  const AbstractType& dst_type = AbstractType::Cast(PopConstant().value());
   Value* value = Pop();
 
   AssertAssignableInstr* instr = new (Z) AssertAssignableInstr(
@@ -1031,12 +1037,9 @@
   code_ = Fragment(code_.entry, is_zero);
 }
 
-void BytecodeFlowGraphBuilder::BuildIfStrictCompare(Token::Kind cmp_kind) {
+void BytecodeFlowGraphBuilder::BuildJumpIfStrictCompare(Token::Kind cmp_kind) {
   ASSERT((cmp_kind == Token::kEQ) || (cmp_kind == Token::kNE));
 
-  // TODO(alexmarkov): revise If* bytecodes to include Jump
-  // (and maybe comparison to true/false)
-
   if (is_generating_interpreter()) {
     UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
   }
@@ -1052,11 +1055,6 @@
   TargetEntryInstr* else_entry =
       (cmp_kind == Token::kEQ) ? ne_branch : eq_branch;
 
-  // The next bytecode instruction should be a Jump.
-  ++pc_;
-  bytecode_instr_ = InstructionAt(pc_, KernelBytecode::kJump);
-  ASSERT(jump_targets_.Lookup(pc_) == nullptr);
-
   const intptr_t target_pc = pc_ + DecodeOperandT().value();
   JoinEntryInstr* join = jump_targets_.Lookup(target_pc);
   ASSERT(join != nullptr);
@@ -1068,18 +1066,32 @@
   code_ = Fragment(else_entry);
 }
 
-void BytecodeFlowGraphBuilder::BuildIfEqStrictTOS() {
-  BuildIfStrictCompare(Token::kEQ);
+void BytecodeFlowGraphBuilder::BuildJumpIfEqStrict() {
+  BuildJumpIfStrictCompare(Token::kEQ);
 }
 
-void BytecodeFlowGraphBuilder::BuildIfNeStrictTOS() {
-  BuildIfStrictCompare(Token::kNE);
+void BytecodeFlowGraphBuilder::BuildJumpIfNeStrict() {
+  BuildJumpIfStrictCompare(Token::kNE);
 }
 
-void BytecodeFlowGraphBuilder::BuildIfEqNull() {
-  LoadLocal(DecodeOperandA());
+void BytecodeFlowGraphBuilder::BuildJumpIfTrue() {
+  code_ += B->Constant(Bool::True());
+  BuildJumpIfStrictCompare(Token::kEQ);
+}
+
+void BytecodeFlowGraphBuilder::BuildJumpIfFalse() {
+  code_ += B->Constant(Bool::False());
+  BuildJumpIfStrictCompare(Token::kEQ);
+}
+
+void BytecodeFlowGraphBuilder::BuildJumpIfNull() {
   code_ += B->NullConstant();
-  BuildIfEqStrictTOS();
+  BuildJumpIfStrictCompare(Token::kEQ);
+}
+
+void BytecodeFlowGraphBuilder::BuildJumpIfNotNull() {
+  code_ += B->NullConstant();
+  BuildJumpIfStrictCompare(Token::kNE);
 }
 
 void BytecodeFlowGraphBuilder::BuildDrop1() {
@@ -1163,6 +1175,113 @@
   ASSERT(B->stack_ == nullptr);
 }
 
+void BytecodeFlowGraphBuilder::BuildEqualsNull() {
+  ASSERT(scratch_var_ != nullptr);
+  LoadStackSlots(1);
+
+  TargetEntryInstr* true_branch = nullptr;
+  TargetEntryInstr* false_branch = nullptr;
+  code_ += B->BranchIfNull(&true_branch, &false_branch);
+
+  JoinEntryInstr* join = B->BuildJoinEntry();
+
+  code_ = Fragment(true_branch);
+  code_ += B->Constant(Bool::True());
+  code_ += B->StoreLocalRaw(position_, scratch_var_);
+  code_ += B->Drop();
+  code_ += B->Goto(join);
+
+  code_ = Fragment(false_branch);
+  code_ += B->Constant(Bool::False());
+  code_ += B->StoreLocalRaw(position_, scratch_var_);
+  code_ += B->Drop();
+  code_ += B->Goto(join);
+
+  code_ = Fragment(join);
+  code_ += B->LoadLocal(scratch_var_);
+}
+
+void BytecodeFlowGraphBuilder::BuildIntOp(const String& name,
+                                          Token::Kind token_kind,
+                                          int num_args) {
+  ASSERT((num_args == 1) || (num_args == 2));
+  ASSERT(MethodTokenRecognizer::RecognizeTokenKind(name) == token_kind);
+
+  LoadStackSlots(num_args);
+  const ArgumentArray arguments = GetArguments(num_args);
+
+  InstanceCallInstr* call = new (Z) InstanceCallInstr(
+      position_, name, token_kind, arguments, 0, Array::null_array(), num_args,
+      *ic_data_array_, B->GetNextDeoptId());
+
+  code_ <<= call;
+  B->Push(call);
+}
+
+void BytecodeFlowGraphBuilder::BuildNegateInt() {
+  BuildIntOp(Symbols::UnaryMinus(), Token::kNEGATE, 1);
+}
+
+void BytecodeFlowGraphBuilder::BuildAddInt() {
+  BuildIntOp(Symbols::Plus(), Token::kADD, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildSubInt() {
+  BuildIntOp(Symbols::Minus(), Token::kSUB, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildMulInt() {
+  BuildIntOp(Symbols::Star(), Token::kMUL, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildTruncDivInt() {
+  BuildIntOp(Symbols::TruncDivOperator(), Token::kTRUNCDIV, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildModInt() {
+  BuildIntOp(Symbols::Percent(), Token::kMOD, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildBitAndInt() {
+  BuildIntOp(Symbols::Ampersand(), Token::kBIT_AND, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildBitOrInt() {
+  BuildIntOp(Symbols::BitOr(), Token::kBIT_OR, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildBitXorInt() {
+  BuildIntOp(Symbols::Caret(), Token::kBIT_XOR, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildShlInt() {
+  BuildIntOp(Symbols::LeftShiftOperator(), Token::kSHL, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildShrInt() {
+  BuildIntOp(Symbols::RightShiftOperator(), Token::kSHR, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildCompareIntEq() {
+  BuildIntOp(Symbols::EqualOperator(), Token::kEQ, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildCompareIntGt() {
+  BuildIntOp(Symbols::RAngleBracket(), Token::kGT, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildCompareIntLt() {
+  BuildIntOp(Symbols::LAngleBracket(), Token::kLT, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildCompareIntGe() {
+  BuildIntOp(Symbols::GreaterEqualOperator(), Token::kGTE, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildCompareIntLe() {
+  BuildIntOp(Symbols::LessEqualOperator(), Token::kLTE, 2);
+}
+
 static bool IsICDataEntry(const ObjectPool& object_pool, intptr_t index) {
   if (object_pool.TypeAt(index) != ObjectPool::kTaggedObject) {
     return false;
@@ -1238,20 +1357,34 @@
   return join;
 }
 
+bool BytecodeFlowGraphBuilder::RequiresScratchVar(KBCInstr instr) {
+  switch (KernelBytecode::DecodeOpcode(instr)) {
+    case KernelBytecode::kEntryOptional:
+      return KernelBytecode::DecodeC(instr) > 0;
+    case KernelBytecode::kEqualsNull:
+      return true;
+    default:
+      return false;
+  }
+}
+
 void BytecodeFlowGraphBuilder::CollectControlFlow(
     const PcDescriptors& descriptors,
     const ExceptionHandlers& handlers,
     GraphEntryInstr* graph_entry) {
   for (intptr_t pc = 0; pc < bytecode_length_; ++pc) {
     const KBCInstr instr = raw_bytecode_[pc];
-    const KernelBytecode::Opcode opcode = KernelBytecode::DecodeOpcode(instr);
 
-    if ((opcode == KernelBytecode::kJump) ||
-        (opcode == KernelBytecode::kJumpIfNoAsserts) ||
-        (opcode == KernelBytecode::kJumpIfNotZeroTypeArgs)) {
+    if (KernelBytecode::IsJumpOpcode(instr)) {
       const intptr_t target = pc + KernelBytecode::DecodeT(instr);
       EnsureControlFlowJoin(descriptors, target);
     }
+
+    if ((scratch_var_ == nullptr) && RequiresScratchVar(instr)) {
+      scratch_var_ = new (Z)
+          LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                        Symbols::ExprTemp(), Object::dynamic_type());
+    }
   }
 
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
index 7de8c02..cbfa60d 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
@@ -14,59 +14,6 @@
 namespace dart {
 namespace kernel {
 
-#define FOR_EACH_BYTECODE_IN_FLOW_GRAPH_BUILDER(M)                             \
-  M(Allocate)                                                                  \
-  M(AllocateContext)                                                           \
-  M(AllocateT)                                                                 \
-  M(AssertAssignable)                                                          \
-  M(AssertBoolean)                                                             \
-  M(AssertSubtype)                                                             \
-  M(BooleanNegateTOS)                                                          \
-  M(CheckFunctionTypeArgs)                                                     \
-  M(CheckStack)                                                                \
-  M(CloneContext)                                                              \
-  M(CreateArrayTOS)                                                            \
-  M(Drop1)                                                                     \
-  M(Entry)                                                                     \
-  M(EntryFixed)                                                                \
-  M(EntryOptional)                                                             \
-  M(Frame)                                                                     \
-  M(IfEqNull)                                                                  \
-  M(IfEqStrictTOS)                                                             \
-  M(IfNeStrictTOS)                                                             \
-  M(IndirectStaticCall)                                                        \
-  M(InstanceCall)                                                              \
-  M(InstantiateType)                                                           \
-  M(InstantiateTypeArgumentsTOS)                                               \
-  M(Jump)                                                                      \
-  M(JumpIfNoAsserts)                                                           \
-  M(JumpIfNotZeroTypeArgs)                                                     \
-  M(LoadConstant)                                                              \
-  M(LoadContextParent)                                                         \
-  M(LoadContextVar)                                                            \
-  M(LoadFieldTOS)                                                              \
-  M(LoadTypeArgumentsField)                                                    \
-  M(MoveSpecial)                                                               \
-  M(NativeCall)                                                                \
-  M(PopLocal)                                                                  \
-  M(Push)                                                                      \
-  M(PushConstant)                                                              \
-  M(PushFalse)                                                                 \
-  M(PushInt)                                                                   \
-  M(PushNull)                                                                  \
-  M(PushStatic)                                                                \
-  M(PushTrue)                                                                  \
-  M(ReturnTOS)                                                                 \
-  M(SetFrame)                                                                  \
-  M(StoreContextParent)                                                        \
-  M(StoreContextVar)                                                           \
-  M(StoreFieldTOS)                                                             \
-  M(StoreIndexedTOS)                                                           \
-  M(StoreLocal)                                                                \
-  M(StoreStaticTOS)                                                            \
-  M(Throw)                                                                     \
-  M(Trap)
-
 // This class builds flow graph from bytecode. It is used either to compile
 // from bytecode, or generate bytecode interpreter (the latter is not
 // fully implemented yet).
@@ -93,6 +40,7 @@
         parameters_(zone_, 0),
         exception_var_(nullptr),
         stacktrace_var_(nullptr),
+        scratch_var_(nullptr),
         prologue_info_(-1, -1),
         throw_no_such_method_(nullptr) {}
 
@@ -180,19 +128,20 @@
   Value* Pop();
   ArgumentArray GetArguments(int count);
   void PropagateStackState(intptr_t target_pc);
-  void BuildIfStrictCompare(Token::Kind cmp_kind);
+  void BuildJumpIfStrictCompare(Token::Kind cmp_kind);
+  void BuildIntOp(const String& name, Token::Kind token_kind, int num_args);
 
   void BuildInstruction(KernelBytecode::Opcode opcode);
 
-#define DECLARE_BUILD_METHOD(bytecode) void Build##bytecode();
-
-  FOR_EACH_BYTECODE_IN_FLOW_GRAPH_BUILDER(DECLARE_BUILD_METHOD)
+#define DECLARE_BUILD_METHOD(name, encoding, op1, op2, op3) void Build##name();
+  KERNEL_BYTECODES_LIST(DECLARE_BUILD_METHOD)
 #undef DECLARE_BUILD_METHOD
 
   void ProcessICDataInObjectPool(const ObjectPool& object_pool);
   intptr_t GetTryIndex(const PcDescriptors& descriptors, intptr_t pc);
   JoinEntryInstr* EnsureControlFlowJoin(const PcDescriptors& descriptors,
                                         intptr_t pc);
+  bool RequiresScratchVar(KBCInstr instr);
   void CollectControlFlow(const PcDescriptors& descriptors,
                           const ExceptionHandlers& handlers,
                           GraphEntryInstr* graph_entry);
@@ -225,6 +174,7 @@
   ZoneGrowableArray<LocalVariable*> parameters_;
   LocalVariable* exception_var_;
   LocalVariable* stacktrace_var_;
+  LocalVariable* scratch_var_;
   IntMap<JoinEntryInstr*> jump_targets_;
   IntMap<Value*> stack_states_;
   PrologueInfo prologue_info_;
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index ac4d998..f1455d5 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -38,6 +38,8 @@
 #if !defined(PRODUCT)
   TimelineDurationScope tds(Thread::Current(), Timeline::GetCompilerStream(),
                             "BytecodeMetadataHelper::ReadMetadata");
+  tds.SetNumArguments(1);
+  tds.CopyArgument(0, "Function", function.ToQualifiedCString());
 #endif  // !defined(PRODUCT)
 
   const intptr_t node_offset = function.kernel_offset();
@@ -186,6 +188,7 @@
   TypeArguments& type_args = TypeArguments::Handle(helper_->zone_);
   Class* symbol_class = nullptr;
   Field* symbol_name_field = nullptr;
+  const String* simpleInstanceOf = nullptr;
   const intptr_t obj_count = pool.Length();
   for (intptr_t i = from_index; i < obj_count; ++i) {
     const intptr_t tag = helper_->ReadTag();
@@ -252,10 +255,15 @@
         intptr_t arg_desc_index = helper_->ReadUInt();
         ASSERT(arg_desc_index < i);
         array ^= pool.ObjectAt(arg_desc_index);
+        if (simpleInstanceOf == nullptr) {
+          simpleInstanceOf =
+              &Library::PrivateCoreLibName(Symbols::_simpleInstanceOf());
+        }
         intptr_t checked_argument_count = 1;
         if ((kind == InvocationKind::method) &&
-            (MethodTokenRecognizer::RecognizeTokenKind(name) !=
-             Token::kILLEGAL)) {
+            ((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;
@@ -534,7 +542,11 @@
       case ConstantPoolTag::kNativeEntry: {
         name = H.DartString(helper_->ReadStringReference()).raw();
         obj = NativeEntry(function, name);
-      } break;
+        pool.SetTypeAt(i, ObjectPool::kNativeEntryData,
+                       ObjectPool::kNotPatchable);
+        pool.SetObjectAt(i, obj);
+        continue;
+      }
       case ConstantPoolTag::kSubtypeTestCache: {
         obj = SubtypeTestCache::New();
       } break;
@@ -716,11 +728,7 @@
   NativeFunction native_function = NULL;
   intptr_t argc_tag = 0;
   if (kind == MethodRecognizer::kUnknown) {
-    if (FLAG_link_natives_lazily) {
-      trampoline = &NativeEntry::BootstrapNativeCallWrapper;
-      native_function =
-          reinterpret_cast<NativeFunction>(&NativeEntry::LinkNativeCall);
-    } else {
+    if (!FLAG_link_natives_lazily) {
       const Class& cls = Class::Handle(zone, function.Owner());
       const Library& library = Library::Handle(zone, cls.library());
       Dart_NativeEntryResolver resolver = library.native_entry_resolver();
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index b75b3d6..cf59420 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -33,6 +33,18 @@
       metadata_mappings_(ExternalTypedData::Handle(Z)),
       constants_(Array::Handle(Z)) {}
 
+TranslationHelper::TranslationHelper(Thread* thread, Heap::Space space)
+    : thread_(thread),
+      zone_(thread->zone()),
+      isolate_(thread->isolate()),
+      allocation_space_(space),
+      string_offsets_(TypedData::Handle(Z)),
+      string_data_(ExternalTypedData::Handle(Z)),
+      canonical_names_(TypedData::Handle(Z)),
+      metadata_payloads_(ExternalTypedData::Handle(Z)),
+      metadata_mappings_(ExternalTypedData::Handle(Z)),
+      constants_(Array::Handle(Z)) {}
+
 void TranslationHelper::Reset() {
   string_offsets_ = TypedData::null();
   string_data_ = ExternalTypedData::null();
@@ -1653,12 +1665,13 @@
   const int kDynamicUsesBit = 1 << 0;
   const int kNonThisUsesBit = 1 << 1;
   const int kTearOffUsesBit = 1 << 2;
+  const int kThisUsesBit = 1 << 3;
 
   const uint8_t flags = helper_->ReadByte();
-  metadata->has_dynamic_invocations =
-      (flags & kDynamicUsesBit) == kDynamicUsesBit;
-  metadata->has_non_this_uses = (flags & kNonThisUsesBit) == kNonThisUsesBit;
-  metadata->has_tearoff_uses = (flags & kTearOffUsesBit) == kTearOffUsesBit;
+  metadata->has_dynamic_invocations = (flags & kDynamicUsesBit) != 0;
+  metadata->has_this_uses = (flags & kThisUsesBit) != 0;
+  metadata->has_non_this_uses = (flags & kNonThisUsesBit) != 0;
+  metadata->has_tearoff_uses = (flags & kTearOffUsesBit) != 0;
   return true;
 }
 
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 0d1e40d..d7737be 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -22,6 +22,8 @@
  public:
   explicit TranslationHelper(Thread* thread);
 
+  TranslationHelper(Thread* thread, Heap::Space space);
+
   virtual ~TranslationHelper() {}
 
   void Reset();
@@ -874,15 +876,10 @@
 };
 
 struct ProcedureAttributesMetadata {
-  ProcedureAttributesMetadata(bool has_dynamic_invocations = true,
-                              bool has_non_this_uses = true,
-                              bool has_tearoff_uses = true)
-      : has_dynamic_invocations(has_dynamic_invocations),
-        has_non_this_uses(has_non_this_uses),
-        has_tearoff_uses(has_tearoff_uses) {}
-  bool has_dynamic_invocations;
-  bool has_non_this_uses;
-  bool has_tearoff_uses;
+  bool has_dynamic_invocations = true;
+  bool has_this_uses = true;
+  bool has_non_this_uses = true;
+  bool has_tearoff_uses = true;
 };
 
 // Helper class which provides access to direct call metadata.
diff --git a/runtime/vm/compiler/intrinsifier_arm.cc b/runtime/vm/compiler/intrinsifier_arm.cc
index 76c4593..920b211 100644
--- a/runtime/vm/compiler/intrinsifier_arm.cc
+++ b/runtime/vm/compiler/intrinsifier_arm.cc
@@ -770,7 +770,7 @@
   __ teq(NOTFP, Operand(R8));
   __ b(&loop, NE);
   __ str(R9, Address(R6, -kBytesPerBigIntDigit, Address::PreIndex));
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(R0, Object::null_object());
   __ Ret();
 }
 
@@ -813,7 +813,7 @@
   __ teq(R6, Operand(R8));
   __ b(&loop, NE);
   __ str(R9, Address(R6, 0));
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(R0, Object::null_object());
   __ Ret();
 }
 
@@ -872,7 +872,7 @@
   __ adc(R4, R4, Operand(0));
   __ str(R4, Address(R8, 0));
 
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(R0, Object::null_object());
   __ Ret();
 }
 
@@ -927,7 +927,7 @@
   __ b(&carry_loop, NE);
 
   __ Bind(&done);
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(R0, Object::null_object());
   __ Ret();
 }
 
diff --git a/runtime/vm/compiler/intrinsifier_arm64.cc b/runtime/vm/compiler/intrinsifier_arm64.cc
index 7709bac..96773e5 100644
--- a/runtime/vm/compiler/intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/intrinsifier_arm64.cc
@@ -676,7 +676,7 @@
   __ cmp(R7, Operand(R6));
   __ b(&loop, NE);
   __ str(R1, Address(R8, -2 * kBytesPerBigIntDigit, Address::PreIndex));
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(R0, Object::null_object());
   __ ret();
 }
 
@@ -723,7 +723,7 @@
   __ cmp(R8, Operand(R6));
   __ b(&loop, NE);
   __ str(R1, Address(R8, 0));
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(R0, Object::null_object());
   __ ret();
 }
 
@@ -788,7 +788,7 @@
   __ str(R0, Address(R6, 0));
 
   __ Bind(&done);
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(R0, Object::null_object());
   __ ret();
 }
 
@@ -847,7 +847,7 @@
   __ cbnz(&carry_loop, R9);
 
   __ Bind(&done);
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(R0, Object::null_object());
   __ ret();
 }
 
diff --git a/runtime/vm/compiler/intrinsifier_ia32.cc b/runtime/vm/compiler/intrinsifier_ia32.cc
index 864d9db..c97906c 100644
--- a/runtime/vm/compiler/intrinsifier_ia32.cc
+++ b/runtime/vm/compiler/intrinsifier_ia32.cc
@@ -785,7 +785,7 @@
 
   // Restore THR and return.
   __ popl(THR);
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(EAX, Object::null_object());
   __ ret();
 }
 
@@ -830,7 +830,7 @@
 
   // Restore THR and return.
   __ popl(THR);
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(EAX, Object::null_object());
   __ ret();
 }
 
@@ -889,7 +889,7 @@
 
   // Restore THR and return.
   __ popl(THR);
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(EAX, Object::null_object());
   __ ret();
 }
 
@@ -944,7 +944,7 @@
   __ Bind(&done);
   // Restore THR and return.
   __ popl(THR);
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(EAX, Object::null_object());
   __ ret();
 }
 
diff --git a/runtime/vm/compiler/intrinsifier_x64.cc b/runtime/vm/compiler/intrinsifier_x64.cc
index 5fc1f89..57975e5 100644
--- a/runtime/vm/compiler/intrinsifier_x64.cc
+++ b/runtime/vm/compiler/intrinsifier_x64.cc
@@ -748,7 +748,7 @@
   __ Bind(&last);
   __ shldq(RDX, R8, RCX);  // R8 == 0.
   __ movq(Address(RBX, 0), RDX);
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(RAX, Object::null_object());
   __ ret();
 }
 
@@ -784,7 +784,7 @@
   __ Bind(&last);
   __ shrdq(RDX, RSI, RCX);  // RSI == 0.
   __ movq(Address(RBX, 0), RDX);
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(RAX, Object::null_object());
   __ ret();
 }
 
@@ -839,7 +839,7 @@
           Immediate(1));
 
   __ Bind(&done);
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(RAX, Object::null_object());
   __ ret();
 }
 
@@ -888,7 +888,7 @@
   __ j(NOT_ZERO, &carry_loop, Assembler::kNearJump);
 
   __ Bind(&done);
-  // Returning Object::null() is not required, since this method is private.
+  __ LoadObject(RAX, Object::null_object());
   __ ret();
 }
 
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 40d64b8..339a85d 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -121,7 +121,7 @@
 #endif
 
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-    // Set flags affecting runtime accordingly for dart_bootstrap.
+    // Set flags affecting runtime accordingly for gen_snapshot.
     // These flags are constants with PRODUCT and DART_PRECOMPILED_RUNTIME.
     FLAG_deoptimize_alot = false;  // Used in some tests.
     FLAG_deoptimize_every = 0;     // Used in some tests.
@@ -138,18 +138,8 @@
 
 #ifndef DART_PRECOMPILED_RUNTIME
 
-bool UseKernelFrontEndFor(ParsedFunction* parsed_function) {
-  const Function& function = parsed_function->function();
-  return (function.kernel_offset() > 0) || function.HasBytecode() ||
-         (function.kind() == RawFunction::kNoSuchMethodDispatcher) ||
-         (function.kind() == RawFunction::kInvokeFieldDispatcher);
-}
-
 void DartCompilationPipeline::ParseFunction(ParsedFunction* parsed_function) {
-  if (!UseKernelFrontEndFor(parsed_function)) {
-    Parser::ParseFunction(parsed_function);
-    parsed_function->AllocateVariables();
-  }
+  // Nothing to do here.
 }
 
 FlowGraph* DartCompilationPipeline::BuildFlowGraph(
@@ -158,20 +148,12 @@
     ZoneGrowableArray<const ICData*>* ic_data_array,
     intptr_t osr_id,
     bool optimized) {
-  if (UseKernelFrontEndFor(parsed_function)) {
-    kernel::FlowGraphBuilder builder(parsed_function, ic_data_array,
-                                     /* not building var desc */ NULL,
-                                     /* not inlining */ NULL, optimized,
-                                     osr_id);
-    FlowGraph* graph = builder.BuildGraph();
-    ASSERT(graph != NULL);
-    return graph;
-  }
-  FlowGraphBuilder builder(*parsed_function, *ic_data_array,
-                           /* not building var desc */ NULL,
-                           /* not inlining */ NULL, osr_id);
-
-  return builder.BuildGraph();
+  kernel::FlowGraphBuilder builder(parsed_function, ic_data_array,
+                                   /* not building var desc */ NULL,
+                                   /* not inlining */ NULL, optimized, osr_id);
+  FlowGraph* graph = builder.BuildGraph();
+  ASSERT(graph != NULL);
+  return graph;
 }
 
 void DartCompilationPipeline::FinalizeCompilation(FlowGraph* flow_graph) {}
@@ -348,27 +330,6 @@
 }
 
 RawError* Compiler::Compile(const Library& library, const Script& script) {
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    Thread* const thread = Thread::Current();
-    StackZone zone(thread);
-    if (FLAG_trace_compiler) {
-      const String& script_url = String::Handle(script.url());
-      // TODO(iposva): Extract script kind.
-      THR_Print("Compiling %s '%s'\n", "", script_url.ToCString());
-    }
-    const String& library_key = String::Handle(library.private_key());
-    script.Tokenize(library_key);
-    Parser::ParseCompilationUnit(library, script);
-    return Error::null();
-  } else {
-    Thread* const thread = Thread::Current();
-    StackZone zone(thread);
-    Error& error = Error::Handle();
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
-    return error.raw();
-  }
   UNREACHABLE();
   return Error::null();
 }
@@ -491,23 +452,6 @@
       AddRelatedClassesToList(parse_list.At(i), &parse_list, &patch_list);
     }
 
-    // Classes loaded from a kernel should not be parsed.
-    if (cls.kernel_offset() <= 0) {
-      // Parse all the classes that have been added above.
-      for (intptr_t i = (parse_list.length() - 1); i >= 0; i--) {
-        const Class& parse_class = parse_list.At(i);
-        ASSERT(!parse_class.IsNull());
-        Parser::ParseClass(parse_class);
-      }
-
-      // Parse all the patch classes that have been added above.
-      for (intptr_t i = 0; i < patch_list.length(); i++) {
-        const Class& parse_class = patch_list.At(i);
-        ASSERT(!parse_class.IsNull());
-        Parser::ParseClass(parse_class);
-      }
-    }
-
     // Finalize these classes.
     for (intptr_t i = (parse_list.length() - 1); i >= 0; i--) {
       const Class& parse_class = parse_list.At(i);
@@ -543,8 +487,6 @@
     thread->clear_sticky_error();
     return error.raw();
   }
-  UNREACHABLE();
-  return Error::null();
 }
 
 class CompileParsedFunctionHelper : public ValueObject {
@@ -1303,7 +1245,8 @@
 #endif  // !defined(PRODUCT)
 
   // If running with interpreter, do the unoptimized compilation first.
-  const bool optimized = !FLAG_enable_interpreter || function.WasCompiled();
+  const bool optimized = !FLAG_enable_interpreter ||
+                         (function.unoptimized_code() != Object::null());
 
   // If we are in the optimizing in the mutator/Dart thread, then
   // this is either an OSR compilation or background compilation is
@@ -1366,20 +1309,11 @@
     ZoneGrowableArray<intptr_t>* context_level_array =
         new ZoneGrowableArray<intptr_t>();
 
-    if (!UseKernelFrontEndFor(parsed_function)) {
-      Parser::ParseFunction(parsed_function);
-      parsed_function->AllocateVariables();
-      FlowGraphBuilder builder(
-          *parsed_function, *ic_data_array, context_level_array,
-          /* not inlining */ NULL, Compiler::kNoOSRDeoptId);
-      builder.BuildGraph();
-    } else {
-      parsed_function->EnsureKernelScopes();
-      kernel::FlowGraphBuilder builder(
-          parsed_function, ic_data_array, context_level_array,
-          /* not inlining */ NULL, false, Compiler::kNoOSRDeoptId);
-      builder.BuildGraph();
-    }
+    parsed_function->EnsureKernelScopes();
+    kernel::FlowGraphBuilder builder(
+        parsed_function, ic_data_array, context_level_array,
+        /* not inlining */ NULL, false, Compiler::kNoOSRDeoptId);
+    builder.BuildGraph();
 
     const LocalVarDescriptors& var_descs = LocalVarDescriptors::Handle(
         parsed_function->node_sequence()->scope()->GetVarDescriptors(
@@ -1522,12 +1456,7 @@
 
       // Create a one-time-use function to evaluate the initializer and invoke
       // it immediately.
-      if (field.kernel_offset() > 0) {
-        parsed_function = kernel::ParseStaticFieldInitializer(zone, field);
-      } else {
-        parsed_function = Parser::ParseStaticFieldInitializer(field);
-        parsed_function->AllocateVariables();
-      }
+      parsed_function = kernel::ParseStaticFieldInitializer(zone, field);
       const Function& initializer = parsed_function->function();
 
       if (FLAG_enable_interpreter) {
@@ -1959,11 +1888,6 @@
 
 #else  // DART_PRECOMPILED_RUNTIME
 
-bool UseKernelFrontEndFor(ParsedFunction* parsed_function) {
-  UNREACHABLE();
-  return false;
-}
-
 CompilationPipeline* CompilationPipeline::New(Zone* zone,
                                               const Function& function) {
   UNREACHABLE();
diff --git a/runtime/vm/compiler/jit/compiler.h b/runtime/vm/compiler/jit/compiler.h
index 5d5d3bd..38d4761 100644
--- a/runtime/vm/compiler/jit/compiler.h
+++ b/runtime/vm/compiler/jit/compiler.h
@@ -28,8 +28,6 @@
 class Script;
 class SequenceNode;
 
-bool UseKernelFrontEndFor(ParsedFunction* parsed_function);
-
 class CompilationPipeline : public ZoneAllocated {
  public:
   static CompilationPipeline* New(Zone* zone, const Function& function);
diff --git a/runtime/vm/compiler/method_recognizer.cc b/runtime/vm/compiler/method_recognizer.cc
index 85f86c8..99b887a 100644
--- a/runtime/vm/compiler/method_recognizer.cc
+++ b/runtime/vm/compiler/method_recognizer.cc
@@ -42,8 +42,7 @@
   Library& lib = Thread::Current()->LibraryHandle();
   cls = function.Owner();
   lib = cls.library();
-  const bool can_use_pragma =
-      function.kernel_offset() > 0 && lib.IsAnyCoreLibrary();
+  const bool can_use_pragma = lib.IsAnyCoreLibrary();
   cls = Class::null();
   if (can_use_pragma) {
     Isolate* I = Isolate::Current();
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index 8eb3586..ae91b3e 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -195,6 +195,7 @@
     val = Instance::Cast(obj).EvaluateCompiledExpression(
         receiver_cls, kernel_bytes, kernel_length, Array::empty_array(),
         Array::empty_array(), TypeArguments::null_type_arguments());
+    free(const_cast<uint8_t*>(kernel_bytes));
   }
   EXPECT(!val.IsNull());
   EXPECT(!val.IsError());
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 67a2739..4092d250 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -276,14 +276,14 @@
 // R15 encodes APSR in the vmrs instruction.
 const Register APSR = R15;
 
-// Exception object is passed in this register to the catch handlers when an
-// exception is thrown.
+// ABI for catch-clause entry point.
 const Register kExceptionObjectReg = R0;
-
-// Stack trace object is passed in this register to the catch handlers when
-// an exception is thrown.
 const Register kStackTraceObjectReg = R1;
 
+// ABI for write barrier stub.
+const Register kWriteBarrierObjectReg = R1;
+const Register kWriteBarrierValueReg = R0;
+
 // List of registers used in load/store multiple.
 typedef uint16_t RegList;
 const RegList kAllCpuRegistersList = 0xFFFF;
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 7ae393b..c456dc7 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -118,14 +118,14 @@
 const Register CALLEE_SAVED_TEMP2 = R20;
 const Register BARRIER_MASK = R28;
 
-// Exception object is passed in this register to the catch handlers when an
-// exception is thrown.
+// ABI for catch-clause entry point.
 const Register kExceptionObjectReg = R0;
-
-// Stack trace object is passed in this register to the catch handlers when
-// an exception is thrown.
 const Register kStackTraceObjectReg = R1;
 
+// ABI for write barrier stub.
+const Register kWriteBarrierObjectReg = R1;
+const Register kWriteBarrierValueReg = R0;
+
 // Masks, sizes, etc.
 const int kXRegSizeInBits = 64;
 const int kWRegSizeInBits = 32;
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 239d4ab..5bd61c4 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -65,14 +65,14 @@
 const Register CALLEE_SAVED_TEMP = EBX;
 const Register CALLEE_SAVED_TEMP2 = EDI;
 
-// Exception object is passed in this register to the catch handlers when an
-// exception is thrown.
+// ABI for catch-clause entry point.
 const Register kExceptionObjectReg = EAX;
-
-// Stack trace object is passed in this register to the catch handlers when
-// an exception is thrown.
 const Register kStackTraceObjectReg = EDX;
 
+// ABI for write barrier stub.
+const Register kWriteBarrierObjectReg = EDX;
+const Register kWriteBarrierValueReg = kNoRegister;
+
 typedef uint32_t RegList;
 const RegList kAllCpuRegistersList = 0xFF;
 
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
index 2a5d9e5..f03847f 100644
--- a/runtime/vm/constants_kbc.h
+++ b/runtime/vm/constants_kbc.h
@@ -87,499 +87,6 @@
 //
 //    Unreachable instruction.
 //
-//  - Nop D
-//
-//    This instruction does nothing. It may refer to an object in the constant
-//    pool that may be decoded by other instructions.
-//
-//  - Compile
-//
-//    Compile current function and start executing newly produced code
-//    (used to implement LazyCompileStub);
-//
-//  - Intrinsic id
-//
-//    Execute intrinsic with the given id. If intrinsic returns true then
-//    return from the current function to the caller passing value produced
-//    by the intrinsic as a result;
-//
-//  - Drop1; DropR n; Drop n
-//
-//    Drop 1 or n values from the stack, if instruction is DropR push the first
-//    dropped value to the stack;
-//
-//  - Jump target
-//
-//    Jump to the given target. Target is specified as offset from the PC of the
-//    jump instruction.
-//
-//  - JumpIfNoAsserts target
-//
-//    Jump to the given target if assertions are not enabled.
-//    Target is specified as offset from the PC of the jump instruction.
-//
-//  - JumpIfNotZeroTypeArgs target
-//
-//    Jump to the given target if number of passed function type
-//    arguments is not zero.
-//    Target is specified as offset from the PC of the jump instruction.
-//
-//  - Return R; ReturnTOS
-//
-//    Return to the caller using either a value from the given register or a
-//    value from the top-of-stack as a result.
-//
-//    Note: return instruction knows how many arguments to remove from the
-//    stack because it can look at the call instruction at caller's PC and
-//    take argument count from it.
-//
-//  - Move rA, rX
-//
-//    FP[rA] <- FP[rX]
-//    Note: rX is signed so it can be used to address parameters which are
-//    at negative indices with respect to FP.
-//
-//  - Swap rA, rX
-//
-//    FP[rA], FP[rX] <- FP[rX], FP[rA]
-//    Note: rX is signed so it can be used to address parameters which are
-//    at negative indices with respect to FP.
-//
-//  - Push rX
-//
-//    Push FP[rX] to the stack.
-//
-//  - LoadConstant rA, D; PushConstant D
-//
-//    Load value at index D from constant pool into FP[rA] or push it onto the
-//    stack.
-//
-//  - PushNull
-//
-//    Push `null` onto the stack.
-//
-//  - PushTrue
-//
-//    Push `true` onto the stack.
-//
-//  - PushFalse
-//
-//    Push `false` onto the stack.
-//
-//  - PushInt rX
-//
-//    Push int rX onto the stack.
-//
-//  - StoreLocal rX; PopLocal rX
-//
-//    Store top of the stack into FP[rX] and pop it if needed.
-//
-//  - StaticCall ArgC, D
-//
-//    Invoke function in SP[0] with arguments SP[-(1+ArgC)], ..., SP[-1] and
-//    argument descriptor PP[D], which indicates whether the first argument
-//    is a type argument vector.
-//
-//  - IndirectStaticCall ArgC, D
-//
-//    Invoke the function given by the ICData in SP[0] with arguments
-//    SP[-(1+ArgC)], ..., SP[-1] and argument descriptor PP[D], which
-//    indicates whether the first argument is a type argument vector.
-//
-//  - InstanceCall ArgC, D
-//
-//    Lookup and invoke method using ICData in PP[D]
-//    with arguments SP[-(1+ArgC)], ..., SP[-1].
-//    The ICData indicates whether the first argument is a type argument vector.
-//
-//  - InstanceCall<N>Opt ArgC, D
-//
-//    Lookup and invoke method with N checked arguments using ICData in PP[D]
-//    with arguments SP[-(1+ArgC)], ..., SP[-1].
-//    The ICData indicates whether the first argument is a type argument vector.
-//
-//  - NativeCall D
-//
-//    Invoke native function described by array at pool[D].
-//    array[0] is wrapper, array[1] is function, array[2] is argc_tag.
-//
-//  - PushPolymorphicInstanceCall ArgC, D
-//
-//    Skips 2*D + 1 instructions and pushes a function object onto the stack
-//    if one can be found as follows. Otherwise skips only 2*D instructions.
-//    The function is looked up in the IC data encoded in the following 2*D
-//    Nop instructions. The Nop instructions should be arranged in pairs with
-//    the first being the cid, and the second being the function to push if
-//    the cid matches the cid in the pair.
-//
-//  - PushPolymorphicInstanceCallByRange ArgC, D
-//
-//    Skips 3*D + 1 instructions and pushes a function object onto the stack
-//    if one can be found as follows. Otherwise skips only 3*D instructions.
-//    The function is looked up in the IC data encoded in the following 3*D
-//    Nop instructions. The Nop instructions should be arranged in triples with
-//    the first being the start cid, the second being the number of cids, and
-//    the third being the function to push if the cid is in the range given
-//    by the first two Nop instructions.
-//
-//  - OneByteStringFromCharCode rA, rX
-//
-//    Load the one-character symbol with the char code given by the Smi
-//    in FP[rX] into FP[rA].
-//
-//  - StringToCharCode rA, rX
-//
-//    Load and smi-encode the single char code of the string in FP[rX] into
-//    FP[rA]. If the string's length is not 1, load smi -1 instead.
-//
-//  - AddTOS; SubTOS; MulTOS; BitOrTOS; BitAndTOS; EqualTOS; LessThanTOS;
-//    GreaterThanTOS;
-//
-//    Smi fast-path for a corresponding method. Checks if SP[0] and SP[-1] are
-//    both smis and result of SP[0] <op> SP[-1] is a smi - if this is true
-//    then pops operands and pushes result on the stack and skips the next
-//    instruction (which implements a slow path fallback).
-//
-//  - Add, Sub, Mul, Div, Mod, Shl, Shr rA, rB, rC
-//
-//    Arithmetic operations on Smis. FP[rA] <- FP[rB] op FP[rC].
-//    If these instructions can trigger a deoptimization, the following
-//    instruction should be Deopt. If no deoptimization should be triggered,
-//    the immediately following instruction is skipped. These instructions
-//    expect their operands to be Smis, but don't check that they are.
-//
-//  - Smi<op>TOS
-//
-//    Performs SP[0] <op> SP[-1], pops operands and pushes result on the stack.
-//    Assumes SP[0] and SP[-1] are both smis and the result is a Smi.
-//
-//  - ShlImm rA, rB, rC
-//
-//    FP[rA] <- FP[rB] << rC. Shifts the Smi in FP[rB] left by rC. rC is
-//    assumed to be a legal positive number by which left-shifting is possible.
-//
-//  - Min, Max rA, rB, rC
-//
-//    FP[rA] <- {min, max}(FP[rB], FP[rC]). Assumes that FP[rB], and FP[rC] are
-//    Smis.
-//
-//  - Neg rA , rD
-//
-//    FP[rA] <- -FP[rD]. Assumes FP[rD] is a Smi. If there is no overflow the
-//    immediately following instruction is skipped.
-//
-//  - DMin, DMax, DAdd, DSub, DMul, DDiv, DPow, DMod rA, rB, rC
-//
-//    Arithmetic operations on unboxed doubles. FP[rA] <- FP[rB] op FP[rC].
-//
-//  - DNeg, DCos, DSin, DSqrt rA, rD
-//
-//    FP[rA] <- op(FP[rD]). Assumes FP[rD] is an unboxed double.
-//
-//  - DTruncate, DFloor, DCeil rA, rD
-//
-//    Applies trunc(), floor(), or ceil() to the unboxed double in FP[rD], and
-//    stores the result in FP[rA].
-//
-//  - DoubleToFloat, FloatToDouble rA, rD
-//
-//    Convert the unboxed float or double in FP[rD] as indicated, and store the
-//    result in FP[rA].
-//
-//  - DoubleIsNaN rA, rD
-//
-//    If the unboxed double in FP[rD] is a NaN, then writes Bool::True().raw()
-//    into FP[rA], and Bool::False().raw() otherwise.
-//
-//  - DoubleIsInfinite rA, rD
-//
-//    If the unboxed double in FP[rD] is + or - infinity, then
-//    writes Bool::True().raw() into FP[rA], and Bool::False().raw() otherwise.
-//
-//  - BitOr, BitAnd, BitXor rA, rB, rC
-//
-//    FP[rA] <- FP[rB] op FP[rC]. These instructions expect their operands to be
-//    Smis, but don't check that they are.
-//
-//  - BitNot rA, rD
-//
-//    FP[rA] <- ~FP[rD]. As above, assumes FP[rD] is a Smi.
-//
-//  - WriteIntoDouble rA, rD
-//
-//    Box the double in FP[rD] using the box in FP[rA].
-//
-//  - UnboxDouble rA, rD
-//
-//    Unbox the double in FP[rD] into FP[rA]. Assumes FP[rD] is a double.
-//
-//  - CheckedUnboxDouble rA, rD
-//
-//    Unboxes FP[rD] into FP[rA] and skips the following instruction unless
-//    FP[rD] is not a double or a Smi. When FP[rD] is a Smi, converts it to a
-//    double.
-//
-//  - UnboxInt32 rA, rB, C
-//
-//    Unboxes the integer in FP[rB] into FP[rA]. If C == 1, the value may be
-//    truncated. If FP[rA] is successfully unboxed the following instruction is
-//    skipped.
-//
-//  - BoxInt32 rA, rD
-//
-//    Boxes the unboxed signed 32-bit integer in FP[rD] into FP[rA].
-//
-//  - BoxUint32 rA, rD
-//
-//    Boxes the unboxed unsigned 32-bit integer in FP[rD] into FP[rA].
-//
-//  - SmiToDouble rA, rD
-//
-//    Convert the Smi in FP[rD] to an unboxed double in FP[rA].
-//
-//  - DoubleToSmi rA, rD
-//
-//    If the unboxed double in FP[rD] can be converted to a Smi in FP[rA], then
-//    this instruction does so, and skips the following instruction. Otherwise,
-//    the following instruction is not skipped.
-//
-//  - StoreStaticTOS D
-//
-//    Stores TOS into the static field PP[D].
-//
-//  - PushStatic
-//
-//    Pushes value of the static field PP[D] on to the stack.
-//
-//  - InitStaticTOS
-//
-//    Takes static field from TOS and ensures that it is initialized.
-//
-//  - If<Cond>(Num)TOS
-//    If<Cond>(Num) rA, rD
-//
-//    Cond is either NeStrict or EqStrict
-//
-//    Skips the next instruction unless the given condition holds. 'Num'
-//    variants perform number check while non-Num variants just compare
-//    RawObject pointers.
-//
-//    Used to implement conditional jump:
-//
-//        IfNeStrictTOS
-//        Jump T         ;; jump if not equal
-//
-//  - If<Cond>Null rA
-//
-//    Cond is Eq or Ne. Skips the next instruction unless the given condition
-//    holds.
-//
-//  - If<Cond> rA, rD
-//
-//    Cond is Le, Lt, Ge, Gt, unsigned variants ULe, ULt, UGe, UGt, and
-//    unboxed double variants DEq, DNe, DLe, DLt, DGe, DGt.
-//    Skips the next instruction unless FP[rA] <Cond> FP[rD]. Assumes that
-//    FP[rA] and FP[rD] are Smis or unboxed doubles as indicated by <Cond>.
-//
-//  - IfSmi<Cond>TOS
-//
-//    Cond is Lt, Le, Ge, Gt.
-//    Skips the next instruction unless SP[-1] <Cond> SP[-0].
-//    It is expected both SP[-1] and SP[-0] are Smis.
-//
-//  - CreateArrayTOS
-//
-//    Allocate array of length SP[0] with type arguments SP[-1].
-//
-//  - CreateArrayOpt rA, rB, rC
-//
-//    Try to allocate a new array where FP[rB] is the length, and FP[rC] is the
-//    type. If allocation is successful, the result is stored in FP[rA], and
-//    the next four instructions, which should be the
-//    (Push type; Push length; AllocateTOS; PopLocal) slow path are skipped.
-//
-//  - Allocate D
-//
-//    Allocate object of class PP[D] with no type arguments.
-//
-//  - AllocateOpt rA, D
-//
-//    Try allocating an object with tags in PP[D] with no type arguments.
-//    If allocation is successful, the result is stored in FP[rA], and
-//    the next two instructions, which should be the (Allocate class; PopLocal)
-//    slow path are skipped
-//
-//  - AllocateT
-//
-//    Allocate object of class SP[0] with type arguments SP[-1].
-//
-//  - AllocateTOpt rA, D
-//
-//    Similar to AllocateOpt with the difference that the offset of the
-//    type arguments in the resulting object is taken from the D field of the
-//    following Nop instruction, and on success 4 instructions are skipped and
-//    the object at the top of the stack is popped.
-//
-//  - StoreIndexedTOS
-//
-//    Store SP[0] into array SP[-2] at index SP[-1]. No typechecking is done.
-//    SP[-2] is assumed to be a RawArray, SP[-1] to be a smi.
-//
-//  - StoreIndexed rA, rB, rC
-//
-//    Store FP[rC] into array FP[rA] at index FP[rB]. No typechecking is done.
-//    FP[rA] is assumed to be a RawArray, FP[rB] to be a smi.
-//
-//  - StoreIndexed{N}{Type} rA, rB, rC
-//
-//    Where Type is Float32, Float64, Uint8, or OneByteString
-//    Where N is '', '4', or '8'. N may only be '4' for Float32 and '8' for
-//    Float64.
-//
-//    Store the unboxed double or tagged Smi in FP[rC] into the typed data array
-//    at FP[rA] at index FP[rB]. If N is not '', the index is assumed to be
-//    already scaled by N.
-//
-//  - StoreIndexedExternalUint8 rA, rB, rC
-//
-//    Similar to StoreIndexedUint8 but FP[rA] is an external typed data aray.
-//
-//  - NoSuchMethod
-//
-//    Performs noSuchmethod handling code.
-//
-//  - TailCall
-//
-//    Unwinds the current frame, populates the arguments descriptor register
-//    with SP[-1] and tail calls the code in SP[-0].
-//
-//  - TailCallOpt  rA, rD
-//
-//    Unwinds the current frame, populates the arguments descriptor register
-//    with rA and tail calls the code in rD.
-//
-//  - LoadArgDescriptor
-//
-//    Load the caller-provoided argument descriptor and pushes it onto the
-//    stack.
-//
-//  - LoadArgDescriptorOpt rA
-//
-//    Load the caller-provoided argument descriptor into [rA].
-//
-//  - LoadFpRelativeSlot rD
-//
-//    Loads from FP using the negative index of SP[-0]+rD.
-//    It is assumed that SP[-0] is a Smi.
-//
-//  - LoadFpRelativeSlotOpt  rA, rB, rY
-//
-//    Loads from FP using the negative index of FP[rB]+rY and stores the result
-//    into rA.
-//    It is assumed that rY is a Smi.
-//
-//  - StoreFpRelativeSlot rD
-//
-//    Stores SP[-0] by indexing into FP using the negative index of SP[-1]+rD.
-//    It is assumed that SP[-1] is a Smi.
-//
-//  - StoreFpRelativeSlotOpt  rA, rB, rY
-//
-//    Stores rA by indexing into FP using the the negative index of FP[rB]+rY.
-//    It is assumed that rY is a Smi.
-//
-//  - LoadIndexedTOS
-//
-//    Loads from array SP[-1] at index SP[-0].
-//    It is assumed that SP[-0] is a Smi.
-//
-//  - LoadIndexed rA, rB, rC
-//
-//    Loads from array FP[rB] at index FP[rC] into FP[rA]. No typechecking is
-//    done. FP[rB] is assumed to be a RawArray, and to contain a Smi at FP[rC].
-//
-//  - LoadIndexed{N}{Type} rA, rB, rC
-//
-//    Where Type is Float32, Float64, OneByteString, TwoByteString, Uint8,
-//    Int8, and N is '', '4', or '8'. N may only be '4' for Float32, and may
-//    only be '8' for Float64.
-//
-//    Loads from typed data array FP[rB] at index FP[rC] into an unboxed double,
-//    or tagged Smi in FP[rA] as indicated by the type in the name. If N is not
-//    '', the index is assumed to be already scaled by N.
-//
-//  - LoadIndexedExternal{Int8, Uint8} rA, rB, rC
-//
-//    Loads from the external typed data array FP[rB] at index FP[rC] into
-//    FP[rA]. No typechecking is done.
-//
-//  - StoreField rA, B, rC
-//
-//    Store value FP[rC] into object FP[rA] at offset (in words) B.
-//
-//  - StoreFieldExt rA, rD
-//
-//    Store value FP[rD] into object FP[rA] at offset (in words)
-//    stored in the following Nop instruction. Used to access fields with
-//    large offsets.
-//
-//  - StoreFieldTOS D
-//
-//    Store value SP[0] into object SP[-1] at offset (in words) PP[D].
-//
-//  - StoreContextParent
-//
-//    Store context SP[0] into `parent` field of context SP[-1].
-//
-//  - StoreContextVar D
-//
-//    Store value SP[0] into context SP[-1] at index D.
-//
-//  - LoadField rA, rB, C
-//
-//    Load value at offset (in words) C from object FP[rB] into FP[rA].
-//
-//  - LoadFieldExt rA, rD
-//
-//    Load value from object FP[rD] at offset (in words) stored in the
-//    following Nop instruction into FP[rA]. Used to access fields with
-//    large offsets.
-//
-//  - LoadUntagged rA, rB, C
-//
-//    Like LoadField, but assumes that FP[rB] is untagged.
-//
-//  - LoadFieldTOS D
-//
-//    Push value at offset (in words) PP[D] from object SP[0].
-//
-//  - LoadTypeArgumentsField D
-//
-//    Load instantiator type arguments from an instance SP[0].
-//    PP[D] = offset (in words) of type arguments field corresponding
-//    to an instance's class.
-//
-//  - LoadContextParent
-//
-//    Load parent from context SP[0].
-//
-//  - LoadContextVar D
-//
-//    Load value from context SP[0] at index D.
-//
-//  - BooleanNegateTOS
-//
-//    SP[0] = !SP[0]
-//
-//  - BooleanNegate rA, rD
-//
-//    FP[rA] = !FP[rD]
-//
-//  - Throw A
-//
-//    Throw (Rethrow if A != 0) exception. Exception object and stack object
-//    are taken from TOS.
-//
 //  - Entry rD
 //
 //    Function prologue for the function
@@ -616,64 +123,164 @@
 //    local variables this is done by a separate bytecode Frame, which should
 //    follow EntryOptional and its LoadConstant instructions.
 //
-//  - EntryOptimized rD
+//  - LoadConstant rA, D
 //
-//    Function prologue for optimized functions.
-//        rD - number of local slots to reserve for registers;
-//
-//    Note: reserved slots are not initialized because optimized code
-//    has stack maps attached to call sites.
-//
-//  - HotCheck A, D
-//
-//    Increment current function's usage counter by A and check if it
-//    exceeds D. If it does trigger (re)optimization of the current
-//    function.
+//    Used in conjunction with EntryOptional instruction to describe names and
+//    default values of optional parameters.
 //
 //  - Frame D
 //
 //    Reserve and initialize with null space for D local variables.
 //
-//  - SetFrame A
+//  - CheckFunctionTypeArgs A, D
 //
-//    Reinitialize SP assuming that current frame has size A.
-//    Used to drop temporaries from the stack in the exception handler.
+//    Check for a passed-in type argument vector of length A and
+//    store it at FP[D].
+//
+//  - CheckStack
+//
+//    Compare SP against isolate stack limit and call StackOverflow handler if
+//    necessary.
+//
+//  - Allocate D
+//
+//    Allocate object of class PP[D] with no type arguments.
+//
+//  - AllocateT
+//
+//    Allocate object of class SP[0] with type arguments SP[-1].
+//
+//  - CreateArrayTOS
+//
+//    Allocate array of length SP[0] with type arguments SP[-1].
 //
 //  - AllocateContext D
 //
 //    Allocate Context object assuming for D context variables.
 //
-//  - AllocateUninitializedContext rA, D
-//
-//    Allocates an uninitialized context for D variables, and places the result
-//    in FP[rA]. On success, skips the next 2 instructions, which should be the
-//    slow path (AllocateContext D; PopLocal rA).
-//
 //  - CloneContext
 //
 //    Clone context stored in TOS.
 //
-//  - MoveSpecial rA, D
+//  - LoadContextParent
 //
-//    Copy special values from inside interpreter to FP[rA]. Currently only
-//    used to pass exception object (D = 0) and stack trace object (D = 1) to
-//    catch handler.
+//    Load parent from context SP[0].
 //
-//  - InstantiateType D
+//  - StoreContextParent
 //
-//    Instantiate type PP[D] with instantiator type arguments SP[-1] and
-//    function type arguments SP[0].
+//    Store context SP[0] into `parent` field of context SP[-1].
 //
-//  - InstantiateTypeArgumentsTOS D
+//  - LoadContextVar D
 //
-//    Instantiate type arguments PP[D] with instantiator type arguments SP[-1]
-//    and function type arguments SP[0].
+//    Load value from context SP[0] at index D.
 //
-//  - InstanceOf
+//  - StoreContextVar D
 //
-//    Test if instance SP[-4] with instantiator type arguments SP[-3] and
-//    function type arguments SP[-2] is a subtype of type SP[-1] using
-//    SubtypeTestCache SP[0], with result placed at top of stack.
+//    Store value SP[0] into context SP[-1] at index D.
+//
+//  - PushConstant D
+//
+//    Push value at index D from constant pool onto the stack.
+//
+//  - PushNull
+//
+//    Push `null` onto the stack.
+//
+//  - PushTrue
+//
+//    Push `true` onto the stack.
+//
+//  - PushFalse
+//
+//    Push `false` onto the stack.
+//
+//  - PushInt rX
+//
+//    Push int rX onto the stack.
+//
+//  - Drop1
+//
+//    Drop 1 value from the stack
+//
+//  - Push rX
+//
+//    Push FP[rX] to the stack.
+//
+//  - StoreLocal rX; PopLocal rX
+//
+//    Store top of the stack into FP[rX] and pop it if needed.
+//
+//  - LoadFieldTOS D
+//
+//    Push value at offset (in words) PP[D] from object SP[0].
+//
+//  - StoreFieldTOS D
+//
+//    Store value SP[0] into object SP[-1] at offset (in words) PP[D].
+//
+//  - StoreIndexedTOS
+//
+//    Store SP[0] into array SP[-2] at index SP[-1]. No typechecking is done.
+//    SP[-2] is assumed to be a RawArray, SP[-1] to be a smi.
+//
+//  - PushStatic
+//
+//    Pushes value of the static field PP[D] on to the stack.
+//
+//  - StoreStaticTOS D
+//
+//    Stores TOS into the static field PP[D].
+//
+//  - Jump target
+//
+//    Jump to the given target. Target is specified as offset from the PC of the
+//    jump instruction.
+//
+//  - JumpIfNoAsserts target
+//
+//    Jump to the given target if assertions are not enabled.
+//    Target is specified as offset from the PC of the jump instruction.
+//
+//  - JumpIfNotZeroTypeArgs target
+//
+//    Jump to the given target if number of passed function type
+//    arguments is not zero.
+//    Target is specified as offset from the PC of the jump instruction.
+//
+//  - JumpIfEqStrict target; JumpIfNeStrict target
+//
+//    Jump to the given target if SP[-1] is the same (JumpIfEqStrict) /
+//    not the same (JumpIfNeStrict) object as SP[0].
+//
+//  - JumpIfTrue target; JumpIfFalse target
+//  - JumpIfNull target; JumpIfNotNull target
+//
+//    Jump to the given target if SP[0] is true/false/null/not null.
+//
+//  - IndirectStaticCall ArgC, D
+//
+//    Invoke the function given by the ICData in SP[0] with arguments
+//    SP[-(1+ArgC)], ..., SP[-1] and argument descriptor PP[D], which
+//    indicates whether the first argument is a type argument vector.
+//
+//  - InstanceCall ArgC, D
+//
+//    Lookup and invoke method using ICData in PP[D]
+//    with arguments SP[-(1+ArgC)], ..., SP[-1].
+//    The ICData indicates whether the first argument is a type argument vector.
+//
+//  - NativeCall D
+//
+//    Invoke native function described by array at pool[D].
+//    array[0] is wrapper, array[1] is function, array[2] is argc_tag.
+//
+//  - ReturnTOS
+//
+//    Return to the caller using a value from the top-of-stack as a result.
+//
+//    Note: return instruction knows how many arguments to remove from the
+//    stack because it can look at the call instruction at caller's PC and
+//    take argument count from it.
 //
 //  - AssertAssignable A, D
 //
@@ -684,6 +291,10 @@
 //
 //    Instance remains on stack. Other arguments are consumed.
 //
+//  - AssertBoolean A
+//
+//    Assert that TOS is a boolean (A = 1) or that TOS is not null (A = 0).
+//
 //  - AssertSubtype
 //
 //    Assert that one type is a subtype of another.  Throws a TypeError
@@ -697,113 +308,64 @@
 //
 //    All 5 arguments are consumed from the stack and no results is pushed.
 //
-//  - BadTypeError
+//  - LoadTypeArgumentsField D
 //
-//    If SP[-4] is non-null, throws a BadType error by calling into the runtime.
-//    Assumes that the stack is arranged the same as for AssertAssignable.
+//    Load instantiator type arguments from an instance SP[0].
+//    PP[D] = offset (in words) of type arguments field corresponding
+//    to an instance's class.
 //
-//  - AssertBoolean A
+//  - InstantiateType D
 //
-//    Assert that TOS is a boolean (A = 1) or that TOS is not null (A = 0).
+//    Instantiate type PP[D] with instantiator type arguments SP[-1] and
+//    function type arguments SP[0].
 //
-//  - TestSmi rA, rD
+//  - InstantiateTypeArgumentsTOS D
 //
-//    If FP[rA] & FP[rD] != 0, then skip the next instruction. FP[rA] and FP[rD]
-//    must be Smis.
+//    Instantiate type arguments PP[D] with instantiator type arguments SP[-1]
+//    and function type arguments SP[0].
 //
-//  - TestCids rA, D
+//  - Throw A
 //
-//    The next D instructions must be Nops whose D field encodes a class id. If
-//    the class id of FP[rA] matches, jump to PC + N + 1 if the matching Nop's
-//    A != 0 or PC + N + 2 if the matching Nop's A = 0. If no match is found,
-//    jump to PC + N.
+//    Throw (Rethrow if A != 0) exception. Exception object and stack object
+//    are taken from TOS.
 //
-//  - CheckSmi rA
+//  - MoveSpecial rA, D
 //
-//    If FP[rA] is a Smi, then skip the next instruction.
+//    Copy special values from inside interpreter to FP[rA]. Currently only
+//    used to pass exception object (D = 0) and stack trace object (D = 1) to
+//    catch handler.
 //
-//  - CheckEitherNonSmi rA, rD
+//  - SetFrame A
 //
-//    If either FP[rA] or FP[rD] is not a Smi, then skip the next instruction.
+//    Reinitialize SP assuming that current frame has size A.
+//    Used to drop temporaries from the stack in the exception handler.
 //
-//  - CheckClassId rA, D
+//  - BooleanNegateTOS
 //
-//    If the class id in FP[rA] matches the class id D, then skip the
-//    following instruction.
+//    SP[0] = !SP[0]
 //
-//  - CheckClassIdRange rA, D
+//  - EqualsNull
 //
-//    Next instruction is a Nop with S, the size of the class-id range.
-//    If the class id in FP[rA] is between the D D + S, then skip the
-//    following instruction.
+//    SP[0] = (SP[0] == null) ? true : false
 //
-//  - CheckBitTest rA, D
+//  - NegateInt
 //
-//    Skips the next 3 instructions if the object at FP[rA] is a valid class for
-//    a dense switch with low cid encoded in the following Nop instruction, and
-//    the cid mask encoded in the Nop instruction after that, or if D == 1 and
-//    FP[rA] is a Smi. Skips 2 instructions otherwise.
+//    Equivalent to invocation of unary int operator-.
+//    Receiver should have static type int.
+//    Check SP[0] for null; SP[0] = -SP[0].
 //
-//  - CheckCids rA, rB, rC
+//  - AddInt; SubInt; MulInt; TruncDivInt; ModInt; BitAndInt; BitOrInt;
+//    BitXorInt; ShlInt; ShrInt
 //
-//    Skips rC + 1 instructions if the object at FP[rA] is a Smi and
-//    rB == 1, or if FP[rA]'s cid is found in the array of cids encoded by the
-//    following rC Nop instructions. Otherwise skips only rC instructions.
+//    Equivalent to invocation of binary int operator +, -, *, ~/, %, &, |,
+//    ^, << or >>. Receiver and argument should have static type int.
+//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0].
 //
-//  - CheckCidsByRange rA, rB, rC
+//  - CompareIntEq; CompareIntGt; CompareIntLt; CompareIntGe; CompareIntLe
 //
-//    Skips rC + 1 instructions if the object at FP[rA] is a Smi and rB ==
-//    1, or if FP[rA]'s cid is found in the array of cid ranges encoded by the
-//    following rC Nop instructions. The cid ranges from a inclusive to b
-//    exclusive are coded in pairs of (a, b - a). Otherwise skips only 2
-//    instructions.
-//
-//  - CheckStack
-//
-//    Compare SP against isolate stack limit and call StackOverflow handler if
-//    necessary.
-//
-//  - CheckStackAlwaysExit
-//
-//    Unconditionally call StackOverflow handler.
-//
-//  - CheckFunctionTypeArgs A, D
-//
-//    Check for a passed-in type argument vector of length A and
-//    store it at FP[D].
-//
-//  - DebugStep, DebugBreak A
-//
-//    Debugger support. DebugBreak is bytecode that can be patched into the
-//    instruction stream to trigger in place breakpoint.
-//
-//    When patching instance or static call with DebugBreak we set A to
-//    match patched call's argument count so that Return instructions continue
-//    to work.
-//
-// TODO(vegorov) the way we replace calls with DebugBreak does not work
-//               with our smi fast paths because DebugBreak is simply skipped.
-//
-//  - LoadClassIdTOS, LoadClassId rA, D
-//
-//    LoadClassIdTOS loads the class id from the object at SP[0] and stores it
-//    to SP[0]. LoadClassId loads the class id from FP[rA] and stores it to
-//    FP[D].
-//
-//  - Deopt ArgC, D
-//
-//    If D != 0 then trigger eager deoptimization with deopt id (D - 1).
-//    If D == 0 then trigger lazy deoptimization.
-//
-//    The meaning of operand ArgC (encoded as A operand) matches that of an
-//    ArgC operand in call instructions. This is needed because we could
-//    potentially patch calls instructions with a lazy deopt and we need to
-//    ensure that any Return/ReturnTOS instructions
-//    returning from the patched calls will continue to function,
-//    e.g. in bytecode sequences like
-//
-//    InstanceCall ... <- lazy deopt inside first call
-//    InstanceCall ... <- patches second call with Deopt
+//    Equivalent to invocation of binary int operator ==, >, <, >= or <=.
+//    Receiver and argument should have static type int.
+//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0] ? true : false.
 //
 // BYTECODE LIST FORMAT
 //
@@ -829,213 +391,76 @@
 //
 #define KERNEL_BYTECODES_LIST(V)                                               \
   V(Trap,                                  0, ___, ___, ___)                   \
-  V(Nop,                                 A_D, num, lit, ___)                   \
-  V(Compile,                               0, ___, ___, ___)                   \
-  V(HotCheck,                            A_D, num, num, ___)                   \
-  V(Intrinsic,                             A, num, ___, ___)                   \
-  V(Drop1,                                 0, ___, ___, ___)                   \
-  V(DropR,                                 A, num, ___, ___)                   \
-  V(Drop,                                  A, num, ___, ___)                   \
-  V(Jump,                                  T, tgt, ___, ___)                   \
-  V(JumpIfNoAsserts,                       T, tgt, ___, ___)                   \
-  V(JumpIfNotZeroTypeArgs,                 T, tgt, ___, ___)                   \
-  V(Return,                                A, reg, ___, ___)                   \
-  V(ReturnTOS,                             0, ___, ___, ___)                   \
-  V(Move,                                A_X, reg, xeg, ___)                   \
-  V(Swap,                                A_X, reg, xeg, ___)                   \
-  V(Push,                                  X, xeg, ___, ___)                   \
+  V(Entry,                                 D, num, ___, ___)                   \
+  V(EntryFixed,                          A_D, num, num, ___)                   \
+  V(EntryOptional,                     A_B_C, num, num, num)                   \
   V(LoadConstant,                        A_D, reg, lit, ___)                   \
-  V(LoadClassId,                         A_D, reg, reg, ___)                   \
-  V(LoadClassIdTOS,                        0, ___, ___, ___)                   \
+  V(Frame,                                 D, num, ___, ___)                   \
+  V(CheckFunctionTypeArgs,               A_D, num, num, ___)                   \
+  V(CheckStack,                            0, ___, ___, ___)                   \
+  V(Allocate,                              D, lit, ___, ___)                   \
+  V(AllocateT,                             0, ___, ___, ___)                   \
+  V(CreateArrayTOS,                        0, ___, ___, ___)                   \
+  V(AllocateContext,                       D, num, ___, ___)                   \
+  V(CloneContext,                          0, ___, ___, ___)                   \
+  V(LoadContextParent,                     0, ___, ___, ___)                   \
+  V(StoreContextParent,                    0, ___, ___, ___)                   \
+  V(LoadContextVar,                        D, num, ___, ___)                   \
+  V(StoreContextVar,                       D, num, ___, ___)                   \
   V(PushConstant,                          D, lit, ___, ___)                   \
   V(PushNull,                              0, ___, ___, ___)                   \
   V(PushTrue,                              0, ___, ___, ___)                   \
   V(PushFalse,                             0, ___, ___, ___)                   \
   V(PushInt,                               X, num, ___, ___)                   \
-  V(StoreLocal,                            X, xeg, ___, ___)                   \
+  V(Drop1,                                 0, ___, ___, ___)                   \
+  V(Push,                                  X, xeg, ___, ___)                   \
   V(PopLocal,                              X, xeg, ___, ___)                   \
-  V(IndirectStaticCall,                  A_D, num, num, ___)                   \
-  V(StaticCall,                          A_D, num, num, ___)                   \
-  V(InstanceCall,                        A_D, num, num, ___)                   \
-  V(InstanceCall1Opt,                    A_D, num, num, ___)                   \
-  V(InstanceCall2Opt,                    A_D, num, num, ___)                   \
-  V(PushPolymorphicInstanceCall,         A_D, num, num, ___)                   \
-  V(PushPolymorphicInstanceCallByRange,  A_D, num, num, ___)                   \
-  V(NativeCall,                            D, lit, ___, ___)                   \
-  V(OneByteStringFromCharCode,           A_X, reg, xeg, ___)                   \
-  V(StringToCharCode,                    A_X, reg, xeg, ___)                   \
-  V(AddTOS,                                0, ___, ___, ___)                   \
-  V(SubTOS,                                0, ___, ___, ___)                   \
-  V(MulTOS,                                0, ___, ___, ___)                   \
-  V(BitOrTOS,                              0, ___, ___, ___)                   \
-  V(BitAndTOS,                             0, ___, ___, ___)                   \
-  V(EqualTOS,                              0, ___, ___, ___)                   \
-  V(LessThanTOS,                           0, ___, ___, ___)                   \
-  V(GreaterThanTOS,                        0, ___, ___, ___)                   \
-  V(SmiAddTOS,                             0, ___, ___, ___)                   \
-  V(SmiSubTOS,                             0, ___, ___, ___)                   \
-  V(SmiMulTOS,                             0, ___, ___, ___)                   \
-  V(SmiBitAndTOS,                          0, ___, ___, ___)                   \
-  V(Add,                               A_B_C, reg, reg, reg)                   \
-  V(Sub,                               A_B_C, reg, reg, reg)                   \
-  V(Mul,                               A_B_C, reg, reg, reg)                   \
-  V(Div,                               A_B_C, reg, reg, reg)                   \
-  V(Mod,                               A_B_C, reg, reg, reg)                   \
-  V(Shl,                               A_B_C, reg, reg, reg)                   \
-  V(Shr,                               A_B_C, reg, reg, reg)                   \
-  V(ShlImm,                            A_B_C, reg, reg, num)                   \
-  V(Neg,                                 A_D, reg, reg, ___)                   \
-  V(BitOr,                             A_B_C, reg, reg, reg)                   \
-  V(BitAnd,                            A_B_C, reg, reg, reg)                   \
-  V(BitXor,                            A_B_C, reg, reg, reg)                   \
-  V(BitNot,                              A_D, reg, reg, ___)                   \
-  V(Min,                               A_B_C, reg, reg, reg)                   \
-  V(Max,                               A_B_C, reg, reg, reg)                   \
-  V(WriteIntoDouble,                     A_D, reg, reg, ___)                   \
-  V(UnboxDouble,                         A_D, reg, reg, ___)                   \
-  V(CheckedUnboxDouble,                  A_D, reg, reg, ___)                   \
-  V(UnboxInt32,                        A_B_C, reg, reg, num)                   \
-  V(BoxInt32,                            A_D, reg, reg, ___)                   \
-  V(BoxUint32,                           A_D, reg, reg, ___)                   \
-  V(SmiToDouble,                         A_D, reg, reg, ___)                   \
-  V(DoubleToSmi,                         A_D, reg, reg, ___)                   \
-  V(DAdd,                              A_B_C, reg, reg, reg)                   \
-  V(DSub,                              A_B_C, reg, reg, reg)                   \
-  V(DMul,                              A_B_C, reg, reg, reg)                   \
-  V(DDiv,                              A_B_C, reg, reg, reg)                   \
-  V(DNeg,                                A_D, reg, reg, ___)                   \
-  V(DSqrt,                               A_D, reg, reg, ___)                   \
-  V(DMin,                              A_B_C, reg, reg, reg)                   \
-  V(DMax,                              A_B_C, reg, reg, reg)                   \
-  V(DCos,                                A_D, reg, reg, ___)                   \
-  V(DSin,                                A_D, reg, reg, ___)                   \
-  V(DPow,                              A_B_C, reg, reg, reg)                   \
-  V(DMod,                              A_B_C, reg, reg, reg)                   \
-  V(DTruncate,                           A_D, reg, reg, ___)                   \
-  V(DFloor,                              A_D, reg, reg, ___)                   \
-  V(DCeil,                               A_D, reg, reg, ___)                   \
-  V(DoubleToFloat,                       A_D, reg, reg, ___)                   \
-  V(FloatToDouble,                       A_D, reg, reg, ___)                   \
-  V(DoubleIsNaN,                           A, reg, ___, ___)                   \
-  V(DoubleIsInfinite,                      A, reg, ___, ___)                   \
-  V(StoreStaticTOS,                        D, lit, ___, ___)                   \
-  V(PushStatic,                            D, lit, ___, ___)                   \
-  V(InitStaticTOS,                         0, ___, ___, ___)                   \
-  V(IfNeStrictTOS,                         0, ___, ___, ___)                   \
-  V(IfEqStrictTOS,                         0, ___, ___, ___)                   \
-  V(IfNeStrictNumTOS,                      0, ___, ___, ___)                   \
-  V(IfEqStrictNumTOS,                      0, ___, ___, ___)                   \
-  V(IfSmiLtTOS,                            0, ___, ___, ___)                   \
-  V(IfSmiLeTOS,                            0, ___, ___, ___)                   \
-  V(IfSmiGeTOS,                            0, ___, ___, ___)                   \
-  V(IfSmiGtTOS,                            0, ___, ___, ___)                   \
-  V(IfNeStrict,                          A_D, reg, reg, ___)                   \
-  V(IfEqStrict,                          A_D, reg, reg, ___)                   \
-  V(IfLe,                                A_D, reg, reg, ___)                   \
-  V(IfLt,                                A_D, reg, reg, ___)                   \
-  V(IfGe,                                A_D, reg, reg, ___)                   \
-  V(IfGt,                                A_D, reg, reg, ___)                   \
-  V(IfULe,                               A_D, reg, reg, ___)                   \
-  V(IfULt,                               A_D, reg, reg, ___)                   \
-  V(IfUGe,                               A_D, reg, reg, ___)                   \
-  V(IfUGt,                               A_D, reg, reg, ___)                   \
-  V(IfDNe,                               A_D, reg, reg, ___)                   \
-  V(IfDEq,                               A_D, reg, reg, ___)                   \
-  V(IfDLe,                               A_D, reg, reg, ___)                   \
-  V(IfDLt,                               A_D, reg, reg, ___)                   \
-  V(IfDGe,                               A_D, reg, reg, ___)                   \
-  V(IfDGt,                               A_D, reg, reg, ___)                   \
-  V(IfNeStrictNum,                       A_D, reg, reg, ___)                   \
-  V(IfEqStrictNum,                       A_D, reg, reg, ___)                   \
-  V(IfEqNull,                              A, reg, ___, ___)                   \
-  V(IfNeNull,                              A, reg, ___, ___)                   \
-  V(CreateArrayTOS,                        0, ___, ___, ___)                   \
-  V(CreateArrayOpt,                    A_B_C, reg, reg, reg)                   \
-  V(Allocate,                              D, lit, ___, ___)                   \
-  V(AllocateT,                             0, ___, ___, ___)                   \
-  V(AllocateOpt,                         A_D, reg, lit, ___)                   \
-  V(AllocateTOpt,                        A_D, reg, lit, ___)                   \
-  V(StoreIndexedTOS,                       0, ___, ___, ___)                   \
-  V(StoreIndexed,                      A_B_C, reg, reg, reg)                   \
-  V(StoreIndexedUint8,                 A_B_C, reg, reg, reg)                   \
-  V(StoreIndexedExternalUint8,         A_B_C, reg, reg, reg)                   \
-  V(StoreIndexedOneByteString,         A_B_C, reg, reg, reg)                   \
-  V(StoreIndexedUint32,                A_B_C, reg, reg, reg)                   \
-  V(StoreIndexedFloat32,               A_B_C, reg, reg, reg)                   \
-  V(StoreIndexed4Float32,              A_B_C, reg, reg, reg)                   \
-  V(StoreIndexedFloat64,               A_B_C, reg, reg, reg)                   \
-  V(StoreIndexed8Float64,              A_B_C, reg, reg, reg)                   \
-  V(NoSuchMethod,                          0, ___, ___, ___)                   \
-  V(TailCall,                              0, ___, ___, ___)                   \
-  V(TailCallOpt,                         A_D, reg, reg, ___)                   \
-  V(LoadArgDescriptor,                     0, ___, ___, ___)                   \
-  V(LoadArgDescriptorOpt,                  A, reg, ___, ___)                   \
-  V(LoadFpRelativeSlot,                    X, reg, ___, ___)                   \
-  V(LoadFpRelativeSlotOpt,             A_B_Y, reg, reg, reg)                   \
-  V(StoreFpRelativeSlot,                    X, reg, ___, ___)                  \
-  V(StoreFpRelativeSlotOpt,             A_B_Y, reg, reg, reg)                  \
-  V(LoadIndexedTOS,                        0, ___, ___, ___)                   \
-  V(LoadIndexed,                       A_B_C, reg, reg, reg)                   \
-  V(LoadIndexedUint8,                  A_B_C, reg, reg, reg)                   \
-  V(LoadIndexedInt8,                   A_B_C, reg, reg, reg)                   \
-  V(LoadIndexedInt32,                  A_B_C, reg, reg, reg)                   \
-  V(LoadIndexedUint32,                 A_B_C, reg, reg, reg)                   \
-  V(LoadIndexedExternalUint8,          A_B_C, reg, reg, reg)                   \
-  V(LoadIndexedExternalInt8,           A_B_C, reg, reg, reg)                   \
-  V(LoadIndexedFloat32,                A_B_C, reg, reg, reg)                   \
-  V(LoadIndexed4Float32,               A_B_C, reg, reg, reg)                   \
-  V(LoadIndexedFloat64,                A_B_C, reg, reg, reg)                   \
-  V(LoadIndexed8Float64,               A_B_C, reg, reg, reg)                   \
-  V(LoadIndexedOneByteString,          A_B_C, reg, reg, reg)                   \
-  V(LoadIndexedTwoByteString,          A_B_C, reg, reg, reg)                   \
-  V(StoreField,                        A_B_C, reg, num, reg)                   \
-  V(StoreFieldExt,                       A_D, reg, reg, ___)                   \
-  V(StoreFieldTOS,                         D, lit, ___, ___)                   \
-  V(StoreContextParent,                    0, ___, ___, ___)                   \
-  V(StoreContextVar,                       D, num, ___, ___)                   \
-  V(LoadField,                         A_B_C, reg, reg, num)                   \
-  V(LoadFieldExt,                        A_D, reg, reg, ___)                   \
-  V(LoadUntagged,                      A_B_C, reg, reg, num)                   \
+  V(StoreLocal,                            X, xeg, ___, ___)                   \
   V(LoadFieldTOS,                          D, lit, ___, ___)                   \
+  V(StoreFieldTOS,                         D, lit, ___, ___)                   \
+  V(StoreIndexedTOS,                       0, ___, ___, ___)                   \
+  V(PushStatic,                            D, lit, ___, ___)                   \
+  V(StoreStaticTOS,                        D, lit, ___, ___)                   \
+  V(Jump,                                  T, tgt, ___, ___)                   \
+  V(JumpIfNoAsserts,                       T, tgt, ___, ___)                   \
+  V(JumpIfNotZeroTypeArgs,                 T, tgt, ___, ___)                   \
+  V(JumpIfEqStrict,                        T, tgt, ___, ___)                   \
+  V(JumpIfNeStrict,                        T, tgt, ___, ___)                   \
+  V(JumpIfTrue,                            T, tgt, ___, ___)                   \
+  V(JumpIfFalse,                           T, tgt, ___, ___)                   \
+  V(JumpIfNull,                            T, tgt, ___, ___)                   \
+  V(JumpIfNotNull,                         T, tgt, ___, ___)                   \
+  V(IndirectStaticCall,                  A_D, num, num, ___)                   \
+  V(InstanceCall,                        A_D, num, num, ___)                   \
+  V(NativeCall,                            D, lit, ___, ___)                   \
+  V(ReturnTOS,                             0, ___, ___, ___)                   \
+  V(AssertAssignable,                    A_D, num, lit, ___)                   \
+  V(AssertBoolean,                         A, num, ___, ___)                   \
+  V(AssertSubtype,                         0, ___, ___, ___)                   \
   V(LoadTypeArgumentsField,                D, lit, ___, ___)                   \
-  V(LoadContextParent,                     0, ___, ___, ___)                   \
-  V(LoadContextVar,                        D, num, ___, ___)                   \
-  V(BooleanNegateTOS,                      0, ___, ___, ___)                   \
-  V(BooleanNegate,                       A_D, reg, reg, ___)                   \
-  V(Throw,                                 A, num, ___, ___)                   \
-  V(Entry,                                 D, num, ___, ___)                   \
-  V(EntryFixed,                          A_D, num, num, ___)                   \
-  V(EntryOptional,                     A_B_C, num, num, num)                   \
-  V(EntryOptimized,                      A_D, num, num, ___)                   \
-  V(Frame,                                 D, num, ___, ___)                   \
-  V(SetFrame,                              A, num, ___, num)                   \
-  V(AllocateContext,                       D, num, ___, ___)                   \
-  V(AllocateUninitializedContext,        A_D, reg, num, ___)                   \
-  V(CloneContext,                          0, ___, ___, ___)                   \
-  V(MoveSpecial,                         A_D, reg, num, ___)                   \
   V(InstantiateType,                       D, lit, ___, ___)                   \
   V(InstantiateTypeArgumentsTOS,         A_D, num, lit, ___)                   \
-  V(InstanceOf,                            0, ___, ___, ___)                   \
-  V(BadTypeError,                          0, ___, ___, ___)                   \
-  V(AssertAssignable,                    A_D, num, lit, ___)                   \
-  V(AssertSubtype,                         0, ___, ___, ___)                   \
-  V(AssertBoolean,                         A, num, ___, ___)                   \
-  V(TestSmi,                             A_D, reg, reg, ___)                   \
-  V(TestCids,                            A_D, reg, num, ___)                   \
-  V(CheckSmi,                              A, reg, ___, ___)                   \
-  V(CheckEitherNonSmi,                   A_D, reg, reg, ___)                   \
-  V(CheckClassId,                        A_D, reg, num, ___)                   \
-  V(CheckClassIdRange,                   A_D, reg, num, ___)                   \
-  V(CheckBitTest,                        A_D, reg, num, ___)                   \
-  V(CheckCids,                         A_B_C, reg, num, num)                   \
-  V(CheckCidsByRange,                  A_B_C, reg, num, num)                   \
-  V(CheckStack,                            0, ___, ___, ___)                   \
-  V(CheckStackAlwaysExit,                  0, ___, ___, ___)                   \
-  V(CheckFunctionTypeArgs,               A_D, num, num, ___)                   \
-  V(DebugStep,                             0, ___, ___, ___)                   \
-  V(DebugBreak,                            A, num, ___, ___)                   \
-  V(Deopt,                               A_D, num, num, ___)                   \
-  V(DeoptRewind,                           0, ___, ___, ___)
+  V(Throw,                                 A, num, ___, ___)                   \
+  V(MoveSpecial,                         A_D, reg, num, ___)                   \
+  V(SetFrame,                              A, num, ___, num)                   \
+  V(BooleanNegateTOS,                      0, ___, ___, ___)                   \
+  V(EqualsNull,                            0, ___, ___, ___)                   \
+  V(NegateInt,                             0, ___, ___, ___)                   \
+  V(AddInt,                                0, ___, ___, ___)                   \
+  V(SubInt,                                0, ___, ___, ___)                   \
+  V(MulInt,                                0, ___, ___, ___)                   \
+  V(TruncDivInt,                           0, ___, ___, ___)                   \
+  V(ModInt,                                0, ___, ___, ___)                   \
+  V(BitAndInt,                             0, ___, ___, ___)                   \
+  V(BitOrInt,                              0, ___, ___, ___)                   \
+  V(BitXorInt,                             0, ___, ___, ___)                   \
+  V(ShlInt,                                0, ___, ___, ___)                   \
+  V(ShrInt,                                0, ___, ___, ___)                   \
+  V(CompareIntEq,                          0, ___, ___, ___)                   \
+  V(CompareIntGt,                          0, ___, ___, ___)                   \
+  V(CompareIntLt,                          0, ___, ___, ___)                   \
+  V(CompareIntGe,                          0, ___, ___, ___)                   \
+  V(CompareIntLe,                          0, ___, ___, ___)
 
 // clang-format on
 
@@ -1135,14 +560,17 @@
     return DecodeOpcode(instr) == KernelBytecode::kTrap;
   }
 
-  DART_FORCE_INLINE static bool IsCallOpcode(KBCInstr instr) {
+  DART_FORCE_INLINE static bool IsJumpOpcode(KBCInstr instr) {
     switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kStaticCall:
-      case KernelBytecode::kIndirectStaticCall:
-      case KernelBytecode::kInstanceCall:
-      case KernelBytecode::kInstanceCall1Opt:
-      case KernelBytecode::kInstanceCall2Opt:
-      case KernelBytecode::kDebugBreak:
+      case KernelBytecode::kJump:
+      case KernelBytecode::kJumpIfNoAsserts:
+      case KernelBytecode::kJumpIfNotZeroTypeArgs:
+      case KernelBytecode::kJumpIfEqStrict:
+      case KernelBytecode::kJumpIfNeStrict:
+      case KernelBytecode::kJumpIfTrue:
+      case KernelBytecode::kJumpIfFalse:
+      case KernelBytecode::kJumpIfNull:
+      case KernelBytecode::kJumpIfNotNull:
         return true;
 
       default:
@@ -1150,16 +578,10 @@
     }
   }
 
-  DART_FORCE_INLINE static bool IsFastSmiOpcode(KBCInstr instr) {
+  DART_FORCE_INLINE static bool IsCallOpcode(KBCInstr instr) {
     switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kAddTOS:
-      case KernelBytecode::kSubTOS:
-      case KernelBytecode::kMulTOS:
-      case KernelBytecode::kBitOrTOS:
-      case KernelBytecode::kBitAndTOS:
-      case KernelBytecode::kEqualTOS:
-      case KernelBytecode::kLessThanTOS:
-      case KernelBytecode::kGreaterThanTOS:
+      case KernelBytecode::kIndirectStaticCall:
+      case KernelBytecode::kInstanceCall:
         return true;
 
       default:
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index f4bbe19..d722ccb 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -108,14 +108,14 @@
 const Register THR = R14;  // Caches current thread in generated code.
 const Register CALLEE_SAVED_TEMP = RBX;
 
-// Exception object is passed in this register to the catch handlers when an
-// exception is thrown.
+// ABI for catch-clause entry point.
 const Register kExceptionObjectReg = RAX;
-
-// Stack trace object is passed in this register to the catch handlers when
-// an exception is thrown.
 const Register kStackTraceObjectReg = RDX;
 
+// ABI for write barrier stub.
+const Register kWriteBarrierObjectReg = RDX;
+const Register kWriteBarrierValueReg = RAX;
+
 typedef uint32_t RegList;
 const RegList kAllCpuRegistersList = 0xFFFF;
 const RegList kAllFpuRegistersList = 0xFFFF;
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index 240bd2d..4910847 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -139,7 +139,7 @@
 
 #if !defined(USING_SIMULATOR)
 #if HOST_OS_IOS
-void HostCPUFeatures::InitOnce() {
+void HostCPUFeatures::Init() {
   // TODO(24743): Actually check the CPU features and fail if we're missing
   // something assumed in a precompiled snapshot.
   hardware_ = "";
@@ -157,9 +157,9 @@
 #endif
 }
 #else  // HOST_OS_IOS
-void HostCPUFeatures::InitOnce() {
+void HostCPUFeatures::Init() {
   bool is_arm64 = false;
-  CpuInfo::InitOnce();
+  CpuInfo::Init();
   hardware_ = CpuInfo::GetCpuModel();
 
   // Check for ARMv5TE, ARMv6, ARMv7, or aarch64.
@@ -261,8 +261,8 @@
 
 #else
 
-void HostCPUFeatures::InitOnce() {
-  CpuInfo::InitOnce();
+void HostCPUFeatures::Init() {
+  CpuInfo::Init();
   hardware_ = CpuInfo::GetCpuModel();
 
 #if defined(TARGET_ARCH_ARM_5TE)
diff --git a/runtime/vm/cpu_arm.h b/runtime/vm/cpu_arm.h
index 8e7c4aad..35e7dd8 100644
--- a/runtime/vm/cpu_arm.h
+++ b/runtime/vm/cpu_arm.h
@@ -27,7 +27,7 @@
 
 class HostCPUFeatures : public AllStatic {
  public:
-  static void InitOnce();
+  static void Init();
   static void Cleanup();
   static const char* hardware() {
     DEBUG_ASSERT(initialized_);
@@ -92,7 +92,7 @@
 
 class TargetCPUFeatures : public AllStatic {
  public:
-  static void InitOnce() { HostCPUFeatures::InitOnce(); }
+  static void Init() { HostCPUFeatures::Init(); }
   static void Cleanup() { HostCPUFeatures::Cleanup(); }
   static bool double_truncate_round_supported() { return false; }
   static bool integer_division_supported() {
diff --git a/runtime/vm/cpu_arm64.cc b/runtime/vm/cpu_arm64.cc
index 32d8aec..c06e099 100644
--- a/runtime/vm/cpu_arm64.cc
+++ b/runtime/vm/cpu_arm64.cc
@@ -66,8 +66,8 @@
 #endif
 
 #if !defined(USING_SIMULATOR)
-void HostCPUFeatures::InitOnce() {
-  CpuInfo::InitOnce();
+void HostCPUFeatures::Init() {
+  CpuInfo::Init();
   hardware_ = CpuInfo::GetCpuModel();
 #if defined(DEBUG)
   initialized_ = true;
@@ -87,8 +87,8 @@
 
 #else  // !defined(USING_SIMULATOR)
 
-void HostCPUFeatures::InitOnce() {
-  CpuInfo::InitOnce();
+void HostCPUFeatures::Init() {
+  CpuInfo::Init();
   hardware_ = CpuInfo::GetCpuModel();
 #if defined(DEBUG)
   initialized_ = true;
diff --git a/runtime/vm/cpu_arm64.h b/runtime/vm/cpu_arm64.h
index df920d3..25481cb 100644
--- a/runtime/vm/cpu_arm64.h
+++ b/runtime/vm/cpu_arm64.h
@@ -20,7 +20,7 @@
 
 class HostCPUFeatures : public AllStatic {
  public:
-  static void InitOnce();
+  static void Init();
   static void Cleanup();
   static const char* hardware() {
     DEBUG_ASSERT(initialized_);
@@ -36,7 +36,7 @@
 
 class TargetCPUFeatures : public AllStatic {
  public:
-  static void InitOnce() { HostCPUFeatures::InitOnce(); }
+  static void Init() { HostCPUFeatures::Init(); }
   static void Cleanup() { HostCPUFeatures::Cleanup(); }
   static const char* hardware() { return HostCPUFeatures::hardware(); }
   static bool double_truncate_round_supported() { return false; }
diff --git a/runtime/vm/cpu_dbc.cc b/runtime/vm/cpu_dbc.cc
index f677b39..c6e9c6a 100644
--- a/runtime/vm/cpu_dbc.cc
+++ b/runtime/vm/cpu_dbc.cc
@@ -25,8 +25,8 @@
 bool HostCPUFeatures::initialized_ = false;
 #endif
 
-void HostCPUFeatures::InitOnce() {
-  CpuInfo::InitOnce();
+void HostCPUFeatures::Init() {
+  CpuInfo::Init();
   hardware_ = CpuInfo::GetCpuModel();
 #if defined(DEBUG)
   initialized_ = true;
diff --git a/runtime/vm/cpu_dbc.h b/runtime/vm/cpu_dbc.h
index a5cf4ee..08a4a83 100644
--- a/runtime/vm/cpu_dbc.h
+++ b/runtime/vm/cpu_dbc.h
@@ -12,7 +12,7 @@
 
 class HostCPUFeatures : public AllStatic {
  public:
-  static void InitOnce();
+  static void Init();
   static void Cleanup();
 
   static const char* hardware() {
@@ -29,7 +29,7 @@
 
 class TargetCPUFeatures : public AllStatic {
  public:
-  static void InitOnce() { HostCPUFeatures::InitOnce(); }
+  static void Init() { HostCPUFeatures::Init(); }
   static void Cleanup() { HostCPUFeatures::Cleanup(); }
 
   static const char* hardware() { return CPU::Id(); }
diff --git a/runtime/vm/cpu_ia32.cc b/runtime/vm/cpu_ia32.cc
index b6d21f2..08cfc5e 100644
--- a/runtime/vm/cpu_ia32.cc
+++ b/runtime/vm/cpu_ia32.cc
@@ -34,8 +34,8 @@
 bool HostCPUFeatures::initialized_ = false;
 #endif
 
-void HostCPUFeatures::InitOnce() {
-  CpuInfo::InitOnce();
+void HostCPUFeatures::Init() {
+  CpuInfo::Init();
 
   hardware_ = CpuInfo::GetCpuModel();
   sse2_supported_ = CpuInfo::FieldContains(kCpuInfoFeatures, "sse2");
diff --git a/runtime/vm/cpu_ia32.h b/runtime/vm/cpu_ia32.h
index 3c8d7af..d486327 100644
--- a/runtime/vm/cpu_ia32.h
+++ b/runtime/vm/cpu_ia32.h
@@ -14,7 +14,7 @@
 
 class HostCPUFeatures : public AllStatic {
  public:
-  static void InitOnce();
+  static void Init();
   static void Cleanup();
   static const char* hardware() {
     DEBUG_ASSERT(initialized_);
@@ -42,7 +42,7 @@
 
 class TargetCPUFeatures : public AllStatic {
  public:
-  static void InitOnce() { HostCPUFeatures::InitOnce(); }
+  static void Init() { HostCPUFeatures::Init(); }
   static void Cleanup() { HostCPUFeatures::Cleanup(); }
   static const char* hardware() { return HostCPUFeatures::hardware(); }
   static bool sse2_supported() { return HostCPUFeatures::sse2_supported(); }
diff --git a/runtime/vm/cpu_x64.cc b/runtime/vm/cpu_x64.cc
index 33c04b0..553e9cd 100644
--- a/runtime/vm/cpu_x64.cc
+++ b/runtime/vm/cpu_x64.cc
@@ -34,8 +34,8 @@
 bool HostCPUFeatures::initialized_ = false;
 #endif
 
-void HostCPUFeatures::InitOnce() {
-  CpuInfo::InitOnce();
+void HostCPUFeatures::Init() {
+  CpuInfo::Init();
   hardware_ = CpuInfo::GetCpuModel();
   sse4_1_supported_ = CpuInfo::FieldContains(kCpuInfoFeatures, "sse4_1") ||
                       CpuInfo::FieldContains(kCpuInfoFeatures, "sse4.1");
diff --git a/runtime/vm/cpu_x64.h b/runtime/vm/cpu_x64.h
index 3e70fce..716c5880 100644
--- a/runtime/vm/cpu_x64.h
+++ b/runtime/vm/cpu_x64.h
@@ -14,7 +14,7 @@
 
 class HostCPUFeatures : public AllStatic {
  public:
-  static void InitOnce();
+  static void Init();
   static void Cleanup();
   static const char* hardware() {
     DEBUG_ASSERT(initialized_);
@@ -42,7 +42,7 @@
 
 class TargetCPUFeatures : public AllStatic {
  public:
-  static void InitOnce() { HostCPUFeatures::InitOnce(); }
+  static void Init() { HostCPUFeatures::Init(); }
   static void Cleanup() { HostCPUFeatures::Cleanup(); }
   static const char* hardware() { return HostCPUFeatures::hardware(); }
   static bool sse2_supported() { return HostCPUFeatures::sse2_supported(); }
diff --git a/runtime/vm/cpuid.cc b/runtime/vm/cpuid.cc
index d0b450b..ce80696 100644
--- a/runtime/vm/cpuid.cc
+++ b/runtime/vm/cpuid.cc
@@ -34,7 +34,7 @@
 #endif
 }
 
-void CpuId::InitOnce() {
+void CpuId::Init() {
   uint32_t info[4] = {static_cast<uint32_t>(-1)};
 
   GetCpuId(0, info);
diff --git a/runtime/vm/cpuid.h b/runtime/vm/cpuid.h
index 180394e..fb7ff70 100644
--- a/runtime/vm/cpuid.h
+++ b/runtime/vm/cpuid.h
@@ -15,13 +15,13 @@
 class CpuId : public AllStatic {
  public:
 #if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
-  static void InitOnce();
+  static void Init();
   static void Cleanup();
 
   // Caller must free the result of field.
   static const char* field(CpuInfoIndices idx);
 #else
-  static void InitOnce() {}
+  static void Init() {}
   static void Cleanup() {}
   static const char* field(CpuInfoIndices idx) { return NULL; }
 #endif
diff --git a/runtime/vm/cpuinfo.h b/runtime/vm/cpuinfo.h
index 89e2432..9257bb2 100644
--- a/runtime/vm/cpuinfo.h
+++ b/runtime/vm/cpuinfo.h
@@ -36,7 +36,7 @@
 
 class CpuInfo : public AllStatic {
  public:
-  static void InitOnce();
+  static void Init();
   static void Cleanup();
 
   static const char* FieldName(CpuInfoIndices idx) {
diff --git a/runtime/vm/cpuinfo_android.cc b/runtime/vm/cpuinfo_android.cc
index 5aa7f93a..0807dfd 100644
--- a/runtime/vm/cpuinfo_android.cc
+++ b/runtime/vm/cpuinfo_android.cc
@@ -15,10 +15,10 @@
 CpuInfoMethod CpuInfo::method_ = kCpuInfoDefault;
 const char* CpuInfo::fields_[kCpuInfoMax] = {0};
 
-void CpuInfo::InitOnce() {
+void CpuInfo::Init() {
   // Initialize our read from /proc/cpuinfo.
   method_ = kCpuInfoSystem;
-  ProcCpuInfo::InitOnce();
+  ProcCpuInfo::Init();
 
 #if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
   fields_[kCpuInfoProcessor] = "vendor_id";
diff --git a/runtime/vm/cpuinfo_fuchsia.cc b/runtime/vm/cpuinfo_fuchsia.cc
index 6b3e076..d5d88cf 100644
--- a/runtime/vm/cpuinfo_fuchsia.cc
+++ b/runtime/vm/cpuinfo_fuchsia.cc
@@ -15,13 +15,13 @@
 CpuInfoMethod CpuInfo::method_ = kCpuInfoDefault;
 const char* CpuInfo::fields_[kCpuInfoMax] = {0};
 
-void CpuInfo::InitOnce() {
+void CpuInfo::Init() {
 // TODO(zra): Add support for HOST_ARCH_ARM64
 #if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
   method_ = kCpuInfoCpuId;
 
   // Initialize the CpuId information.
-  CpuId::InitOnce();
+  CpuId::Init();
 
   fields_[kCpuInfoProcessor] = "Processor";
   fields_[kCpuInfoModel] = "Hardware";
diff --git a/runtime/vm/cpuinfo_linux.cc b/runtime/vm/cpuinfo_linux.cc
index 94c4678..0c4fc99 100644
--- a/runtime/vm/cpuinfo_linux.cc
+++ b/runtime/vm/cpuinfo_linux.cc
@@ -20,7 +20,7 @@
 CpuInfoMethod CpuInfo::method_ = kCpuInfoDefault;
 const char* CpuInfo::fields_[kCpuInfoMax] = {0};
 
-void CpuInfo::InitOnce() {
+void CpuInfo::Init() {
 #if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
   fields_[kCpuInfoProcessor] = "vendor_id";
   fields_[kCpuInfoModel] = "model name";
@@ -28,7 +28,7 @@
   fields_[kCpuInfoFeatures] = "flags";
   fields_[kCpuInfoArchitecture] = "CPU architecture";
   method_ = kCpuInfoCpuId;
-  CpuId::InitOnce();
+  CpuId::Init();
 #elif defined(HOST_ARCH_ARM)
   fields_[kCpuInfoProcessor] = "Processor";
   fields_[kCpuInfoModel] = "model name";
@@ -36,7 +36,7 @@
   fields_[kCpuInfoFeatures] = "Features";
   fields_[kCpuInfoArchitecture] = "CPU architecture";
   method_ = kCpuInfoSystem;
-  ProcCpuInfo::InitOnce();
+  ProcCpuInfo::Init();
 #elif defined(HOST_ARCH_ARM64)
   fields_[kCpuInfoProcessor] = "Processor";
   fields_[kCpuInfoModel] = "CPU implementer";
@@ -44,7 +44,7 @@
   fields_[kCpuInfoFeatures] = "Features";
   fields_[kCpuInfoArchitecture] = "CPU architecture";
   method_ = kCpuInfoSystem;
-  ProcCpuInfo::InitOnce();
+  ProcCpuInfo::Init();
 #else
 #error Unrecognized target architecture
 #endif
diff --git a/runtime/vm/cpuinfo_macos.cc b/runtime/vm/cpuinfo_macos.cc
index b477202..cbc66f4 100644
--- a/runtime/vm/cpuinfo_macos.cc
+++ b/runtime/vm/cpuinfo_macos.cc
@@ -18,7 +18,7 @@
 CpuInfoMethod CpuInfo::method_ = kCpuInfoDefault;
 const char* CpuInfo::fields_[kCpuInfoMax] = {0};
 
-void CpuInfo::InitOnce() {
+void CpuInfo::Init() {
   method_ = kCpuInfoSystem;
 
   fields_[kCpuInfoProcessor] = "machdep.cpu.vendor";
diff --git a/runtime/vm/cpuinfo_win.cc b/runtime/vm/cpuinfo_win.cc
index bef8c84..5e5601e 100644
--- a/runtime/vm/cpuinfo_win.cc
+++ b/runtime/vm/cpuinfo_win.cc
@@ -19,11 +19,11 @@
 CpuInfoMethod CpuInfo::method_ = kCpuInfoDefault;
 const char* CpuInfo::fields_[kCpuInfoMax] = {0};
 
-void CpuInfo::InitOnce() {
+void CpuInfo::Init() {
   method_ = kCpuInfoCpuId;
 
   // Initialize the CpuId information.
-  CpuId::InitOnce();
+  CpuId::Init();
 
   fields_[kCpuInfoProcessor] = "Processor";
   fields_[kCpuInfoModel] = "Hardware";
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index dcc1ac8..7cc1f3b 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -109,19 +109,19 @@
 #undef CHECK_OFFSET
 }
 
-char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
-                     const uint8_t* instructions_snapshot,
-                     Dart_IsolateCreateCallback create,
-                     Dart_IsolateShutdownCallback shutdown,
-                     Dart_IsolateCleanupCallback cleanup,
-                     Dart_ThreadExitCallback thread_exit,
-                     Dart_FileOpenCallback file_open,
-                     Dart_FileReadCallback file_read,
-                     Dart_FileWriteCallback file_write,
-                     Dart_FileCloseCallback file_close,
-                     Dart_EntropySource entropy_source,
-                     Dart_GetVMServiceAssetsArchive get_service_assets,
-                     bool start_kernel_isolate) {
+char* Dart::Init(const uint8_t* vm_isolate_snapshot,
+                 const uint8_t* instructions_snapshot,
+                 Dart_IsolateCreateCallback create,
+                 Dart_IsolateShutdownCallback shutdown,
+                 Dart_IsolateCleanupCallback cleanup,
+                 Dart_ThreadExitCallback thread_exit,
+                 Dart_FileOpenCallback file_open,
+                 Dart_FileReadCallback file_read,
+                 Dart_FileWriteCallback file_write,
+                 Dart_FileCloseCallback file_close,
+                 Dart_EntropySource entropy_source,
+                 Dart_GetVMServiceAssetsArchive get_service_assets,
+                 bool start_kernel_isolate) {
   CheckOffsets();
   // TODO(iposva): Fix race condition here.
   if (vm_isolate_ != NULL || !Flags::Initialized()) {
@@ -153,36 +153,36 @@
     FLAG_optimization_counter_threshold = -1;
   }
 
-  FrameLayout::InitOnce();
+  FrameLayout::Init();
 
   set_thread_exit_callback(thread_exit);
   SetFileCallbacks(file_open, file_read, file_write, file_close);
   set_entropy_source_callback(entropy_source);
-  OS::InitOnce();
-  NOT_IN_PRODUCT(CodeObservers::InitOnce());
+  OS::Init();
+  NOT_IN_PRODUCT(CodeObservers::Init());
   start_time_micros_ = OS::GetCurrentMonotonicMicros();
-  VirtualMemory::InitOnce();
-  OSThread::InitOnce();
+  VirtualMemory::Init();
+  OSThread::Init();
   if (FLAG_support_timeline) {
-    Timeline::InitOnce();
+    Timeline::Init();
   }
   NOT_IN_PRODUCT(
-      TimelineDurationScope tds(Timeline::GetVMStream(), "Dart::InitOnce"));
-  Isolate::InitOnce();
-  IdleNotifier::InitOnce();
-  PortMap::InitOnce();
-  FreeListElement::InitOnce();
-  ForwardingCorpse::InitOnce();
-  Api::InitOnce();
-  NativeSymbolResolver::InitOnce();
-  NOT_IN_PRODUCT(Profiler::InitOnce());
-  SemiSpace::InitOnce();
-  NOT_IN_PRODUCT(Metric::InitOnce());
-  StoreBuffer::InitOnce();
-  MarkingStack::InitOnce();
+      TimelineDurationScope tds(Timeline::GetVMStream(), "Dart::Init"));
+  Isolate::InitVM();
+  IdleNotifier::Init();
+  PortMap::Init();
+  FreeListElement::Init();
+  ForwardingCorpse::Init();
+  Api::Init();
+  NativeSymbolResolver::Init();
+  NOT_IN_PRODUCT(Profiler::Init());
+  SemiSpace::Init();
+  NOT_IN_PRODUCT(Metric::Init());
+  StoreBuffer::Init();
+  MarkingStack::Init();
 
 #if defined(USING_SIMULATOR)
-  Simulator::InitOnce();
+  Simulator::Init();
 #endif
   // Create the read-only handles area.
   ASSERT(predefined_handles_ == NULL);
@@ -198,7 +198,7 @@
     // Setup default flags for the VM isolate.
     Dart_IsolateFlags api_flags;
     Isolate::FlagsInitialize(&api_flags);
-    vm_isolate_ = Isolate::Init("vm-isolate", api_flags, is_vm_isolate);
+    vm_isolate_ = Isolate::InitIsolate("vm-isolate", api_flags, is_vm_isolate);
     // Verify assumptions about executing in the VM isolate.
     ASSERT(vm_isolate_ == Isolate::Current());
     ASSERT(vm_isolate_ == Thread::Current()->isolate());
@@ -209,10 +209,10 @@
     HandleScope handle_scope(T);
     Object::InitNull(vm_isolate_);
     ObjectStore::Init(vm_isolate_);
-    TargetCPUFeatures::InitOnce();
-    Object::InitOnce(vm_isolate_);
-    ArgumentsDescriptor::InitOnce();
-    ICData::InitOnce();
+    TargetCPUFeatures::Init();
+    Object::Init(vm_isolate_);
+    ArgumentsDescriptor::Init();
+    ICData::Init();
     if (vm_isolate_snapshot != NULL) {
       NOT_IN_PRODUCT(TimelineDurationScope tds(Timeline::GetVMStream(),
                                                "VMIsolateSnapshot"));
@@ -237,15 +237,15 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
         return strdup("Precompiled runtime requires a precompiled snapshot");
 #else
-        StubCode::InitOnce();
-        Object::FinishInitOnce(vm_isolate_);
+        StubCode::Init();
+        Object::FinishInit(vm_isolate_);
         // MallocHooks can't be initialized until StubCode has been since stack
         // trace generation relies on stub methods that are generated in
-        // StubCode::InitOnce().
+        // StubCode::Init().
         // TODO(bkonyi) Split initialization for stack trace collection from the
         // initialization for the actual malloc hooks to increase accuracy of
         // memory consumption statistics.
-        MallocHooks::InitOnce();
+        MallocHooks::Init();
 #endif
       } else {
         return strdup("Invalid vm isolate snapshot seen");
@@ -256,7 +256,7 @@
         // Must copy before leaving the zone.
         return strdup(error.ToErrorCString());
       }
-      Object::FinishInitOnce(vm_isolate_);
+      Object::FinishInit(vm_isolate_);
 #if !defined(PRODUCT)
       if (tds.enabled()) {
         tds.SetNumArguments(2);
@@ -284,22 +284,22 @@
       return strdup("Missing vm isolate snapshot");
 #else
       vm_snapshot_kind_ = Snapshot::kNone;
-      StubCode::InitOnce();
-      Object::FinishInitOnce(vm_isolate_);
+      StubCode::Init();
+      Object::FinishInit(vm_isolate_);
       // MallocHooks can't be initialized until StubCode has been since stack
       // trace generation relies on stub methods that are generated in
-      // StubCode::InitOnce().
+      // StubCode::Init().
       // TODO(bkonyi) Split initialization for stack trace collection from the
       // initialization for the actual malloc hooks to increase accuracy of
       // memory consumption statistics.
-      MallocHooks::InitOnce();
-      Symbols::InitOnce(vm_isolate_);
+      MallocHooks::Init();
+      Symbols::Init(vm_isolate_);
 #endif
     }
     // We need to initialize the constants here for the vm isolate thread due to
     // bootstrapping issues.
     T->InitVMConstants();
-    Scanner::InitOnce();
+    Scanner::Init();
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
     // Dart VM requires at least SSE2.
     if (!TargetCPUFeatures::sse2_supported()) {
@@ -389,10 +389,10 @@
     OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutting down profiling\n",
                  UptimeMillis());
   }
-  Profiler::Shutdown();
+  Profiler::Cleanup();
 #endif  // !defined(PRODUCT)
 
-  NativeSymbolResolver::ShutdownOnce();
+  NativeSymbolResolver::Cleanup();
 
   {
     // Set the VM isolate as current isolate when shutting down
@@ -454,6 +454,7 @@
   WaitForIsolateShutdown();
 
   IdleNotifier::Stop();
+
   // Shutdown the thread pool. On return, all thread pool threads have exited.
   if (FLAG_trace_shutdown) {
     OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Deleting thread pool\n",
@@ -462,6 +463,10 @@
   delete thread_pool_;
   thread_pool_ = NULL;
 
+  Api::Cleanup();
+  delete predefined_handles_;
+  predefined_handles_ = NULL;
+
   // Disable creation of any new OSThread structures which means no more new
   // threads can do an EnterIsolate. This must come after isolate shutdown
   // because new threads may need to be spawned to shutdown the isolates.
@@ -485,12 +490,19 @@
   ShutdownIsolate();
   vm_isolate_ = NULL;
   ASSERT(Isolate::IsolateListLength() == 0);
+  PortMap::Cleanup();
   IdleNotifier::Cleanup();
-
+  ICData::Cleanup();
+  ArgumentsDescriptor::Cleanup();
   TargetCPUFeatures::Cleanup();
-  MarkingStack::ShutDown();
-  StoreBuffer::ShutDown();
-
+  MarkingStack::Cleanup();
+  StoreBuffer::Cleanup();
+  Object::Cleanup();
+  SemiSpace::Cleanup();
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  // Stubs are generated when not precompiled, clean them up.
+  StubCode::Cleanup();
+#endif
   // Delete the current thread's TLS and set it's TLS to null.
   // If it is the last thread then the destructor would call
   // OSThread::Cleanup.
@@ -506,25 +518,27 @@
     OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Deleting code observers\n",
                  UptimeMillis());
   }
-  NOT_IN_PRODUCT(CodeObservers::DeleteAll());
+  NOT_IN_PRODUCT(CodeObservers::Cleanup());
   if (FLAG_support_timeline) {
     if (FLAG_trace_shutdown) {
       OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutting down timeline\n",
                    UptimeMillis());
     }
-    Timeline::Shutdown();
+    Timeline::Cleanup();
   }
+  OS::Cleanup();
   if (FLAG_trace_shutdown) {
     OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Done\n", UptimeMillis());
   }
-  MallocHooks::TearDown();
+  MallocHooks::Cleanup();
+  Flags::Cleanup();
   return NULL;
 }
 
 Isolate* Dart::CreateIsolate(const char* name_prefix,
                              const Dart_IsolateFlags& api_flags) {
   // Create a new isolate.
-  Isolate* isolate = Isolate::Init(name_prefix, api_flags);
+  Isolate* isolate = Isolate::InitIsolate(name_prefix, api_flags);
   return isolate;
 }
 
@@ -704,8 +718,6 @@
     ADD_FLAG(asserts, enable_asserts, FLAG_enable_asserts);
     ADD_FLAG(error_on_bad_type, enable_error_on_bad_type,
              FLAG_error_on_bad_type);
-    ADD_FLAG(error_on_bad_override, enable_error_on_bad_override,
-             FLAG_error_on_bad_override);
     // sync-async and reify_generic_functions also affect deopt_ids.
     buffer.AddString(FLAG_sync_async ? " sync_async" : " no-sync_async");
     buffer.AddString(FLAG_reify_generic_functions
@@ -726,7 +738,12 @@
     buffer.AddString(TargetCPUFeatures::hardfp_supported() ? " hardfp"
                                                            : " softfp");
 #elif defined(TARGET_ARCH_ARM64)
-    buffer.AddString(" arm64");
+#if defined(TARGET_OS_FUCHSIA)
+    // See signal handler cheat in Assembler::EnterFrame.
+    buffer.AddString(" arm64-fuchsia");
+#else
+    buffer.AddString(" arm64-sysv");
+#endif
 #elif defined(TARGET_ARCH_IA32)
     buffer.AddString(" ia32");
 #elif defined(TARGET_ARCH_X64)
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index fe4f566..802859f 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -24,19 +24,19 @@
 
 class Dart : public AllStatic {
  public:
-  static char* InitOnce(const uint8_t* vm_snapshot_data,
-                        const uint8_t* vm_snapshot_instructions,
-                        Dart_IsolateCreateCallback create,
-                        Dart_IsolateShutdownCallback shutdown,
-                        Dart_IsolateCleanupCallback cleanup,
-                        Dart_ThreadExitCallback thread_exit,
-                        Dart_FileOpenCallback file_open,
-                        Dart_FileReadCallback file_read,
-                        Dart_FileWriteCallback file_write,
-                        Dart_FileCloseCallback file_close,
-                        Dart_EntropySource entropy_source,
-                        Dart_GetVMServiceAssetsArchive get_service_assets,
-                        bool start_kernel_isolate);
+  static char* Init(const uint8_t* vm_snapshot_data,
+                    const uint8_t* vm_snapshot_instructions,
+                    Dart_IsolateCreateCallback create,
+                    Dart_IsolateShutdownCallback shutdown,
+                    Dart_IsolateCleanupCallback cleanup,
+                    Dart_ThreadExitCallback thread_exit,
+                    Dart_FileOpenCallback file_open,
+                    Dart_FileReadCallback file_read,
+                    Dart_FileWriteCallback file_write,
+                    Dart_FileCloseCallback file_close,
+                    Dart_EntropySource entropy_source,
+                    Dart_GetVMServiceAssetsArchive get_service_assets,
+                    bool start_kernel_isolate);
   static const char* Cleanup();
 
   static Isolate* CreateIsolate(const char* name_prefix,
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 7a079a0..fbd78b1 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -478,9 +478,10 @@
   return scope;
 }
 
-void Api::InitOnce() {
-  ASSERT(api_native_key_ == kUnsetThreadLocalKey);
-  api_native_key_ = OSThread::CreateThreadLocal();
+void Api::Init() {
+  if (api_native_key_ == kUnsetThreadLocalKey) {
+    api_native_key_ = OSThread::CreateThreadLocal();
+  }
   ASSERT(api_native_key_ != kUnsetThreadLocalKey);
 }
 
@@ -511,6 +512,13 @@
   empty_string_handle_ = InitNewReadOnlyApiHandle(Symbols::Empty().raw());
 }
 
+void Api::Cleanup() {
+  true_handle_ = NULL;
+  false_handle_ = NULL;
+  null_handle_ = NULL;
+  empty_string_handle_ = NULL;
+}
+
 bool Api::StringGetPeerHelper(NativeArguments* arguments,
                               int arg_index,
                               void** peer) {
@@ -994,12 +1002,12 @@
         "Invalid Dart_InitializeParams version.");
   }
 
-  return Dart::InitOnce(
-      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);
+  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);
 }
 
 DART_EXPORT char* Dart_Cleanup() {
@@ -1155,13 +1163,6 @@
                              void* callback_data,
                              char** error) {
   API_TIMELINE_DURATION(Thread::Current());
-  // Setup default flags in case none were passed.
-  Dart_IsolateFlags api_flags;
-  if (flags == NULL) {
-    Isolate::FlagsInitialize(&api_flags);
-    flags = &api_flags;
-  }
-  flags->use_dart_frontend = true;
   return CreateIsolate(script_uri, main, NULL, NULL, NULL, NULL, kernel_buffer,
                        kernel_buffer_size, flags, callback_data, error);
 }
@@ -1479,47 +1480,6 @@
   return Api::Success();
 }
 
-DART_EXPORT Dart_Handle
-Dart_CreateScriptSnapshot(uint8_t** script_snapshot_buffer,
-                          intptr_t* script_snapshot_size) {
-  DARTSCOPE(Thread::Current());
-  API_TIMELINE_DURATION(T);
-  Isolate* I = T->isolate();
-  CHECK_NULL(script_snapshot_buffer);
-  CHECK_NULL(script_snapshot_size);
-  if (I->use_dart_frontend()) {
-    return Api::NewError("Script snapshots are not supported in Dart 2");
-  }
-  // Finalize all classes if needed.
-  Dart_Handle state = Api::CheckAndFinalizePendingClasses(T);
-  if (::Dart_IsError(state)) {
-    return state;
-  }
-  Library& lib = Library::Handle(Z, I->object_store()->root_library());
-
-#if defined(DEBUG)
-  I->heap()->CollectAllGarbage();
-  {
-    HeapIterationScope iteration(T);
-    CheckFunctionTypesVisitor check_canonical(T);
-    iteration.IterateObjects(&check_canonical);
-  }
-#endif  // #if defined(DEBUG)
-
-  ScriptSnapshotWriter writer(ApiReallocate);
-  writer.WriteScriptSnapshot(lib);
-  *script_snapshot_buffer = writer.buffer();
-  *script_snapshot_size = writer.BytesWritten();
-  return Api::Success();
-}
-
-DART_EXPORT bool Dart_IsSnapshot(const uint8_t* buffer, intptr_t buffer_size) {
-  if (buffer_size < Snapshot::kHeaderSize) {
-    return false;
-  }
-  return Snapshot::SetupFromBuffer(buffer) != NULL;
-}
-
 DART_EXPORT bool Dart_IsKernel(const uint8_t* buffer, intptr_t buffer_size) {
   if (buffer_size < 4) {
     return false;
@@ -1528,43 +1488,6 @@
          (buffer[3] == 0xef);
 }
 
-DART_EXPORT bool Dart_IsDart2Snapshot(const uint8_t* snapshot_buffer) {
-  if (snapshot_buffer == NULL) {
-    return false;
-  }
-  const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_buffer);
-  if (snapshot == NULL) {
-    return false;
-  }
-  const intptr_t snapshot_size = snapshot->length();
-  const char* expected_version = Version::SnapshotString();
-  ASSERT(expected_version != NULL);
-  const intptr_t version_len = strlen(expected_version);
-  if (snapshot_size < version_len) {
-    return false;
-  }
-
-  const char* version = reinterpret_cast<const char*>(snapshot->content());
-  ASSERT(version != NULL);
-  if (strncmp(version, expected_version, version_len)) {
-    return false;
-  }
-  const char* features = version + version_len;
-  ASSERT(features != NULL);
-  intptr_t pending_len = snapshot_size - version_len;
-  intptr_t buffer_len = Utils::StrNLen(features, pending_len);
-  // if buffer_len is less than pending_len it means we have a null terminated
-  // string and we can safely execute 'strstr' on it.
-  if ((buffer_len < pending_len)) {
-    if (strstr(features, "no-strong")) {
-      return false;
-    } else if (strstr(features, "strong")) {
-      return true;
-    }
-  }
-  return false;
-}
-
 DART_EXPORT char* Dart_IsolateMakeRunnable(Dart_Isolate isolate) {
   CHECK_NO_ISOLATE(Isolate::Current());
   API_TIMELINE_DURATION(Thread::Current());
@@ -5008,129 +4931,7 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
 #else
-  DARTSCOPE(Thread::Current());
-  API_TIMELINE_DURATION(T);
-  Isolate* I = T->isolate();
-  const String& url_str = Api::UnwrapStringHandle(Z, url);
-  if (url_str.IsNull()) {
-    RETURN_TYPE_ERROR(Z, url, String);
-  }
-  if (::Dart_IsNull(resolved_url)) {
-    resolved_url = url;
-  }
-  const String& resolved_url_str = Api::UnwrapStringHandle(Z, resolved_url);
-  if (resolved_url_str.IsNull()) {
-    RETURN_TYPE_ERROR(Z, resolved_url, String);
-  }
-  Library& library = Library::Handle(Z, I->object_store()->root_library());
-  if (!library.IsNull()) {
-    const String& library_url = String::Handle(Z, library.url());
-    return Api::NewError("%s: A script has already been loaded from '%s'.",
-                         CURRENT_FUNC, library_url.ToCString());
-  }
-  if (line_offset < 0) {
-    return Api::NewError("%s: argument 'line_offset' must be positive number",
-                         CURRENT_FUNC);
-  }
-  if (column_offset < 0) {
-    return Api::NewError("%s: argument 'column_offset' must be positive number",
-                         CURRENT_FUNC);
-  }
-  CHECK_CALLBACK_STATE(T);
-  CHECK_COMPILATION_ALLOWED(I);
-
-  Dart_Handle result;
-  if (I->use_dart_frontend()) {
-    return Api::NewError("%s: Should not be called with using Dart frontend",
-                         CURRENT_FUNC);
-  }
-
-  const String& source_str = Api::UnwrapStringHandle(Z, source);
-  if (source_str.IsNull()) {
-    RETURN_TYPE_ERROR(Z, source, String);
-  }
-
-  NoHeapGrowthControlScope no_growth_control;
-
-  library = Library::New(url_str);
-  library.set_debuggable(true);
-  library.Register(T);
-  I->object_store()->set_root_library(library);
-
-  const Script& script =
-      Script::Handle(Z, Script::New(url_str, resolved_url_str, source_str,
-                                    RawScript::kScriptTag));
-  script.SetLocationOffset(line_offset, column_offset);
-  CompileSource(T, library, script, &result);
-  return result;
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
-DART_EXPORT Dart_Handle Dart_LoadScriptFromSnapshot(const uint8_t* buffer,
-                                                    intptr_t buffer_len) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
-#else
-  DARTSCOPE(Thread::Current());
-  API_TIMELINE_DURATION(T);
-  Isolate* I = T->isolate();
-  StackZone zone(T);
-  if (buffer == NULL) {
-    RETURN_NULL_ERROR(buffer);
-  }
-  if (I->use_dart_frontend()) {
-    return Api::NewError("Script snapshots are not supported in Dart 2");
-  }
-  NoHeapGrowthControlScope no_growth_control;
-
-  const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
-  if (snapshot == NULL) {
-    return Api::NewError(
-        "%s expects parameter 'buffer' to be a script type"
-        " snapshot with a valid length.",
-        CURRENT_FUNC);
-  }
-  if (snapshot->kind() != Snapshot::kScript) {
-    return Api::NewError(
-        "%s expects parameter 'buffer' to be a script type"
-        " snapshot.",
-        CURRENT_FUNC);
-  }
-  if (snapshot->length() != buffer_len) {
-    return Api::NewError("%s: 'buffer_len' of %" Pd " is not equal to %" Pd
-                         " which is the expected length in the snapshot.",
-                         CURRENT_FUNC, buffer_len, snapshot->length());
-  }
-  Library& library = Library::Handle(Z, I->object_store()->root_library());
-  if (!library.IsNull()) {
-    const String& library_url = String::Handle(Z, library.url());
-    return Api::NewError("%s: A script has already been loaded from '%s'.",
-                         CURRENT_FUNC, library_url.ToCString());
-  }
-  CHECK_CALLBACK_STATE(T);
-  CHECK_COMPILATION_ALLOWED(I);
-
-  ASSERT(snapshot->kind() == Snapshot::kScript);
-  NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(),
-                                            "ScriptSnapshotReader"));
-
-  ScriptSnapshotReader reader(snapshot->content(), snapshot->length(), T);
-  const Object& tmp = Object::Handle(Z, reader.ReadScriptSnapshot());
-  if (tmp.IsError()) {
-    return Api::NewHandle(T, tmp.raw());
-  }
-#if !defined(PRODUCT)
-  if (tds2.enabled()) {
-    tds2.SetNumArguments(2);
-    tds2.FormatArgument(0, "snapshotSize", "%" Pd, snapshot->length());
-    tds2.FormatArgument(1, "heapSize", "%" Pd64,
-                        I->heap()->UsedInWords(Heap::kOld) * kWordSize);
-  }
-#endif  // !defined(PRODUCT)
-  library ^= tmp.raw();
-  library.set_debuggable(true);
-  I->object_store()->set_root_library(library);
-  return Api::NewHandle(T, library.raw());
+  return Api::NewError("%s: Should not be called in Dart 2", CURRENT_FUNC);
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
@@ -5153,6 +4954,11 @@
   CHECK_CALLBACK_STATE(T);
   CHECK_COMPILATION_ALLOWED(I);
 
+  // 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);
+
   const char* error = nullptr;
   kernel::Program* program =
       kernel::Program::ReadFromBuffer(buffer, buffer_size, &error);
@@ -5386,73 +5192,7 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
 #else
-  DARTSCOPE(Thread::Current());
-  API_TIMELINE_DURATION(T);
-  Isolate* I = T->isolate();
-
-  const String& url_str = Api::UnwrapStringHandle(Z, url);
-  if (url_str.IsNull()) {
-    RETURN_TYPE_ERROR(Z, url, String);
-  }
-  Dart_Handle result;
-  if (I->use_dart_frontend()) {
-    return Api::NewError("%s: Should not be called with using Dart frontend",
-                         CURRENT_FUNC);
-  }
-  if (::Dart_IsNull(resolved_url)) {
-    resolved_url = url;
-  }
-  const String& resolved_url_str = Api::UnwrapStringHandle(Z, resolved_url);
-  if (resolved_url_str.IsNull()) {
-    RETURN_TYPE_ERROR(Z, resolved_url, String);
-  }
-  const String& source_str = Api::UnwrapStringHandle(Z, source);
-  if (source_str.IsNull()) {
-    RETURN_TYPE_ERROR(Z, source, String);
-  }
-  if (line_offset < 0) {
-    return Api::NewError("%s: argument 'line_offset' must be positive number",
-                         CURRENT_FUNC);
-  }
-  if (column_offset < 0) {
-    return Api::NewError("%s: argument 'column_offset' must be positive number",
-                         CURRENT_FUNC);
-  }
-  CHECK_CALLBACK_STATE(T);
-  CHECK_COMPILATION_ALLOWED(I);
-
-  NoHeapGrowthControlScope no_growth_control;
-
-  Library& library = Library::Handle(Z, Library::LookupLibrary(T, url_str));
-  if (library.IsNull()) {
-    library = Library::New(url_str);
-    library.Register(T);
-  } else if (library.LoadInProgress() || library.Loaded() ||
-             library.LoadFailed()) {
-    // The source for this library has either been loaded or is in the
-    // process of loading.  Return an error.
-    return Api::NewError("%s: library '%s' has already been loaded.",
-                         CURRENT_FUNC, url_str.ToCString());
-  }
-  const Script& script =
-      Script::Handle(Z, Script::New(url_str, resolved_url_str, source_str,
-                                    RawScript::kLibraryTag));
-  script.SetLocationOffset(line_offset, column_offset);
-  CompileSource(T, library, script, &result);
-  // Propagate the error out right now.
-  if (::Dart_IsError(result)) {
-    return result;
-  }
-
-  // If this is the dart:_builtin library, register it with the VM.
-  if (url_str.Equals("dart:_builtin")) {
-    I->object_store()->set_builtin_library(library);
-    Dart_Handle state = Api::CheckAndFinalizePendingClasses(T);
-    if (::Dart_IsError(state)) {
-      return state;
-    }
-  }
-  return result;
+  return Api::NewError("%s: Should not be called in Dart 2", CURRENT_FUNC);
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
@@ -5469,6 +5209,11 @@
   CHECK_CALLBACK_STATE(T);
   CHECK_COMPILATION_ALLOWED(I);
 
+  // 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);
+
   const char* error = nullptr;
   kernel::Program* program =
       kernel::Program::ReadFromBuffer(buffer, buffer_size, &error);
@@ -6597,7 +6342,8 @@
 Dart_CreateAppJITSnapshotAsBlobs(uint8_t** isolate_snapshot_data_buffer,
                                  intptr_t* isolate_snapshot_data_size,
                                  uint8_t** isolate_snapshot_instructions_buffer,
-                                 intptr_t* isolate_snapshot_instructions_size) {
+                                 intptr_t* isolate_snapshot_instructions_size,
+                                 const uint8_t* reused_instructions) {
 #if defined(TARGET_ARCH_IA32)
   return Api::NewError("Snapshots with code are not supported on IA32.");
 #elif defined(DART_PRECOMPILED_RUNTIME)
@@ -6621,6 +6367,9 @@
   }
   BackgroundCompiler::Stop(I);
 
+  if (reused_instructions) {
+    DropCodeWithoutReusableInstructions(reused_instructions);
+  }
   ProgramVisitor::Dedup();
   Symbols::Compact(I);
 
@@ -6628,7 +6377,7 @@
                                             "WriteAppJITSnapshot"));
   BlobImageWriter isolate_image_writer(isolate_snapshot_instructions_buffer,
                                        ApiReallocate, 2 * MB /* initial_size */,
-                                       NULL, NULL);
+                                       NULL, NULL, reused_instructions);
   FullSnapshotWriter writer(Snapshot::kFullJIT, NULL,
                             isolate_snapshot_data_buffer, ApiReallocate, NULL,
                             &isolate_image_writer);
@@ -6638,6 +6387,10 @@
   *isolate_snapshot_instructions_size =
       isolate_image_writer.InstructionsBlobSize();
 
+  if (reused_instructions) {
+    *isolate_snapshot_instructions_buffer = NULL;
+  }
+
   return Api::Success();
 #endif
 }
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 76747d5..e6a1361 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -238,12 +238,15 @@
   // Retrieves the top ApiLocalScope.
   static ApiLocalScope* TopScope(Thread* thread);
 
-  // Performs one-time initialization needed by the API.
-  static void InitOnce();
+  // Performs initialization needed by the API.
+  static void Init();
 
   // Allocates handles for objects in the VM isolate.
   static void InitHandles();
 
+  // Cleanup
+  static void Cleanup();
+
   // Helper function to get the peer value of an external string object.
   static bool StringGetPeerHelper(NativeArguments* args,
                                   int arg_index,
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 9b50641..277ab8d 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -4,6 +4,7 @@
 
 #include "vm/dart_api_impl.h"
 #include "bin/builtin.h"
+#include "bin/dartutils.h"
 #include "include/dart_api.h"
 #include "include/dart_native_api.h"
 #include "include/dart_tools_api.h"
@@ -12,6 +13,7 @@
 #include "platform/utils.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler/jit/compiler.h"
+#include "vm/dart.h"
 #include "vm/dart_api_state.h"
 #include "vm/debugger_api_impl_test.h"
 #include "vm/heap/verifier.h"
@@ -26,6 +28,36 @@
 
 #ifndef PRODUCT
 
+UNIT_TEST_CASE(DartAPI_DartInitializeAfterCleanup) {
+  EXPECT(Dart_SetVMFlags(TesterState::argc, TesterState::argv) == NULL);
+  Dart_InitializeParams params;
+  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.start_kernel_isolate = true;
+
+  // Reinitialize and ensure we can execute Dart code.
+  EXPECT(Dart_Initialize(&params) == NULL);
+  {
+    TestIsolateScope scope;
+    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);
+  }
+  EXPECT(Dart_Cleanup() == NULL);
+}
+
 TEST_CASE(DartAPI_ErrorHandleBasics) {
   const char* kScriptChars =
       "void testMain() {\n"
@@ -57,7 +89,6 @@
   EXPECT(Dart_IsError(Dart_ErrorGetException(instance)));
   EXPECT(Dart_IsError(Dart_ErrorGetException(error)));
   EXPECT_VALID(Dart_ErrorGetException(exception));
-
   EXPECT(Dart_IsError(Dart_ErrorGetStackTrace(instance)));
   EXPECT(Dart_IsError(Dart_ErrorGetStackTrace(error)));
   EXPECT_VALID(Dart_ErrorGetStackTrace(exception));
@@ -3539,6 +3570,7 @@
     if (error != NULL) {
       return Dart_NewApiError(error);
     }
+    TestCaseBase::AddToKernelBuffers(kernel_buffer);
     return Dart_LoadScriptFromKernel(kernel_buffer, kernel_buffer_size);
   }
 }
@@ -3561,8 +3593,6 @@
   api_flags.enable_type_checks = true;
   api_flags.enable_asserts = true;
   api_flags.enable_error_on_bad_type = true;
-  api_flags.enable_error_on_bad_override = true;
-  api_flags.use_dart_frontend = FLAG_use_dart_frontend;
   char* err;
   Dart_Isolate isolate =
       Dart_CreateIsolate(NULL, NULL, bin::core_isolate_snapshot_data,
@@ -5715,6 +5745,9 @@
 }
 
 TEST_CASE(DartAPI_LoadScript) {
+  if (FLAG_use_dart_frontend) {
+    return;
+  }
   const char* kScriptChars =
       "main() {"
       "  return 12345;"
@@ -6701,13 +6734,10 @@
     int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile);
     lib = TestCase::LoadTestScriptWithDFE(sourcefiles_count, sourcefiles, NULL,
                                           true);
-    if (TestCase::UsingStrongMode()) {
-      EXPECT_ERROR(lib,
-                   "Compilation failed file:///test-lib:4:10:"
-                   " Error: Setter not found: 'foo'");
-      return;
-    }
-    EXPECT_VALID(lib);
+    EXPECT_ERROR(lib,
+                 "Compilation failed file:///test-lib:4:10:"
+                 " Error: Setter not found: 'foo'");
+    return;
   } else {
     Dart_Handle url = NewString(TestCase::url());
     Dart_Handle source = NewString(kScriptChars);
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 689d488..6b4b612 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -504,7 +504,6 @@
                                                      intptr_t object_id) {
   switch (class_id) {
     case kClassCid: {
-      Read<bool>();  // Consume the is_in_fullsnapshot indicator.
       Dart_CObject_Internal* object = AllocateDartCObjectClass();
       AddBackRef(object_id, object, kIsDeserialized);
       object->internal.as_class.library_url = ReadObjectImpl();
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 5708a0d..36aead1 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -502,12 +502,19 @@
   return descriptor.raw();
 }
 
-void ArgumentsDescriptor::InitOnce() {
+void ArgumentsDescriptor::Init() {
   for (int i = 0; i < kCachedDescriptorCount; i++) {
     cached_args_descriptors_[i] = NewNonCached(/*type_args_len=*/0, i, false);
   }
 }
 
+void ArgumentsDescriptor::Cleanup() {
+  for (int i = 0; i < kCachedDescriptorCount; i++) {
+    // Don't free pointers to RawArray objects managed by the VM.
+    cached_args_descriptors_[i] = NULL;
+  }
+}
+
 RawObject* DartLibraryCalls::InstanceCreate(const Library& lib,
                                             const String& class_name,
                                             const String& constructor_name,
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index cfcd404..65a6f0d 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -73,7 +73,10 @@
   static RawArray* New(intptr_t type_args_len, intptr_t num_arguments);
 
   // Initialize the preallocated fixed length arguments descriptors cache.
-  static void InitOnce();
+  static void Init();
+
+  // Clear the preallocated fixed length arguments descriptors cache.
+  static void Cleanup();
 
   enum { kCachedDescriptorCount = 32 };
 
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 6827707..c9a2374 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -2876,17 +2876,9 @@
 
         bool has_func_literal_initializer = false;
 #ifndef DART_PRECOMPILED_RUNTIME
-        if (isolate_->use_dart_frontend()) {
-          has_func_literal_initializer =
-              kernel::FieldHasFunctionLiteralInitializer(field, &start, &end);
-        } else {
+        has_func_literal_initializer =
+            kernel::FieldHasFunctionLiteralInitializer(field, &start, &end);
 #endif  // !DART_PRECOMPILED_RUNTIME
-          has_func_literal_initializer =
-              Parser::FieldHasFunctionLiteralInitializer(field, &start, &end);
-#ifndef DART_PRECOMPILED_RUNTIME
-        }
-#endif  // !DART_PRECOMPILED_RUNTIME
-
         if (has_func_literal_initializer) {
           if ((start <= token_pos && token_pos <= end) ||
               (token_pos <= start && start <= last_token_pos)) {
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index b597adb..88792e5 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -268,14 +268,17 @@
 
     const uint8_t* kernel_bytes = compilation_result.kernel;
     intptr_t kernel_length = compilation_result.kernel_size;
-    return Api::NewHandle(T, lib.EvaluateCompiledExpression(
-                                 kernel_bytes, kernel_length,
-                                 /* type_definitions= */
-                                 Array::empty_array(),
-                                 /* param_values= */
-                                 Array::empty_array(),
-                                 /* type_param_values= */
-                                 TypeArguments::null_type_arguments()));
+    Dart_Handle result = Api::NewHandle(
+        T,
+        lib.EvaluateCompiledExpression(kernel_bytes, kernel_length,
+                                       /* type_definitions= */
+                                       Array::empty_array(),
+                                       /* param_values= */
+                                       Array::empty_array(),
+                                       /* type_param_values= */
+                                       TypeArguments::null_type_arguments()));
+    free(const_cast<uint8_t*>(kernel_bytes));
+    return result;
   }
 }
 
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 61e06aa..c52cf87 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -211,6 +211,7 @@
     "Enable magical pragmas for testing purposes. Use at your own risk!")      \
   R(eliminate_type_checks, true, bool, true,                                   \
     "Eliminate type checks when allowed by static type analysis.")             \
-  P(enable_interpreter, bool, false, "Enable interpreting kernel bytecode.")
+  P(enable_interpreter, bool, false, "Enable interpreting kernel bytecode.")   \
+  D(support_rr, bool, false, "Support running within RR.")
 
 #endif  // RUNTIME_VM_FLAG_LIST_H_
diff --git a/runtime/vm/flags.cc b/runtime/vm/flags.cc
index 7b454b3..3cd3422 100644
--- a/runtime/vm/flags.cc
+++ b/runtime/vm/flags.cc
@@ -177,6 +177,11 @@
          (flag->bool_ptr_ != NULL) && (*flag->bool_ptr_ == true);
 }
 
+void Flags::Cleanup() {
+  ASSERT(initialized_);
+  initialized_ = false;
+}
+
 void Flags::AddFlag(Flag* flag) {
   ASSERT(!initialized_);
   if (num_flags_ == capacity_) {
diff --git a/runtime/vm/flags.h b/runtime/vm/flags.h
index e72b33f..d230f5d 100644
--- a/runtime/vm/flags.h
+++ b/runtime/vm/flags.h
@@ -71,6 +71,8 @@
 
   static bool Initialized() { return initialized_; }
 
+  static void Cleanup();
+
 #ifndef PRODUCT
   static void PrintJSON(JSONStream* js);
 #endif  // !PRODUCT
diff --git a/runtime/vm/hash_map.h b/runtime/vm/hash_map.h
index fb6ff15..95194aa 100644
--- a/runtime/vm/hash_map.h
+++ b/runtime/vm/hash_map.h
@@ -43,6 +43,7 @@
     return Lookup(key) != NULL;
   }
 
+  intptr_t Size() const { return count_; }
   bool IsEmpty() const { return count_ == 0; }
 
   virtual void Clear() {
diff --git a/runtime/vm/heap/become.cc b/runtime/vm/heap/become.cc
index 8dfad74..74a72dd 100644
--- a/runtime/vm/heap/become.cc
+++ b/runtime/vm/heap/become.cc
@@ -40,7 +40,7 @@
   return result;
 }
 
-void ForwardingCorpse::InitOnce() {
+void ForwardingCorpse::Init() {
   ASSERT(sizeof(ForwardingCorpse) == kObjectAlignment);
   ASSERT(OFFSET_OF(ForwardingCorpse, tags_) == Object::tags_offset());
 }
diff --git a/runtime/vm/heap/become.h b/runtime/vm/heap/become.h
index 9d3263a2..e962735 100644
--- a/runtime/vm/heap/become.h
+++ b/runtime/vm/heap/become.h
@@ -33,7 +33,7 @@
 
   static ForwardingCorpse* AsForwarder(uword addr, intptr_t size);
 
-  static void InitOnce();
+  static void Init();
 
   // Used to allocate class for forwarding corpses in Object::InitOnce.
   class FakeInstance {
diff --git a/runtime/vm/heap/freelist.cc b/runtime/vm/heap/freelist.cc
index 39caeb0..a2012d5 100644
--- a/runtime/vm/heap/freelist.cc
+++ b/runtime/vm/heap/freelist.cc
@@ -44,7 +44,7 @@
   // writable.
 }
 
-void FreeListElement::InitOnce() {
+void FreeListElement::Init() {
   ASSERT(sizeof(FreeListElement) == kObjectAlignment);
   ASSERT(OFFSET_OF(FreeListElement, tags_) == Object::tags_offset());
 }
diff --git a/runtime/vm/heap/freelist.h b/runtime/vm/heap/freelist.h
index 10e0beb..26f2c9b 100644
--- a/runtime/vm/heap/freelist.h
+++ b/runtime/vm/heap/freelist.h
@@ -35,7 +35,7 @@
 
   static FreeListElement* AsElement(uword addr, intptr_t size);
 
-  static void InitOnce();
+  static void Init();
 
   static intptr_t HeaderSizeFor(intptr_t size);
 
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 7e8072c..96b0eec 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -6,6 +6,7 @@
 
 #include "platform/assert.h"
 #include "platform/utils.h"
+#include "vm/compiler/jit/compiler.h"
 #include "vm/flags.h"
 #include "vm/heap/pages.h"
 #include "vm/heap/safepoint.h"
@@ -836,8 +837,8 @@
          (type == kMarkCompact && gc_old_space_in_progress_));
 #ifndef PRODUCT
   if (FLAG_support_service && Service::gc_stream.enabled() &&
-      !ServiceIsolate::IsServiceIsolateDescendant(Isolate::Current())) {
-    ServiceEvent event(Isolate::Current(), ServiceEvent::kGC);
+      !Isolate::IsVMInternalIsolate(isolate())) {
+    ServiceEvent event(isolate(), ServiceEvent::kGC);
     event.set_gc_stats(&stats_);
     Service::HandleEvent(&event);
   }
@@ -976,4 +977,22 @@
   }
 }
 
+BumpAllocateScope::BumpAllocateScope(Thread* thread)
+    : StackResource(thread), no_reload_scope_(thread->isolate(), thread) {
+  ASSERT(!thread->bump_allocate());
+  // If the background compiler thread is not disabled, there will be a cycle
+  // between the symbol table lock and the old space data lock.
+  BackgroundCompiler::Disable(thread->isolate());
+  thread->heap()->WaitForMarkerTasks(thread);
+  thread->heap()->old_space()->AcquireDataLock();
+  thread->set_bump_allocate(true);
+}
+
+BumpAllocateScope::~BumpAllocateScope() {
+  ASSERT(thread()->bump_allocate());
+  thread()->set_bump_allocate(false);
+  thread()->heap()->old_space()->ReleaseDataLock();
+  BackgroundCompiler::Enable(thread()->isolate());
+}
+
 }  // namespace dart
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index d2d90dd..6f205184 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -13,6 +13,7 @@
 #include "vm/heap/scavenger.h"
 #include "vm/heap/spaces.h"
 #include "vm/heap/weak_table.h"
+#include "vm/isolate.h"
 
 namespace dart {
 
@@ -431,6 +432,26 @@
   ~WritableVMIsolateScope();
 };
 
+// This scope forces heap growth, forces use of the bump allocator, and
+// takes the page lock. It is useful e.g. at program startup when allocating
+// many objects into old gen (like libraries, classes, and functions).
+class BumpAllocateScope : StackResource {
+ public:
+  explicit BumpAllocateScope(Thread* thread);
+  ~BumpAllocateScope();
+
+ private:
+  // This is needed to avoid a GC while we hold the page lock, which would
+  // trigger a deadlock.
+  NoHeapGrowthControlScope no_growth_control_;
+
+  // A reload will try to allocate into new gen, which could trigger a
+  // scavenge and deadlock.
+  NoReloadScope no_reload_scope_;
+
+  DISALLOW_COPY_AND_ASSIGN(BumpAllocateScope);
+};
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_HEAP_HEAP_H_
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index ffa17fd..ba234b6 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -454,6 +454,12 @@
   freelist_[HeapPage::kData].mutex()->Unlock();
 }
 
+#if defined(DEBUG)
+bool PageSpace::CurrentThreadOwnsDataLock() {
+  return freelist_[HeapPage::kData].mutex()->IsOwnedByCurrentThread();
+}
+#endif
+
 void PageSpace::AllocateExternal(intptr_t cid, intptr_t size) {
   intptr_t size_in_words = size >> kWordSizeLog2;
   AtomicOperations::IncrementBy(&(usage_.external_in_words), size_in_words);
@@ -1313,8 +1319,12 @@
   if (heap_growth_ratio_ == 100) {
     return false;
   }
-  return after.CombinedCapacityInWords() >
-         (gc_threshold_in_words_ + heap_->new_space()->CapacityInWords());
+#if defined(TARGET_ARCH_IA32) || !defined(CONCURRENT_MARKING)
+  intptr_t headroom = 0;
+#else
+  intptr_t headroom = heap_->new_space()->CapacityInWords();
+#endif
+  return after.CombinedCapacityInWords() > (gc_threshold_in_words_ + headroom);
 }
 
 bool PageSpaceController::AlmostNeedsGarbageCollection(SpaceUsage after) const {
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index 4255f93..047a3b7 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -336,6 +336,9 @@
   // Bulk data allocation.
   void AcquireDataLock();
   void ReleaseDataLock();
+#if defined(DEBUG)
+  bool CurrentThreadOwnsDataLock();
+#endif
 
   uword TryAllocateDataLocked(intptr_t size, GrowthPolicy growth_policy) {
     bool is_protected = false;
diff --git a/runtime/vm/heap/pointer_block.cc b/runtime/vm/heap/pointer_block.cc
index 2d0d2a1..52b4563 100644
--- a/runtime/vm/heap/pointer_block.cc
+++ b/runtime/vm/heap/pointer_block.cc
@@ -27,15 +27,17 @@
 Mutex* BlockStack<BlockSize>::global_mutex_ = NULL;
 
 template <int BlockSize>
-void BlockStack<BlockSize>::InitOnce() {
+void BlockStack<BlockSize>::Init() {
   global_empty_ = new List();
-  global_mutex_ = new Mutex();
+  if (global_mutex_ == NULL) {
+    global_mutex_ = new Mutex();
+  }
 }
 
 template <int BlockSize>
-void BlockStack<BlockSize>::ShutDown() {
+void BlockStack<BlockSize>::Cleanup() {
   delete global_empty_;
-  delete global_mutex_;
+  global_empty_ = NULL;
 }
 
 template <int BlockSize>
diff --git a/runtime/vm/heap/pointer_block.h b/runtime/vm/heap/pointer_block.h
index e1fd642..609ea97 100644
--- a/runtime/vm/heap/pointer_block.h
+++ b/runtime/vm/heap/pointer_block.h
@@ -87,8 +87,8 @@
 
   BlockStack();
   ~BlockStack();
-  static void InitOnce();
-  static void ShutDown();
+  static void Init();
+  static void Cleanup();
 
   // Partially filled blocks can be reused, and there is an "inifite" supply
   // of empty blocks (reused or newly allocated). In any case, the caller
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index b732ff1..17872dd 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -289,12 +289,19 @@
 Mutex* SemiSpace::mutex_ = NULL;
 SemiSpace* SemiSpace::cache_ = NULL;
 
-void SemiSpace::InitOnce() {
-  ASSERT(mutex_ == NULL);
-  mutex_ = new Mutex();
+void SemiSpace::Init() {
+  if (mutex_ == NULL) {
+    mutex_ = new Mutex();
+  }
   ASSERT(mutex_ != NULL);
 }
 
+void SemiSpace::Cleanup() {
+  MutexLocker locker(mutex_);
+  delete cache_;
+  cache_ = NULL;
+}
+
 SemiSpace* SemiSpace::New(intptr_t size_in_words, const char* name) {
   {
     MutexLocker locker(mutex_);
diff --git a/runtime/vm/heap/scavenger.h b/runtime/vm/heap/scavenger.h
index 45e0c3c..412395d 100644
--- a/runtime/vm/heap/scavenger.h
+++ b/runtime/vm/heap/scavenger.h
@@ -28,7 +28,8 @@
 // Wrapper around VirtualMemory that adds caching and handles the empty case.
 class SemiSpace {
  public:
-  static void InitOnce();
+  static void Init();
+  static void Cleanup();
 
   // Get a space of the given size. Returns NULL on out of memory. If size is 0,
   // returns an empty space: pointer(), start() and end() all return NULL.
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 28dda6a..4da29a8 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -12,6 +12,7 @@
 #include "vm/heap/heap.h"
 #include "vm/json_writer.h"
 #include "vm/object.h"
+#include "vm/program_visitor.h"
 #include "vm/stub_code.h"
 #include "vm/timeline.h"
 #include "vm/type_testing_stubs.h"
@@ -30,6 +31,11 @@
             "Print sizes of all instruction objects to the given file");
 #endif
 
+DEFINE_FLAG(bool,
+            trace_reused_instructions,
+            false,
+            "Print code that lacks reusable instructions");
+
 intptr_t ObjectOffsetTrait::Hashcode(Key key) {
   RawObject* obj = key;
   ASSERT(!obj->IsSmi());
@@ -72,11 +78,13 @@
 }
 
 ImageWriter::ImageWriter(const void* shared_objects,
-                         const void* shared_instructions)
+                         const void* shared_instructions,
+                         const void* reused_instructions)
     : next_data_offset_(0), next_text_offset_(0), objects_(), instructions_() {
   ResetOffsets();
   SetupShared(&shared_objects_, shared_objects);
   SetupShared(&shared_instructions_, shared_instructions);
+  SetupShared(&reuse_instructions_, reused_instructions);
 }
 
 void ImageWriter::SetupShared(ObjectOffsetMap* map, const void* shared_image) {
@@ -100,6 +108,15 @@
 
 int32_t ImageWriter::GetTextOffsetFor(RawInstructions* instructions,
                                       RawCode* code) {
+  if (!reuse_instructions_.IsEmpty()) {
+    ObjectOffsetPair* pair = reuse_instructions_.Lookup(instructions);
+    if (pair == NULL) {
+      // Code should have been removed by DropCodeWithoutReusableInstructions.
+      FATAL("Expected instructions to reuse\n");
+    }
+    return pair->offset;
+  }
+
   ObjectOffsetPair* pair = shared_instructions_.Lookup(instructions);
   if (pair != NULL) {
     // Negative offsets tell the reader the offset is w/r/t the shared
@@ -160,6 +177,11 @@
   js.OpenArray();
   for (intptr_t i = 0; i < instructions_.length(); i++) {
     auto& data = instructions_[i];
+    if (data.code_->IsNull()) {
+      // TODO(34650): Type testing stubs are added to the serializer without
+      // their Code.
+      continue;
+    }
     owner = data.code_->owner();
     js.OpenObject();
     if (owner.IsFunction()) {
@@ -280,7 +302,7 @@
                                          void* callback_data,
                                          const void* shared_objects,
                                          const void* shared_instructions)
-    : ImageWriter(shared_objects, shared_instructions),
+    : ImageWriter(shared_objects, shared_instructions, NULL),
       assembly_stream_(512 * KB, callback, callback_data),
       dwarf_(NULL) {
 #if defined(DART_PRECOMPILER)
@@ -531,8 +553,9 @@
                                  ReAlloc alloc,
                                  intptr_t initial_size,
                                  const void* shared_objects,
-                                 const void* shared_instructions)
-    : ImageWriter(shared_objects, shared_instructions),
+                                 const void* shared_instructions,
+                                 const void* reused_instructions)
+    : ImageWriter(shared_objects, shared_instructions, reused_instructions),
       instructions_blob_stream_(instructions_blob_buffer, alloc, initial_size) {
 }
 
@@ -644,4 +667,67 @@
   return result;
 }
 
+void DropCodeWithoutReusableInstructions(const void* reused_instructions) {
+  class DropCodeVisitor : public FunctionVisitor, public ClassVisitor {
+   public:
+    explicit DropCodeVisitor(const void* reused_instructions)
+        : code_(Code::Handle()), instructions_(Instructions::Handle()) {
+      ImageWriter::SetupShared(&reused_instructions_, reused_instructions);
+      if (FLAG_trace_reused_instructions) {
+        OS::PrintErr("%" Pd " reusable instructions\n",
+                     reused_instructions_.Size());
+      }
+    }
+
+    void Visit(const Class& cls) {
+      code_ = cls.allocation_stub();
+      if (!code_.IsNull() && !IsAvailable(code_)) {
+        if (FLAG_trace_reused_instructions) {
+          OS::PrintErr("No reusable instructions for %s\n", cls.ToCString());
+        }
+        cls.DisableAllocationStub();
+      }
+    }
+
+    void Visit(const Function& func) {
+      if (func.HasCode()) {
+        code_ = func.CurrentCode();
+        if (!IsAvailable(code_)) {
+          if (FLAG_trace_reused_instructions) {
+            OS::PrintErr("No reusable instructions for %s\n", func.ToCString());
+          }
+          func.ClearCode();
+          func.ClearICDataArray();
+          return;
+        }
+      }
+      code_ = func.unoptimized_code();
+      if (!code_.IsNull() && !IsAvailable(code_)) {
+        if (FLAG_trace_reused_instructions) {
+          OS::PrintErr("No reusable instructions for %s\n", func.ToCString());
+        }
+        func.ClearCode();
+        func.ClearICDataArray();
+        return;
+      }
+    }
+
+   private:
+    bool IsAvailable(const Code& code) {
+      ObjectOffsetPair* pair = reused_instructions_.Lookup(code.instructions());
+      return pair != NULL;
+    }
+
+    ObjectOffsetMap reused_instructions_;
+    Code& code_;
+    Instructions& instructions_;
+
+    DISALLOW_COPY_AND_ASSIGN(DropCodeVisitor);
+  };
+
+  DropCodeVisitor visitor(reused_instructions);
+  ProgramVisitor::VisitClasses(&visitor);
+  ProgramVisitor::VisitFunctions(&visitor);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index a4af7e4..b5ba9dc 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -96,10 +96,12 @@
 
 class ImageWriter : public ValueObject {
  public:
-  ImageWriter(const void* shared_objects, const void* shared_instructions);
+  ImageWriter(const void* shared_objects,
+              const void* shared_instructions,
+              const void* reused_instructions);
   virtual ~ImageWriter() {}
 
-  void SetupShared(ObjectOffsetMap* map, const void* shared_image);
+  static void SetupShared(ObjectOffsetMap* map, const void* shared_image);
   void ResetOffsets() {
     next_data_offset_ = Image::kHeaderSize;
     next_text_offset_ = Image::kHeaderSize;
@@ -156,6 +158,7 @@
   GrowableArray<InstructionsData> instructions_;
   ObjectOffsetMap shared_objects_;
   ObjectOffsetMap shared_instructions_;
+  ObjectOffsetMap reuse_instructions_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(ImageWriter);
@@ -196,7 +199,8 @@
                   ReAlloc alloc,
                   intptr_t initial_size,
                   const void* shared_objects,
-                  const void* shared_instructions);
+                  const void* shared_instructions,
+                  const void* reused_instructions = NULL);
 
   virtual void WriteText(WriteStream* clustered_stream, bool vm);
 
@@ -210,6 +214,8 @@
   DISALLOW_COPY_AND_ASSIGN(BlobImageWriter);
 };
 
+void DropCodeWithoutReusableInstructions(const void* reused_instructions);
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_IMAGE_SNAPSHOT_H_
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index b0bbb27..b13a27e 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -92,8 +92,11 @@
  public:
 #define DEFINE_CASTS(Type)                                                     \
   DART_FORCE_INLINE static Raw##Type* CastTo##Type(RawObject* obj) {           \
-    ASSERT((k##Type##Cid == kSmiCid) ? !obj->IsHeapObject()                    \
-                                     : obj->Is##Type());                       \
+    ASSERT((k##Type##Cid == kSmiCid)                                           \
+               ? !obj->IsHeapObject()                                          \
+               : (k##Type##Cid == kIntegerCid)                                 \
+                     ? (!obj->IsHeapObject() || obj->IsMint())                 \
+                     : obj->Is##Type());                                       \
     return reinterpret_cast<Raw##Type*>(obj);                                  \
   }
   CLASS_LIST(DEFINE_CASTS)
@@ -631,186 +634,6 @@
 #endif
 }
 
-// TODO(vegorov): Investigate advantages of using
-// __builtin_s{add,sub,mul}_overflow() intrinsics here and below.
-// Note that they may clobber the output location even when there is overflow:
-// https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html
-DART_FORCE_INLINE static bool SignedAddWithOverflow(int32_t lhs,
-                                                    int32_t rhs,
-                                                    intptr_t* out) {
-  intptr_t res = 1;
-#if defined(HOST_ARCH_IA32)
-  asm volatile(
-      "add %2, %1\n"
-      "jo 1f;\n"
-      "xor %0, %0\n"
-      "mov %1, 0(%3)\n"
-      "1: "
-      : "+r"(res), "+r"(lhs)
-      : "r"(rhs), "r"(out)
-      : "cc");
-#elif defined(HOST_ARCH_X64)
-  int64_t tmp;
-  asm volatile(
-      "addl %[rhs], %[lhs]\n"
-      "jo 1f;\n"
-      "xor %[res], %[res]\n"
-      "movslq %[lhs], %[tmp]\n"
-      "mov %[tmp], 0(%[out])\n"
-      "1: "
-      : [res] "+r"(res), [lhs] "+r"(lhs), [tmp] "=&r"(tmp)
-      : [rhs] "r"(rhs), [out] "r"(out)
-      : "cc");
-#elif defined(HOST_ARCH_ARM)
-  asm volatile(
-      "adds %1, %1, %2;\n"
-      "bvs 1f;\n"
-      "mov %0, #0;\n"
-      "str %1, [%3, #0]\n"
-      "1:"
-      : "+r"(res), "+r"(lhs)
-      : "r"(rhs), "r"(out)
-      : "cc");
-#elif defined(HOST_ARCH_ARM64)
-  asm volatile(
-      "adds %w1, %w1, %w2;\n"
-      "bvs 1f;\n"
-      "sxtw %x1, %w1;\n"
-      "mov %0, #0;\n"
-      "str %x1, [%3, #0]\n"
-      "1:"
-      : "+r"(res), "+r"(lhs)
-      : "r"(rhs), "r"(out)
-      : "cc");
-#else
-#error "Unsupported platform"
-#endif
-  return (res != 0);
-}
-
-DART_FORCE_INLINE static bool SignedSubWithOverflow(int32_t lhs,
-                                                    int32_t rhs,
-                                                    intptr_t* out) {
-  intptr_t res = 1;
-#if defined(HOST_ARCH_IA32)
-  asm volatile(
-      "sub %2, %1\n"
-      "jo 1f;\n"
-      "xor %0, %0\n"
-      "mov %1, 0(%3)\n"
-      "1: "
-      : "+r"(res), "+r"(lhs)
-      : "r"(rhs), "r"(out)
-      : "cc");
-#elif defined(HOST_ARCH_X64)
-  int64_t tmp;
-  asm volatile(
-      "subl %[rhs], %[lhs]\n"
-      "jo 1f;\n"
-      "xor %[res], %[res]\n"
-      "movslq %[lhs], %[tmp]\n"
-      "mov %[tmp], 0(%[out])\n"
-      "1: "
-      : [res] "+r"(res), [lhs] "+r"(lhs), [tmp] "=&r"(tmp)
-      : [rhs] "r"(rhs), [out] "r"(out)
-      : "cc");
-#elif defined(HOST_ARCH_ARM)
-  asm volatile(
-      "subs %1, %1, %2;\n"
-      "bvs 1f;\n"
-      "mov %0, #0;\n"
-      "str %1, [%3, #0]\n"
-      "1:"
-      : "+r"(res), "+r"(lhs)
-      : "r"(rhs), "r"(out)
-      : "cc");
-#elif defined(HOST_ARCH_ARM64)
-  asm volatile(
-      "subs %w1, %w1, %w2;\n"
-      "bvs 1f;\n"
-      "sxtw %x1, %w1;\n"
-      "mov %0, #0;\n"
-      "str %x1, [%3, #0]\n"
-      "1:"
-      : "+r"(res), "+r"(lhs)
-      : "r"(rhs), "r"(out)
-      : "cc");
-#else
-#error "Unsupported platform"
-#endif
-  return (res != 0);
-}
-
-DART_FORCE_INLINE static bool SignedMulWithOverflow(int32_t lhs,
-                                                    int32_t rhs,
-                                                    intptr_t* out) {
-  intptr_t res = 1;
-#if defined(HOST_ARCH_IA32)
-  asm volatile(
-      "imul %2, %1\n"
-      "jo 1f;\n"
-      "xor %0, %0\n"
-      "mov %1, 0(%3)\n"
-      "1: "
-      : "+r"(res), "+r"(lhs)
-      : "r"(rhs), "r"(out)
-      : "cc");
-#elif defined(HOST_ARCH_X64)
-  int64_t tmp;
-  asm volatile(
-      "imull %[rhs], %[lhs]\n"
-      "jo 1f;\n"
-      "xor %[res], %[res]\n"
-      "movslq %[lhs], %[tmp]\n"
-      "mov %[tmp], 0(%[out])\n"
-      "1: "
-      : [res] "+r"(res), [lhs] "+r"(lhs), [tmp] "=&r"(tmp)
-      : [rhs] "r"(rhs), [out] "r"(out)
-      : "cc");
-#elif defined(HOST_ARCH_ARM)
-  asm volatile(
-      "smull %1, ip, %1, %2;\n"
-      "cmp ip, %1, ASR #31;\n"
-      "bne 1f;\n"
-      "mov %0, $0;\n"
-      "str %1, [%3, #0]\n"
-      "1:"
-      : "+r"(res), "+r"(lhs)
-      : "r"(rhs), "r"(out)
-      : "cc", "r12");
-#elif defined(HOST_ARCH_ARM64)
-  int64_t prod_lo = 0;
-  asm volatile(
-      "smull %x1, %w2, %w3\n"
-      "asr %x2, %x1, #63\n"
-      "cmp %x2, %x1, ASR #31;\n"
-      "bne 1f;\n"
-      "mov %0, #0;\n"
-      "str %x1, [%4, #0]\n"
-      "1:"
-      : "=r"(res), "+r"(prod_lo), "+r"(lhs)
-      : "r"(rhs), "r"(out)
-      : "cc");
-#else
-#error "Unsupported platform"
-#endif
-  return (res != 0);
-}
-
-DART_FORCE_INLINE static bool AreBothSmis(intptr_t a, intptr_t b) {
-  return ((a | b) & kHeapObjectTag) == 0;
-}
-
-#define SMI_MUL(lhs, rhs, pres) SignedMulWithOverflow((lhs), (rhs) >> 1, pres)
-#define SMI_COND(cond, lhs, rhs, pres)                                         \
-  ((*(pres) = ((lhs cond rhs) ? true_value : false_value)), false)
-#define SMI_EQ(lhs, rhs, pres) SMI_COND(==, lhs, rhs, pres)
-#define SMI_LT(lhs, rhs, pres) SMI_COND(<, lhs, rhs, pres)
-#define SMI_GT(lhs, rhs, pres) SMI_COND(>, lhs, rhs, pres)
-#define SMI_BITOR(lhs, rhs, pres) ((*(pres) = (lhs | rhs)), false)
-#define SMI_BITAND(lhs, rhs, pres) ((*(pres) = ((lhs) & (rhs))), false)
-#define SMI_BITXOR(lhs, rhs, pres) ((*(pres) = ((lhs) ^ (rhs))), false)
-
 void Interpreter::CallRuntime(Thread* thread,
                               RawObject** base,
                               RawObject** exit_frame,
@@ -1014,18 +837,18 @@
         }
         // Push arguments of type test.
         // Type checked value is at call_base + 1.
+        call_base[2] = field_type;
         // Provide type arguments of instance as instantiator.
         RawClass* instance_class = thread->isolate()->class_table()->At(
             InterpreterHelpers::GetClassId(instance));
-        call_base[2] =
+        call_base[3] =
             instance_class->ptr()->num_type_arguments_ > 0
                 ? reinterpret_cast<RawObject**>(
                       instance
                           ->ptr())[instance_class->ptr()
                                        ->type_arguments_field_offset_in_words_]
                 : null_value;
-        call_base[3] = null_value;  // Implicit setters cannot be generic.
-        call_base[4] = field_type;
+        call_base[4] = null_value;  // Implicit setters cannot be generic.
         call_base[5] = field->ptr()->name_;
         if (!AssertAssignable(thread, *pc, *FP, call_base + 5, call_base + 1,
                               cache)) {
@@ -1419,6 +1242,9 @@
 // Fetch next operation from PC, increment program counter and dispatch.
 #define DISPATCH() DISPATCH_OP(*pc++)
 
+// Load target of a jump instruction into PC.
+#define LOAD_JUMP_TARGET() pc += ((static_cast<int32_t>(op) >> 8) - 1)
+
 // Define entry point that handles bytecode Name with the given operand format.
 #define BYTECODE(Name, Operands)                                               \
   BYTECODE_HEADER(Name, DECLARE_##Operands, DECODE_##Operands)
@@ -1465,54 +1291,6 @@
   USE(rD)
 #define DECODE_A_X rD = (static_cast<int32_t>(op) >> KernelBytecode::kDShift);
 
-#define SMI_FASTPATH_ICDATA_INC                                                \
-  do {                                                                         \
-    ASSERT(KernelBytecode::IsCallOpcode(*pc));                                 \
-    const uint16_t kidx = KernelBytecode::DecodeD(*pc);                        \
-    const RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));           \
-    RawObject** entries = icdata->ptr()->ic_data_->ptr()->data();              \
-    InterpreterHelpers::IncrementICUsageCount(entries, 0, 2);                  \
-  } while (0);
-
-// Declare bytecode handler for a smi operation (e.g. AddTOS) with the
-// given result type and the given behavior specified as a function
-// that takes left and right operands and result slot and returns
-// true if fast-path succeeds.
-#define SMI_FASTPATH_TOS(ResultT, Func)                                        \
-  {                                                                            \
-    const intptr_t lhs = reinterpret_cast<intptr_t>(SP[-1]);                   \
-    const intptr_t rhs = reinterpret_cast<intptr_t>(SP[-0]);                   \
-    ResultT* slot = reinterpret_cast<ResultT*>(SP - 1);                        \
-    if (LIKELY(!thread->isolate()->single_step()) &&                           \
-        LIKELY(AreBothSmis(lhs, rhs) && !Func(lhs, rhs, slot))) {              \
-      SMI_FASTPATH_ICDATA_INC;                                                 \
-      /* Fast path succeeded. Skip the generic call that follows. */           \
-      pc++;                                                                    \
-      /* We dropped 2 arguments and push result                   */           \
-      SP--;                                                                    \
-    }                                                                          \
-  }
-
-// Skip the next instruction if there is no overflow.
-#define SMI_OP_CHECK(ResultT, Func)                                            \
-  {                                                                            \
-    const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]);                   \
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]);                   \
-    ResultT* slot = reinterpret_cast<ResultT*>(&FP[rA]);                       \
-    if (LIKELY(!Func(lhs, rhs, slot))) {                                       \
-      /* Success. Skip the instruction that follows. */                        \
-      pc++;                                                                    \
-    }                                                                          \
-  }
-
-// Do not check for overflow.
-#define SMI_OP_NOCHECK(ResultT, Func)                                          \
-  {                                                                            \
-    const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]);                   \
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]);                   \
-    ResultT* slot = reinterpret_cast<ResultT*>(&FP[rA]);                       \
-    Func(lhs, rhs, slot);                                                      \
-  }
 
 // Exception handling helper. Gets handler FP and PC from the Interpreter where
 // they were stored by Interpreter::Longjmp and proceeds to execute the handler.
@@ -1591,6 +1369,29 @@
 
 #define LOAD_CONSTANT(index) (pp_->ptr()->data()[(index)].raw_obj_)
 
+#define UNBOX_INT64(value, obj, selector)                                      \
+  int64_t value;                                                               \
+  {                                                                            \
+    word raw_value = reinterpret_cast<word>(obj);                              \
+    if (LIKELY((raw_value & kSmiTagMask) == kSmiTag)) {                        \
+      value = raw_value >> kSmiTagShift;                                       \
+    } else {                                                                   \
+      if (UNLIKELY(obj == null_value)) {                                       \
+        SP[0] = selector.raw();                                                \
+        goto ThrowNullError;                                                   \
+      }                                                                        \
+      value = Integer::GetInt64Value(RAW_CAST(Integer, obj));                  \
+    }                                                                          \
+  }
+
+#define BOX_INT64_RESULT(result)                                               \
+  if (LIKELY(Smi::IsValid(result))) {                                          \
+    SP[0] = Smi::New(static_cast<intptr_t>(result));                           \
+  } else if (!AllocateInt64Box(thread, result, pc, FP, SP)) {                  \
+    HANDLE_EXCEPTION;                                                          \
+  }                                                                            \
+  ASSERT(Integer::GetInt64Value(RAW_CAST(Integer, SP[0])) == result);
+
 // Returns true if deoptimization succeeds.
 DART_FORCE_INLINE bool Interpreter::Deoptimize(Thread* thread,
                                                uint32_t** pc,
@@ -1656,9 +1457,9 @@
   if (cache != null_value) {
     RawInstance* instance = static_cast<RawInstance*>(args[0]);
     RawTypeArguments* instantiator_type_arguments =
-        static_cast<RawTypeArguments*>(args[1]);
-    RawTypeArguments* function_type_arguments =
         static_cast<RawTypeArguments*>(args[2]);
+    RawTypeArguments* function_type_arguments =
+        static_cast<RawTypeArguments*>(args[3]);
 
     const intptr_t cid = InterpreterHelpers::GetClassId(instance);
 
@@ -1716,18 +1517,16 @@
   }
 
 AssertAssignableCallRuntime:
-  // TODO(regis): Modify AssertAssignable bytecode to expect arguments in same
-  // order as the TypeCheck runtime call, so this copying can be avoided.
-  call_top[1] = 0;        // Unused result.
-  call_top[2] = args[0];  // Instance.
-  call_top[3] = args[3];  // Type.
-  call_top[4] = args[1];  // Instantiator type args.
-  call_top[5] = args[2];  // Function type args.
-  call_top[6] = args[4];  // Name.
-  call_top[7] = cache;
-  call_top[8] = Smi::New(kTypeCheckFromInline);
-  Exit(thread, FP, call_top + 9, pc);
-  NativeArguments native_args(thread, 7, call_top + 2, call_top + 1);
+  // args[0]: Instance.
+  // args[1]: Type.
+  // args[2]: Instantiator type args.
+  // args[3]: Function type args.
+  // args[4]: Name.
+  args[5] = cache;
+  args[6] = Smi::New(kTypeCheckFromInline);
+  args[7] = 0;  // Unused result.
+  Exit(thread, FP, args + 8, pc);
+  NativeArguments native_args(thread, 7, args, args + 7);
   return InvokeRuntime(thread, this, DRT_TypeCheck, native_args);
 }
 
@@ -1739,6 +1538,42 @@
               arguments.raw_ptr()->data(), thread);
 }
 
+// Allocate _Mint box for the given int64_t value and puts it into SP[0].
+// Returns false on exception.
+DART_NOINLINE bool Interpreter::AllocateInt64Box(Thread* thread,
+                                                 int64_t value,
+                                                 uint32_t* pc,
+                                                 RawObject** FP,
+                                                 RawObject** SP) {
+  ASSERT(!Smi::IsValid(value));
+  const intptr_t instance_size = Mint::InstanceSize();
+  const uword start =
+      thread->heap()->new_space()->TryAllocateInTLAB(thread, instance_size);
+  if (LIKELY(start != 0)) {
+    uword tags = 0;
+    tags = RawObject::ClassIdTag::update(kMintCid, tags);
+    tags = RawObject::SizeTag::update(instance_size, tags);
+    tags = RawObject::NewBit::update(true, tags);
+    // Also writes zero in the hash_ field.
+    *reinterpret_cast<uword*>(start + Mint::tags_offset()) = tags;
+    *reinterpret_cast<int64_t*>(start + Mint::value_offset()) = value;
+    SP[0] = reinterpret_cast<RawObject*>(start + kHeapObjectTag);
+    return true;
+  } else {
+    SP[0] = 0;  // Space for the result.
+    SP[1] = thread->isolate()->object_store()->mint_class();  // Class object.
+    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)) {
+      return false;
+    }
+    *reinterpret_cast<int64_t*>(reinterpret_cast<uword>(SP[0]) -
+                                kHeapObjectTag + Mint::value_offset()) = value;
+    return true;
+  }
+}
+
 RawObject* Interpreter::Call(RawFunction* function,
                              RawArray* argdesc,
                              intptr_t argc,
@@ -2008,16 +1843,6 @@
   }
 
   {
-    BYTECODE(EntryOptimized, A_D);
-    const uint16_t num_registers = rD;
-
-    // Reserve space for registers used by the optimized code.
-    SP = FP + num_registers - 1;
-
-    DISPATCH();
-  }
-
-  {
     BYTECODE(Frame, A_D);
     // Initialize locals with null and increment SP.
     const uint16_t num_locals = rD;
@@ -2036,78 +1861,6 @@
   }
 
   {
-    BYTECODE(Compile, 0);
-    FP[0] = argdesc_;
-    FP[1] = FrameFunction(FP);
-    FP[2] = 0;
-
-    UNIMPLEMENTED();  // TODO(regis): Revisit.
-
-    Exit(thread, FP, FP + 3, pc);
-    NativeArguments args(thread, 1, FP + 1, FP + 2);
-    INVOKE_RUNTIME(DRT_CompileFunction, args);
-    {
-      // Function should be compiled now, dispatch to its entry point.
-      RawCode* code = FrameFunction(FP)->ptr()->code_;
-      InterpreterHelpers::SetFrameCode(FP, code);
-      pp_ = code->ptr()->object_pool_;
-      pc = reinterpret_cast<uint32_t*>(code->ptr()->entry_point_);
-      pc_ = reinterpret_cast<uword>(pc);  // For the profiler.
-      argdesc_ = static_cast<RawArray*>(FP[0]);
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(HotCheck, A_D);
-    const uint8_t increment = rA;
-    const uint16_t threshold = rD;
-    RawFunction* f = FrameFunction(FP);
-    int32_t counter = f->ptr()->usage_counter_;
-    // Note: we don't increment usage counter in the prologue of optimized
-    // functions.
-    if (increment) {
-      counter += increment;
-      f->ptr()->usage_counter_ = counter;
-    }
-    if (UNLIKELY(counter >= threshold)) {
-      FP[0] = f;
-      FP[1] = 0;
-
-      // Save the args desriptor which came in.
-      FP[2] = argdesc_;
-
-      UNIMPLEMENTED();  // TODO(regis): Revisit.
-
-      // Make the DRT_OptimizeInvokedFunction see a stub as its caller for
-      // consistency with the other architectures, and to avoid needing to
-      // generate a stackmap for the HotCheck pc.
-      const StubEntry* stub = StubCode::OptimizeFunction_entry();
-      FP[kKBCPcMarkerSlotFromFp] = stub->code();
-      pc = reinterpret_cast<uint32_t*>(stub->EntryPoint());
-
-      Exit(thread, FP, FP + 3, pc);
-      NativeArguments args(thread, 1, /*argv=*/FP, /*retval=*/FP + 1);
-      INVOKE_RUNTIME(DRT_OptimizeInvokedFunction, args);
-      {
-        // DRT_OptimizeInvokedFunction returns the code object to execute.
-        ASSERT(FP[1]->GetClassId() == kFunctionCid);
-        RawFunction* function = static_cast<RawFunction*>(FP[1]);
-        RawCode* code = function->ptr()->code_;
-        InterpreterHelpers::SetFrameCode(FP, code);
-
-        // Restore args descriptor which came in.
-        argdesc_ = Array::RawCast(FP[2]);
-
-        pp_ = code->ptr()->object_pool_;
-        pc = reinterpret_cast<uint32_t*>(function->ptr()->entry_point_);
-        pc_ = reinterpret_cast<uword>(pc);  // For the profiler.
-      }
-    }
-    DISPATCH();
-  }
-
-  {
     BYTECODE(CheckStack, A);
     {
       // Check the interpreter's own stack limit for actual interpreter's stack
@@ -2134,16 +1887,6 @@
   }
 
   {
-    BYTECODE(CheckStackAlwaysExit, A);
-    {
-      Exit(thread, FP, SP + 1, pc);
-      NativeArguments args(thread, 0, NULL, NULL);
-      INVOKE_RUNTIME(DRT_StackOverflow, args);
-    }
-    DISPATCH();
-  }
-
-  {
     BYTECODE(CheckFunctionTypeArgs, A_D);
     const uint16_t declared_type_args_len = rA;
     const uint16_t first_stack_local_index = rD;
@@ -2166,38 +1909,6 @@
   }
 
   {
-    BYTECODE(DebugStep, A);
-    if (thread->isolate()->single_step()) {
-      Exit(thread, FP, SP + 1, pc);
-      NativeArguments args(thread, 0, NULL, NULL);
-      INVOKE_RUNTIME(DRT_SingleStepHandler, args);
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DebugBreak, A);
-#if !defined(PRODUCT)
-    {
-      const uint32_t original_bc =
-          static_cast<uint32_t>(reinterpret_cast<uintptr_t>(
-              thread->isolate()->debugger()->GetPatchedStubAddress(
-                  reinterpret_cast<uword>(pc))));
-
-      SP[1] = null_value;
-      Exit(thread, FP, SP + 2, pc);
-      NativeArguments args(thread, 0, NULL, SP + 1);
-      INVOKE_RUNTIME(DRT_BreakpointRuntimeHandler, args)
-      DISPATCH_OP(original_bc);
-    }
-#else
-    // There should be no debug breaks in product mode.
-    UNREACHABLE();
-#endif
-    DISPATCH();
-  }
-
-  {
     BYTECODE(InstantiateType, A_D);
     // Stack: instantiator type args, function type args
     RawObject* type = LOAD_CONSTANT(rD);
@@ -2277,20 +1988,6 @@
   }
 
   {
-    BYTECODE(Drop, 0);
-    SP -= rA;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DropR, 0);
-    RawObject* result = SP[0];
-    SP -= rA;
-    SP[0] = result;
-    DISPATCH();
-  }
-
-  {
     BYTECODE(LoadConstant, A_D);
     FP[rA] = LOAD_CONSTANT(rD);
     DISPATCH();
@@ -2304,19 +2001,19 @@
 
   {
     BYTECODE(PushNull, 0);
-    *++SP = Object::null();
+    *++SP = null_value;
     DISPATCH();
   }
 
   {
     BYTECODE(PushTrue, 0);
-    *++SP = Object::bool_true().raw();
+    *++SP = true_value;
     DISPATCH();
   }
 
   {
     BYTECODE(PushFalse, 0);
-    *++SP = Object::bool_false().raw();
+    *++SP = false_value;
     DISPATCH();
   }
 
@@ -2333,20 +2030,6 @@
   }
 
   {
-    BYTECODE(Move, A_X);
-    FP[rA] = FP[rD];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Swap, A_X);
-    RawObject* tmp = FP[rD];
-    FP[rD] = FP[rA];
-    FP[rA] = tmp;
-    DISPATCH();
-  }
-
-  {
     BYTECODE(StoreLocal, A_X);
     FP[rD] = *SP;
     DISPATCH();
@@ -2371,12 +2054,6 @@
   }
 
   {
-    BYTECODE(BooleanNegate, A_D);
-    FP[rA] = (FP[rD] == true_value) ? false_value : true_value;
-    DISPATCH();
-  }
-
-  {
     BYTECODE(IndirectStaticCall, A_D);
 
     // Check if single stepping.
@@ -2407,18 +2084,6 @@
   }
 
   {
-    BYTECODE(StaticCall, A_D);
-    const uint16_t argc = rA;
-    RawObject** call_base = SP - argc;
-    RawObject** call_top = SP;  // *SP contains function
-    argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(rD));
-    if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
-      HANDLE_EXCEPTION;
-    }
-    DISPATCH();
-  }
-
-  {
     BYTECODE(InstanceCall, A_D);
 
     // Check if single stepping.
@@ -2457,90 +2122,6 @@
   }
 
   {
-    BYTECODE(InstanceCall1Opt, A_D);
-
-    {
-      const uint16_t argc = rA;
-      const uint16_t kidx = rD;
-
-      RawObject** call_base = SP - argc + 1;
-      RawObject** call_top = SP + 1;
-
-      RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      if (!InstanceCall1(thread, icdata, call_base, call_top, &pc, &FP, &SP,
-                         true /* optimized */)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(InstanceCall2Opt, A_D);
-
-    {
-      const uint16_t argc = rA;
-      const uint16_t kidx = rD;
-
-      RawObject** call_base = SP - argc + 1;
-      RawObject** call_top = SP + 1;
-
-      RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      if (!InstanceCall2(thread, icdata, call_base, call_top, &pc, &FP, &SP,
-                         true /* optimized */)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushPolymorphicInstanceCall, A_D);
-    const uint8_t argc = rA;
-    const intptr_t cids_length = rD;
-    RawObject** args = SP - argc + 1;
-    const intptr_t receiver_cid = InterpreterHelpers::GetClassId(args[0]);
-    for (intptr_t i = 0; i < 2 * cids_length; i += 2) {
-      const intptr_t icdata_cid = KernelBytecode::DecodeD(*(pc + i));
-      if (receiver_cid == icdata_cid) {
-        RawFunction* target = RAW_CAST(
-            Function, LOAD_CONSTANT(KernelBytecode::DecodeD(*(pc + i + 1))));
-        *++SP = target;
-        pc++;
-        break;
-      }
-    }
-    pc += 2 * cids_length;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushPolymorphicInstanceCallByRange, A_D);
-    const uint8_t argc = rA;
-    const intptr_t cids_length = rD;
-    RawObject** args = SP - argc + 1;
-    const intptr_t receiver_cid = InterpreterHelpers::GetClassId(args[0]);
-    for (intptr_t i = 0; i < 3 * cids_length; i += 3) {
-      // Note unsigned types to get an unsigned range compare.
-      const uintptr_t cid_start = KernelBytecode::DecodeD(*(pc + i));
-      const uintptr_t cids = KernelBytecode::DecodeD(*(pc + i + 1));
-      if (receiver_cid - cid_start < cids) {
-        RawFunction* target = RAW_CAST(
-            Function, LOAD_CONSTANT(KernelBytecode::DecodeD(*(pc + i + 2))));
-        *++SP = target;
-        pc++;
-        break;
-      }
-    }
-    pc += 3 * cids_length;
-    DISPATCH();
-  }
-
-  {
     BYTECODE(NativeCall, __D);
     RawTypedData* data = static_cast<RawTypedData*>(LOAD_CONSTANT(rD));
     MethodRecognizer::Kind kind = NativeEntryData::GetKind(data);
@@ -2682,21 +2263,29 @@
         *--SP = null_value;
       } break;
       default: {
-        NativeFunctionWrapper trampoline = NativeEntryData::GetTrampoline(data);
-        NativeFunction function = NativeEntryData::GetNativeFunction(data);
+        NativeEntryData::Payload* payload =
+            NativeEntryData::FromTypedArray(data);
         intptr_t argc_tag = NativeEntryData::GetArgcTag(data);
         const intptr_t num_arguments =
             NativeArguments::ArgcBits::decode(argc_tag);
 
+        if (payload->trampoline == NULL) {
+          ASSERT(payload->native_function == NULL);
+          payload->trampoline = &NativeEntry::BootstrapNativeCallWrapper;
+          payload->native_function =
+              reinterpret_cast<NativeFunction>(&NativeEntry::LinkNativeCall);
+        }
+
         *++SP = null_value;  // Result slot.
 
         RawObject** incoming_args = SP - num_arguments;
         RawObject** return_slot = SP;
         Exit(thread, FP, SP, pc);
         NativeArguments args(thread, argc_tag, incoming_args, return_slot);
-        INVOKE_NATIVE(trampoline,
-                      reinterpret_cast<Dart_NativeFunction>(function),
-                      reinterpret_cast<Dart_NativeArguments>(&args));
+        INVOKE_NATIVE(
+            payload->trampoline,
+            reinterpret_cast<Dart_NativeFunction>(payload->native_function),
+            reinterpret_cast<Dart_NativeArguments>(&args));
 
         *(SP - num_arguments) = *return_slot;
         SP -= num_arguments;
@@ -2705,779 +2294,12 @@
     DISPATCH();
   }
 
-  {
-    BYTECODE(OneByteStringFromCharCode, A_X);
-    const intptr_t char_code = Smi::Value(RAW_CAST(Smi, FP[rD]));
-    ASSERT(char_code >= 0);
-    ASSERT(char_code <= 255);
-    RawString** strings = Symbols::PredefinedAddress();
-    const intptr_t index = char_code + Symbols::kNullCharCodeSymbolOffset;
-    FP[rA] = strings[index];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StringToCharCode, A_X);
-    RawOneByteString* str = RAW_CAST(OneByteString, FP[rD]);
-    if (str->ptr()->length_ == Smi::New(1)) {
-      FP[rA] = Smi::New(str->ptr()->data()[0]);
-    } else {
-      FP[rA] = Smi::New(-1);
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AddTOS, A_B_C);
-    SMI_FASTPATH_TOS(intptr_t, SignedAddWithOverflow);
-    DISPATCH();
-  }
-  {
-    BYTECODE(SubTOS, A_B_C);
-    SMI_FASTPATH_TOS(intptr_t, SignedSubWithOverflow);
-    DISPATCH();
-  }
-  {
-    BYTECODE(MulTOS, A_B_C);
-    SMI_FASTPATH_TOS(intptr_t, SMI_MUL);
-    DISPATCH();
-  }
-  {
-    BYTECODE(BitOrTOS, A_B_C);
-    SMI_FASTPATH_TOS(intptr_t, SMI_BITOR);
-    DISPATCH();
-  }
-  {
-    BYTECODE(BitAndTOS, A_B_C);
-    SMI_FASTPATH_TOS(intptr_t, SMI_BITAND);
-    DISPATCH();
-  }
-  {
-    BYTECODE(EqualTOS, A_B_C);
-    SMI_FASTPATH_TOS(RawObject*, SMI_EQ);
-    DISPATCH();
-  }
-  {
-    BYTECODE(LessThanTOS, A_B_C);
-    SMI_FASTPATH_TOS(RawObject*, SMI_LT);
-    DISPATCH();
-  }
-  {
-    BYTECODE(GreaterThanTOS, A_B_C);
-    SMI_FASTPATH_TOS(RawObject*, SMI_GT);
-    DISPATCH();
-  }
-  {
-    BYTECODE(SmiAddTOS, 0);
-    RawSmi* left = Smi::RawCast(SP[-1]);
-    RawSmi* right = Smi::RawCast(SP[-0]);
-    SP--;
-    SP[0] = Smi::New(Smi::Value(left) + Smi::Value(right));
-    DISPATCH();
-  }
-  {
-    BYTECODE(SmiSubTOS, 0);
-    RawSmi* left = Smi::RawCast(SP[-1]);
-    RawSmi* right = Smi::RawCast(SP[-0]);
-    SP--;
-    SP[0] = Smi::New(Smi::Value(left) - Smi::Value(right));
-    DISPATCH();
-  }
-  {
-    BYTECODE(SmiMulTOS, 0);
-    RawSmi* left = Smi::RawCast(SP[-1]);
-    RawSmi* right = Smi::RawCast(SP[-0]);
-    SP--;
-    SP[0] = Smi::New(Smi::Value(left) * Smi::Value(right));
-    DISPATCH();
-  }
-  {
-    BYTECODE(SmiBitAndTOS, 0);
-    RawSmi* left = Smi::RawCast(SP[-1]);
-    RawSmi* right = Smi::RawCast(SP[-0]);
-    SP--;
-    SP[0] = Smi::New(Smi::Value(left) & Smi::Value(right));
-    DISPATCH();
-  }
-  {
-    BYTECODE(Add, A_B_C);
-    SMI_OP_CHECK(intptr_t, SignedAddWithOverflow);
-    DISPATCH();
-  }
-  {
-    BYTECODE(Sub, A_B_C);
-    SMI_OP_CHECK(intptr_t, SignedSubWithOverflow);
-    DISPATCH();
-  }
-  {
-    BYTECODE(Mul, A_B_C);
-    SMI_OP_CHECK(intptr_t, SMI_MUL);
-    DISPATCH();
-  }
-  {
-    BYTECODE(Neg, A_D);
-    const intptr_t value = reinterpret_cast<intptr_t>(FP[rD]);
-    intptr_t* out = reinterpret_cast<intptr_t*>(&FP[rA]);
-    if (LIKELY(!SignedSubWithOverflow(0, value, out))) {
-      pc++;
-    }
-    DISPATCH();
-  }
-  {
-    BYTECODE(BitOr, A_B_C);
-    SMI_OP_NOCHECK(intptr_t, SMI_BITOR);
-    DISPATCH();
-  }
-  {
-    BYTECODE(BitAnd, A_B_C);
-    SMI_OP_NOCHECK(intptr_t, SMI_BITAND);
-    DISPATCH();
-  }
-  {
-    BYTECODE(BitXor, A_B_C);
-    SMI_OP_NOCHECK(intptr_t, SMI_BITXOR);
-    DISPATCH();
-  }
-  {
-    BYTECODE(BitNot, A_D);
-    const intptr_t value = reinterpret_cast<intptr_t>(FP[rD]);
-    *reinterpret_cast<intptr_t*>(&FP[rA]) = ~value & (~kSmiTagMask);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Div, A_B_C);
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]);
-    if (rhs != 0) {
-      const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]);
-      const intptr_t res = (lhs >> kSmiTagSize) / (rhs >> kSmiTagSize);
-      const intptr_t untaggable = 0x40000000L;
-      if (res != untaggable) {
-        *reinterpret_cast<intptr_t*>(&FP[rA]) = res << kSmiTagSize;
-        pc++;
-      }
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Mod, A_B_C);
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]);
-    if (rhs != 0) {
-      const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]);
-      const intptr_t res = ((lhs >> kSmiTagSize) % (rhs >> kSmiTagSize))
-                           << kSmiTagSize;
-      *reinterpret_cast<intptr_t*>(&FP[rA]) =
-          (res < 0) ? ((rhs < 0) ? (res - rhs) : (res + rhs)) : res;
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Shl, A_B_C);
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]) >> kSmiTagSize;
-    const int kBitsPerInt32 = 32;
-    if (static_cast<uintptr_t>(rhs) < kBitsPerInt32) {
-      const int32_t lhs = reinterpret_cast<intptr_t>(FP[rB]);
-      const int32_t res = lhs << rhs;
-      if (lhs == (res >> rhs)) {
-        *reinterpret_cast<intptr_t*>(&FP[rA]) = static_cast<intptr_t>(res);
-        pc++;
-      }
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Shr, A_B_C);
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]) >> kSmiTagSize;
-    if (rhs >= 0) {
-      const intptr_t shift_amount = (rhs >= 32) ? (32 - 1) : rhs;
-      const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]) >> kSmiTagSize;
-      *reinterpret_cast<intptr_t*>(&FP[rA]) = (lhs >> shift_amount)
-                                              << kSmiTagSize;
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(ShlImm, A_B_C);
-    const uint8_t shift = rC;
-    const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]);
-    FP[rA] = reinterpret_cast<RawObject*>(lhs << shift);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Min, A_B_C);
-    const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]);
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]);
-    FP[rA] = reinterpret_cast<RawObject*>((lhs < rhs) ? lhs : rhs);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Max, A_B_C);
-    const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rB]);
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rC]);
-    FP[rA] = reinterpret_cast<RawObject*>((lhs > rhs) ? lhs : rhs);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(UnboxInt32, A_B_C);
-    const intptr_t box_cid = InterpreterHelpers::GetClassId(FP[rB]);
-    const bool may_truncate = rC == 1;
-    if (box_cid == kSmiCid) {
-      const intptr_t value = reinterpret_cast<intptr_t>(FP[rB]) >> kSmiTagSize;
-      const int32_t value32 = static_cast<int32_t>(value);
-      if (may_truncate || (value == static_cast<intptr_t>(value32))) {
-        FP[rA] = reinterpret_cast<RawObject*>(value);
-        pc++;
-      }
-    } else if (box_cid == kMintCid) {
-      RawMint* mint = RAW_CAST(Mint, FP[rB]);
-      const int64_t value = mint->ptr()->value_;
-      const int32_t value32 = static_cast<int32_t>(value);
-      if (may_truncate || (value == static_cast<int64_t>(value32))) {
-        FP[rA] = reinterpret_cast<RawObject*>(value);
-        pc++;
-      }
-    }
-    DISPATCH();
-  }
-
-#if defined(ARCH_IS_64_BIT)
-  {
-    BYTECODE(WriteIntoDouble, A_D);
-    const double value = bit_cast<double, RawObject*>(FP[rD]);
-    RawDouble* box = RAW_CAST(Double, FP[rA]);
-    box->ptr()->value_ = value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(UnboxDouble, A_D);
-    const RawDouble* box = RAW_CAST(Double, FP[rD]);
-    FP[rA] = bit_cast<RawObject*, double>(box->ptr()->value_);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckedUnboxDouble, A_D);
-    const intptr_t box_cid = InterpreterHelpers::GetClassId(FP[rD]);
-    if (box_cid == kSmiCid) {
-      const intptr_t value = reinterpret_cast<intptr_t>(FP[rD]) >> kSmiTagSize;
-      const double result = static_cast<double>(value);
-      FP[rA] = bit_cast<RawObject*, double>(result);
-      pc++;
-    } else if (box_cid == kDoubleCid) {
-      const RawDouble* box = RAW_CAST(Double, FP[rD]);
-      FP[rA] = bit_cast<RawObject*, double>(box->ptr()->value_);
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DoubleToSmi, A_D);
-    const double value = bit_cast<double, RawObject*>(FP[rD]);
-    if (!isnan(value)) {
-      const intptr_t result = static_cast<intptr_t>(value);
-      if ((result <= Smi::kMaxValue) && (result >= Smi::kMinValue)) {
-        FP[rA] = reinterpret_cast<RawObject*>(result << kSmiTagSize);
-        pc++;
-      }
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(SmiToDouble, A_D);
-    const intptr_t value = reinterpret_cast<intptr_t>(FP[rD]) >> kSmiTagSize;
-    const double result = static_cast<double>(value);
-    FP[rA] = bit_cast<RawObject*, double>(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DAdd, A_B_C);
-    const double lhs = bit_cast<double, RawObject*>(FP[rB]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rC]);
-    FP[rA] = bit_cast<RawObject*, double>(lhs + rhs);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DSub, A_B_C);
-    const double lhs = bit_cast<double, RawObject*>(FP[rB]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rC]);
-    FP[rA] = bit_cast<RawObject*, double>(lhs - rhs);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DMul, A_B_C);
-    const double lhs = bit_cast<double, RawObject*>(FP[rB]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rC]);
-    FP[rA] = bit_cast<RawObject*, double>(lhs * rhs);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DDiv, A_B_C);
-    const double lhs = bit_cast<double, RawObject*>(FP[rB]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rC]);
-    const double result = lhs / rhs;
-    FP[rA] = bit_cast<RawObject*, double>(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DNeg, A_D);
-    const double value = bit_cast<double, RawObject*>(FP[rD]);
-    FP[rA] = bit_cast<RawObject*, double>(-value);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DSqrt, A_D);
-    const double value = bit_cast<double, RawObject*>(FP[rD]);
-    FP[rA] = bit_cast<RawObject*, double>(sqrt(value));
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DSin, A_D);
-    const double value = bit_cast<double, RawObject*>(FP[rD]);
-    FP[rA] = bit_cast<RawObject*, double>(sin(value));
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DCos, A_D);
-    const double value = bit_cast<double, RawObject*>(FP[rD]);
-    FP[rA] = bit_cast<RawObject*, double>(cos(value));
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DPow, A_B_C);
-    const double lhs = bit_cast<double, RawObject*>(FP[rB]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rC]);
-    const double result = pow(lhs, rhs);
-    FP[rA] = bit_cast<RawObject*, double>(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DMod, A_B_C);
-    const double lhs = bit_cast<double, RawObject*>(FP[rB]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rC]);
-    const double result = DartModulo(lhs, rhs);
-    FP[rA] = bit_cast<RawObject*, double>(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DMin, A_B_C);
-    const double lhs = bit_cast<double, RawObject*>(FP[rB]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rC]);
-    FP[rA] = bit_cast<RawObject*, double>(fmin(lhs, rhs));
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DMax, A_B_C);
-    const double lhs = bit_cast<double, RawObject*>(FP[rB]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rC]);
-    FP[rA] = bit_cast<RawObject*, double>(fmax(lhs, rhs));
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DTruncate, A_D);
-    const double value = bit_cast<double, RawObject*>(FP[rD]);
-    FP[rA] = bit_cast<RawObject*, double>(trunc(value));
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DFloor, A_D);
-    const double value = bit_cast<double, RawObject*>(FP[rD]);
-    FP[rA] = bit_cast<RawObject*, double>(floor(value));
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DCeil, A_D);
-    const double value = bit_cast<double, RawObject*>(FP[rD]);
-    FP[rA] = bit_cast<RawObject*, double>(ceil(value));
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DoubleToFloat, A_D);
-    const double value = bit_cast<double, RawObject*>(FP[rD]);
-    const float valuef = static_cast<float>(value);
-    *reinterpret_cast<float*>(&FP[rA]) = valuef;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(FloatToDouble, A_D);
-    const float valuef = *reinterpret_cast<float*>(&FP[rD]);
-    const double value = static_cast<double>(valuef);
-    FP[rA] = bit_cast<RawObject*, double>(value);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DoubleIsNaN, A);
-    const double v = bit_cast<double, RawObject*>(FP[rA]);
-    if (!isnan(v)) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DoubleIsInfinite, A);
-    const double v = bit_cast<double, RawObject*>(FP[rA]);
-    if (!isinf(v)) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedFloat32, A_B_C);
-    uint8_t* data = InterpreterHelpers::GetTypedData(FP[rB], FP[rC]);
-    const uint32_t value = *reinterpret_cast<uint32_t*>(data);
-    const uint64_t value64 = value;
-    FP[rA] = reinterpret_cast<RawObject*>(value64);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexed4Float32, A_B_C);
-    ASSERT(RawObject::IsTypedDataClassId(FP[rB]->GetClassId()));
-    RawTypedData* array = reinterpret_cast<RawTypedData*>(FP[rB]);
-    RawSmi* index = RAW_CAST(Smi, FP[rC]);
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    const uint32_t value =
-        reinterpret_cast<uint32_t*>(array->ptr()->data())[Smi::Value(index)];
-    const uint64_t value64 = value;  // sign extend to clear high bits.
-    FP[rA] = reinterpret_cast<RawObject*>(value64);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedFloat64, A_B_C);
-    uint8_t* data = InterpreterHelpers::GetTypedData(FP[rB], FP[rC]);
-    *reinterpret_cast<uint64_t*>(&FP[rA]) = *reinterpret_cast<uint64_t*>(data);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexed8Float64, A_B_C);
-    ASSERT(RawObject::IsTypedDataClassId(FP[rB]->GetClassId()));
-    RawTypedData* array = reinterpret_cast<RawTypedData*>(FP[rB]);
-    RawSmi* index = RAW_CAST(Smi, FP[rC]);
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    const int64_t value =
-        reinterpret_cast<int64_t*>(array->ptr()->data())[Smi::Value(index)];
-    FP[rA] = reinterpret_cast<RawObject*>(value);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreIndexedFloat32, A_B_C);
-    uint8_t* data = InterpreterHelpers::GetTypedData(FP[rA], FP[rB]);
-    const uint64_t value = reinterpret_cast<uint64_t>(FP[rC]);
-    const uint32_t value32 = value;
-    *reinterpret_cast<uint32_t*>(data) = value32;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreIndexed4Float32, A_B_C);
-    ASSERT(RawObject::IsTypedDataClassId(FP[rA]->GetClassId()));
-    RawTypedData* array = reinterpret_cast<RawTypedData*>(FP[rA]);
-    RawSmi* index = RAW_CAST(Smi, FP[rB]);
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    const uint64_t value = reinterpret_cast<uint64_t>(FP[rC]);
-    const uint32_t value32 = value;
-    reinterpret_cast<uint32_t*>(array->ptr()->data())[Smi::Value(index)] =
-        value32;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreIndexedFloat64, A_B_C);
-    uint8_t* data = InterpreterHelpers::GetTypedData(FP[rA], FP[rB]);
-    *reinterpret_cast<uint64_t*>(data) = reinterpret_cast<uint64_t>(FP[rC]);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreIndexed8Float64, A_B_C);
-    ASSERT(RawObject::IsTypedDataClassId(FP[rA]->GetClassId()));
-    RawTypedData* array = reinterpret_cast<RawTypedData*>(FP[rA]);
-    RawSmi* index = RAW_CAST(Smi, FP[rB]);
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    const int64_t value = reinterpret_cast<int64_t>(FP[rC]);
-    reinterpret_cast<int64_t*>(array->ptr()->data())[Smi::Value(index)] = value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BoxInt32, A_D);
-    // Casts sign-extend high 32 bits from low 32 bits.
-    const intptr_t value = reinterpret_cast<intptr_t>(FP[rD]);
-    const int32_t value32 = static_cast<int32_t>(value);
-    FP[rA] = Smi::New(static_cast<intptr_t>(value32));
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BoxUint32, A_D);
-    // Casts to zero out high 32 bits.
-    const uintptr_t value = reinterpret_cast<uintptr_t>(FP[rD]);
-    const uint32_t value32 = static_cast<uint32_t>(value);
-    FP[rA] = Smi::New(static_cast<intptr_t>(value32));
-    DISPATCH();
-  }
-#else   // defined(ARCH_IS_64_BIT)
-  {
-    BYTECODE(WriteIntoDouble, A_D);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(UnboxDouble, A_D);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckedUnboxDouble, A_D);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DoubleToSmi, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(SmiToDouble, A_D);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DAdd, A_B_C);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DSub, A_B_C);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DMul, A_B_C);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DDiv, A_B_C);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DNeg, A_D);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DSqrt, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DSin, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DCos, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DPow, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DMod, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DMin, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DMax, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DTruncate, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DFloor, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DCeil, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DoubleToFloat, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(FloatToDouble, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DoubleIsNaN, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DoubleIsInfinite, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedFloat32, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexed4Float32, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedFloat64, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexed8Float64, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreIndexedFloat32, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreIndexed4Float32, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreIndexedFloat64, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreIndexed8Float64, A_B_C);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BoxInt32, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BoxUint32, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-#endif  // defined(ARCH_IS_64_BIT)
-
   // Return and return like instructions (Intrinsic).
   {
     RawObject* result;  // result to return to the caller.
 
-    BYTECODE(Intrinsic, A);
-    // Try invoking intrinsic handler. If it succeeds (returns true)
-    // then just return the value it returned to the caller.
-    result = null_value;
-    if (!intrinsics_[rA](thread, FP, &result)) {
-      DISPATCH();
-    }
-    goto ReturnImpl;
-
-    BYTECODE(Return, A);
-    result = FP[rA];
-    goto ReturnImpl;
-
     BYTECODE(ReturnTOS, 0);
     result = *SP;
-    // Fall through to the ReturnImpl.
-
-  ReturnImpl:
     // Restore caller PC.
     pc = SavedCallerPC(FP);
     pc_ = reinterpret_cast<uword>(pc);  // For the profiler.
@@ -3540,38 +2362,6 @@
   }
 
   {
-    BYTECODE(StoreField, A_B_C);
-    const uint16_t offset_in_words = rB;
-    const uint16_t value_reg = rC;
-
-    RawInstance* instance = reinterpret_cast<RawInstance*>(FP[rA]);
-    RawObject* value = FP[value_reg];
-
-    // TODO(regis): Implement cid guard.
-    ASSERT(!thread->isolate()->use_field_guards());
-
-    instance->StorePointer(
-        reinterpret_cast<RawObject**>(instance->ptr()) + offset_in_words, value,
-        thread);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreFieldExt, A_D);
-    // The offset is stored in the following nop-instruction which is skipped.
-    const uint16_t offset_in_words = KernelBytecode::DecodeD(*pc++);
-    RawInstance* instance = reinterpret_cast<RawInstance*>(FP[rA]);
-    RawObject* value = FP[rD];
-
-    UNREACHABLE();  // TODO(regis): unused, remove.
-
-    instance->StorePointer(
-        reinterpret_cast<RawObject**>(instance->ptr()) + offset_in_words, value,
-        thread);
-    DISPATCH();
-  }
-
-  {
     BYTECODE(StoreFieldTOS, __D);
     const uword offset_in_words =
         static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))));
@@ -3620,34 +2410,6 @@
   }
 
   {
-    BYTECODE(LoadField, A_B_C);
-    const uint16_t instance_reg = rB;
-    const uint16_t offset_in_words = rC;
-    RawInstance* instance = reinterpret_cast<RawInstance*>(FP[instance_reg]);
-    FP[rA] = reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadFieldExt, A_D);
-    // The offset is stored in the following nop-instruction which is skipped.
-    const uint16_t offset_in_words = KernelBytecode::DecodeD(*pc++);
-    const uint16_t instance_reg = rD;
-    RawInstance* instance = reinterpret_cast<RawInstance*>(FP[instance_reg]);
-    FP[rA] = reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadUntagged, A_B_C);
-    const uint16_t instance_reg = rB;
-    const uint16_t offset_in_words = rC;
-    RawInstance* instance = reinterpret_cast<RawInstance*>(FP[instance_reg]);
-    FP[rA] = reinterpret_cast<RawObject**>(instance)[offset_in_words];
-    DISPATCH();
-  }
-
-  {
     BYTECODE(LoadFieldTOS, __D);
     const uword offset_in_words =
         static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))));
@@ -3683,46 +2445,9 @@
     DISPATCH();
   }
 
-  {
-    BYTECODE(InitStaticTOS, 0);
-    UNREACHABLE();  // Not used. TODO(regis): Remove this bytecode.
-    RawField* field = static_cast<RawField*>(*SP--);
-    RawObject* value = field->ptr()->value_.static_value_;
-    if ((value == Object::sentinel().raw()) ||
-        (value == Object::transition_sentinel().raw())) {
-      // Note: SP[1] already contains the field object.
-      SP[2] = 0;
-      Exit(thread, FP, SP + 3, pc);
-      NativeArguments args(thread, 1, SP + 1, SP + 2);
-      INVOKE_RUNTIME(DRT_InitStaticField, args);
-    }
-    DISPATCH();
-  }
-
   // TODO(vegorov) allocation bytecodes can benefit from the new-space
   // allocation fast-path that does not transition into the runtime system.
   {
-    BYTECODE(AllocateUninitializedContext, A_D);
-    const uint16_t num_context_variables = rD;
-    const intptr_t instance_size = Context::InstanceSize(num_context_variables);
-    const uword start =
-        thread->heap()->new_space()->TryAllocateInTLAB(thread, instance_size);
-    if (LIKELY(start != 0)) {
-      uint32_t tags = 0;
-      tags = RawObject::ClassIdTag::update(kContextCid, tags);
-      tags = RawObject::SizeTag::update(instance_size, tags);
-      tags = RawObject::NewBit::update(true, tags);
-      // Also writes 0 in the hash_ field of the header.
-      *reinterpret_cast<uword*>(start + Array::tags_offset()) = tags;
-      *reinterpret_cast<uword*>(start + Context::num_variables_offset()) =
-          num_context_variables;
-      FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag);
-      pc += 2;
-    }
-    DISPATCH();
-  }
-
-  {
     BYTECODE(AllocateContext, A_D);
     const uint16_t num_context_variables = rD;
     {
@@ -3747,26 +2472,6 @@
   }
 
   {
-    BYTECODE(AllocateOpt, A_D);
-    uint32_t tags = Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD)));
-    const intptr_t instance_size = RawObject::SizeTag::decode(tags);
-    const uword start =
-        thread->heap()->new_space()->TryAllocateInTLAB(thread, instance_size);
-    if (LIKELY(start != 0)) {
-      // Writes both the tags and the initial identity hash on 64 bit platforms.
-      tags = RawObject::NewBit::update(true, tags);
-      *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags;
-      for (intptr_t current_offset = sizeof(RawInstance);
-           current_offset < instance_size; current_offset += kWordSize) {
-        *reinterpret_cast<RawObject**>(start + current_offset) = null_value;
-      }
-      FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag);
-      pc += 2;
-    }
-    DISPATCH();
-  }
-
-  {
     BYTECODE(Allocate, A_D);
     SP[1] = 0;                  // Space for the result.
     SP[2] = LOAD_CONSTANT(rD);  // Class object.
@@ -3779,30 +2484,6 @@
   }
 
   {
-    BYTECODE(AllocateTOpt, A_D);
-    uint32_t tags = Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD)));
-    const intptr_t instance_size = RawObject::SizeTag::decode(tags);
-    const uword start =
-        thread->heap()->new_space()->TryAllocateInTLAB(thread, instance_size);
-    if (LIKELY(start != 0)) {
-      RawObject* type_args = SP[0];
-      const intptr_t type_args_offset = KernelBytecode::DecodeD(*pc);
-      // Writes both the tags and the initial identity hash on 64 bit platforms.
-      tags = RawObject::NewBit::update(true, tags);
-      *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags;
-      for (intptr_t current_offset = sizeof(RawInstance);
-           current_offset < instance_size; current_offset += kWordSize) {
-        *reinterpret_cast<RawObject**>(start + current_offset) = null_value;
-      }
-      *reinterpret_cast<RawObject**>(start + type_args_offset) = type_args;
-      FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag);
-      SP -= 1;  // Consume the type arguments on the stack.
-      pc += 4;
-    }
-    DISPATCH();
-  }
-
-  {
     BYTECODE(AllocateT, 0);
     SP[1] = SP[-0];  // Class object.
     SP[2] = SP[-1];  // Type arguments
@@ -3814,46 +2495,6 @@
   }
 
   {
-    BYTECODE(CreateArrayOpt, A_B_C);
-    if (LIKELY(!FP[rB]->IsHeapObject())) {
-      const intptr_t length = Smi::Value(RAW_CAST(Smi, FP[rB]));
-      if (LIKELY(static_cast<uintptr_t>(length) <= Array::kMaxElements)) {
-        const intptr_t fixed_size_plus_alignment_padding =
-            sizeof(RawArray) + kObjectAlignment - 1;
-        const intptr_t instance_size =
-            (fixed_size_plus_alignment_padding + length * kWordSize) &
-            ~(kObjectAlignment - 1);
-        const uword start = thread->heap()->new_space()->TryAllocateInTLAB(
-            thread, instance_size);
-        if (LIKELY(start != 0)) {
-          const intptr_t cid = kArrayCid;
-          uword tags = 0;
-          if (LIKELY(instance_size <= RawObject::SizeTag::kMaxSizeTag)) {
-            tags = RawObject::SizeTag::update(instance_size, tags);
-          }
-          tags = RawObject::ClassIdTag::update(cid, tags);
-          tags = RawObject::NewBit::update(true, tags);
-          // Writes both the tags and the initial identity hash on 64 bit
-          // platforms.
-          *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags;
-          *reinterpret_cast<RawObject**>(start + Array::length_offset()) =
-              FP[rB];
-          *reinterpret_cast<RawObject**>(
-              start + Array::type_arguments_offset()) = FP[rC];
-          RawObject** data =
-              reinterpret_cast<RawObject**>(start + Array::data_offset());
-          for (intptr_t i = 0; i < length; i++) {
-            data[i] = null_value;
-          }
-          FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag);
-          pc += 4;
-        }
-      }
-    }
-    DISPATCH();
-  }
-
-  {
     BYTECODE(CreateArrayTOS, 0);
     SP[1] = SP[-0];  // Length.
     SP[2] = SP[-1];  // Type.
@@ -3865,109 +2506,8 @@
   }
 
   {
-    BYTECODE(InstanceOf, 0);
-    // Stack: instance, instantiator type args, function type args, type, cache
-    RawInstance* instance = static_cast<RawInstance*>(SP[-4]);
-    RawTypeArguments* instantiator_type_arguments =
-        static_cast<RawTypeArguments*>(SP[-3]);
-    RawTypeArguments* function_type_arguments =
-        static_cast<RawTypeArguments*>(SP[-2]);
-    RawAbstractType* type = static_cast<RawAbstractType*>(SP[-1]);
-    RawSubtypeTestCache* cache = static_cast<RawSubtypeTestCache*>(SP[0]);
-
-    if (cache != null_value) {
-      const intptr_t cid = InterpreterHelpers::GetClassId(instance);
-
-      RawTypeArguments* instance_type_arguments =
-          static_cast<RawTypeArguments*>(null_value);
-      RawObject* instance_cid_or_function;
-      RawTypeArguments* parent_function_type_arguments;
-      RawTypeArguments* delayed_function_type_arguments;
-      if (cid == kClosureCid) {
-        RawClosure* closure = static_cast<RawClosure*>(instance);
-        instance_type_arguments = closure->ptr()->instantiator_type_arguments_;
-        parent_function_type_arguments =
-            closure->ptr()->function_type_arguments_;
-        delayed_function_type_arguments =
-            closure->ptr()->delayed_type_arguments_;
-        instance_cid_or_function = closure->ptr()->function_;
-      } else {
-        instance_cid_or_function = Smi::New(cid);
-
-        RawClass* instance_class = thread->isolate()->class_table()->At(cid);
-        if (instance_class->ptr()->num_type_arguments_ < 0) {
-          goto InstanceOfCallRuntime;
-        } else if (instance_class->ptr()->num_type_arguments_ > 0) {
-          instance_type_arguments = reinterpret_cast<RawTypeArguments**>(
-              instance->ptr())[instance_class->ptr()
-                                   ->type_arguments_field_offset_in_words_];
-        }
-        parent_function_type_arguments =
-            static_cast<RawTypeArguments*>(null_value);
-        delayed_function_type_arguments =
-            static_cast<RawTypeArguments*>(null_value);
-      }
-
-      for (RawObject** entries = cache->ptr()->cache_->ptr()->data();
-           entries[0] != null_value;
-           entries += SubtypeTestCache::kTestEntryLength) {
-        if ((entries[SubtypeTestCache::kInstanceClassIdOrFunction] ==
-             instance_cid_or_function) &&
-            (entries[SubtypeTestCache::kInstanceTypeArguments] ==
-             instance_type_arguments) &&
-            (entries[SubtypeTestCache::kInstantiatorTypeArguments] ==
-             instantiator_type_arguments) &&
-            (entries[SubtypeTestCache::kFunctionTypeArguments] ==
-             function_type_arguments) &&
-            (entries[SubtypeTestCache::kInstanceParentFunctionTypeArguments] ==
-             parent_function_type_arguments) &&
-            (entries[SubtypeTestCache::kInstanceDelayedFunctionTypeArguments] ==
-             delayed_function_type_arguments)) {
-          SP[-4] = entries[SubtypeTestCache::kTestResult];
-          goto InstanceOfOk;
-        }
-      }
-    }
-
-  // clang-format off
-  InstanceOfCallRuntime:
-    {
-      SP[1] = instance;
-      SP[2] = type;
-      SP[3] = instantiator_type_arguments;
-      SP[4] = function_type_arguments;
-      SP[5] = cache;
-      Exit(thread, FP, SP + 6, pc);
-      NativeArguments native_args(thread, 5, SP + 1, SP - 4);
-      INVOKE_RUNTIME(DRT_Instanceof, native_args);
-    }
-    // clang-format on
-
-  InstanceOfOk:
-    SP -= 4;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BadTypeError, 0);
-    // Stack: instance, instantiator type args, function type args, type, name
-    RawObject** args = SP - 4;
-    if (args[0] != null_value) {
-      SP[1] = args[0];  // instance.
-      SP[2] = args[4];  // name.
-      SP[3] = args[3];  // type.
-      Exit(thread, FP, SP + 4, pc);
-      NativeArguments native_args(thread, 3, SP + 1, SP - 4);
-      INVOKE_RUNTIME(DRT_BadTypeError, native_args);
-      UNREACHABLE();
-    }
-    SP -= 4;
-    DISPATCH();
-  }
-
-  {
     BYTECODE(AssertAssignable, A_D);
-    // Stack: instance, instantiator type args, function type args, type, name
+    // Stack: instance, type, instantiator type args, function type args, name
     RawObject** args = SP - 4;
     const bool may_be_smi = (rA == 1);
     const bool is_smi =
@@ -4040,475 +2580,15 @@
   }
 
   {
-    BYTECODE(TestSmi, A_D);
-    intptr_t left = reinterpret_cast<intptr_t>(RAW_CAST(Smi, FP[rA]));
-    intptr_t right = reinterpret_cast<intptr_t>(RAW_CAST(Smi, FP[rD]));
-    if ((left & right) != 0) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(TestCids, A_D);
-    const intptr_t cid = InterpreterHelpers::GetClassId(FP[rA]);
-    const intptr_t num_cases = rD;
-    for (intptr_t i = 0; i < num_cases; i++) {
-      ASSERT(KernelBytecode::DecodeOpcode(pc[i]) == KernelBytecode::kNop);
-      intptr_t test_target = KernelBytecode::DecodeA(pc[i]);
-      intptr_t test_cid = KernelBytecode::DecodeD(pc[i]);
-      if (cid == test_cid) {
-        if (test_target != 0) {
-          pc += 1;  // Match true.
-        } else {
-          pc += 2;  // Match false.
-        }
-        break;
-      }
-    }
-    pc += num_cases;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckSmi, 0);
-    intptr_t obj = reinterpret_cast<intptr_t>(FP[rA]);
-    if ((obj & kSmiTagMask) == kSmiTag) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckEitherNonSmi, A_D);
-    const intptr_t obj1 = reinterpret_cast<intptr_t>(FP[rA]);
-    const intptr_t obj2 = reinterpret_cast<intptr_t>(FP[rD]);
-    const intptr_t tag = (obj1 | obj2) & kSmiTagMask;
-    if (tag != kSmiTag) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckClassId, A_D);
-    const intptr_t actual_cid =
-        reinterpret_cast<intptr_t>(FP[rA]) >> kSmiTagSize;
-    const intptr_t desired_cid = rD;
-    pc += (actual_cid == desired_cid) ? 1 : 0;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckClassIdRange, A_D);
-    const intptr_t actual_cid =
-        reinterpret_cast<intptr_t>(FP[rA]) >> kSmiTagSize;
-    const uintptr_t cid_start = rD;
-    const uintptr_t cid_range = KernelBytecode::DecodeD(*pc);
-    // Unsigned comparison.  Skip either just the nop or both the nop and the
-    // following instruction.
-    pc += (actual_cid - cid_start <= cid_range) ? 2 : 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckBitTest, A_D);
-    const intptr_t raw_value = reinterpret_cast<intptr_t>(FP[rA]);
-    const bool is_smi = ((raw_value & kSmiTagMask) == kSmiTag);
-    const intptr_t cid_min = KernelBytecode::DecodeD(*pc);
-    const intptr_t cid_mask = Smi::Value(
-        RAW_CAST(Smi, LOAD_CONSTANT(KernelBytecode::DecodeD(*(pc + 1)))));
-    if (LIKELY(!is_smi)) {
-      const intptr_t cid_max = Utils::HighestBit(cid_mask) + cid_min;
-      const intptr_t cid = InterpreterHelpers::GetClassId(FP[rA]);
-      // The cid is in-bounds, and the bit is set in the mask.
-      if ((cid >= cid_min) && (cid <= cid_max) &&
-          ((cid_mask & (1 << (cid - cid_min))) != 0)) {
-        pc += 3;
-      } else {
-        pc += 2;
-      }
-    } else {
-      const bool may_be_smi = (rD == 1);
-      pc += (may_be_smi ? 3 : 2);
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckCids, A_B_C);
-    const intptr_t raw_value = reinterpret_cast<intptr_t>(FP[rA]);
-    const bool is_smi = ((raw_value & kSmiTagMask) == kSmiTag);
-    const bool may_be_smi = (rB == 1);
-    const intptr_t cids_length = rC;
-    if (LIKELY(!is_smi)) {
-      const intptr_t cid = InterpreterHelpers::GetClassId(FP[rA]);
-      for (intptr_t i = 0; i < cids_length; i++) {
-        const intptr_t desired_cid = KernelBytecode::DecodeD(*(pc + i));
-        if (cid == desired_cid) {
-          pc++;
-          break;
-        }
-      }
-      pc += cids_length;
-    } else {
-      pc += cids_length;
-      pc += (may_be_smi ? 1 : 0);
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckCidsByRange, A_B_C);
-    const intptr_t raw_value = reinterpret_cast<intptr_t>(FP[rA]);
-    const bool is_smi = ((raw_value & kSmiTagMask) == kSmiTag);
-    const bool may_be_smi = (rB == 1);
-    const intptr_t cids_length = rC;
-    if (LIKELY(!is_smi)) {
-      const intptr_t cid = InterpreterHelpers::GetClassId(FP[rA]);
-      for (intptr_t i = 0; i < cids_length; i += 2) {
-        // Note unsigned type to get unsigned range check below.
-        const uintptr_t cid_start = KernelBytecode::DecodeD(*(pc + i));
-        const uintptr_t cids = KernelBytecode::DecodeD(*(pc + i + 1));
-        if (cid - cid_start < cids) {
-          pc++;
-          break;
-        }
-      }
-      pc += cids_length;
-    } else {
-      pc += cids_length;
-      pc += (may_be_smi ? 1 : 0);
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfEqStrictTOS, 0);
-    SP -= 2;
-    if (SP[1] != SP[2]) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfNeStrictTOS, 0);
-    SP -= 2;
-    if (SP[1] == SP[2]) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfEqStrictNumTOS, 0);
-    if (thread->isolate()->single_step()) {
-      Exit(thread, FP, SP + 1, pc);
-      NativeArguments args(thread, 0, NULL, NULL);
-      INVOKE_RUNTIME(DRT_SingleStepHandler, args);
-    }
-
-    SP -= 2;
-    if (!InterpreterHelpers::IsStrictEqualWithNumberCheck(SP[1], SP[2])) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfNeStrictNumTOS, 0);
-    if (thread->isolate()->single_step()) {
-      Exit(thread, FP, SP + 1, pc);
-      NativeArguments args(thread, 0, NULL, NULL);
-      INVOKE_RUNTIME(DRT_SingleStepHandler, args);
-    }
-
-    SP -= 2;
-    if (InterpreterHelpers::IsStrictEqualWithNumberCheck(SP[1], SP[2])) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfSmiLtTOS, 0);
-    RawSmi* left = Smi::RawCast(SP[-1]);
-    RawSmi* right = Smi::RawCast(SP[-0]);
-    if (!(Smi::Value(left) < Smi::Value(right))) {
-      pc++;
-    }
-    SP -= 2;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfSmiLeTOS, 0);
-    RawSmi* left = Smi::RawCast(SP[-1]);
-    RawSmi* right = Smi::RawCast(SP[-0]);
-    if (!(Smi::Value(left) <= Smi::Value(right))) {
-      pc++;
-    }
-    SP -= 2;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfSmiGeTOS, 0);
-    RawSmi* left = Smi::RawCast(SP[-1]);
-    RawSmi* right = Smi::RawCast(SP[-0]);
-    if (!(Smi::Value(left) >= Smi::Value(right))) {
-      pc++;
-    }
-    SP -= 2;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfSmiGtTOS, 0);
-    RawSmi* left = Smi::RawCast(SP[-1]);
-    RawSmi* right = Smi::RawCast(SP[-0]);
-    if (!(Smi::Value(left) > Smi::Value(right))) {
-      pc++;
-    }
-    SP -= 2;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfEqStrict, A_D);
-    RawObject* lhs = FP[rA];
-    RawObject* rhs = FP[rD];
-    if (lhs != rhs) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfNeStrict, A_D);
-    RawObject* lhs = FP[rA];
-    RawObject* rhs = FP[rD];
-    if (lhs == rhs) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfLe, A_D);
-    const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rA]);
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rD]);
-    if (lhs > rhs) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfLt, A_D);
-    const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rA]);
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rD]);
-    if (lhs >= rhs) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfGe, A_D);
-    const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rA]);
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rD]);
-    if (lhs < rhs) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfGt, A_D);
-    const intptr_t lhs = reinterpret_cast<intptr_t>(FP[rA]);
-    const intptr_t rhs = reinterpret_cast<intptr_t>(FP[rD]);
-    if (lhs <= rhs) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfULe, A_D);
-    const uintptr_t lhs = reinterpret_cast<uintptr_t>(FP[rA]);
-    const uintptr_t rhs = reinterpret_cast<uintptr_t>(FP[rD]);
-    if (lhs > rhs) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfULt, A_D);
-    const uintptr_t lhs = reinterpret_cast<uintptr_t>(FP[rA]);
-    const uintptr_t rhs = reinterpret_cast<uintptr_t>(FP[rD]);
-    if (lhs >= rhs) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfUGe, A_D);
-    const uintptr_t lhs = reinterpret_cast<uintptr_t>(FP[rA]);
-    const uintptr_t rhs = reinterpret_cast<uintptr_t>(FP[rD]);
-    if (lhs < rhs) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfUGt, A_D);
-    const uintptr_t lhs = reinterpret_cast<uintptr_t>(FP[rA]);
-    const uintptr_t rhs = reinterpret_cast<uintptr_t>(FP[rD]);
-    if (lhs <= rhs) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-#if defined(ARCH_IS_64_BIT)
-  {
-    BYTECODE(IfDEq, A_D);
-    const double lhs = bit_cast<double, RawObject*>(FP[rA]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rD]);
-    pc += (lhs == rhs) ? 0 : 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfDNe, A_D);
-    const double lhs = bit_cast<double, RawObject*>(FP[rA]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rD]);
-    pc += (lhs != rhs) ? 0 : 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfDLe, A_D);
-    const double lhs = bit_cast<double, RawObject*>(FP[rA]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rD]);
-    pc += (lhs <= rhs) ? 0 : 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfDLt, A_D);
-    const double lhs = bit_cast<double, RawObject*>(FP[rA]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rD]);
-    pc += (lhs < rhs) ? 0 : 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfDGe, A_D);
-    const double lhs = bit_cast<double, RawObject*>(FP[rA]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rD]);
-    pc += (lhs >= rhs) ? 0 : 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfDGt, A_D);
-    const double lhs = bit_cast<double, RawObject*>(FP[rA]);
-    const double rhs = bit_cast<double, RawObject*>(FP[rD]);
-    pc += (lhs > rhs) ? 0 : 1;
-    DISPATCH();
-  }
-#else   // defined(ARCH_IS_64_BIT)
-  {
-    BYTECODE(IfDEq, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfDNe, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfDLe, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfDLt, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfDGe, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfDGt, A_D);
-    UNREACHABLE();
-    DISPATCH();
-  }
-#endif  // defined(ARCH_IS_64_BIT)
-
-  {
-    BYTECODE(IfEqStrictNum, A_D);
-    RawObject* lhs = FP[rA];
-    RawObject* rhs = FP[rD];
-    if (!InterpreterHelpers::IsStrictEqualWithNumberCheck(lhs, rhs)) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfNeStrictNum, A_D);
-    RawObject* lhs = FP[rA];
-    RawObject* rhs = FP[rD];
-    if (InterpreterHelpers::IsStrictEqualWithNumberCheck(lhs, rhs)) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfEqNull, A);
-    if (FP[rA] != null_value) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(IfNeNull, A_D);
-    if (FP[rA] == null_value) {
-      pc++;
-    }
-    DISPATCH();
-  }
-
-  {
     BYTECODE(Jump, 0);
-    const int32_t target = static_cast<int32_t>(op) >> 8;
-    pc += (target - 1);
+    LOAD_JUMP_TARGET();
     DISPATCH();
   }
 
   {
     BYTECODE(JumpIfNoAsserts, 0);
     if (!thread->isolate()->asserts()) {
-      const int32_t target = static_cast<int32_t>(op) >> 8;
-      pc += (target - 1);
+      LOAD_JUMP_TARGET();
     }
     DISPATCH();
   }
@@ -4516,24 +2596,62 @@
   {
     BYTECODE(JumpIfNotZeroTypeArgs, 0);
     if (InterpreterHelpers::ArgDescTypeArgsLen(argdesc_) != 0) {
-      const int32_t target = static_cast<int32_t>(op) >> 8;
-      pc += (target - 1);
+      LOAD_JUMP_TARGET();
     }
     DISPATCH();
   }
 
   {
-    BYTECODE(LoadClassId, A_D);
-    const uint16_t object_reg = rD;
-    RawObject* obj = static_cast<RawObject*>(FP[object_reg]);
-    FP[rA] = InterpreterHelpers::GetClassIdAsSmi(obj);
+    BYTECODE(JumpIfEqStrict, 0);
+    SP -= 2;
+    if (SP[1] == SP[2]) {
+      LOAD_JUMP_TARGET();
+    }
     DISPATCH();
   }
 
   {
-    BYTECODE(LoadClassIdTOS, 0);
-    RawObject* obj = static_cast<RawObject*>(SP[0]);
-    SP[0] = InterpreterHelpers::GetClassIdAsSmi(obj);
+    BYTECODE(JumpIfNeStrict, 0);
+    SP -= 2;
+    if (SP[1] != SP[2]) {
+      LOAD_JUMP_TARGET();
+    }
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(JumpIfTrue, 0);
+    SP -= 1;
+    if (SP[1] == true_value) {
+      LOAD_JUMP_TARGET();
+    }
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(JumpIfFalse, 0);
+    SP -= 1;
+    if (SP[1] == false_value) {
+      LOAD_JUMP_TARGET();
+    }
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(JumpIfNull, 0);
+    SP -= 1;
+    if (SP[1] == null_value) {
+      LOAD_JUMP_TARGET();
+    }
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(JumpIfNotNull, 0);
+    SP -= 1;
+    if (SP[1] != null_value) {
+      LOAD_JUMP_TARGET();
+    }
     DISPATCH();
   }
 
@@ -4550,234 +2668,199 @@
   }
 
   {
-    BYTECODE(StoreIndexed, A_B_C);
-    RawArray* array = RAW_CAST(Array, FP[rA]);
-    RawSmi* index = RAW_CAST(Smi, FP[rB]);
-    RawObject* value = FP[rC];
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    array->StorePointer(array->ptr()->data() + Smi::Value(index), value,
-                        thread);
+    BYTECODE(EqualsNull, 0);
+    SP[0] = (SP[0] == null_value) ? true_value : false_value;
     DISPATCH();
   }
 
   {
-    BYTECODE(StoreIndexedUint8, A_B_C);
-    uint8_t* data = InterpreterHelpers::GetTypedData(FP[rA], FP[rB]);
-    *data = Smi::Value(RAW_CAST(Smi, FP[rC]));
+    BYTECODE(NegateInt, 0);
+    UNBOX_INT64(value, SP[0], Symbols::UnaryMinus());
+    int64_t result = Utils::SubWithWrapAround(0, value);
+    BOX_INT64_RESULT(result);
     DISPATCH();
   }
 
   {
-    BYTECODE(StoreIndexedExternalUint8, A_B_C);
-    uint8_t* array = reinterpret_cast<uint8_t*>(FP[rA]);
-    RawSmi* index = RAW_CAST(Smi, FP[rB]);
-    RawSmi* value = RAW_CAST(Smi, FP[rC]);
-    array[Smi::Value(index)] = Smi::Value(value);
+    BYTECODE(AddInt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::Plus());
+    UNBOX_INT64(b, SP[1], Symbols::Plus());
+    int64_t result = Utils::AddWithWrapAround(a, b);
+    BOX_INT64_RESULT(result);
     DISPATCH();
   }
 
   {
-    BYTECODE(StoreIndexedOneByteString, A_B_C);
-    RawOneByteString* array = RAW_CAST(OneByteString, FP[rA]);
-    RawSmi* index = RAW_CAST(Smi, FP[rB]);
-    RawSmi* value = RAW_CAST(Smi, FP[rC]);
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    array->ptr()->data()[Smi::Value(index)] = Smi::Value(value);
+    BYTECODE(SubInt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::Minus());
+    UNBOX_INT64(b, SP[1], Symbols::Minus());
+    int64_t result = Utils::SubWithWrapAround(a, b);
+    BOX_INT64_RESULT(result);
     DISPATCH();
   }
 
   {
-    BYTECODE(StoreIndexedUint32, A_B_C);
-    uint8_t* data = InterpreterHelpers::GetTypedData(FP[rA], FP[rB]);
-    const uintptr_t value = reinterpret_cast<uintptr_t>(FP[rC]);
-    *reinterpret_cast<uint32_t*>(data) = static_cast<uint32_t>(value);
+    BYTECODE(MulInt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::Star());
+    UNBOX_INT64(b, SP[1], Symbols::Star());
+    int64_t result = Utils::MulWithWrapAround(a, b);
+    BOX_INT64_RESULT(result);
     DISPATCH();
   }
 
   {
-    BYTECODE(TailCall, 0);
-    RawCode* code = RAW_CAST(Code, SP[-0]);
-    RawImmutableArray* args_desc = RAW_CAST(ImmutableArray, SP[-1]);
-    PrepareForTailCall(code, args_desc, FP, &SP, &pc);
+    BYTECODE(TruncDivInt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::TruncDivOperator());
+    UNBOX_INT64(b, SP[1], Symbols::TruncDivOperator());
+    if (UNLIKELY(b == 0)) {
+      goto ThrowIntegerDivisionByZeroException;
+    }
+    int64_t result;
+    if (UNLIKELY((a == Mint::kMinValue) && (b == -1))) {
+      result = Mint::kMinValue;
+    } else {
+      result = a / b;
+    }
+    BOX_INT64_RESULT(result);
     DISPATCH();
   }
 
   {
-    BYTECODE(TailCallOpt, A_D);
-    RawImmutableArray* args_desc = RAW_CAST(ImmutableArray, FP[rA]);
-    RawCode* code = RAW_CAST(Code, FP[rD]);
-    PrepareForTailCall(code, args_desc, FP, &SP, &pc);
+    BYTECODE(ModInt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::Percent());
+    UNBOX_INT64(b, SP[1], Symbols::Percent());
+    if (UNLIKELY(b == 0)) {
+      goto ThrowIntegerDivisionByZeroException;
+    }
+    int64_t result;
+    if (UNLIKELY((a == Mint::kMinValue) && (b == -1))) {
+      result = 0;
+    } else {
+      result = a % b;
+      if (result < 0) {
+        if (b < 0) {
+          result -= b;
+        } else {
+          result += b;
+        }
+      }
+    }
+    BOX_INT64_RESULT(result);
     DISPATCH();
   }
 
   {
-    BYTECODE(LoadArgDescriptor, 0);
-    SP++;
-    SP[0] = argdesc_;
+    BYTECODE(BitAndInt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::Ampersand());
+    UNBOX_INT64(b, SP[1], Symbols::Ampersand());
+    int64_t result = a & b;
+    BOX_INT64_RESULT(result);
     DISPATCH();
   }
 
   {
-    BYTECODE(LoadArgDescriptorOpt, A);
-    FP[rA] = argdesc_;
+    BYTECODE(BitOrInt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::BitOr());
+    UNBOX_INT64(b, SP[1], Symbols::BitOr());
+    int64_t result = a | b;
+    BOX_INT64_RESULT(result);
     DISPATCH();
   }
 
   {
-    BYTECODE(NoSuchMethod, 0);
-    goto ClosureNoSuchMethod;
-  }
-
-  {
-    BYTECODE(LoadFpRelativeSlot, A_X);
-    RawSmi* index = RAW_CAST(Smi, SP[-0]);
-    const int16_t offset = rD;
-    SP[-0] = FP[-(Smi::Value(index) + offset)];
+    BYTECODE(BitXorInt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::Caret());
+    UNBOX_INT64(b, SP[1], Symbols::Caret());
+    int64_t result = a ^ b;
+    BOX_INT64_RESULT(result);
     DISPATCH();
   }
 
   {
-    BYTECODE(LoadFpRelativeSlotOpt, A_B_Y);
-    RawSmi* index = RAW_CAST(Smi, FP[rB]);
-    const int8_t offset = rY;
-    FP[rA] = FP[-(Smi::Value(index) + offset)];
+    BYTECODE(ShlInt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::LeftShiftOperator());
+    UNBOX_INT64(b, SP[1], Symbols::LeftShiftOperator());
+    if (b < 0) {
+      SP[0] = SP[1];
+      goto ThrowArgumentError;
+    }
+    int64_t result = Utils::ShiftLeftWithTruncation(a, b);
+    BOX_INT64_RESULT(result);
     DISPATCH();
   }
 
   {
-    BYTECODE(StoreFpRelativeSlot, A_X);
-    RawSmi* index = RAW_CAST(Smi, SP[-1]);
-    const int16_t offset = rD;
-    FP[-(Smi::Value(index) + offset) - 0] = SP[-0];
-    SP--;
+    BYTECODE(ShrInt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::RightShiftOperator());
+    UNBOX_INT64(b, SP[1], Symbols::RightShiftOperator());
+    if (b < 0) {
+      SP[0] = SP[1];
+      goto ThrowArgumentError;
+    }
+    int64_t result = a >> Utils::Minimum<int64_t>(b, Mint::kBits);
+    BOX_INT64_RESULT(result);
     DISPATCH();
   }
 
   {
-    BYTECODE(StoreFpRelativeSlotOpt, A_B_Y);
-    RawSmi* index = RAW_CAST(Smi, FP[rB]);
-    const int8_t offset = rY;
-    FP[-(Smi::Value(index) + offset) - 0] = FP[rA];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedTOS, 0);
-    // Currently this instruction is only emitted if it's safe to do.
-    ASSERT(!SP[0]->IsHeapObject());
-    ASSERT(SP[-1]->IsArray() || SP[-1]->IsImmutableArray());
-
-    const intptr_t index_scale = rA;
-    RawSmi* index = RAW_CAST(Smi, SP[-0]);
-    RawArray* array = Array::RawCast(SP[-1]);
-
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    SP[-1] = array->ptr()->data()[Smi::Value(index) << index_scale];
-    SP--;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexed, A_B_C);
-    RawObject* obj = FP[rB];
-    ASSERT(obj->IsArray() || obj->IsImmutableArray());
-    RawArray* array = reinterpret_cast<RawArray*>(obj);
-    RawSmi* index = RAW_CAST(Smi, FP[rC]);
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    FP[rA] = array->ptr()->data()[Smi::Value(index)];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedUint8, A_B_C);
-    uint8_t* data = InterpreterHelpers::GetTypedData(FP[rB], FP[rC]);
-    FP[rA] = Smi::New(*data);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedInt8, A_B_C);
-    uint8_t* data = InterpreterHelpers::GetTypedData(FP[rB], FP[rC]);
-    FP[rA] = Smi::New(*reinterpret_cast<int8_t*>(data));
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedUint32, A_B_C);
-    const uint8_t* data = InterpreterHelpers::GetTypedData(FP[rB], FP[rC]);
-    const uint32_t value = *reinterpret_cast<const uint32_t*>(data);
-    FP[rA] = reinterpret_cast<RawObject*>(value);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedInt32, A_B_C);
-    const uint8_t* data = InterpreterHelpers::GetTypedData(FP[rB], FP[rC]);
-    const int32_t value = *reinterpret_cast<const int32_t*>(data);
-    FP[rA] = reinterpret_cast<RawObject*>(value);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedExternalUint8, A_B_C);
-    uint8_t* data = reinterpret_cast<uint8_t*>(FP[rB]);
-    RawSmi* index = RAW_CAST(Smi, FP[rC]);
-    FP[rA] = Smi::New(data[Smi::Value(index)]);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedExternalInt8, A_B_C);
-    int8_t* data = reinterpret_cast<int8_t*>(FP[rB]);
-    RawSmi* index = RAW_CAST(Smi, FP[rC]);
-    FP[rA] = Smi::New(data[Smi::Value(index)]);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedOneByteString, A_B_C);
-    RawOneByteString* array = RAW_CAST(OneByteString, FP[rB]);
-    RawSmi* index = RAW_CAST(Smi, FP[rC]);
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    FP[rA] = Smi::New(array->ptr()->data()[Smi::Value(index)]);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadIndexedTwoByteString, A_B_C);
-    RawTwoByteString* array = RAW_CAST(TwoByteString, FP[rB]);
-    RawSmi* index = RAW_CAST(Smi, FP[rC]);
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    FP[rA] = Smi::New(array->ptr()->data()[Smi::Value(index)]);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Deopt, A_D);
-    const bool is_lazy = rD == 0;
-    if (!Deoptimize(thread, &pc, &FP, &SP, is_lazy)) {
-      HANDLE_EXCEPTION;
+    BYTECODE(CompareIntEq, 0);
+    SP -= 1;
+    if (SP[0] == SP[1]) {
+      SP[0] = true_value;
+    } else if (!SP[0]->IsHeapObject() || !SP[1]->IsHeapObject() ||
+               (SP[0] == null_value) || (SP[1] == null_value)) {
+      SP[0] = false_value;
+    } else {
+      int64_t a = Integer::GetInt64Value(RAW_CAST(Integer, SP[0]));
+      int64_t b = Integer::GetInt64Value(RAW_CAST(Integer, SP[1]));
+      SP[0] = (a == b) ? true_value : false_value;
     }
     DISPATCH();
   }
 
   {
-    BYTECODE(DeoptRewind, 0);
-    pc = reinterpret_cast<uint32_t*>(thread->resume_pc());
-    if (!Deoptimize(thread, &pc, &FP, &SP, false /* eager */)) {
-      HANDLE_EXCEPTION;
-    }
-    {
-      Exit(thread, FP, SP + 1, pc);
-      NativeArguments args(thread, 0, NULL, NULL);
-      INVOKE_RUNTIME(DRT_RewindPostDeopt, args);
-    }
-    UNREACHABLE();  // DRT_RewindPostDeopt does not exit normally.
+    BYTECODE(CompareIntGt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::RAngleBracket());
+    UNBOX_INT64(b, SP[1], Symbols::RAngleBracket());
+    SP[0] = (a > b) ? true_value : false_value;
     DISPATCH();
   }
 
   {
-    BYTECODE(Nop, 0);
+    BYTECODE(CompareIntLt, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::LAngleBracket());
+    UNBOX_INT64(b, SP[1], Symbols::LAngleBracket());
+    SP[0] = (a < b) ? true_value : false_value;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(CompareIntGe, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::GreaterEqualOperator());
+    UNBOX_INT64(b, SP[1], Symbols::GreaterEqualOperator());
+    SP[0] = (a >= b) ? true_value : false_value;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(CompareIntLe, 0);
+    SP -= 1;
+    UNBOX_INT64(a, SP[0], Symbols::LessEqualOperator());
+    UNBOX_INT64(b, SP[1], Symbols::LessEqualOperator());
+    SP[0] = (a <= b) ? true_value : false_value;
     DISPATCH();
   }
 
@@ -4850,6 +2933,35 @@
     DISPATCH();
   }
 
+  {
+  ThrowNullError:
+    // SP[0] contains selector.
+    SP[1] = 0;  // Unused space for result.
+    Exit(thread, FP, SP + 2, pc);
+    NativeArguments args(thread, 1, SP, SP + 1);
+    INVOKE_RUNTIME(DRT_NullErrorWithSelector, args);
+    UNREACHABLE();
+  }
+
+  {
+  ThrowIntegerDivisionByZeroException:
+    SP[0] = 0;  // Unused space for result.
+    Exit(thread, FP, SP + 1, pc);
+    NativeArguments args(thread, 0, SP, SP);
+    INVOKE_RUNTIME(DRT_IntegerDivisionByZeroException, args);
+    UNREACHABLE();
+  }
+
+  {
+  ThrowArgumentError:
+    // SP[0] contains value.
+    SP[1] = 0;  // Unused space for result.
+    Exit(thread, FP, SP + 2, pc);
+    NativeArguments args(thread, 1, SP, SP + 1);
+    INVOKE_RUNTIME(DRT_ArgumentError, args);
+    UNREACHABLE();
+  }
+
   // Single dispatch point used by exception handling macros.
   {
   DispatchAfterException:
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index 73fcadb..24d66a8 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -198,6 +198,12 @@
                         RawObject** args,
                         RawSubtypeTestCache* cache);
 
+  bool AllocateInt64Box(Thread* thread,
+                        int64_t value,
+                        uint32_t* pc,
+                        RawObject** FP,
+                        RawObject** SP);
+
 #if defined(DEBUG)
   // Returns true if tracing of executed instructions is enabled.
   bool IsTracingExecution() const;
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index d26ed2e..ac487d86 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -87,6 +87,7 @@
     FLAG_marker_tasks = 0;                // Timing dependent.
     FLAG_background_compilation = false;  // Timing dependent.
     FLAG_collect_code = false;            // Timing dependent.
+    FLAG_concurrent_sweep = false;        // Timing dependent.
     FLAG_random_seed = 0x44617274;  // "Dart"
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
     FLAG_load_deferred_eagerly = true;
@@ -775,7 +776,6 @@
   api_flags->isolate_flag = flag;
   ISOLATE_FLAG_LIST(INIT_FROM_FLAG)
 #undef INIT_FROM_FLAG
-  api_flags->use_dart_frontend = false;
   api_flags->entry_points = NULL;
   api_flags->load_vmservice_library = false;
 }
@@ -786,7 +786,6 @@
   api_flags->isolate_flag = name();
   ISOLATE_FLAG_LIST(INIT_FROM_FIELD)
 #undef INIT_FROM_FIELD
-  api_flags->use_dart_frontend = use_dart_frontend();
   api_flags->entry_points = NULL;
   api_flags->load_vmservice_library = should_load_vmservice();
 }
@@ -817,7 +816,6 @@
 #undef FLAG_FOR_PRODUCT
 #undef SET_FROM_FLAG
 
-  set_use_dart_frontend(api_flags.use_dart_frontend);
   set_should_load_vmservice(api_flags.load_vmservice_library);
 
   // Copy entry points list.
@@ -1039,23 +1037,25 @@
   }
 }
 
-void Isolate::InitOnce() {
+void Isolate::InitVM() {
   create_callback_ = NULL;
-  isolates_list_monitor_ = new Monitor();
+  if (isolates_list_monitor_ == NULL) {
+    isolates_list_monitor_ = new Monitor();
+  }
   ASSERT(isolates_list_monitor_ != NULL);
   EnableIsolateCreation();
 }
 
-Isolate* Isolate::Init(const char* name_prefix,
-                       const Dart_IsolateFlags& api_flags,
-                       bool is_vm_isolate) {
+Isolate* Isolate::InitIsolate(const char* name_prefix,
+                              const Dart_IsolateFlags& api_flags,
+                              bool is_vm_isolate) {
   Isolate* result = new Isolate(api_flags);
   ASSERT(result != NULL);
 
 #if !defined(PRODUCT)
 // Initialize metrics.
 #define ISOLATE_METRIC_INIT(type, variable, name, unit)                        \
-  result->metric_##variable##_.Init(result, name, NULL, Metric::unit);
+  result->metric_##variable##_.InitInstance(result, name, NULL, Metric::unit);
   ISOLATE_METRIC_LIST(ISOLATE_METRIC_INIT);
 #undef ISOLATE_METRIC_INIT
 #endif  // !defined(PRODUCT)
@@ -1260,7 +1260,28 @@
   ASSERT(!IsReloading());
   SetHasAttemptedReload(true);
   reload_context_ = new IsolateReloadContext(this, js);
-  reload_context_->Reload(force_reload, root_script_url, packages_url);
+  reload_context_->Reload(force_reload, root_script_url, packages_url,
+                          /* kernel_buffer= */ NULL,
+                          /* kernel_buffer_size= */ 0);
+  bool success = !reload_context_->reload_aborted();
+  if (!dont_delete_reload_context) {
+    DeleteReloadContext();
+  }
+  return success;
+}
+
+bool Isolate::ReloadKernel(JSONStream* js,
+                           bool force_reload,
+                           const uint8_t* kernel_buffer,
+                           intptr_t kernel_buffer_size,
+                           bool dont_delete_reload_context) {
+  ASSERT(!IsReloading());
+  SetHasAttemptedReload(true);
+  reload_context_ = new IsolateReloadContext(this, js);
+  reload_context_->Reload(force_reload,
+                          /* root_script_url= */ NULL,
+                          /* packages_url= */ NULL, kernel_buffer,
+                          kernel_buffer_size);
   bool success = !reload_context_->reload_aborted();
   if (!dont_delete_reload_context) {
     DeleteReloadContext();
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index c47a9d6..3117c52 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -143,8 +143,6 @@
   V(NONPRODUCT, asserts, EnableAsserts, enable_asserts, FLAG_enable_asserts)   \
   V(NONPRODUCT, error_on_bad_type, ErrorOnBadType, enable_error_on_bad_type,   \
     FLAG_error_on_bad_type)                                                    \
-  V(NONPRODUCT, error_on_bad_override, ErrorOnBadOverride,                     \
-    enable_error_on_bad_override, FLAG_error_on_bad_override)                  \
   V(NONPRODUCT, use_field_guards, UseFieldGuards, use_field_guards,            \
     FLAG_use_field_guards)                                                     \
   V(NONPRODUCT, use_osr, UseOsr, use_osr, FLAG_use_osr)                        \
@@ -307,6 +305,13 @@
                      const char* root_script_url = NULL,
                      const char* packages_url = NULL,
                      bool dont_delete_reload_context = false);
+
+  // If provided, the VM takes ownership of kernel_buffer.
+  bool ReloadKernel(JSONStream* js,
+                    bool force_reload,
+                    const uint8_t* kernel_buffer = NULL,
+                    intptr_t kernel_buffer_size = 0,
+                    bool dont_delete_reload_context = false);
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
   const char* MakeRunnable();
@@ -552,13 +557,6 @@
   }
 #endif  // !defined(PRODUCT)
 
-  bool use_dart_frontend() const {
-    return UseDartFrontEndBit::decode(isolate_flags_);
-  }
-  void set_use_dart_frontend(bool value) {
-    isolate_flags_ = UseDartFrontEndBit::update(value, isolate_flags_);
-  }
-
   RawError* PausePostRequest();
 
   uword user_tag() const { return user_tag_; }
@@ -801,10 +799,10 @@
 
   explicit Isolate(const Dart_IsolateFlags& api_flags);
 
-  static void InitOnce();
-  static Isolate* Init(const char* name_prefix,
-                       const Dart_IsolateFlags& api_flags,
-                       bool is_vm_isolate = false);
+  static void InitVM();
+  static Isolate* InitIsolate(const char* name_prefix,
+                              const Dart_IsolateFlags& api_flags,
+                              bool is_vm_isolate = false);
 
   // The isolates_list_monitor_ should be held when calling Kill().
   void KillLocked(LibMsgId msg_id);
@@ -881,7 +879,6 @@
   V(ResumeRequest)                                                             \
   V(HasAttemptedReload)                                                        \
   V(ShouldPausePostServiceRequest)                                             \
-  V(UseDartFrontEnd)                                                           \
   V(EnableTypeChecks)                                                          \
   V(EnableAsserts)                                                             \
   V(ErrorOnBadType)                                                            \
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 4b784f1..16b28a0 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -557,9 +557,12 @@
 }
 
 // NOTE: This function returns *after* FinalizeLoading is called.
+// If [root_script_url] is null, attempt to load from [kernel_buffer].
 void IsolateReloadContext::Reload(bool force_reload,
                                   const char* root_script_url,
-                                  const char* packages_url_) {
+                                  const char* packages_url_,
+                                  const uint8_t* kernel_buffer,
+                                  intptr_t kernel_buffer_size) {
   TIMELINE_SCOPE(Reload);
   Thread* thread = Thread::Current();
   ASSERT(isolate() == thread->isolate());
@@ -597,7 +600,7 @@
 
   bool did_kernel_compilation = false;
   bool skip_reload = false;
-  if (isolate()->use_dart_frontend()) {
+  {
     // Load the kernel program and figure out the modified libraries.
     const GrowableObjectArray& libs =
         GrowableObjectArray::Handle(object_store()->libraries());
@@ -610,18 +613,25 @@
     // compiled, so ReadKernelFromFile returns NULL.
     kernel_program.set(kernel::Program::ReadFromFile(root_script_url));
     if (kernel_program.get() == NULL) {
-      Dart_SourceFile* modified_scripts = NULL;
-      intptr_t modified_scripts_count = 0;
-
-      FindModifiedSources(thread, force_reload, &modified_scripts,
-                          &modified_scripts_count, packages_url_);
-
       Dart_KernelCompilationResult retval;
-      {
-        TransitionVMToNative transition(thread);
-        retval = KernelIsolate::CompileToKernel(root_lib_url.ToCString(), NULL,
-                                                0, modified_scripts_count,
-                                                modified_scripts, true, NULL);
+      if (kernel_buffer != NULL && kernel_buffer_size != 0) {
+        retval.kernel = const_cast<uint8_t*>(kernel_buffer);
+        retval.kernel_size = kernel_buffer_size;
+        retval.status = Dart_KernelCompilationStatus_Ok;
+      } else {
+        Dart_SourceFile* modified_scripts = NULL;
+        intptr_t modified_scripts_count = 0;
+
+        FindModifiedSources(thread, force_reload, &modified_scripts,
+                            &modified_scripts_count, packages_url_);
+
+        {
+          TransitionVMToNative transition(thread);
+          retval = KernelIsolate::CompileToKernel(
+              root_lib_url.ToCString(), NULL, 0, modified_scripts_count,
+              modified_scripts, true, NULL);
+          did_kernel_compilation = true;
+        }
       }
 
       if (retval.status != Dart_KernelCompilationStatus_Ok) {
@@ -629,12 +639,14 @@
         const String& error_str = String::Handle(String::New(retval.error));
         free(retval.error);
         const ApiError& error = ApiError::Handle(ApiError::New(error_str));
+        if (retval.kernel != NULL) {
+          free(const_cast<uint8_t*>(retval.kernel));
+        }
         AddReasonForCancelling(new Aborted(zone_, error));
         ReportReasonsForCancelling();
         CommonFinalizeTail();
         return;
       }
-      did_kernel_compilation = true;
 
       // The ownership of the kernel buffer goes now to the VM.
       const ExternalTypedData& typed_data = ExternalTypedData::Handle(
@@ -659,10 +671,6 @@
 
     kernel::KernelLoader::FindModifiedLibraries(
         kernel_program.get(), I, modified_libs_, force_reload, &skip_reload);
-  } else {
-    // Check to see which libraries have been modified.
-    modified_libs_ = FindModifiedLibraries(force_reload, root_lib_modified);
-    skip_reload = !modified_libs_->Contains(old_root_lib.index());
   }
   if (skip_reload) {
     ASSERT(modified_libs_->IsEmpty());
@@ -675,7 +683,7 @@
     // If we use the CFE and performed a compilation, we need to notify that
     // we have accepted the compilation to clear some state in the incremental
     // compiler.
-    if (isolate()->use_dart_frontend() && did_kernel_compilation) {
+    if (did_kernel_compilation) {
       AcceptCompilation(thread);
     }
     TIR_Print("---- SKIPPING RELOAD (No libraries were modified)\n");
@@ -729,7 +737,7 @@
   // for example, top level parse errors. We want to capture these errors while
   // propagating the UnwindError or an UnhandledException error.
 
-  if (isolate()->use_dart_frontend()) {
+  {
     const Object& tmp =
         kernel::KernelLoader::LoadEntireProgram(kernel_program.get());
     if (!tmp.IsError()) {
@@ -754,16 +762,6 @@
     } else {
       result = tmp.raw();
     }
-  } else {
-    TIR_Print("---- ENTERING TAG HANDLER\n");
-    TransitionVMToNative transition(thread);
-    Api::Scope api_scope(thread);
-
-    Dart_Handle retval = (I->library_tag_handler())(
-        Dart_kScriptTag, Api::NewHandle(thread, packages_url.raw()),
-        Api::NewHandle(thread, root_lib_url.raw()));
-    result = Api::UnwrapHandle(retval);
-    TIR_Print("---- EXITED TAG HANDLER\n");
   }
   //
   // WEIRD CONTROL FLOW ENDS.
diff --git a/runtime/vm/isolate_reload.h b/runtime/vm/isolate_reload.h
index c225685..219b4f4 100644
--- a/runtime/vm/isolate_reload.h
+++ b/runtime/vm/isolate_reload.h
@@ -135,9 +135,12 @@
   explicit IsolateReloadContext(Isolate* isolate, JSONStream* js);
   ~IsolateReloadContext();
 
+  // If kernel_buffer is provided, the VM takes ownership when Reload is called.
   void Reload(bool force_reload,
               const char* root_script_url = NULL,
-              const char* packages_url = NULL);
+              const char* packages_url = NULL,
+              const uint8_t* kernel_buffer = NULL,
+              intptr_t kernel_buffer_size = 0);
 
   // All zone allocated objects must be allocated from this zone.
   Zone* zone() const { return zone_; }
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index 2b0594e..47e1c63 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -184,6 +184,7 @@
       ""
     }};
   // clang-format on
+
   {
     const uint8_t* kernel_buffer = NULL;
     intptr_t kernel_buffer_size = 0;
@@ -281,6 +282,86 @@
   EXPECT_EQ(24, value);
 }
 
+TEST_CASE(IsolateReload_KernelIncrementalCompileBaseClass) {
+  // clang-format off
+  Dart_SourceFile sourcefiles[] = {
+      {
+          "file:///test-app.dart",
+          "import 'test-util.dart';\n"
+          "main() {\n"
+          "  var v = doWork();"
+          "  return v == 42 ? 1: v == null ? -1: 0;\n"
+          "}\n",
+      },
+      {
+          "file:///test-lib.dart",
+          "class State<T, U> {\n"
+          "  T t;\n"
+          "  U u;\n"
+          "  State(List l) {\n"
+          "    t = l[0] is T? l[0]: null;\n"
+          "    u = l[1] is U? l[1]: null;\n"
+          "  }\n"
+          "}\n",
+      },
+      {
+          "file:///test-util.dart",
+          "import 'test-lib.dart';\n"
+          "class MyAccountState extends State<int, String> {\n"
+          "  MyAccountState(List l): super(l) {}\n"
+          "  first() => t;\n"
+          "}\n"
+          "doWork() => new MyAccountState(<dynamic>[42, 'abc']).first();\n"
+      },
+      {
+          "file:///.packages", "untitled:/"
+      }};
+  // clang-format on
+
+  Dart_Handle lib = TestCase::LoadTestScriptWithDFE(
+      sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles,
+      NULL /* resolver */, true /* finalize */, true /* incrementally */);
+  EXPECT_VALID(lib);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  int64_t value = 0;
+  result = Dart_IntegerToInt64(result, &value);
+  EXPECT_VALID(result);
+  EXPECT_EQ(1, value);
+
+  // clang-format off
+  Dart_SourceFile updated_sourcefiles[] = {
+      {
+          "file:///test-lib.dart",
+          "class State<U, T> {\n"
+          "  T t;\n"
+          "  U u;\n"
+          "  State(List l) {\n"
+          "    t = l[0] is T? l[0]: null;\n"
+          "    u = l[1] is U? l[1]: null;\n"
+          "  }\n"
+          "}\n",
+      }};
+  // clang-format on
+  {
+    const uint8_t* kernel_buffer = NULL;
+    intptr_t kernel_buffer_size = 0;
+    char* error = TestCase::CompileTestScriptWithDFE(
+        "file:///test-app.dart",
+        sizeof(updated_sourcefiles) / sizeof(Dart_SourceFile),
+        updated_sourcefiles, &kernel_buffer, &kernel_buffer_size,
+        true /* incrementally */);
+    EXPECT(error == NULL);
+    EXPECT_NOTNULL(kernel_buffer);
+
+    lib = TestCase::ReloadTestKernel(kernel_buffer, kernel_buffer_size);
+    EXPECT_VALID(lib);
+  }
+  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  result = Dart_IntegerToInt64(result, &value);
+  EXPECT_VALID(result);
+  EXPECT_EQ(-1, value);
+}
+
 TEST_CASE(IsolateReload_BadClass) {
   const char* kScript =
       "class Foo {\n"
@@ -1087,7 +1168,7 @@
       "}\n";
 
   lib = TestCase::ReloadTestScript(kReloadScript);
-  if (TestCase::UsingDartFrontend() && TestCase::UsingStrongMode()) {
+  if (TestCase::UsingDartFrontend()) {
     EXPECT_ERROR(lib, "importedIntFunc");
   } else {
     EXPECT_VALID(lib);
@@ -1620,32 +1701,10 @@
   Dart_Handle error_handle = SimpleInvokeError(lib, "main");
 
   const char* error;
-  if (TestCase::UsingStrongMode()) {
-    error =
-        "file:///test-lib:8:12: Error: Too few positional"
-        " arguments: 1 required, 0 given.\n"
-        "  return f1();";
-  } else if (TestCase::UsingDartFrontend()) {
-    error =
-        "NoSuchMethodError: Closure call with mismatched arguments: function "
-        "'C.foo'\n"
-        "Receiver: Closure: (dynamic) => dynamic from Function 'foo': static.\n"
-        "Tried calling: C.foo()\n"
-        "Found: C.foo(dynamic) => dynamic\n"
-        "#0      Object.noSuchMethod "
-        "(dart:core/runtime/libobject_patch.dart:50:5)\n"
-        "#1      main (file:///test-lib:8:12)";
-  } else {
-    error =
-        "NoSuchMethodError: Closure call with mismatched arguments: function "
-        "'C.foo'\n"
-        "Receiver: Closure: (dynamic) => dynamic from Function 'foo': static.\n"
-        "Tried calling: C.foo()\n"
-        "Found: C.foo(dynamic) => dynamic\n"
-        "#0      Object.noSuchMethod "
-        "(dart:core-patch/dart:core/object_patch.dart:50)\n"
-        "#1      main (test-lib:8:12)";
-  }
+  error =
+      "file:///test-lib:8:12: Error: Too few positional"
+      " arguments: 1 required, 0 given.\n"
+      "  return f1();";
   EXPECT_ERROR(error_handle, error);
 }
 
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 335a140..3067264 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -692,6 +692,26 @@
              .StartsWith(Symbols::InitPrefix());
 }
 
+bool IsTearOffTaken(const Function& function, Zone* zone) {
+  const Script& script = Script::Handle(zone, function.script());
+  TranslationHelper translation_helper(Thread::Current());
+  translation_helper.InitFromScript(script);
+
+  KernelReaderHelper reader_helper(
+      zone, &translation_helper, script,
+      ExternalTypedData::Handle(zone, function.KernelData()),
+      function.KernelDataProgramOffset());
+
+  ProcedureAttributesMetadataHelper procedure_attributes_metadata_helper(
+      &reader_helper);
+
+  ProcedureAttributesMetadata attrs =
+      procedure_attributes_metadata_helper.GetProcedureAttributes(
+          function.kernel_offset());
+
+  return attrs.has_tearoff_uses;
+}
+
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 534d18f..8ec7aed 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -200,6 +200,8 @@
 
 bool IsFieldInitializer(const Function& function, Zone* zone);
 
+bool IsTearOffTaken(const Function& function, Zone* zone);
+
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index 7a132b5..02f38c88 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -91,8 +91,6 @@
     api_flags.enable_type_checks = false;
     api_flags.enable_asserts = false;
     api_flags.enable_error_on_bad_type = false;
-    api_flags.enable_error_on_bad_override = false;
-    api_flags.use_dart_frontend = true;
     api_flags.unsafe_trust_strong_mode_types = false;
 #if !defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC)
     api_flags.use_field_guards = true;
@@ -115,15 +113,15 @@
       return;
     }
 
-    bool init_success = false;
+    bool got_unwind;
     {
       ASSERT(Isolate::Current() == NULL);
       StartIsolateScope start_scope(isolate);
-      init_success = RunMain(isolate);
+      got_unwind = RunMain(isolate);
     }
     KernelIsolate::FinishedInitializing();
 
-    if (!init_success) {
+    if (got_unwind) {
       ShutdownIsolate(reinterpret_cast<uword>(isolate));
       return;
     }
@@ -207,20 +205,27 @@
     ASSERT(!result.IsNull());
     if (result.IsError()) {
       // Kernel isolate did not initialize properly.
-      const Error& error = Error::Cast(result);
-      OS::PrintErr(DART_KERNEL_ISOLATE_NAME
-                   ": Calling main resulted in an error: %s",
-                   error.ToErrorCString());
+      if (FLAG_trace_kernel) {
+        const Error& error = Error::Cast(result);
+        OS::PrintErr(DART_KERNEL_ISOLATE_NAME
+                     ": Calling main resulted in an error: %s",
+                     error.ToErrorCString());
+      }
+      if (result.IsUnwindError()) {
+        return true;
+      }
       return false;
     }
     ASSERT(result.IsReceivePort());
     const ReceivePort& rp = ReceivePort::Cast(result);
     KernelIsolate::SetLoadPort(rp.Id());
-    return true;
+    return false;
   }
 };
 
 void KernelIsolate::Run() {
+  MonitorLocker ml(monitor_);
+  initializing_ = true;
   // Grab the isolate create callback here to avoid race conditions with tests
   // that change this after Dart_Initialize returns.
   create_callback_ = Isolate::CreateCallback();
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 8440522..e8456fe 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -10,6 +10,7 @@
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/dart_api_impl.h"
 #include "vm/flags.h"
+#include "vm/heap/heap.h"
 #include "vm/kernel_binary.h"
 #include "vm/longjump.h"
 #include "vm/object_store.h"
@@ -172,13 +173,14 @@
       loading_native_wrappers_library_(false),
       library_kernel_data_(ExternalTypedData::ZoneHandle(zone_)),
       kernel_program_info_(KernelProgramInfo::ZoneHandle(zone_)),
-      translation_helper_(this, thread_),
+      translation_helper_(this, thread_, Heap::kOld),
       helper_(zone_,
               &translation_helper_,
               program_->kernel_data(),
               program_->kernel_data_size(),
               0),
       type_translator_(&helper_, &active_class_, /* finalize= */ false),
+      inferred_type_metadata_helper_(&helper_),
       external_name_class_(Class::Handle(Z)),
       external_name_field_(Field::Handle(Z)),
       potential_natives_(GrowableObjectArray::Handle(Z)),
@@ -197,6 +199,8 @@
 
 Object& KernelLoader::LoadEntireProgram(Program* program,
                                         bool process_pending_classes) {
+  Thread* thread = Thread::Current();
+
   if (program->is_single_program()) {
     KernelLoader loader(program);
     return Object::Handle(loader.LoadProgram(process_pending_classes));
@@ -206,7 +210,6 @@
   GrowableArray<intptr_t> subprogram_file_starts;
   index_programs(&reader, &subprogram_file_starts);
 
-  Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Library& library = Library::Handle(zone);
   // Create "fake programs" for each sub-program.
@@ -340,9 +343,10 @@
       library_kernel_data_(ExternalTypedData::ZoneHandle(zone_)),
       kernel_program_info_(
           KernelProgramInfo::ZoneHandle(zone_, script.kernel_program_info())),
-      translation_helper_(this, thread_),
+      translation_helper_(this, thread_, Heap::kOld),
       helper_(zone_, &translation_helper_, script, kernel_data, 0),
       type_translator_(&helper_, &active_class_, /* finalize= */ false),
+      inferred_type_metadata_helper_(&helper_),
       external_name_class_(Class::Handle(Z)),
       external_name_field_(Field::Handle(Z)),
       potential_natives_(GrowableObjectArray::Handle(Z)),
@@ -760,6 +764,18 @@
   }
 }
 
+void KernelLoader::ReadInferredType(const Field& field,
+                                    intptr_t kernel_offset) {
+  const InferredTypeMetadata type =
+      inferred_type_metadata_helper_.GetInferredType(kernel_offset);
+  if (type.IsTrivial()) {
+    return;
+  }
+  field.set_guarded_cid(type.cid);
+  field.set_is_nullable(type.IsNullable());
+  field.set_guarded_list_length(Field::kNoFixedLength);
+}
+
 void KernelLoader::CheckForInitializer(const Field& field) {
   if (helper_.PeekTag() == kSomething) {
     SimpleExpressionConverter converter(&H, &helper_);
@@ -932,6 +948,7 @@
     field.set_kernel_offset(field_offset);
     const AbstractType& type = T.BuildType();  // read type.
     field.SetFieldType(type);
+    ReadInferredType(field, field_offset + library_kernel_offset_);
     CheckForInitializer(field);
     field_helper.SetJustRead(FieldHelper::kType);
     field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
@@ -1326,6 +1343,7 @@
                      field_helper.IsConst(), is_reflectable, script_class, type,
                      field_helper.position_, field_helper.end_position_));
       field.set_kernel_offset(field_offset);
+      ReadInferredType(field, field_offset + library_kernel_offset_);
       CheckForInitializer(field);
       field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
       intptr_t field_initializer_offset = helper_.ReaderOffset();
@@ -1849,6 +1867,7 @@
   const AbstractType& field_type = AbstractType::Handle(Z, field.type());
   getter.set_result_type(field_type);
   getter.set_is_debuggable(false);
+  getter.set_accessor_field(field);
   SetupFieldAccessorFunction(klass, getter, field_type);
 
   if (!field_helper->IsStatic() && !field_helper->IsFinal()) {
@@ -1868,6 +1887,7 @@
     setter.set_kernel_offset(field.kernel_offset());
     setter.set_result_type(Object::void_type());
     setter.set_is_debuggable(false);
+    setter.set_accessor_field(field);
     SetupFieldAccessorFunction(klass, setter, field_type);
   }
 }
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index f17681b..7e40d13 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -21,8 +21,10 @@
 
 class BuildingTranslationHelper : public TranslationHelper {
  public:
-  BuildingTranslationHelper(KernelLoader* loader, Thread* thread)
-      : TranslationHelper(thread), loader_(loader) {}
+  BuildingTranslationHelper(KernelLoader* loader,
+                            Thread* thread,
+                            Heap::Space space)
+      : TranslationHelper(thread, space), loader_(loader) {}
   virtual ~BuildingTranslationHelper() {}
 
   virtual RawLibrary* LookupLibraryByKernelLibrary(NameIndex library);
@@ -221,6 +223,7 @@
   void LoadPreliminaryClass(ClassHelper* class_helper,
                             intptr_t type_parameter_count);
 
+  void ReadInferredType(const Field& field, intptr_t kernel_offset);
   void CheckForInitializer(const Field& field);
 
   void FixCoreLibraryScriptUri(const Library& library, const Script& script);
@@ -340,6 +343,7 @@
   BuildingTranslationHelper translation_helper_;
   KernelReaderHelper helper_;
   TypeTranslator type_translator_;
+  InferredTypeMetadataHelper inferred_type_metadata_helper_;
 
   Class& external_name_class_;
   Field& external_name_field_;
diff --git a/runtime/vm/malloc_hooks.h b/runtime/vm/malloc_hooks.h
index bea2f39..42b9186 100644
--- a/runtime/vm/malloc_hooks.h
+++ b/runtime/vm/malloc_hooks.h
@@ -23,8 +23,8 @@
 
 class MallocHooks : public AllStatic {
  public:
-  static void InitOnce();
-  static void TearDown();
+  static void Init();
+  static void Cleanup();
   static bool ProfilingEnabled();
   static bool stack_trace_collection_enabled();
   static void set_stack_trace_collection_enabled(bool enabled);
diff --git a/runtime/vm/malloc_hooks_jemalloc.cc b/runtime/vm/malloc_hooks_jemalloc.cc
index 7add546..2eb1b94 100644
--- a/runtime/vm/malloc_hooks_jemalloc.cc
+++ b/runtime/vm/malloc_hooks_jemalloc.cc
@@ -13,11 +13,11 @@
 
 namespace dart {
 
-void MallocHooks::InitOnce() {
+void MallocHooks::Init() {
   // Do nothing.
 }
 
-void MallocHooks::TearDown() {
+void MallocHooks::Cleanup() {
   // Do nothing.
 }
 
diff --git a/runtime/vm/malloc_hooks_tcmalloc.cc b/runtime/vm/malloc_hooks_tcmalloc.cc
index f0e8b24..c525f0f 100644
--- a/runtime/vm/malloc_hooks_tcmalloc.cc
+++ b/runtime/vm/malloc_hooks_tcmalloc.cc
@@ -260,7 +260,7 @@
   address_map_ = NULL;
 }
 
-void MallocHooks::InitOnce() {
+void MallocHooks::Init() {
   if (!FLAG_profiler_native_memory || MallocHooks::Active()) {
     return;
   }
@@ -278,7 +278,7 @@
   ASSERT(success);
 }
 
-void MallocHooks::TearDown() {
+void MallocHooks::Cleanup() {
   if (!FLAG_profiler_native_memory || !MallocHooks::Active()) {
     return;
   }
diff --git a/runtime/vm/malloc_hooks_test.cc b/runtime/vm/malloc_hooks_test.cc
index 7facea6..28c6009 100644
--- a/runtime/vm/malloc_hooks_test.cc
+++ b/runtime/vm/malloc_hooks_test.cc
@@ -31,12 +31,12 @@
     OSThread::Current();  // Ensure not allocated during test.
     saved_enable_malloc_hooks_ = FLAG_profiler_native_memory;
     FLAG_profiler_native_memory = true;
-    MallocHooks::InitOnce();
+    MallocHooks::Init();
     MallocHooks::ResetStats();
   }
 
   ~EnableMallocHooksScope() {
-    MallocHooks::TearDown();
+    MallocHooks::Cleanup();
     FLAG_profiler_native_memory = saved_enable_malloc_hooks_;
   }
 
@@ -52,7 +52,7 @@
     MallocHooks::set_stack_trace_collection_enabled(true);
     if (!FLAG_profiler) {
       FLAG_profiler = true;
-      Profiler::InitOnce();
+      Profiler::Init();
     }
     MallocHooks::ResetStats();
   }
diff --git a/runtime/vm/malloc_hooks_unsupported.cc b/runtime/vm/malloc_hooks_unsupported.cc
index a1e3634..e37ca80 100644
--- a/runtime/vm/malloc_hooks_unsupported.cc
+++ b/runtime/vm/malloc_hooks_unsupported.cc
@@ -11,11 +11,11 @@
 
 namespace dart {
 
-void MallocHooks::InitOnce() {
+void MallocHooks::Init() {
   // Do nothing.
 }
 
-void MallocHooks::TearDown() {
+void MallocHooks::Cleanup() {
   // Do nothing.
 }
 
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 2bc806d..00a2ff3 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -670,7 +670,8 @@
 bool IdleNotifier::task_running_ = false;
 IdleNotifier::Timer* IdleNotifier::queue_ = NULL;
 
-void IdleNotifier::InitOnce() {
+void IdleNotifier::Init() {
+  ASSERT(monitor_ == NULL);
   monitor_ = new Monitor();
 }
 
@@ -697,6 +698,7 @@
 void IdleNotifier::Cleanup() {
   ASSERT(queue_ == NULL);
   ASSERT(!task_running_);
+  ASSERT(monitor_ != NULL);
   delete monitor_;
   monitor_ = NULL;
 }
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 247bff0..1ce64ad 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -260,7 +260,7 @@
 
 class IdleNotifier : public AllStatic {
  public:
-  static void InitOnce();
+  static void Init();
   static void Stop();
   static void Cleanup();
   static void Update(MessageHandler* handler, int64_t expirary);
diff --git a/runtime/vm/message_handler_test.cc b/runtime/vm/message_handler_test.cc
index 75e0077..0677178 100644
--- a/runtime/vm/message_handler_test.cc
+++ b/runtime/vm/message_handler_test.cc
@@ -40,7 +40,10 @@
         end_called_(false),
         results_(NULL) {}
 
-  ~TestMessageHandler() { delete[] port_buffer_; }
+  ~TestMessageHandler() {
+    PortMap::ClosePorts(this);
+    delete[] port_buffer_;
+  }
 
   void MessageNotify(Message::Priority priority) { notify_count_++; }
 
@@ -233,7 +236,6 @@
   EXPECT_EQ(port2, ports[0]);
   EXPECT_EQ(port3, ports[1]);
   EXPECT_EQ(port1, ports[2]);
-  PortMap::ClosePorts(&handler);
 }
 
 VM_UNIT_TEST_CASE(MessageHandler_HandleNextMessage_ProcessOOBAfterError) {
@@ -394,7 +396,6 @@
   }
   handler_peer.decrement_live_ports();
   EXPECT(!handler.HasLivePorts());
-  PortMap::ClosePorts(&handler);
   delete[] ports;
 }
 
diff --git a/runtime/vm/metrics.cc b/runtime/vm/metrics.cc
index 94fd0bf..f00d991 100644
--- a/runtime/vm/metrics.cc
+++ b/runtime/vm/metrics.cc
@@ -30,10 +30,10 @@
       value_(0),
       next_(NULL) {}
 
-void Metric::Init(Isolate* isolate,
-                  const char* name,
-                  const char* description,
-                  Unit unit) {
+void Metric::InitInstance(Isolate* isolate,
+                          const char* name,
+                          const char* description,
+                          Unit unit) {
   // Only called once.
   ASSERT(next_ == NULL);
   ASSERT(name != NULL);
@@ -44,7 +44,9 @@
   RegisterWithIsolate();
 }
 
-void Metric::Init(const char* name, const char* description, Unit unit) {
+void Metric::InitInstance(const char* name,
+                          const char* description,
+                          Unit unit) {
   // Only called once.
   ASSERT(next_ == NULL);
   ASSERT(name != NULL);
@@ -54,7 +56,7 @@
   RegisterWithVM();
 }
 
-Metric::~Metric() {
+void Metric::CleanupInstance() {
   // Only deregister metrics which had been registered. Metrics without a name
   // are from shallow copy isolates.
   if (name_ != NULL) {
@@ -66,6 +68,10 @@
   }
 }
 
+Metric::~Metric() {
+  CleanupInstance();
+}
+
 #ifndef PRODUCT
 static const char* UnitString(intptr_t unit) {
   switch (unit) {
@@ -302,9 +308,9 @@
 VM_METRIC_LIST(VM_METRIC_VARIABLE);
 #undef VM_METRIC_VARIABLE
 
-void Metric::InitOnce() {
+void Metric::Init() {
 #define VM_METRIC_INIT(type, variable, name, unit)                             \
-  vm_metric_##variable##_.Init(name, NULL, Metric::unit);
+  vm_metric_##variable##_.InitInstance(name, NULL, Metric::unit);
   VM_METRIC_LIST(VM_METRIC_INIT);
 #undef VM_METRIC_INIT
 }
@@ -321,6 +327,10 @@
     }
     OS::PrintErr("\n");
   }
+#define VM_METRIC_CLEANUP(type, variable, name, unit)                          \
+  vm_metric_##variable##_.CleanupInstance();
+  VM_METRIC_LIST(VM_METRIC_CLEANUP);
+#undef VM_METRIC_CLEANUP
 }
 
 MaxMetric::MaxMetric() : Metric() {
diff --git a/runtime/vm/metrics.h b/runtime/vm/metrics.h
index 530cc4d..fab74b9 100644
--- a/runtime/vm/metrics.h
+++ b/runtime/vm/metrics.h
@@ -44,18 +44,20 @@
 
   Metric();
 
-  static void InitOnce();
+  static void Init();
 
   static void Cleanup();
 
   // Initialize and register a metric for an isolate.
-  void Init(Isolate* isolate,
-            const char* name,
-            const char* description,
-            Unit unit);
+  void InitInstance(Isolate* isolate,
+                    const char* name,
+                    const char* description,
+                    Unit unit);
 
   // Initialize and register a metric for the VM.
-  void Init(const char* name, const char* description, Unit unit);
+  void InitInstance(const char* name, const char* description, Unit unit);
+
+  void CleanupInstance();
 
   virtual ~Metric();
 
diff --git a/runtime/vm/metrics_test.cc b/runtime/vm/metrics_test.cc
index 1e20866..8ca4151 100644
--- a/runtime/vm/metrics_test.cc
+++ b/runtime/vm/metrics_test.cc
@@ -21,7 +21,8 @@
     Metric metric;
 
     // Initialize metric.
-    metric.Init(Isolate::Current(), "a.b.c", "foobar", Metric::kCounter);
+    metric.InitInstance(Isolate::Current(), "a.b.c", "foobar",
+                        Metric::kCounter);
     EXPECT_EQ(0, metric.value());
     metric.increment();
     EXPECT_EQ(1, metric.value());
@@ -51,7 +52,7 @@
     HANDLESCOPE(thread);
     MyMetric metric;
 
-    metric.Init(Isolate::Current(), "a.b.c", "foobar", Metric::kByte);
+    metric.InitInstance(Isolate::Current(), "a.b.c", "foobar", Metric::kByte);
     // value is still the default value.
     EXPECT_EQ(0, metric.value());
     // Call LeakyValue to confirm that Value returns constant 99.
diff --git a/runtime/vm/native_entry.h b/runtime/vm/native_entry.h
index 2b4ebb0..c0abf55 100644
--- a/runtime/vm/native_entry.h
+++ b/runtime/vm/native_entry.h
@@ -192,6 +192,9 @@
   static Payload* FromTypedArray(RawTypedData* data);
 
   const TypedData& data_;
+
+  friend class Interpreter;
+  friend class ObjectPoolSerializationCluster;
   DISALLOW_COPY_AND_ASSIGN(NativeEntryData);
 };
 
diff --git a/runtime/vm/native_symbol.h b/runtime/vm/native_symbol.h
index 4c5c754..3bc71cd 100644
--- a/runtime/vm/native_symbol.h
+++ b/runtime/vm/native_symbol.h
@@ -14,8 +14,8 @@
 
 class NativeSymbolResolver : public AllStatic {
  public:
-  static void InitOnce();
-  static void ShutdownOnce();
+  static void Init();
+  static void Cleanup();
   static char* LookupSymbolName(uintptr_t pc, uintptr_t* start);
   static bool LookupSharedObject(uword pc, uword* dso_base, char** dso_name);
   static void FreeSymbolName(char* name);
diff --git a/runtime/vm/native_symbol_android.cc b/runtime/vm/native_symbol_android.cc
index 9f1a1fc..8ed1999 100644
--- a/runtime/vm/native_symbol_android.cc
+++ b/runtime/vm/native_symbol_android.cc
@@ -27,9 +27,9 @@
 
 namespace dart {
 
-void NativeSymbolResolver::InitOnce() {}
+void NativeSymbolResolver::Init() {}
 
-void NativeSymbolResolver::ShutdownOnce() {}
+void NativeSymbolResolver::Cleanup() {}
 
 char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
   Dl_info info;
diff --git a/runtime/vm/native_symbol_fuchsia.cc b/runtime/vm/native_symbol_fuchsia.cc
index 5605762..f7fdd81 100644
--- a/runtime/vm/native_symbol_fuchsia.cc
+++ b/runtime/vm/native_symbol_fuchsia.cc
@@ -13,9 +13,9 @@
 
 namespace dart {
 
-void NativeSymbolResolver::InitOnce() {}
+void NativeSymbolResolver::Init() {}
 
-void NativeSymbolResolver::ShutdownOnce() {}
+void NativeSymbolResolver::Cleanup() {}
 
 char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
   Dl_info info;
diff --git a/runtime/vm/native_symbol_linux.cc b/runtime/vm/native_symbol_linux.cc
index e1fc90f..135daed 100644
--- a/runtime/vm/native_symbol_linux.cc
+++ b/runtime/vm/native_symbol_linux.cc
@@ -13,9 +13,9 @@
 
 namespace dart {
 
-void NativeSymbolResolver::InitOnce() {}
+void NativeSymbolResolver::Init() {}
 
-void NativeSymbolResolver::ShutdownOnce() {}
+void NativeSymbolResolver::Cleanup() {}
 
 char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
   Dl_info info;
diff --git a/runtime/vm/native_symbol_macos.cc b/runtime/vm/native_symbol_macos.cc
index e8ca487..84d7d7a 100644
--- a/runtime/vm/native_symbol_macos.cc
+++ b/runtime/vm/native_symbol_macos.cc
@@ -12,9 +12,9 @@
 
 namespace dart {
 
-void NativeSymbolResolver::InitOnce() {}
+void NativeSymbolResolver::Init() {}
 
-void NativeSymbolResolver::ShutdownOnce() {}
+void NativeSymbolResolver::Cleanup() {}
 
 char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
   Dl_info info;
diff --git a/runtime/vm/native_symbol_win.cc b/runtime/vm/native_symbol_win.cc
index d1f65c7..e5f8e61 100644
--- a/runtime/vm/native_symbol_win.cc
+++ b/runtime/vm/native_symbol_win.cc
@@ -16,9 +16,11 @@
 static bool running_ = false;
 static Mutex* lock_ = NULL;
 
-void NativeSymbolResolver::InitOnce() {
+void NativeSymbolResolver::Init() {
   ASSERT(running_ == false);
-  lock_ = new Mutex();
+  if (lock_ == NULL) {
+    lock_ = new Mutex();
+  }
   running_ = true;
   SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS);
   HANDLE hProcess = GetCurrentProcess();
@@ -29,7 +31,7 @@
   }
 }
 
-void NativeSymbolResolver::ShutdownOnce() {
+void NativeSymbolResolver::Cleanup() {
   MutexLocker lock(lock_);
   if (!running_) {
     return;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 0a4719f..e48782a 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -70,8 +70,8 @@
     false,
     "Show names of internal classes (e.g. \"OneByteString\") in error messages "
     "instead of showing the corresponding interface names (e.g. \"String\")");
-DEFINE_FLAG(bool, use_lib_cache, true, "Use library name cache");
-DEFINE_FLAG(bool, use_exp_cache, true, "Use library exported name cache");
+DEFINE_FLAG(bool, use_lib_cache, false, "Use library name cache");
+DEFINE_FLAG(bool, use_exp_cache, false, "Use library exported name cache");
 
 DEFINE_FLAG(bool,
             remove_script_timestamps_for_test,
@@ -456,7 +456,7 @@
   }
 }
 
-void Object::InitOnce(Isolate* isolate) {
+void Object::Init(Isolate* isolate) {
   // Should only be run by the vm isolate.
   ASSERT(isolate == Dart::vm_isolate());
 
@@ -937,7 +937,7 @@
   ASSERT(extractor_parameter_names_->IsArray());
 }
 
-void Object::FinishInitOnce(Isolate* isolate) {
+void Object::FinishInit(Isolate* isolate) {
   // The type testing stubs we initialize in AbstractType objects for the
   // canonical type of kDynamicCid/kVoidCid need to be set in this
   // method, which is called after StubCode::InitOnce().
@@ -950,6 +950,46 @@
   void_type_->SetTypeTestingStub(instr);
 }
 
+void Object::Cleanup() {
+  null_ = reinterpret_cast<RawObject*>(RAW_NULL);
+  class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  void_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  unresolved_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  function_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  closure_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  signature_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  redirection_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  field_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  script_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  library_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  namespace_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  kernel_program_info_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  code_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  object_pool_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  code_source_map_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  stackmap_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  var_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  exception_handlers_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  context_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  singletargetcache_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  unlinkedcall_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  icdata_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  megamorphic_cache_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  subtypetestcache_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  api_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  language_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  unhandled_exception_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  unwind_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+}
+
 // An object visitor which will mark all visited objects. This is used to
 // premark all objects in the vm_isolate_ heap.  Also precalculates hash
 // codes so that we can get the identity hash code of objects in the read-
@@ -1276,7 +1316,8 @@
                                            "Object::Init");)
 
 #if defined(DART_NO_SNAPSHOT)
-  bool bootstrapping = Dart::vm_snapshot_kind() == Snapshot::kNone;
+  bool bootstrapping =
+      (Dart::vm_snapshot_kind() == Snapshot::kNone) || is_kernel;
 #elif defined(DART_PRECOMPILED_RUNTIME)
   bool bootstrapping = false;
 #else
@@ -2018,7 +2059,16 @@
   Isolate* isolate = thread->isolate();
   Heap* heap = isolate->heap();
 
-  uword address = heap->Allocate(size, space);
+  uword address;
+
+  // In a bump allocation scope, all allocations go into old space.
+  if (thread->bump_allocate() && (space != Heap::kCode)) {
+    DEBUG_ASSERT(heap->old_space()->CurrentThreadOwnsDataLock());
+    address = heap->old_space()->TryAllocateDataBumpLocked(
+        size, PageSpace::kForceGrowth);
+  } else {
+    address = heap->Allocate(size, space);
+  }
   if (address == 0) {
     // Use the preallocated out of memory exception to avoid calling
     // into dart code or allocating any code.
@@ -5956,12 +6006,8 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   return raw_ptr()->code_ != StubCode::LazyCompile_entry()->code();
 #else
-  if (FLAG_enable_interpreter) {
-    return raw_ptr()->code_ != StubCode::LazyCompile_entry()->code() &&
-           raw_ptr()->code_ != StubCode::InterpretCall_entry()->code();
-  } else {
-    return raw_ptr()->code_ != StubCode::LazyCompile_entry()->code();
-  }
+  return raw_ptr()->code_ != StubCode::LazyCompile_entry()->code() &&
+         raw_ptr()->code_ != StubCode::InterpretCall_entry()->code();
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
@@ -7070,56 +7116,6 @@
   return chars;
 }
 
-bool Function::HasCompatibleParametersWith(const Function& other,
-                                           Error* bound_error) const {
-  ASSERT(Isolate::Current()->error_on_bad_override());
-  ASSERT(!FLAG_strong);
-  ASSERT((bound_error != NULL) && bound_error->IsNull());
-  // Check that this function's signature type is a subtype of the other
-  // function's signature type.
-  // Map type parameters referred to by formal parameter types and result type
-  // in the signature to dynamic before the test.
-  // Note that type parameters declared by a generic signature are preserved.
-  Function& this_fun = Function::Handle(raw());
-  if (!this_fun.HasInstantiatedSignature(kCurrentClass)) {
-    this_fun = this_fun.InstantiateSignatureFrom(
-        Object::null_type_arguments(), Object::null_type_arguments(),
-        kNoneFree,  // Keep function type parameters, do not map to dynamic.
-        Heap::kOld);
-  }
-  Function& other_fun = Function::Handle(other.raw());
-  if (!other_fun.HasInstantiatedSignature(kCurrentClass)) {
-    other_fun = other_fun.InstantiateSignatureFrom(
-        Object::null_type_arguments(), Object::null_type_arguments(),
-        kNoneFree,  // Keep function type parameters, do not map to dynamic.
-        Heap::kOld);
-  }
-  if (!this_fun.TypeTest(kIsSubtypeOf, other_fun, bound_error, NULL,
-                         Heap::kOld)) {
-    // For more informative error reporting, use the location of the other
-    // function here, since the caller will use the location of this function.
-    auto space = Thread::Current()->IsMutatorThread() ? Heap::kNew : Heap::kOld;
-    *bound_error = LanguageError::NewFormatted(
-        *bound_error,  // A bound error if non null.
-        Script::Handle(other.script()), other.token_pos(), Report::AtLocation,
-        Report::kError, space,
-        "signature type '%s' of function '%s' is not a subtype of signature "
-        "type '%s' of function '%s'\n",
-        String::Handle(UserVisibleSignature()).ToCString(),
-        String::Handle(UserVisibleName()).ToCString(),
-        String::Handle(other.UserVisibleSignature()).ToCString(),
-        String::Handle(other.UserVisibleName()).ToCString());
-    return false;
-  }
-  // We should also check that if the other function explicitly specifies a
-  // default value for a formal parameter, this function does not specify a
-  // different default value for the same parameter. However, this check is not
-  // possible in the current implementation, because the default parameter
-  // values are not stored in the Function object, but discarded after a
-  // function is compiled.
-  return true;
-}
-
 RawFunction* Function::InstantiateSignatureFrom(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
@@ -11485,10 +11481,13 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Object& entry = Object::Handle(zone);
-  if (LookupResolvedNamesCache(name, &entry)) {
+  if (FLAG_use_lib_cache && LookupResolvedNamesCache(name, &entry)) {
     // TODO(koda): Support deleted sentinel in snapshots and remove only 'name'.
     ClearResolvedNamesCache();
   }
+  if (!FLAG_use_exp_cache) {
+    return;
+  }
   // When a new name is added to a library, we need to invalidate all
   // caches that contain an entry for this name. If the name was previously
   // looked up but could not be resolved, the cache contains a null entry.
@@ -12481,6 +12480,10 @@
   kernel::KernelLoader loader(kernel_pgm);
   const Object& result = Object::Handle(
       loader.LoadExpressionEvaluationFunction(library_url, klass));
+
+  delete kernel_pgm;
+  kernel_pgm = NULL;
+
   if (result.IsError()) return result.raw();
 
   const Function& callee = Function::Cast(result);
@@ -13643,7 +13646,7 @@
   for (intptr_t i = 0; i < Length(); i++) {
     intptr_t offset = OffsetFromIndex(i);
     THR_Print("  %" Pd " PP+0x%" Px ": ", i, offset);
-    if (TypeAt(i) == kTaggedObject) {
+    if ((TypeAt(i) == kTaggedObject) || (TypeAt(i) == kNativeEntryData)) {
       RawObject* obj = ObjectAt(i);
       THR_Print("0x%" Px " %s (obj)\n", reinterpret_cast<uword>(obj),
                 Object::Handle(obj).ToCString());
@@ -15254,7 +15257,7 @@
   return true;
 }
 
-void ICData::InitOnce() {
+void ICData::Init() {
   for (int i = 0; i <= kCachedICDataMaxArgsTestedWithoutExactnessTracking;
        i++) {
     cached_icdata_arrays_
@@ -15265,6 +15268,12 @@
       ICData::NewNonCachedEmptyICDataArray(1, true);
 }
 
+void ICData::Cleanup() {
+  for (int i = 0; i < kCachedICDataArrayCount; ++i) {
+    cached_icdata_arrays_[i] = NULL;
+  }
+}
+
 RawArray* ICData::NewNonCachedEmptyICDataArray(intptr_t num_args_tested,
                                                bool tracking_exactness) {
   // IC data array must be null terminated (sentinel entry).
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 4aace8f..4f2f070 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -460,11 +460,13 @@
 
   // Initialize the VM isolate.
   static void InitNull(Isolate* isolate);
-  static void InitOnce(Isolate* isolate);
-  static void FinishInitOnce(Isolate* isolate);
+  static void Init(Isolate* isolate);
+  static void FinishInit(Isolate* isolate);
   static void FinalizeVMIsolate(Isolate* isolate);
   static void FinalizeReadOnlyObject(RawObject* object);
 
+  static void Cleanup();
+
   // Initialize a new isolate either from a Kernel IR, from source, or from a
   // snapshot.
   static RawError* Init(Isolate* isolate,
@@ -2086,7 +2088,10 @@
                         TokenPosition token_pos) const;
 
   // Initialize the preallocated empty ICData entry arrays.
-  static void InitOnce();
+  static void Init();
+
+  // Clear the preallocated empty ICData entry arrays.
+  static void Cleanup();
 
   // We cache ICData with 0, 1, 2 arguments tested without exactness
   // tracking and with 1 argument tested with exactness tracking.
@@ -2694,12 +2699,6 @@
 
   const char* ToQualifiedCString() const;
 
-  // Returns true if this function has parameters that are compatible with the
-  // parameters of the other function in order for this function to override the
-  // other function.
-  bool HasCompatibleParametersWith(const Function& other,
-                                   Error* bound_error) const;
-
   // Returns true if the type of this function is a subtype of the type of
   // the other function.
   bool IsSubtypeOf(const Function& other,
@@ -4310,6 +4309,7 @@
     kImmediate,
     kNativeFunction,
     kNativeFunctionWrapper,
+    kNativeEntryData,
   };
 
   enum Patchability {
@@ -4361,11 +4361,13 @@
   }
 
   RawObject* ObjectAt(intptr_t index) const {
-    ASSERT(TypeAt(index) == kTaggedObject);
+    ASSERT((TypeAt(index) == kTaggedObject) ||
+           (TypeAt(index) == kNativeEntryData));
     return EntryAddr(index)->raw_obj_;
   }
   void SetObjectAt(intptr_t index, const Object& obj) const {
-    ASSERT(TypeAt(index) == kTaggedObject);
+    ASSERT((TypeAt(index) == kTaggedObject) ||
+           (TypeAt(index) == kNativeEntryData));
     StorePointer(&EntryAddr(index)->raw_obj_, obj.raw());
   }
 
@@ -7111,6 +7113,16 @@
                       const Integer& other,
                       Heap::Space space = Heap::kNew) const;
 
+  static int64_t GetInt64Value(const RawInteger* obj) {
+    intptr_t raw_value = reinterpret_cast<intptr_t>(obj);
+    if ((raw_value & kSmiTagMask) == kSmiTag) {
+      return (raw_value >> kSmiTagShift);
+    } else {
+      ASSERT(obj->IsMint());
+      return reinterpret_cast<const RawMint*>(obj)->ptr()->value_;
+    }
+  }
+
  private:
   OBJECT_IMPLEMENTATION(Integer, Number);
   friend class Class;
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 9159e97..bc78047 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -716,7 +716,10 @@
              old_target.kind() == RawFunction::kConstructor);
       // This can be incorrect if the call site was an unqualified invocation.
       const Class& cls = Class::Handle(zone, old_target.Owner());
-      new_target = cls.LookupStaticFunction(selector);
+      new_target = cls.LookupFunction(selector);
+      if (new_target.kind() != old_target.kind()) {
+        new_target = Function::null();
+      }
     } else {
       // Super call.
       Function& caller = Function::Handle(zone);
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 502e0ed..c618ac6 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -657,6 +657,11 @@
           jsentry.AddProperty("kind", "Immediate");
           jsentry.AddProperty64("value", imm);
           break;
+        case ObjectPool::kNativeEntryData:
+          obj = ObjectAt(i);
+          jsentry.AddProperty("kind", "NativeEntryData");
+          jsentry.AddProperty("value", obj);
+          break;
         case ObjectPool::kNativeFunction:
           imm = RawValueAt(i);
           jsentry.AddProperty("kind", "NativeFunction");
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 0470f1a..c9d59ae 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -231,7 +231,6 @@
       case Snapshot::kFullJIT:
       case Snapshot::kFullAOT:
         return reinterpret_cast<RawObject**>(&megamorphic_miss_function_);
-      case Snapshot::kScript:
       case Snapshot::kMessage:
       case Snapshot::kNone:
       case Snapshot::kInvalid:
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 9af09d4..6a24632 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -3216,7 +3216,6 @@
 }
 
 TEST_CASE(StackTraceFormat) {
-  Isolate* isolate = Isolate::Current();
   const char* kScriptChars =
       "void baz() {\n"
       "  throw 'MyException';\n"
@@ -3260,8 +3259,7 @@
   EXPECT_VALID(lib);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
 
-  const char* lib_url =
-      isolate->use_dart_frontend() ? "file:///test-lib" : "test-lib";
+  const char* lib_url = "file:///test-lib";
   const size_t kBufferSize = 1024;
   char expected[kBufferSize];
   snprintf(expected, kBufferSize,
diff --git a/runtime/vm/os.h b/runtime/vm/os.h
index dcee83d..e79b54a 100644
--- a/runtime/vm/os.h
+++ b/runtime/vm/os.h
@@ -118,10 +118,10 @@
   static void RegisterCodeObservers();
 
   // Initialize the OS class.
-  static void InitOnce();
+  static void Init();
 
-  // Shut down the OS class.
-  static void Shutdown();
+  // Cleanup the OS class.
+  static void Cleanup();
 
   static DART_NORETURN void Abort();
 
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index 78e7e45..0ff1668 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -356,16 +356,9 @@
   va_end(args);
 }
 
-void OS::InitOnce() {
-  // TODO(5411554): For now we check that initonce is called only once,
-  // Once there is more formal mechanism to call InitOnce we can move
-  // this check there.
-  static bool init_once_called = false;
-  ASSERT(init_once_called == false);
-  init_once_called = true;
-}
+void OS::Init() {}
 
-void OS::Shutdown() {}
+void OS::Cleanup() {}
 
 void OS::Abort() {
   abort();
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index a6b7a18..7f4ff12 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -253,20 +253,14 @@
   va_end(args);
 }
 
-void OS::InitOnce() {
-  // TODO(5411554): For now we check that initonce is called only once,
-  // Once there is more formal mechanism to call InitOnce we can move
-  // this check there.
-  static bool init_once_called = false;
-  ASSERT(init_once_called == false);
-  init_once_called = true;
+void OS::Init() {
   auto environment_services = std::make_shared<component::Services>();
   auto env_service_root = component::subtle::CreateStaticServiceRootHandle();
   environment_services->Bind(std::move(env_service_root));
   environment_services->ConnectToService(tz.NewRequest());
 }
 
-void OS::Shutdown() {}
+void OS::Cleanup() {}
 
 void OS::Abort() {
   abort();
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index 13936fb..1d48dad 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -655,16 +655,9 @@
   va_end(args);
 }
 
-void OS::InitOnce() {
-  // TODO(5411554): For now we check that initonce is called only once,
-  // Once there is more formal mechanism to call InitOnce we can move
-  // this check there.
-  static bool init_once_called = false;
-  ASSERT(init_once_called == false);
-  init_once_called = true;
-}
+void OS::Init() {}
 
-void OS::Shutdown() {}
+void OS::Cleanup() {}
 
 void OS::Abort() {
   abort();
diff --git a/runtime/vm/os_macos.cc b/runtime/vm/os_macos.cc
index e423c7a..05813dc 100644
--- a/runtime/vm/os_macos.cc
+++ b/runtime/vm/os_macos.cc
@@ -302,14 +302,7 @@
 #endif
 }
 
-void OS::InitOnce() {
-  // TODO(5411554): For now we check that initonce is called only once,
-  // Once there is more formal mechanism to call InitOnce we can move
-  // this check there.
-  static bool init_once_called = false;
-  ASSERT(init_once_called == false);
-  init_once_called = true;
-
+void OS::Init() {
   // See https://github.com/dart-lang/sdk/issues/29539
   // This is a workaround for a macos bug, we eagerly call localtime_r so that
   // libnotify is initialized early before any fork happens.
@@ -326,7 +319,7 @@
   }
 }
 
-void OS::Shutdown() {}
+void OS::Cleanup() {}
 
 void OS::Abort() {
   abort();
diff --git a/runtime/vm/os_thread.cc b/runtime/vm/os_thread.cc
index 125dabf..2120380 100644
--- a/runtime/vm/os_thread.cc
+++ b/runtime/vm/os_thread.cc
@@ -136,15 +136,17 @@
   delete reinterpret_cast<OSThread*>(thread);
 }
 
-void OSThread::InitOnce() {
+void OSThread::Init() {
   // Allocate the global OSThread lock.
-  ASSERT(thread_list_lock_ == NULL);
-  thread_list_lock_ = new Mutex();
+  if (thread_list_lock_ == NULL) {
+    thread_list_lock_ = new Mutex();
+  }
   ASSERT(thread_list_lock_ != NULL);
 
   // Create the thread local key.
-  ASSERT(thread_key_ == kUnsetThreadLocalKey);
-  thread_key_ = CreateThreadLocal(DeleteThread);
+  if (thread_key_ == kUnsetThreadLocalKey) {
+    thread_key_ = CreateThreadLocal(DeleteThread);
+  }
   ASSERT(thread_key_ != kUnsetThreadLocalKey);
 
   // Enable creation of OSThread structures in the VM.
diff --git a/runtime/vm/os_thread.h b/runtime/vm/os_thread.h
index baad4af..1f30787 100644
--- a/runtime/vm/os_thread.h
+++ b/runtime/vm/os_thread.h
@@ -204,7 +204,7 @@
   static ThreadJoinId GetCurrentThreadJoinId(OSThread* thread);
 
   // Called at VM startup and shutdown.
-  static void InitOnce();
+  static void Init();
 
   static bool IsThreadInList(ThreadId id);
 
diff --git a/runtime/vm/os_thread_win.cc b/runtime/vm/os_thread_win.cc
index 6fef2cd..5f75a32 100644
--- a/runtime/vm/os_thread_win.cc
+++ b/runtime/vm/os_thread_win.cc
@@ -604,7 +604,7 @@
 // This function is executed on the thread that is exiting. It is invoked
 // by |OnDartThreadExit| (see below for notes on TLS destructors on Windows).
 void ThreadLocalData::RunDestructors() {
-  // If an OS thread is created but ThreadLocalData::InitOnce has not yet been
+  // If an OS thread is created but ThreadLocalData::Init has not yet been
   // called, this method still runs. If this happens, there's nothing to clean
   // up here. See issue 33826.
   if (thread_locals_ == NULL) {
@@ -624,12 +624,12 @@
 Mutex* ThreadLocalData::mutex_ = NULL;
 MallocGrowableArray<ThreadLocalEntry>* ThreadLocalData::thread_locals_ = NULL;
 
-void ThreadLocalData::InitOnce() {
+void ThreadLocalData::Init() {
   mutex_ = new Mutex();
   thread_locals_ = new MallocGrowableArray<ThreadLocalEntry>();
 }
 
-void ThreadLocalData::Shutdown() {
+void ThreadLocalData::Cleanup() {
   if (mutex_ != NULL) {
     delete mutex_;
     mutex_ = NULL;
diff --git a/runtime/vm/os_thread_win.h b/runtime/vm/os_thread_win.h
index 594b445..24f4031 100644
--- a/runtime/vm/os_thread_win.h
+++ b/runtime/vm/os_thread_win.h
@@ -147,8 +147,8 @@
   static Mutex* mutex_;
   static MallocGrowableArray<ThreadLocalEntry>* thread_locals_;
 
-  static void InitOnce();
-  static void Shutdown();
+  static void Init();
+  static void Cleanup();
 
   friend class OS;
   friend class OSThread;
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc
index c9a102b..d01ccf9 100644
--- a/runtime/vm/os_win.cc
+++ b/runtime/vm/os_win.cc
@@ -312,16 +312,15 @@
   va_end(args);
 }
 
-void OS::InitOnce() {
-  // TODO(5411554): For now we check that initonce is called only once,
-  // Once there is more formal mechanism to call InitOnce we can move
-  // this check there.
+void OS::Init() {
   static bool init_once_called = false;
-  ASSERT(init_once_called == false);
+  if (init_once_called) {
+    return;
+  }
   init_once_called = true;
   // Do not pop up a message box when abort is called.
   _set_abort_behavior(0, _WRITE_ABORT_MSG);
-  ThreadLocalData::InitOnce();
+  ThreadLocalData::Init();
   MonitorWaitData::monitor_wait_data_key_ = OSThread::CreateThreadLocal();
   MonitorData::GetMonitorWaitDataForThread();
   LARGE_INTEGER ticks_per_sec;
@@ -332,9 +331,9 @@
   }
 }
 
-void OS::Shutdown() {
+void OS::Cleanup() {
   // TODO(zra): Enable once VM can shutdown cleanly.
-  // ThreadLocalData::Shutdown();
+  // ThreadLocalData::Cleanup();
 }
 
 void OS::Abort() {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 0e7670e..7e9dea5 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -69,104 +69,6 @@
 // Quick synthetic token position.
 #define ST(token_pos) ((token_pos).ToSynthetic())
 
-#if defined(DEBUG)
-class TraceParser : public ValueObject {
- public:
-  TraceParser(TokenPosition token_pos,
-              const Script& script,
-              intptr_t* trace_indent,
-              const char* msg) {
-    indent_ = trace_indent;
-    if (FLAG_trace_parser) {
-      // Skips tracing of bootstrap libraries.
-      if (script.HasSource()) {
-        intptr_t line, column;
-        script.GetTokenLocation(token_pos, &line, &column);
-        PrintIndent();
-        OS::PrintErr("%s (line %" Pd ", col %" Pd ", token %" Pd ")\n", msg,
-                     line, column, token_pos.value());
-      }
-      (*indent_)++;
-    }
-  }
-  ~TraceParser() {
-    if (FLAG_trace_parser) {
-      (*indent_)--;
-      ASSERT(*indent_ >= 0);
-    }
-  }
-
- private:
-  void PrintIndent() {
-    for (intptr_t i = 0; i < *indent_; i++) {
-      OS::PrintErr(". ");
-    }
-  }
-  intptr_t* indent_;
-};
-
-#define TRACE_PARSER(s)                                                        \
-  TraceParser __p__(this->TokenPos(), this->script_, &this->trace_indent_, s)
-
-#else  // not DEBUG
-#define TRACE_PARSER(s)
-#endif  // DEBUG
-
-class BoolScope : public ValueObject {
- public:
-  BoolScope(bool* addr, bool new_value) : _addr(addr), _saved_value(*addr) {
-    *_addr = new_value;
-  }
-  ~BoolScope() { *_addr = _saved_value; }
-
- private:
-  bool* _addr;
-  bool _saved_value;
-};
-
-// Helper class to save and restore token position.
-class Parser::TokenPosScope : public ValueObject {
- public:
-  explicit TokenPosScope(Parser* p) : p_(p) { saved_pos_ = p_->TokenPos(); }
-  TokenPosScope(Parser* p, TokenPosition pos) : p_(p), saved_pos_(pos) {}
-  ~TokenPosScope() { p_->SetPosition(saved_pos_); }
-
- private:
-  Parser* p_;
-  TokenPosition saved_pos_;
-  DISALLOW_COPY_AND_ASSIGN(TokenPosScope);
-};
-
-class RecursionChecker : public ValueObject {
- public:
-  explicit RecursionChecker(Parser* p) : parser_(p) {
-    parser_->recursion_counter_++;
-    // This limit also protects against stack overflow in the flow graph builder
-    // and some optimization passes, which may use more stack than the parser
-    // for the same function.
-    // The limit is somewhat arbitrary.
-    if (parser_->recursion_counter_ > 256) {
-      parser_->ReportError("stack overflow while parsing");
-    }
-  }
-  ~RecursionChecker() { parser_->recursion_counter_--; }
-
- private:
-  Parser* parser_;
-};
-
-static RawTypeArguments* NewTypeArguments(
-    const GrowableArray<AbstractType*>& objs) {
-  const TypeArguments& a =
-      TypeArguments::Handle(TypeArguments::New(objs.length()));
-  for (int i = 0; i < objs.length(); i++) {
-    a.SetTypeAt(i, *objs.At(i));
-  }
-  // Cannot canonicalize TypeArgument yet as its types may not have been
-  // finalized yet.
-  return a.raw();
-}
-
 ParsedFunction::ParsedFunction(Thread* thread, const Function& function)
     : thread_(thread),
       function_(function),
@@ -421,18 +323,6 @@
   num_stack_locals_ = -next_free_index.value();
 }
 
-struct CatchParamDesc {
-  CatchParamDesc()
-      : token_pos(TokenPosition::kNoSource),
-        type(NULL),
-        name(NULL),
-        var(NULL) {}
-  TokenPosition token_pos;
-  const AbstractType* type;
-  const String* name;
-  LocalVariable* var;
-};
-
 void ParsedFunction::AllocateIrregexpVariables(intptr_t num_stack_locals) {
   ASSERT(function().IsIrregexpFunction());
   ASSERT(function().NumOptionalParameters() == 0);
@@ -452,14437 +342,6 @@
   num_stack_locals_ = num_stack_locals;
 }
 
-struct Parser::Block : public ZoneAllocated {
-  Block(Block* outer_block, LocalScope* local_scope, SequenceNode* seq)
-      : parent(outer_block), scope(local_scope), statements(seq) {
-    ASSERT(scope != NULL);
-    ASSERT(statements != NULL);
-  }
-  Block* parent;  // Enclosing block, or NULL if outermost.
-  LocalScope* scope;
-  SequenceNode* statements;
-};
-
-// Class which describes an inlined finally block which is used to generate
-// inlined code for the finally blocks when there is an exit from a try
-// block using 'return', 'break' or 'continue'.
-class Parser::TryStack : public ZoneAllocated {
- public:
-  TryStack(Block* try_block, TryStack* outer_try, intptr_t try_index)
-      : try_block_(try_block),
-        inlined_finally_nodes_(),
-        outer_try_(outer_try),
-        try_index_(try_index),
-        inside_catch_(false),
-        inside_finally_(false) {}
-
-  TryStack* outer_try() const { return outer_try_; }
-  Block* try_block() const { return try_block_; }
-  intptr_t try_index() const { return try_index_; }
-  bool inside_catch() const { return inside_catch_; }
-  void enter_catch() { inside_catch_ = true; }
-  bool inside_finally() const { return inside_finally_; }
-  void enter_finally() { inside_finally_ = true; }
-  void exit_finally() { inside_finally_ = false; }
-
-  void AddNodeForFinallyInlining(AstNode* node);
-  void RemoveJumpToLabel(SourceLabel* label);
-  AstNode* GetNodeToInlineFinally(int index) {
-    if (0 <= index && index < inlined_finally_nodes_.length()) {
-      return inlined_finally_nodes_[index];
-    }
-    return NULL;
-  }
-
- private:
-  Block* try_block_;
-  GrowableArray<AstNode*> inlined_finally_nodes_;
-  TryStack* outer_try_;
-  const intptr_t try_index_;
-  bool inside_catch_;    // True when parsing a catch clause of this try.
-  bool inside_finally_;  // True when parsing a finally clause of an inner try
-                         // of this try.
-
-  DISALLOW_COPY_AND_ASSIGN(TryStack);
-};
-
-void Parser::TryStack::AddNodeForFinallyInlining(AstNode* node) {
-  inlined_finally_nodes_.Add(node);
-}
-
-void Parser::TryStack::RemoveJumpToLabel(SourceLabel* label) {
-  int i = 0;
-  while (i < inlined_finally_nodes_.length()) {
-    if (inlined_finally_nodes_[i]->IsJumpNode()) {
-      JumpNode* jump = inlined_finally_nodes_[i]->AsJumpNode();
-      if (jump->label() == label) {
-        // Shift remaining entries left and delete last entry.
-        for (int j = i + 1; j < inlined_finally_nodes_.length(); j++) {
-          inlined_finally_nodes_[j - 1] = inlined_finally_nodes_[j];
-        }
-        inlined_finally_nodes_.RemoveLast();
-        continue;
-      }
-    }
-    i++;
-  }
-}
-
-// For parsing a compilation unit.
-Parser::Parser(const Script& script,
-               const Library& library,
-               TokenPosition token_pos)
-    : thread_(Thread::Current()),
-      isolate_(thread()->isolate()),
-      allocation_space_(thread_->IsMutatorThread() ? Heap::kNew : Heap::kOld),
-      script_(Script::Handle(zone(), script.raw())),
-      tokens_iterator_(zone(),
-                       TokenStream::Handle(zone(), script.tokens()),
-                       token_pos),
-      token_kind_(Token::kILLEGAL),
-      current_block_(NULL),
-      is_top_level_(false),
-      await_is_keyword_(false),
-      current_member_(NULL),
-      allow_function_literals_(true),
-      parsed_function_(NULL),
-      innermost_function_(Function::Handle(zone())),
-      literal_token_(LiteralToken::Handle(zone())),
-      current_class_(Class::Handle(zone())),
-      library_(Library::Handle(zone(), library.raw())),
-      try_stack_(NULL),
-      last_used_try_index_(0),
-      unregister_pending_function_(false),
-      async_temp_scope_(NULL),
-      trace_indent_(0),
-      recursion_counter_(0) {
-  ASSERT(tokens_iterator_.IsValid());
-  ASSERT(!library.IsNull());
-}
-
-// For parsing a function.
-Parser::Parser(const Script& script,
-               ParsedFunction* parsed_function,
-               TokenPosition token_pos)
-    : thread_(Thread::Current()),
-      isolate_(thread()->isolate()),
-      allocation_space_(thread_->IsMutatorThread() ? Heap::kNew : Heap::kOld),
-      script_(Script::Handle(zone(), script.raw())),
-      tokens_iterator_(zone(),
-                       TokenStream::Handle(zone(), script.tokens()),
-                       token_pos),
-      token_kind_(Token::kILLEGAL),
-      current_block_(NULL),
-      is_top_level_(false),
-      await_is_keyword_(false),
-      current_member_(NULL),
-      allow_function_literals_(true),
-      parsed_function_(parsed_function),
-      innermost_function_(
-          Function::Handle(zone(), parsed_function->function().raw())),
-      literal_token_(LiteralToken::Handle(zone())),
-      current_class_(
-          Class::Handle(zone(), parsed_function->function().Owner())),
-      library_(Library::Handle(
-          zone(),
-          Class::Handle(zone(), parsed_function->function().origin())
-              .library())),
-      try_stack_(NULL),
-      last_used_try_index_(0),
-      unregister_pending_function_(false),
-      async_temp_scope_(NULL),
-      trace_indent_(0),
-      recursion_counter_(0) {
-  ASSERT(tokens_iterator_.IsValid());
-  ASSERT(!current_function().IsNull());
-  EnsureExpressionTemp();
-}
-
-Parser::~Parser() {
-  if (unregister_pending_function_) {
-    const GrowableObjectArray& pending_functions =
-        GrowableObjectArray::Handle(T->pending_functions());
-    ASSERT(!pending_functions.IsNull());
-    ASSERT(pending_functions.Length() > 0);
-    ASSERT(pending_functions.At(pending_functions.Length() - 1) ==
-           current_function().raw());
-    pending_functions.RemoveLast();
-  }
-}
-
-// Each try in this function gets its own try index.
-// See definition of RawPcDescriptors::PcDescriptor.
-int16_t Parser::AllocateTryIndex() {
-  if (!Utils::IsInt(16, last_used_try_index_ - 1)) {
-    ReportError("too many nested try statements");
-  }
-  return last_used_try_index_++;
-}
-
-void Parser::SetScript(const Script& script, TokenPosition token_pos) {
-  script_ = script.raw();
-  tokens_iterator_.SetStream(TokenStream::Handle(Z, script.tokens()),
-                             token_pos);
-  token_kind_ = Token::kILLEGAL;
-}
-
-bool Parser::SetAllowFunctionLiterals(bool value) {
-  bool current_value = allow_function_literals_;
-  allow_function_literals_ = value;
-  return current_value;
-}
-
-const Function& Parser::current_function() const {
-  ASSERT(parsed_function() != NULL);
-  return parsed_function()->function();
-}
-
-const Function& Parser::innermost_function() const {
-  return innermost_function_;
-}
-
-int Parser::FunctionLevel() const {
-  if (current_block_ != NULL) {
-    return current_block_->scope->function_level();
-  }
-  return 0;
-}
-
-const Class& Parser::current_class() const {
-  return current_class_;
-}
-
-void Parser::set_current_class(const Class& value) {
-  current_class_ = value.raw();
-}
-
-void Parser::SetPosition(TokenPosition position) {
-  tokens_iterator_.SetCurrentPosition(position);
-  token_kind_ = Token::kILLEGAL;
-  prev_token_pos_ = position;
-}
-
-// Set state and increments generational count so that thge background compiler
-// can detect if loading/top-level-parsing occured during compilation.
-class TopLevelParsingScope : public StackResource {
- public:
-  explicit TopLevelParsingScope(Thread* thread) : StackResource(thread) {
-    isolate()->IncrTopLevelParsingCount();
-  }
-  ~TopLevelParsingScope() {
-    isolate()->DecrTopLevelParsingCount();
-    isolate()->IncrLoadingInvalidationGen();
-  }
-};
-
-void Parser::ParseCompilationUnit(const Library& library,
-                                  const Script& script) {
-  Thread* thread = Thread::Current();
-  CSTAT_TIMER_SCOPE(thread, parser_timer);
-#ifndef PRODUCT
-  VMTagScope tagScope(thread, VMTag::kCompileTopLevelTagId);
-  TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
-                            "CompileTopLevel");
-  if (tds.enabled()) {
-    tds.SetNumArguments(1);
-    tds.CopyArgument(0, "script", String::Handle(script.url()).ToCString());
-  }
-#endif
-
-  TopLevelParsingScope scope(thread);
-  Parser parser(script, library, TokenPosition::kMinSource);
-  parser.ParseTopLevel();
-}
-
-void Parser::ComputeCurrentToken() {
-  ASSERT(token_kind_ == Token::kILLEGAL);
-  token_kind_ = tokens_iterator_.CurrentTokenKind();
-  if (token_kind_ == Token::kERROR) {
-    ReportError(TokenPos(), "%s", CurrentLiteral()->ToCString());
-  }
-}
-
-Token::Kind Parser::LookaheadToken(int num_tokens) {
-  return tokens_iterator_.LookaheadTokenKind(num_tokens);
-}
-
-String* Parser::CurrentLiteral() const {
-  String& result = String::ZoneHandle(Z, tokens_iterator_.CurrentLiteral());
-  return &result;
-}
-
-RawDouble* Parser::CurrentDoubleLiteral() const {
-  literal_token_ ^= tokens_iterator_.CurrentToken();
-  ASSERT(literal_token_.kind() == Token::kDOUBLE);
-  return Double::RawCast(literal_token_.value());
-}
-
-RawInteger* Parser::CurrentIntegerLiteral() const {
-  literal_token_ ^= tokens_iterator_.CurrentToken();
-  ASSERT(literal_token_.kind() == Token::kINTEGER);
-  RawInteger* ri = Integer::RawCast(literal_token_.value());
-  return ri;
-}
-
-struct ParamDesc {
-  ParamDesc()
-      : type(NULL),
-        name_pos(TokenPosition::kNoSource),
-        name(NULL),
-        default_value(NULL),
-        metadata(NULL),
-        var(NULL),
-        is_final(false),
-        is_field_initializer(false),
-        has_explicit_type(false),
-        is_covariant(false) {}
-  const AbstractType* type;
-  TokenPosition name_pos;
-  const String* name;
-  const Instance* default_value;  // NULL if not an optional parameter.
-  const Object* metadata;  // NULL if no metadata or metadata not evaluated.
-  LocalVariable* var;      // Scope variable allocated for this parameter.
-  bool is_final;
-  bool is_field_initializer;
-  bool has_explicit_type;
-  bool is_covariant;
-};
-
-struct ParamList {
-  ParamList() { Clear(); }
-
-  void Clear() {
-    num_fixed_parameters = 0;
-    num_optional_parameters = 0;
-    has_optional_positional_parameters = false;
-    has_optional_named_parameters = false;
-    has_explicit_default_values = false;
-    has_field_initializer = false;
-    has_covariant = false;
-    implicitly_final = false;
-    skipped = false;
-    this->parameters = new ZoneGrowableArray<ParamDesc>();
-  }
-
-  void AddFinalParameter(TokenPosition name_pos,
-                         const String* name,
-                         const AbstractType* type) {
-    this->num_fixed_parameters++;
-    ParamDesc param;
-    param.name_pos = name_pos;
-    param.name = name;
-    param.is_final = true;
-    param.type = type;
-    this->parameters->Add(param);
-  }
-
-  void AddReceiver(const AbstractType* receiver_type, TokenPosition token_pos) {
-    ASSERT(this->parameters->is_empty());
-    AddFinalParameter(token_pos, &Symbols::This(), receiver_type);
-  }
-
-  void EraseParameterTypes() {
-    const int num_parameters = parameters->length();
-    for (int i = 0; i < num_parameters; i++) {
-      (*parameters)[i].type = &Object::dynamic_type();
-    }
-  }
-
-  // Make the parameter variables visible/invisible.
-  void SetInvisible(bool invisible) {
-    const intptr_t num_params = parameters->length();
-    for (int i = 0; i < num_params; i++) {
-      ParamDesc& param = (*parameters)[i];
-      ASSERT(param.var != NULL);
-      param.var->set_invisible(invisible);
-    }
-  }
-
-  void HideInitFormals() {
-    const intptr_t num_params = parameters->length();
-    for (int i = 0; i < num_params; i++) {
-      ParamDesc& param = (*parameters)[i];
-      if (param.is_field_initializer) {
-        ASSERT(param.var != NULL);
-        param.var->set_invisible(true);
-      }
-    }
-  }
-
-  void SetImplicitlyFinal() { implicitly_final = true; }
-
-  int num_fixed_parameters;
-  int num_optional_parameters;
-  bool has_optional_positional_parameters;
-  bool has_optional_named_parameters;
-  bool has_explicit_default_values;
-  bool has_field_initializer;
-  bool has_covariant;
-  bool implicitly_final;
-  bool skipped;
-  ZoneGrowableArray<ParamDesc>* parameters;
-};
-
-struct MemberDesc {
-  MemberDesc() { Clear(); }
-
-  void Clear() {
-    has_abstract = false;
-    has_external = false;
-    has_covariant = false;
-    has_final = false;
-    has_const = false;
-    has_static = false;
-    has_var = false;
-    has_factory = false;
-    has_operator = false;
-    has_native = false;
-    metadata_pos = TokenPosition::kNoSource;
-    operator_token = Token::kILLEGAL;
-    type = NULL;
-    name_pos = TokenPosition::kNoSource;
-    name = NULL;
-    redirect_name = NULL;
-    dict_name = NULL;
-    params.Clear();
-    kind = RawFunction::kRegularFunction;
-    field_ = NULL;
-  }
-
-  bool IsConstructor() const {
-    return (kind == RawFunction::kConstructor) && !has_static;
-  }
-  bool IsFactory() const {
-    return (kind == RawFunction::kConstructor) && has_static;
-  }
-  bool IsFactoryOrConstructor() const {
-    return (kind == RawFunction::kConstructor);
-  }
-  bool IsGetter() const { return kind == RawFunction::kGetterFunction; }
-  bool IsSetter() const { return kind == RawFunction::kSetterFunction; }
-  const char* ToCString() const {
-    if (field_ != NULL) {
-      return "field";
-    } else if (IsConstructor()) {
-      return "constructor";
-    } else if (IsFactory()) {
-      return "factory";
-    } else if (IsGetter()) {
-      return "getter";
-    } else if (IsSetter()) {
-      return "setter";
-    }
-    return "method";
-  }
-  String* DictName() const { return (dict_name != NULL) ? dict_name : name; }
-  bool has_abstract;
-  bool has_external;
-  bool has_covariant;
-  bool has_final;
-  bool has_const;
-  bool has_static;
-  bool has_var;
-  bool has_factory;
-  bool has_operator;
-  bool has_native;
-  TokenPosition metadata_pos;
-  Token::Kind operator_token;
-  const AbstractType* type;
-  TokenPosition name_pos;
-  TokenPosition decl_begin_pos;
-  String* name;
-  // For constructors: NULL or name of redirected to constructor.
-  String* redirect_name;
-  // dict_name is the name used for the class namespace, if it
-  // differs from 'name'.
-  // For constructors: NULL for unnamed constructor,
-  // identifier after classname for named constructors.
-  // For getters and setters: unmangled name.
-  String* dict_name;
-  ParamList params;
-  RawFunction::Kind kind;
-  // NULL for functions, field object for static or instance fields.
-  Field* field_;
-};
-
-class ClassDesc : public ValueObject {
- public:
-  ClassDesc(Zone* zone,
-            const Class& cls,
-            const String& cls_name,
-            bool is_interface,
-            TokenPosition token_pos)
-      : zone_(zone),
-        clazz_(cls),
-        class_name_(cls_name),
-        token_pos_(token_pos),
-        functions_(zone, 4),
-        fields_(zone, 4) {}
-
-  void AddFunction(const Function& function) {
-    functions_.Add(&Function::ZoneHandle(zone_, function.raw()));
-  }
-
-  const GrowableArray<const Function*>& functions() const { return functions_; }
-
-  void AddField(const Field& field) {
-    fields_.Add(&Field::ZoneHandle(zone_, field.raw()));
-  }
-
-  const GrowableArray<const Field*>& fields() const { return fields_; }
-
-  const Class& clazz() const { return clazz_; }
-
-  const String& class_name() const { return class_name_; }
-
-  bool has_constructor() const {
-    for (int i = 0; i < functions_.length(); i++) {
-      const Function* func = functions_.At(i);
-      if (func->kind() == RawFunction::kConstructor) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  TokenPosition token_pos() const { return token_pos_; }
-
-  void AddMember(const MemberDesc& member) { members_.Add(member); }
-
-  const GrowableArray<MemberDesc>& members() const { return members_; }
-
-  MemberDesc* LookupMember(const String& name) const {
-    for (int i = 0; i < members_.length(); i++) {
-      if (name.Equals(*members_[i].name)) {
-        return &members_[i];
-      }
-    }
-    return NULL;
-  }
-
-  RawArray* MakeFunctionsArray() {
-    const intptr_t len = functions_.length();
-    const Array& res = Array::Handle(zone_, Array::New(len, Heap::kOld));
-    for (intptr_t i = 0; i < len; i++) {
-      res.SetAt(i, *functions_[i]);
-    }
-    return res.raw();
-  }
-
- private:
-  Zone* zone_;
-  const Class& clazz_;
-  const String& class_name_;
-  TokenPosition token_pos_;  // Token index of "class" keyword.
-  GrowableArray<const Function*> functions_;
-  GrowableArray<const Field*> fields_;
-  GrowableArray<MemberDesc> members_;
-};
-
-class TopLevel : public ValueObject {
- public:
-  explicit TopLevel(Zone* zone)
-      : zone_(zone), fields_(zone, 4), functions_(zone, 4) {}
-
-  void AddField(const Field& field) {
-    fields_.Add(&Field::ZoneHandle(zone_, field.raw()));
-  }
-
-  void AddFunction(const Function& function) {
-    functions_.Add(&Function::ZoneHandle(zone_, function.raw()));
-  }
-
-  const GrowableArray<const Field*>& fields() const { return fields_; }
-
-  const GrowableArray<const Function*>& functions() const { return functions_; }
-
- private:
-  Zone* zone_;
-  GrowableArray<const Field*> fields_;
-  GrowableArray<const Function*> functions_;
-};
-
-void Parser::ParseClass(const Class& cls) {
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  const int64_t num_tokes_before = STAT_VALUE(thread, num_tokens_consumed);
-#ifndef PRODUCT
-  TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
-                            "ParseClass");
-  if (tds.enabled()) {
-    tds.SetNumArguments(1);
-    tds.CopyArgument(0, "class", String::Handle(cls.Name()).ToCString());
-  }
-#endif
-  if (!cls.is_synthesized_class()) {
-    CSTAT_TIMER_SCOPE(thread, parser_timer);
-    const Script& script = Script::Handle(zone, cls.script());
-    const Library& lib = Library::Handle(zone, cls.library());
-    Parser parser(script, lib, cls.token_pos());
-    parser.ParseClassDefinition(cls);
-  } else if (cls.is_enum_class()) {
-    CSTAT_TIMER_SCOPE(thread, parser_timer);
-    const Script& script = Script::Handle(zone, cls.script());
-    const Library& lib = Library::Handle(zone, cls.library());
-    Parser parser(script, lib, cls.token_pos());
-    parser.ParseEnumDefinition(cls);
-  }
-  const int64_t num_tokes_after = STAT_VALUE(thread, num_tokens_consumed);
-  INC_STAT(thread, num_class_tokens, num_tokes_after - num_tokes_before);
-}
-
-bool Parser::FieldHasFunctionLiteralInitializer(const Field& field,
-                                                TokenPosition* start,
-                                                TokenPosition* end) {
-  if (!field.has_initializer()) {
-    return false;
-  }
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  const Class& cls = Class::Handle(zone, field.Owner());
-  const Script& script = Script::Handle(zone, field.Script());
-  const Library& lib = Library::Handle(zone, cls.library());
-  Parser parser(script, lib, field.token_pos());
-  return parser.GetFunctionLiteralInitializerRange(field, start, end);
-}
-
-bool Parser::GetFunctionLiteralInitializerRange(const Field& field,
-                                                TokenPosition* start,
-                                                TokenPosition* end) {
-  ASSERT(field.has_initializer());
-  // Since |field| has an initializer, skip until '='.
-  while (CurrentToken() != Token::kASSIGN) {
-    ConsumeToken();
-  }
-  // Skip past the '=' as well.
-  ConsumeToken();
-
-  *start = TokenPos();
-  if (IsFunctionLiteral()) {
-    SkipExpr();
-    *end = PrevTokenPos();
-    return true;
-  }
-
-  return false;
-}
-
-RawObject* Parser::ParseFunctionParameters(const Function& func) {
-  ASSERT(!func.IsNull());
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    Thread* thread = Thread::Current();
-    StackZone stack_zone(thread);
-    Zone* zone = stack_zone.GetZone();
-    const Script& script = Script::Handle(zone, func.script());
-    const Class& owner = Class::Handle(zone, func.Owner());
-    ASSERT(!owner.IsNull());
-    ParsedFunction* parsed_function =
-        new ParsedFunction(thread, Function::ZoneHandle(zone, func.raw()));
-    Parser parser(script, parsed_function, func.token_pos());
-    parser.SkipFunctionPreamble();
-    const bool use_function_type_syntax = false;
-    const bool allow_explicit_default_values = true;
-    const bool evaluate_metadata = true;
-    ParamList params;
-    parser.ParseFormalParameterList(use_function_type_syntax,
-                                    allow_explicit_default_values,
-                                    evaluate_metadata, &params);
-    ParamDesc* param = params.parameters->data();
-    const int param_cnt =
-        params.num_fixed_parameters + params.num_optional_parameters;
-    const Array& param_descriptor =
-        Array::Handle(Array::New(param_cnt * kParameterEntrySize, Heap::kOld));
-    for (int i = 0, j = 0; i < param_cnt; i++, j += kParameterEntrySize) {
-      param_descriptor.SetAt(j + kParameterIsFinalOffset,
-                             param[i].is_final ? Bool::True() : Bool::False());
-      param_descriptor.SetAt(j + kParameterDefaultValueOffset,
-                             (param[i].default_value == NULL)
-                                 ? Object::null_instance()
-                                 : *(param[i].default_value));
-      const Object* metadata = param[i].metadata;
-      if ((metadata != NULL) && (*metadata).IsError()) {
-        return metadata->raw();  // Error evaluating the metadata.
-      }
-      param_descriptor.SetAt(j + kParameterMetadataOffset,
-                             (param[i].metadata == NULL)
-                                 ? Object::null_instance()
-                                 : *(param[i].metadata));
-    }
-    return param_descriptor.raw();
-  } else {
-    Thread* thread = Thread::Current();
-    Error& error = Error::Handle();
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
-    return error.raw();
-  }
-  UNREACHABLE();
-  return Object::null();
-}
-
-bool Parser::ParseFormalParameters(const Function& func, ParamList* params) {
-  ASSERT(!func.IsNull());
-  // This is currently only used for constructors. To handle all kinds
-  // of functions, special cases for getters and possibly other kinds
-  // need to be added.
-  ASSERT(func.kind() == RawFunction::kConstructor);
-  ASSERT(!func.IsRedirectingFactory());
-  // Implicit constructors have no source, no user-defined formal parameters.
-  if (func.IsImplicitConstructor()) {
-    return true;
-  }
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    const Script& script = Script::Handle(func.script());
-    const Class& owner = Class::Handle(func.Owner());
-    ASSERT(!owner.IsNull());
-    ParsedFunction* parsed_function =
-        new ParsedFunction(Thread::Current(), Function::ZoneHandle(func.raw()));
-    Parser parser(script, parsed_function, func.token_pos());
-    parser.SkipFunctionPreamble();
-    const bool use_function_type_syntax = false;
-    const bool allow_explicit_default_values = true;
-    const bool evaluate_metadata = true;
-    parser.ParseFormalParameterList(use_function_type_syntax,
-                                    allow_explicit_default_values,
-                                    evaluate_metadata, params);
-    return true;
-  } else {
-    Thread::Current()->clear_sticky_error();
-    params->Clear();
-    return false;
-  }
-  UNREACHABLE();
-  return false;
-}
-
-void Parser::ParseFunction(ParsedFunction* parsed_function) {
-  Thread* thread = parsed_function->thread();
-  ASSERT(thread == Thread::Current());
-  Zone* zone = thread->zone();
-  CSTAT_TIMER_SCOPE(thread, parser_timer);
-  INC_STAT(thread, num_functions_parsed, 1);
-#ifndef PRODUCT
-  VMTagScope tagScope(thread, VMTag::kCompileParseFunctionTagId,
-                      FLAG_profile_vm);
-  TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
-                            "ParseFunction");
-#endif  // !PRODUCT
-  ASSERT(parsed_function != NULL);
-  const Function& func = parsed_function->function();
-  const Script& script = Script::Handle(zone, func.script());
-  Parser parser(script, parsed_function, func.token_pos());
-#ifndef PRODUCT
-  if (tds.enabled()) {
-    tds.SetNumArguments(1);
-    tds.CopyArgument(0, "function", String::Handle(func.name()).ToCString());
-  }
-#endif  // !PRODUCT
-  SequenceNode* node_sequence = NULL;
-
-  switch (func.kind()) {
-    case RawFunction::kImplicitClosureFunction:
-      node_sequence = parser.ParseImplicitClosure(func);
-      break;
-    case RawFunction::kClosureFunction:
-    case RawFunction::kRegularFunction:
-    case RawFunction::kGetterFunction:
-    case RawFunction::kSetterFunction:
-    case RawFunction::kConstructor:
-      // The call to a redirecting factory is redirected.
-      ASSERT(!func.IsRedirectingFactory());
-      if (!func.IsImplicitConstructor()) {
-        parser.SkipFunctionPreamble();
-      }
-      node_sequence = parser.ParseFunc(func, false);
-      break;
-    case RawFunction::kImplicitGetter:
-      ASSERT(!func.is_static());
-      node_sequence = parser.ParseInstanceGetter(func);
-      break;
-    case RawFunction::kImplicitSetter:
-      ASSERT(!func.is_static());
-      node_sequence = parser.ParseInstanceSetter(func);
-      break;
-    case RawFunction::kImplicitStaticFinalGetter:
-      node_sequence = parser.ParseStaticFinalGetter(func);
-      INC_STAT(thread, num_implicit_final_getters, 1);
-      break;
-    case RawFunction::kMethodExtractor:
-      node_sequence = parser.ParseMethodExtractor(func);
-      INC_STAT(thread, num_method_extractors, 1);
-      break;
-    case RawFunction::kNoSuchMethodDispatcher:
-      node_sequence = parser.ParseNoSuchMethodDispatcher(func);
-      break;
-    case RawFunction::kInvokeFieldDispatcher:
-      node_sequence = parser.ParseInvokeFieldDispatcher(func);
-      break;
-    case RawFunction::kIrregexpFunction:
-      UNREACHABLE();  // Irregexp functions have their own parser.
-    default:
-      UNREACHABLE();
-  }
-
-  if (parsed_function->has_expression_temp_var()) {
-    node_sequence->scope()->AddVariable(parsed_function->expression_temp_var());
-  }
-  node_sequence->scope()->AddVariable(parsed_function->current_context_var());
-  if (parsed_function->has_finally_return_temp_var()) {
-    node_sequence->scope()->AddVariable(
-        parsed_function->finally_return_temp_var());
-  }
-  parsed_function->SetNodeSequence(node_sequence);
-
-  // The instantiators may be required at run time for generic type checks or
-  // allocation of generic types.
-  if (parser.IsInstantiatorRequired()) {
-    // In the case of a local function, only set the instantiator if the
-    // receiver (or type arguments parameter of a factory) was captured.
-    LocalVariable* instantiator = NULL;
-    const bool kTestOnly = true;
-    if (parser.current_function().IsInFactoryScope()) {
-      instantiator = parser.LookupTypeArgumentsParameter(node_sequence->scope(),
-                                                         kTestOnly);
-    } else {
-      instantiator = parser.LookupReceiver(node_sequence->scope(), kTestOnly);
-    }
-    if (!parser.current_function().IsLocalFunction() ||
-        ((instantiator != NULL) && instantiator->is_captured())) {
-      parsed_function->set_instantiator(instantiator);
-    }
-  }
-  // ParseFunc has recorded the generic function type arguments variable.
-  ASSERT(!FLAG_reify_generic_functions ||
-         !parser.current_function().IsGeneric() ||
-         (parsed_function->function_type_arguments() != NULL));
-}
-
-RawObject* Parser::ParseMetadata(const Field& meta_data) {
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    Thread* thread = Thread::Current();
-    StackZone stack_zone(thread);
-    Zone* zone = stack_zone.GetZone();
-    const Class& owner_class = Class::Handle(zone, meta_data.Owner());
-    const Script& script = Script::Handle(zone, meta_data.Script());
-    const TokenPosition token_pos = meta_data.token_pos();
-    // Parsing metadata can involve following paths in the parser that are
-    // normally used for expressions and assume current_function is non-null,
-    // so we create a fake function to use as the current_function rather than
-    // scattering special cases throughout the parser.
-    const Function& fake_function = Function::ZoneHandle(
-        zone,
-        Function::New(Symbols::At(), RawFunction::kRegularFunction,
-                      true,   // is_static
-                      false,  // is_const
-                      false,  // is_abstract
-                      false,  // is_external
-                      false,  // is_native
-                      Object::Handle(zone, meta_data.RawOwner()), token_pos));
-    fake_function.set_is_debuggable(false);
-    ParsedFunction* parsed_function = new ParsedFunction(thread, fake_function);
-    Parser parser(script, parsed_function, token_pos);
-    parser.set_current_class(owner_class);
-    parser.OpenFunctionBlock(fake_function);
-
-    RawObject* metadata = parser.EvaluateMetadata();
-    return metadata;
-  } else {
-    Thread* thread = Thread::Current();
-    StackZone stack_zone(thread);
-    Zone* zone = stack_zone.GetZone();
-    Error& error = Error::Handle(zone);
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
-    return error.raw();
-  }
-  UNREACHABLE();
-  return Object::null();
-}
-
-RawArray* Parser::EvaluateMetadata() {
-  CheckToken(Token::kAT, "Metadata character '@' expected");
-  GrowableObjectArray& meta_values =
-      GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld));
-  while (CurrentToken() == Token::kAT) {
-    ConsumeToken();
-    TokenPosition expr_pos = TokenPos();
-    if (!IsIdentifier()) {
-      ExpectIdentifier("identifier expected");
-    }
-    // Reject expressions with deferred library prefix eagerly.
-    Object& obj =
-        Object::Handle(Z, library_.LookupLocalObject(*CurrentLiteral()));
-    if (!obj.IsNull() && obj.IsLibraryPrefix()) {
-      if (LibraryPrefix::Cast(obj).is_deferred_load()) {
-        ReportError("Metadata must be compile-time constant");
-      }
-    }
-    AstNode* expr = NULL;
-    if ((LookaheadToken(1) == Token::kLPAREN) ||
-        ((LookaheadToken(1) == Token::kPERIOD) &&
-         (LookaheadToken(3) == Token::kLPAREN)) ||
-        ((LookaheadToken(1) == Token::kPERIOD) &&
-         (LookaheadToken(3) == Token::kPERIOD) &&
-         (LookaheadToken(5) == Token::kLPAREN))) {
-      expr = ParseNewOperator(Token::kCONST);
-    } else {
-      // Can be x, C.x, or L.C.x.
-      expr = ParsePrimary();  // Consumes x, C or L.C.
-      Class& cls = Class::Handle(Z);
-      if (expr->IsPrimaryNode()) {
-        PrimaryNode* primary_node = expr->AsPrimaryNode();
-        if (primary_node->primary().IsClass()) {
-          // If the primary node referred to a class we are loading a
-          // qualified static field.
-          cls ^= primary_node->primary().raw();
-        } else {
-          ReportError(expr_pos,
-                      "Metadata expressions must refer to a const field "
-                      "or constructor");
-        }
-      }
-      if (CurrentToken() == Token::kPERIOD) {
-        // C.x or L.C.X.
-        if (cls.IsNull()) {
-          ReportError(expr_pos,
-                      "Metadata expressions must refer to a const field "
-                      "or constructor");
-        }
-        ConsumeToken();
-        const TokenPosition ident_pos = TokenPos();
-        String* ident = ExpectIdentifier("identifier expected");
-        const Field& field = Field::Handle(Z, cls.LookupStaticField(*ident));
-        if (field.IsNull()) {
-          ReportError(ident_pos, "Class '%s' has no field '%s'",
-                      cls.ToCString(), ident->ToCString());
-        }
-        if (!field.is_const()) {
-          ReportError(ident_pos, "Field '%s' of class '%s' is not const",
-                      ident->ToCString(), cls.ToCString());
-        }
-        expr = GenerateStaticFieldLookup(field, ident_pos);
-      }
-    }
-    if (expr->EvalConstExpr() == NULL) {
-      ReportError(expr_pos, "expression must be a compile-time constant");
-    }
-    const Instance& val = EvaluateConstExpr(expr_pos, expr);
-    meta_values.Add(val, Heap::kOld);
-  }
-  return Array::MakeFixedLength(meta_values);
-}
-
-SequenceNode* Parser::ParseStaticInitializer() {
-  ExpectIdentifier("field name expected");
-  CheckToken(Token::kASSIGN, "field initializer expected");
-  ConsumeToken();
-  OpenFunctionBlock(parsed_function()->function());
-  TokenPosition expr_pos = TokenPos();
-  AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
-  ReturnNode* ret = new (Z) ReturnNode(expr_pos, expr);
-  current_block_->statements->Add(ret);
-  return CloseBlock();
-}
-
-ParsedFunction* Parser::ParseStaticFieldInitializer(const Field& field) {
-  ASSERT(field.is_static());
-  Thread* thread = Thread::Current();
-  // TODO(koda): Should there be a StackZone here?
-  Zone* zone = thread->zone();
-#ifndef PRODUCT
-  VMTagScope tagScope(thread, VMTag::kCompileParseFunctionTagId,
-                      FLAG_profile_vm);
-  TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
-                            "ParseStaticFieldInitializer");
-#endif  // !PRODUCT
-
-  const String& field_name = String::Handle(zone, field.name());
-  String& init_name = String::Handle(
-      zone, Symbols::FromConcat(thread, Symbols::InitPrefix(), field_name));
-
-  const Script& script = Script::Handle(zone, field.Script());
-  Object& initializer_owner = Object::Handle(field.Owner());
-  initializer_owner = PatchClass::New(Class::Handle(field.Owner()), script);
-
-  const Function& initializer = Function::ZoneHandle(
-      zone, Function::New(init_name, RawFunction::kImplicitStaticFinalGetter,
-                          true,   // static
-                          false,  // !const
-                          false,  // !abstract
-                          false,  // !external
-                          false,  // !native
-                          initializer_owner, field.token_pos()));
-  initializer.set_result_type(AbstractType::Handle(zone, field.type()));
-  // Static initializer functions are hidden from the user.
-  // Since they are only executed once, we avoid inlining them.
-  // After the field is initialized, the compiler can eliminate
-  // the call to the static initializer.
-  initializer.set_is_reflectable(false);
-  initializer.set_is_debuggable(false);
-  initializer.set_is_inlinable(false);
-
-  ParsedFunction* parsed_function = new ParsedFunction(thread, initializer);
-  Parser parser(script, parsed_function, field.token_pos());
-
-  SequenceNode* body = parser.ParseStaticInitializer();
-  parsed_function->SetNodeSequence(body);
-
-  if (parsed_function->has_expression_temp_var()) {
-    body->scope()->AddVariable(parsed_function->expression_temp_var());
-  }
-  body->scope()->AddVariable(parsed_function->current_context_var());
-  if (parsed_function->has_finally_return_temp_var()) {
-    body->scope()->AddVariable(parsed_function->finally_return_temp_var());
-  }
-  // The instantiator is not required in a static expression.
-  ASSERT(!parser.IsInstantiatorRequired());
-
-  return parsed_function;
-}
-
-SequenceNode* Parser::ParseStaticFinalGetter(const Function& func) {
-  TRACE_PARSER("ParseStaticFinalGetter");
-  ASSERT(func.num_fixed_parameters() == 0);  // static.
-  ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
-  OpenFunctionBlock(func);
-  TokenPosition ident_pos = TokenPos();
-  const String& field_name = *ExpectIdentifier("field name expected");
-  const Class& field_class = Class::Handle(Z, func.Owner());
-  const Field& field =
-      Field::ZoneHandle(Z, field_class.LookupStaticField(field_name));
-  ASSERT(!field.IsNull());
-
-  // Static final fields must have an initializer.
-  ExpectToken(Token::kASSIGN);
-
-  const TokenPosition expr_pos = TokenPos();
-  if (field.is_const()) {
-    // We don't want to use ParseConstExpr() here because we don't want
-    // the constant folding code to create, compile and execute a code
-    // fragment to evaluate the expression. Instead, we just make sure
-    // the static const field initializer is a constant expression and
-    // leave the evaluation to the getter function.
-    AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
-    // This getter will only be called once at compile time.
-    if (expr->EvalConstExpr() == NULL) {
-      ReportError(expr_pos, "initializer is not a valid compile-time constant");
-    }
-    ReturnNode* return_node = new ReturnNode(ident_pos, expr);
-    current_block_->statements->Add(return_node);
-  } else {
-    // This getter may be called each time the static field is accessed.
-    // Call runtime support to parse and evaluate the initializer expression.
-    // The runtime function will detect circular dependencies in expressions
-    // and handle errors while evaluating the expression.
-    current_block_->statements->Add(new (Z)
-                                        InitStaticFieldNode(ident_pos, field));
-    ReturnNode* return_node =
-        new ReturnNode(ident_pos, new LoadStaticFieldNode(ident_pos, field));
-    current_block_->statements->Add(return_node);
-  }
-  return CloseBlock();
-}
-
-// Create AstNodes for an implicit instance getter method:
-//   LoadLocalNode 0 ('this');
-//   LoadInstanceFieldNode (field_name);
-//   ReturnNode (field's value);
-SequenceNode* Parser::ParseInstanceGetter(const Function& func) {
-  TRACE_PARSER("ParseInstanceGetter");
-  ParamList params;
-  // func.token_pos() points to the name of the field.
-  const TokenPosition ident_pos = func.token_pos();
-  ASSERT(current_class().raw() == func.Owner());
-  params.AddReceiver(ReceiverType(current_class()), ident_pos);
-  ASSERT(func.num_fixed_parameters() == 1);  // receiver.
-  ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
-
-  // Build local scope for function and populate with the formal parameters.
-  OpenFunctionBlock(func);
-  AddFormalParamsToScope(&params, current_block_->scope);
-
-  // Receiver is local 0.
-  LocalVariable* receiver = current_block_->scope->VariableAt(0);
-  LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver);
-  String& field_name = String::Handle(Z, func.name());
-  field_name = Field::NameFromGetter(field_name);
-
-  const Class& field_class = Class::Handle(Z, func.Owner());
-  const Field& field =
-      Field::ZoneHandle(Z, field_class.LookupInstanceField(field_name));
-  ASSERT(!field.IsNull());
-
-  LoadInstanceFieldNode* load_field =
-      new LoadInstanceFieldNode(ident_pos, load_receiver, field);
-
-  ReturnNode* return_node = new ReturnNode(ST(ident_pos), load_field);
-  current_block_->statements->Add(return_node);
-  return CloseBlock();
-}
-
-// Create AstNodes for an implicit instance setter method:
-//   LoadLocalNode 0 ('this')
-//   LoadLocalNode 1 ('value')
-//   SetInstanceField (field_name);
-//   ReturnNode (void);
-SequenceNode* Parser::ParseInstanceSetter(const Function& func) {
-  TRACE_PARSER("ParseInstanceSetter");
-  // func.token_pos() points to the name of the field.
-  const TokenPosition ident_pos = func.token_pos();
-  const String& field_name = *CurrentLiteral();
-  const Class& field_class = Class::ZoneHandle(Z, func.Owner());
-  const Field& field =
-      Field::ZoneHandle(Z, field_class.LookupInstanceField(field_name));
-  const AbstractType& field_type = AbstractType::ZoneHandle(Z, field.type());
-
-  ParamList params;
-  ASSERT(current_class().raw() == func.Owner());
-  params.AddReceiver(ReceiverType(current_class()), ident_pos);
-  params.AddFinalParameter(ident_pos, &Symbols::Value(), &field_type);
-  ASSERT(func.num_fixed_parameters() == 2);  // receiver, value.
-  ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(Z, func.result_type()).IsVoidType());
-
-  // Build local scope for function and populate with the formal parameters.
-  OpenFunctionBlock(func);
-  AddFormalParamsToScope(&params, current_block_->scope);
-
-  LoadLocalNode* receiver =
-      new LoadLocalNode(ident_pos, current_block_->scope->VariableAt(0));
-  LoadLocalNode* value =
-      new LoadLocalNode(ident_pos, current_block_->scope->VariableAt(1));
-
-  EnsureExpressionTemp();
-  StoreInstanceFieldNode* store_field =
-      new StoreInstanceFieldNode(ident_pos, receiver, field, value,
-                                 /* is_initializer = */ false);
-  current_block_->statements->Add(store_field);
-  current_block_->statements->Add(new ReturnNode(ST(ident_pos)));
-  return CloseBlock();
-}
-
-SequenceNode* Parser::ParseImplicitClosure(const Function& func) {
-  TRACE_PARSER("ParseImplicitClosure");
-  TokenPosition token_pos = func.token_pos();
-
-  OpenFunctionBlock(func);
-
-  if (parsed_function_->has_arg_desc_var() && FunctionLevel() == 0) {
-    EnsureExpressionTemp();
-    current_block_->scope->AddVariable(parsed_function_->arg_desc_var());
-  }
-
-  const Function& parent = Function::Handle(func.parent_function());
-  intptr_t type_args_len = 0;  // Length of type args vector passed to parent.
-  LocalVariable* type_args_var = NULL;
-  if (FLAG_reify_generic_functions) {
-    // The parent function of an implicit closure is the original function, i.e.
-    // non-closurized. It is not an enclosing function in the usual sense of a
-    // parent function. Do not set parent_type_arguments() in parsed_function_.
-    ASSERT(func.IsGeneric() == parent.IsGeneric());
-
-    if (func.IsGeneric()) {
-      type_args_len = func.NumTypeParameters();
-      // Insert function type arguments variable to scope.
-      type_args_var = new (Z) LocalVariable(
-          TokenPosition::kNoSource, TokenPosition::kNoSource,
-          Symbols::FunctionTypeArgumentsVar(), Object::dynamic_type());
-      current_block_->scope->AddVariable(type_args_var);
-      ASSERT(FunctionLevel() == 0);
-      parsed_function_->set_function_type_arguments(type_args_var);
-    }
-  }
-
-  ParamList params;
-  params.AddFinalParameter(token_pos, &Symbols::ClosureParameter(),
-                           &Object::dynamic_type());
-
-  if (parent.IsImplicitSetterFunction()) {
-    const TokenPosition ident_pos = func.token_pos();
-    ASSERT(IsIdentifier());
-    params.AddFinalParameter(ident_pos, &Symbols::Value(),
-                             &Object::dynamic_type());
-    ASSERT(func.num_fixed_parameters() == 2);  // closure, value.
-  } else if (!parent.IsGetterFunction() && !parent.IsImplicitGetterFunction()) {
-    // NOTE: For the `kernel -> flowgraph` we don't use the parser.
-    if (parent.kernel_offset() <= 0) {
-      SkipFunctionPreamble();
-      const bool use_function_type_syntax = false;
-      const bool allow_explicit_default_values = true;
-      const bool evaluate_metadata = false;
-      ParseFormalParameterList(use_function_type_syntax,
-                               allow_explicit_default_values, evaluate_metadata,
-                               &params);
-      FinalizeFormalParameterTypes(&params);
-      SetupDefaultsForOptionalParams(params);
-    }
-  }
-
-  // Populate function scope with the formal parameters.
-  LocalScope* scope = current_block_->scope;
-  AddFormalParamsToScope(&params, scope);
-
-  ArgumentListNode* func_args =
-      new ArgumentListNode(token_pos, type_args_var, type_args_len);
-  if (!func.is_static()) {
-    func_args->Add(LoadReceiver(token_pos));
-  }
-  // Skip implicit parameter at 0.
-  for (intptr_t i = 1; i < func.NumParameters(); ++i) {
-    func_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
-  }
-
-  if (func.HasOptionalNamedParameters()) {
-    // TODO(srdjan): Must allocate array in old space, since it
-    // runs in background compiler. Find a better way.
-    const Array& arg_names =
-        Array::ZoneHandle(Array::New(func.NumOptionalParameters(), Heap::kOld));
-    for (intptr_t i = 0; i < arg_names.Length(); ++i) {
-      intptr_t index = func.num_fixed_parameters() + i;
-      arg_names.SetAt(i, String::Handle(func.ParameterNameAt(index)));
-    }
-    func_args->set_names(arg_names);
-  }
-
-  const String& func_name = String::ZoneHandle(parent.name());
-  const Class& owner = Class::Handle(parent.Owner());
-  Function& target = Function::ZoneHandle(owner.LookupFunction(func_name));
-
-  if (target.raw() != parent.raw()) {
-    NOT_IN_PRODUCT(ASSERT(Isolate::Current()->HasAttemptedReload()));
-    if (target.IsNull() || (target.is_static() != parent.is_static()) ||
-        (target.kind() != parent.kind())) {
-      target = Function::null();
-    }
-  }
-
-  AstNode* call = NULL;
-  // Check the target still exists and has compatible parameters. If not,
-  // throw NSME/call nSM instead of forwarding the call. Note we compare the
-  // parent not func because func has an extra parameter for the closure
-  // receiver.
-  if (!target.IsNull() &&
-      (parent.num_fixed_parameters() == target.num_fixed_parameters())) {
-    call = new StaticCallNode(token_pos, target, func_args,
-                              StaticCallNode::kNoRebind);
-  } else if (!parent.is_static()) {
-    NOT_IN_PRODUCT(ASSERT(Isolate::Current()->HasAttemptedReload()));
-    // If a subsequent reload reintroduces the target in the middle of the
-    // Invocation object being constructed, we won't be able to successfully
-    // deopt because the generated AST will change.
-    func.SetIsOptimizable(false);
-
-    ArgumentListNode* arguments = BuildNoSuchMethodArguments(
-        token_pos, func_name, *func_args, NULL, false);
-    const intptr_t kTypeArgsLen = 0;
-    const intptr_t kNumArguments = 2;  // Receiver, InvocationMirror.
-    ArgumentsDescriptor args_desc(Array::Handle(
-        Z, ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
-    Function& no_such_method =
-        Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass(
-                                    owner, Symbols::NoSuchMethod(), args_desc));
-    if (no_such_method.IsNull()) {
-      // If noSuchMethod(i) is not found, call Object:noSuchMethod.
-      no_such_method ^= Resolver::ResolveDynamicForReceiverClass(
-          Class::Handle(Z, I->object_store()->object_class()),
-          Symbols::NoSuchMethod(), args_desc);
-    }
-    call = new StaticCallNode(token_pos, no_such_method, arguments,
-                              StaticCallNode::kStatic);
-  } else {
-    NOT_IN_PRODUCT(ASSERT(Isolate::Current()->HasAttemptedReload()));
-    // If a subsequent reload reintroduces the target in the middle of the
-    // arguments array being constructed, we won't be able to successfully
-    // deopt because the generated AST will change.
-    func.SetIsOptimizable(false);
-
-    InvocationMirror::Kind im_kind;
-    if (parent.IsImplicitGetterFunction()) {
-      im_kind = InvocationMirror::kGetter;
-    } else if (parent.IsImplicitSetterFunction()) {
-      im_kind = InvocationMirror::kSetter;
-    } else {
-      im_kind = InvocationMirror::kMethod;
-    }
-    call = ThrowNoSuchMethodError(TokenPos(), owner, func_name, func_args,
-                                  InvocationMirror::kStatic, im_kind,
-                                  NULL);  // No existing function.
-  }
-
-  ASSERT(call != NULL);
-  ReturnNode* return_node = new ReturnNode(token_pos, call);
-  current_block_->statements->Add(return_node);
-  return CloseBlock();
-}
-
-SequenceNode* Parser::ParseMethodExtractor(const Function& func) {
-  TRACE_PARSER("ParseMethodExtractor");
-
-  ParamList params;
-
-  const TokenPosition ident_pos = func.token_pos();
-  ASSERT(func.token_pos() == TokenPosition::kMethodExtractor);
-  ASSERT(current_class().raw() == func.Owner());
-  params.AddReceiver(ReceiverType(current_class()), ident_pos);
-  ASSERT(func.num_fixed_parameters() == 1);  // Receiver.
-  ASSERT(!func.HasOptionalParameters());
-
-  // Build local scope for function and populate with the formal parameters.
-  OpenFunctionBlock(func);
-  AddFormalParamsToScope(&params, current_block_->scope);
-
-  // Receiver is local 0.
-  LocalVariable* receiver = current_block_->scope->VariableAt(0);
-  LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver);
-
-  ClosureNode* closure = new ClosureNode(
-      ident_pos, Function::ZoneHandle(Z, func.extracted_method_closure()),
-      load_receiver, NULL);
-
-  ReturnNode* return_node = new ReturnNode(ident_pos, closure);
-  current_block_->statements->Add(return_node);
-  return CloseBlock();
-}
-
-void Parser::BuildDispatcherScope(const Function& func,
-                                  const ArgumentsDescriptor& desc) {
-  ParamList params;
-  // Receiver first.
-  TokenPosition token_pos = func.token_pos();
-  params.AddReceiver(ReceiverType(current_class()), token_pos);
-  // Remaining positional parameters.
-  intptr_t i = 1;
-  for (; i < desc.PositionalCount(); ++i) {
-    ParamDesc p;
-    char name[64];
-    Utils::SNPrint(name, 64, ":p%" Pd, i);
-    p.name = &String::ZoneHandle(Z, Symbols::New(T, name));
-    p.type = &Object::dynamic_type();
-    params.parameters->Add(p);
-    params.num_fixed_parameters++;
-  }
-  ASSERT(desc.PositionalCount() == params.num_fixed_parameters);
-
-  // Named parameters.
-  for (; i < desc.Count(); ++i) {
-    ParamDesc p;
-    intptr_t index = i - desc.PositionalCount();
-    p.name = &String::ZoneHandle(Z, desc.NameAt(index));
-    p.type = &Object::dynamic_type();
-    p.default_value = &Object::null_instance();
-    params.parameters->Add(p);
-    params.num_optional_parameters++;
-    params.has_optional_named_parameters = true;
-  }
-  ASSERT(desc.NamedCount() == params.num_optional_parameters);
-
-  SetupDefaultsForOptionalParams(params);
-
-  // Build local scope for function and populate with the formal parameters.
-  OpenFunctionBlock(func);
-  AddFormalParamsToScope(&params, current_block_->scope);
-
-  if (desc.TypeArgsLen() > 0) {
-    ASSERT(func.IsGeneric() && !func.HasGenericParent());
-    // Insert function type arguments variable to scope.
-    LocalVariable* type_args_var = new (Z) LocalVariable(
-        TokenPosition::kNoSource, TokenPosition::kNoSource,
-        Symbols::FunctionTypeArgumentsVar(), Object::dynamic_type());
-    current_block_->scope->AddVariable(type_args_var);
-    ASSERT(FunctionLevel() == 0);
-    parsed_function_->set_function_type_arguments(type_args_var);
-  }
-
-  if (parsed_function_->has_arg_desc_var() && FunctionLevel() == 0) {
-    EnsureExpressionTemp();
-    current_block_->scope->AddVariable(parsed_function_->arg_desc_var());
-  }
-}
-
-SequenceNode* Parser::ParseNoSuchMethodDispatcher(const Function& func) {
-  TRACE_PARSER("ParseNoSuchMethodDispatcher");
-  ASSERT(FLAG_lazy_dispatchers);
-  ASSERT(func.IsNoSuchMethodDispatcher());
-  TokenPosition token_pos = func.token_pos();
-  ASSERT(func.token_pos() == TokenPosition::kMinSource);
-  ASSERT(current_class().raw() == func.Owner());
-
-  ArgumentsDescriptor desc(Array::Handle(Z, func.saved_args_desc()));
-  ASSERT(desc.Count() > 0);
-
-  // Set up scope for this function.
-  BuildDispatcherScope(func, desc);
-
-  // Receiver is local 0.
-  LocalScope* scope = current_block_->scope;
-  ArgumentListNode* func_args = new ArgumentListNode(
-      token_pos, parsed_function_->function_type_arguments(),
-      desc.TypeArgsLen());
-  for (intptr_t i = 0; i < desc.Count(); ++i) {
-    func_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
-  }
-
-  if (desc.NamedCount() > 0) {
-    const Array& arg_names =
-        Array::ZoneHandle(Z, Array::New(desc.NamedCount(), Heap::kOld));
-    for (intptr_t i = 0; i < arg_names.Length(); ++i) {
-      arg_names.SetAt(i, String::Handle(Z, desc.NameAt(i)));
-    }
-    func_args->set_names(arg_names);
-  }
-
-  const String& func_name = String::ZoneHandle(Z, func.name());
-  ArgumentListNode* arguments =
-      BuildNoSuchMethodArguments(token_pos, func_name, *func_args, NULL, false);
-  const intptr_t kTypeArgsLen = 0;
-  const intptr_t kNumArguments = 2;  // Receiver, InvocationMirror.
-  ArgumentsDescriptor args_desc(
-      Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
-  Function& no_such_method = Function::ZoneHandle(
-      Z,
-      Resolver::ResolveDynamicForReceiverClass(
-          Class::Handle(Z, func.Owner()), Symbols::NoSuchMethod(), args_desc));
-  if (no_such_method.IsNull()) {
-    // If noSuchMethod(i) is not found, call Object:noSuchMethod.
-    no_such_method ^= Resolver::ResolveDynamicForReceiverClass(
-        Class::Handle(Z, I->object_store()->object_class()),
-        Symbols::NoSuchMethod(), args_desc);
-  }
-  StaticCallNode* call = new StaticCallNode(
-      token_pos, no_such_method, arguments, StaticCallNode::kNSMDispatch);
-
-  ReturnNode* return_node = new ReturnNode(token_pos, call);
-  current_block_->statements->Add(return_node);
-  return CloseBlock();
-}
-
-SequenceNode* Parser::ParseInvokeFieldDispatcher(const Function& func) {
-  TRACE_PARSER("ParseInvokeFieldDispatcher");
-  ASSERT(func.IsInvokeFieldDispatcher());
-  TokenPosition token_pos = func.token_pos();
-  ASSERT(func.token_pos() == TokenPosition::kMinSource);
-  ASSERT(current_class().raw() == func.Owner());
-
-  const Array& args_desc = Array::Handle(Z, func.saved_args_desc());
-  ArgumentsDescriptor desc(args_desc);
-  ASSERT(desc.Count() > 0);
-
-  // Set up scope for this function.
-  BuildDispatcherScope(func, desc);
-
-  // Receiver is local 0.
-  LocalScope* scope = current_block_->scope;
-  ArgumentListNode* no_args = new ArgumentListNode(token_pos);
-  LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0));
-
-  const Class& closure_cls =
-      Class::Handle(Isolate::Current()->object_store()->closure_class());
-
-  const Class& owner = Class::Handle(Z, func.Owner());
-  ASSERT(!owner.IsNull());
-  const String& name = String::Handle(Z, func.name());
-  AstNode* function_object = NULL;
-  if (owner.raw() == closure_cls.raw() && name.Equals(Symbols::Call())) {
-    function_object = receiver;
-  } else {
-    const String& getter_name =
-        String::ZoneHandle(Z, Field::GetterSymbol(name));
-    function_object =
-        new (Z) InstanceCallNode(token_pos, receiver, getter_name, no_args);
-  }
-
-  // Pass arguments 1..n to the closure call.
-  ArgumentListNode* args = new (Z)
-      ArgumentListNode(token_pos, parsed_function_->function_type_arguments(),
-                       desc.TypeArgsLen());
-  const Array& names =
-      Array::Handle(Z, Array::New(desc.NamedCount(), Heap::kOld));
-
-  // Positional parameters.
-  intptr_t i = 1;
-  for (; i < desc.PositionalCount(); ++i) {
-    args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
-  }
-  // Named parameters.
-  for (; i < desc.Count(); i++) {
-    args->Add(new (Z) LoadLocalNode(token_pos, scope->VariableAt(i)));
-    intptr_t index = i - desc.PositionalCount();
-    names.SetAt(index, String::Handle(Z, desc.NameAt(index)));
-  }
-  args->set_names(names);
-
-  AstNode* result = NULL;
-  if (owner.raw() == closure_cls.raw() && name.Equals(Symbols::Call())) {
-    result = new ClosureCallNode(token_pos, function_object, args);
-  } else {
-    result = BuildClosureCall(token_pos, function_object, args);
-  }
-
-  ReturnNode* return_node = new ReturnNode(token_pos, result);
-  current_block_->statements->Add(return_node);
-  return CloseBlock();
-}
-
-AstNode* Parser::BuildClosureCall(TokenPosition token_pos,
-                                  AstNode* closure,
-                                  ArgumentListNode* arguments) {
-  return new InstanceCallNode(token_pos, closure, Symbols::Call(), arguments);
-}
-
-void Parser::SkipToMatching() {
-  Token::Kind opening_token = CurrentToken();
-  ASSERT((opening_token == Token::kLBRACE) ||
-         (opening_token == Token::kLPAREN));
-  GrowableArray<Token::Kind> token_stack(8);
-  GrowableArray<TokenPosition> token_pos_stack(8);
-  // Adding the first opening brace here, because it will be consumed
-  // in the loop right away.
-  token_stack.Add(opening_token);
-  const TokenPosition start_pos = TokenPos();
-  TokenPosition opening_pos = start_pos;
-  token_pos_stack.Add(start_pos);
-  bool is_match = true;
-  bool unexpected_token_found = false;
-  Token::Kind token = opening_token;
-  TokenPosition token_pos;
-  do {
-    ConsumeToken();
-    token = CurrentToken();
-    token_pos = TokenPos();
-    switch (token) {
-      case Token::kLBRACE:
-      case Token::kLPAREN:
-      case Token::kLBRACK:
-        token_stack.Add(token);
-        token_pos_stack.Add(token_pos);
-        break;
-      case Token::kRBRACE:
-        opening_token = token_stack.RemoveLast();
-        opening_pos = token_pos_stack.RemoveLast();
-        is_match = opening_token == Token::kLBRACE;
-        break;
-      case Token::kRPAREN:
-        opening_token = token_stack.RemoveLast();
-        opening_pos = token_pos_stack.RemoveLast();
-        is_match = opening_token == Token::kLPAREN;
-        break;
-      case Token::kRBRACK:
-        opening_token = token_stack.RemoveLast();
-        opening_pos = token_pos_stack.RemoveLast();
-        is_match = opening_token == Token::kLBRACK;
-        break;
-      case Token::kEOS:
-        opening_token = token_stack.RemoveLast();
-        opening_pos = token_pos_stack.RemoveLast();
-        unexpected_token_found = true;
-        break;
-      default:
-        // nothing.
-        break;
-    }
-  } while (!token_stack.is_empty() && is_match && !unexpected_token_found);
-  if (!is_match) {
-    const Error& error = Error::Handle(LanguageError::NewFormatted(
-        Error::Handle(), script_, opening_pos, Report::AtLocation,
-        Report::kWarning, allocation_space_, "unbalanced '%s' opens here",
-        Token::Str(opening_token)));
-    ReportErrors(error, script_, token_pos, "unbalanced '%s'",
-                 Token::Str(token));
-  } else if (unexpected_token_found) {
-    ReportError(start_pos, "unterminated '%s'", Token::Str(opening_token));
-  }
-}
-
-void Parser::SkipBlock() {
-  ASSERT(CurrentToken() == Token::kLBRACE);
-  SkipToMatching();
-}
-
-// Skips tokens up to and including matching closing parenthesis.
-void Parser::SkipToMatchingParenthesis() {
-  ASSERT(CurrentToken() == Token::kLPAREN);
-  SkipToMatching();
-  ASSERT(CurrentToken() == Token::kRPAREN);
-  ConsumeToken();
-}
-
-// Parses a parameter type as defined by the 'parameterTypeList' production.
-void Parser::ParseParameterType(ParamList* params) {
-  TRACE_PARSER("ParseParameterType");
-  ParamDesc parameter;
-
-  parameter.has_explicit_type = true;  // The type is required by the syntax.
-  // It is too early to resolve the type here, since it can be a result type
-  // referring to a not yet declared function type parameter.
-  parameter.type = &AbstractType::ZoneHandle(
-      Z, ParseTypeOrFunctionType(true, ClassFinalizer::kDoNotResolve));
-
-  // At this point, we must see an identifier for the parameter name, unless
-  // we are using the function type syntax (in which case the name is optional,
-  // unless we expect optional named parameters).
-  if (IsIdentifier()) {
-    parameter.name_pos = TokenPos();
-    parameter.name = CurrentLiteral();
-    ConsumeToken();
-
-    if (params->has_optional_named_parameters &&
-        (parameter.name->CharAt(0) == Library::kPrivateIdentifierStart)) {
-      ReportError(parameter.name_pos, "named parameter must not be private");
-    }
-
-    // Check for duplicate formal parameters.
-    const intptr_t num_existing_parameters =
-        params->num_fixed_parameters + params->num_optional_parameters;
-    for (intptr_t i = 0; i < num_existing_parameters; i++) {
-      ParamDesc& existing_parameter = (*params->parameters)[i];
-      if (existing_parameter.name->Equals(*parameter.name)) {
-        ReportError(parameter.name_pos, "duplicate formal parameter '%s'",
-                    parameter.name->ToCString());
-      }
-    }
-  } else if (params->has_optional_named_parameters) {
-    ExpectIdentifier("parameter name expected");
-  } else {
-    parameter.name_pos = TokenPos();
-    parameter.name = &Symbols::NotNamed();
-  }
-
-  // The function type syntax does not allow the signature type syntax.
-  // No need to check for IsParameterPart().
-
-  if ((CurrentToken() == Token::kASSIGN) || (CurrentToken() == Token::kCOLON)) {
-    ReportError("parameter must not specify a default value");
-  } else {
-    if (params->has_optional_positional_parameters ||
-        params->has_optional_named_parameters) {
-      // Implicit default value is null.
-      params->num_optional_parameters++;
-      parameter.default_value = &Object::null_instance();
-    } else {
-      params->num_fixed_parameters++;
-      ASSERT(params->num_optional_parameters == 0);
-    }
-  }
-  if (params->implicitly_final) {
-    parameter.is_final = true;
-  }
-  params->parameters->Add(parameter);
-  if (parameter.is_covariant) {
-    params->has_covariant = true;
-  }
-}
-
-// Parses a formal parameter as defined by the 'formalParameterList' production.
-void Parser::ParseFormalParameter(bool allow_explicit_default_value,
-                                  bool evaluate_metadata,
-                                  ParamList* params) {
-  TRACE_PARSER("ParseFormalParameter");
-  ParamDesc parameter;
-  bool var_seen = false;
-  bool final_seen = false;
-  bool this_seen = false;
-
-  if (evaluate_metadata && (CurrentToken() == Token::kAT)) {
-    parameter.metadata = &Array::ZoneHandle(Z, EvaluateMetadata());
-  } else {
-    SkipMetadata();
-  }
-
-  if (CurrentToken() == Token::kCOVARIANT &&
-      (LookaheadToken(1) == Token::kFINAL || LookaheadToken(1) == Token::kVAR ||
-       LookaheadToken(1) == Token::kVOID ||
-       Token::IsIdentifier(LookaheadToken(1)))) {
-    parameter.is_covariant = true;
-    ConsumeToken();
-  }
-  if (CurrentToken() == Token::kFINAL) {
-    ConsumeToken();
-    final_seen = true;
-    parameter.is_final = true;
-  } else if (CurrentToken() == Token::kVAR) {
-    ConsumeToken();
-    var_seen = true;
-    // The parameter type is the 'dynamic' type.
-    // If this is an initializing formal, its type will be set to the type of
-    // the respective field when the constructor is fully parsed.
-    parameter.type = &Object::dynamic_type();
-  }
-  if (CurrentToken() == Token::kTHIS) {
-    ConsumeToken();
-    ExpectToken(Token::kPERIOD);
-    this_seen = true;
-    parameter.is_field_initializer = true;
-    parameter.is_final = true;
-  }
-  if ((parameter.type == NULL) && (CurrentToken() == Token::kVOID)) {
-    ConsumeToken();
-    // This must later be changed to a closure type if we recognize
-    // a closure/function type parameter. We check this at the end
-    // of ParseFormalParameter.
-    parameter.type = &Object::void_type();
-  }
-  if ((parameter.type == NULL) || IsFunctionTypeSymbol()) {
-    // At this point, we must see an identifier for the type or the
-    // function parameter. The identifier may be 'Function'.
-    if (!IsIdentifier()) {
-      ReportError("parameter name or type expected");
-    }
-
-    // Lookahead to determine whether the next tokens are a return type
-    // followed by a parameter name.
-    bool found_type = false;
-    {
-      TokenPosScope saved_pos(this);
-      if (TryParseType(true)) {
-        if (IsIdentifier() || (CurrentToken() == Token::kTHIS)) {
-          found_type = true;
-        }
-      }
-    }
-    if (found_type) {
-      // The types of formal parameters are never ignored, even in unchecked
-      // mode, because they are part of the function type of closurized
-      // functions appearing in type tests with typedefs.
-      parameter.has_explicit_type = true;
-      // It is too early to resolve the type here, since it can be a result
-      // type referring to a not yet declared function type parameter.
-      if (parameter.type == NULL) {
-        parameter.type = &AbstractType::ZoneHandle(
-            Z, ParseTypeOrFunctionType(true, ClassFinalizer::kDoNotResolve));
-      } else {
-        parameter.type = &AbstractType::ZoneHandle(
-            Z,
-            ParseFunctionType(*parameter.type, ClassFinalizer::kDoNotResolve));
-      }
-    } else {
-      // If this is an initializing formal, its type will be set to the type
-      // of the respective field when the constructor is fully parsed.
-      parameter.type = &Object::dynamic_type();
-    }
-  }
-  if (!this_seen && (CurrentToken() == Token::kTHIS)) {
-    ConsumeToken();
-    ExpectToken(Token::kPERIOD);
-    this_seen = true;
-    parameter.is_field_initializer = true;
-    parameter.is_final = true;
-  }
-
-  // At this point, we must see an identifier for the parameter name.
-  parameter.name_pos = TokenPos();
-  parameter.name = ExpectIdentifier("parameter name expected");
-  if (parameter.is_field_initializer) {
-    params->has_field_initializer = true;
-  }
-
-  if (params->has_optional_named_parameters &&
-      (parameter.name->CharAt(0) == Library::kPrivateIdentifierStart)) {
-    ReportError(parameter.name_pos, "named parameter must not be private");
-  }
-
-  // Check for duplicate formal parameters.
-  const intptr_t num_existing_parameters =
-      params->num_fixed_parameters + params->num_optional_parameters;
-  for (intptr_t i = 0; i < num_existing_parameters; i++) {
-    ParamDesc& existing_parameter = (*params->parameters)[i];
-    if (existing_parameter.name->Equals(*parameter.name)) {
-      ReportError(parameter.name_pos, "duplicate formal parameter '%s'",
-                  parameter.name->ToCString());
-    }
-  }
-
-  if (IsParameterPart()) {
-    // This parameter is probably a closure. If we saw the keyword 'var'
-    // or 'final', a closure is not legal here and we ignore the
-    // opening parens.
-    // TODO(hausner): The language spec appears to allow var and final
-    // in signature types when used with initializing formals:
-    // fieldFormalParameter:
-    // metadata finalConstVarOrType? this ‘.’ identifier formalParameterList? ;
-    if (!var_seen && !final_seen) {
-      // The parsed parameter type is actually the function result type.
-      AbstractType& result_type =
-          AbstractType::Handle(Z, parameter.type->raw());
-
-      // In top-level and mixin functions, the source may be in a different
-      // script than the script of the current class. However, we never reparse
-      // signature functions (except typedef signature functions), therefore
-      // we do not need to keep the correct script via a patch class. Use the
-      // actual current class as owner of the signature function.
-      Function& signature_function = Function::Handle(
-          Z,
-          Function::NewSignatureFunction(current_class(), innermost_function(),
-                                         TokenPosition::kNoSource));
-      innermost_function_ = signature_function.raw();
-
-      // Finish parsing the function type parameter.
-      if (CurrentToken() == Token::kLT) {
-        ParseTypeParameters(false);  // Not parameterizing class, but function.
-      }
-
-      ASSERT(CurrentToken() == Token::kLPAREN);
-      ParamList func_params;
-
-      // Add implicit closure object parameter.
-      func_params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(),
-                                    &Object::dynamic_type());
-
-      const bool use_function_type_syntax = false;
-      const bool allow_explicit_default_values = false;
-      const bool evaluate_metadata = false;
-      ParseFormalParameterList(use_function_type_syntax,
-                               allow_explicit_default_values, evaluate_metadata,
-                               &func_params);
-
-      signature_function.set_result_type(result_type);
-      // The result type may refer to the signature function's type parameters,
-      // but was not parsed in the scope of the signature function. Adjust.
-      result_type.SetScopeFunction(signature_function);
-      AddFormalParamsToFunction(&func_params, signature_function);
-
-      ASSERT(innermost_function().raw() == signature_function.raw());
-      innermost_function_ = signature_function.parent_function();
-
-      Type& signature_type =
-          Type::ZoneHandle(Z, signature_function.SignatureType());
-
-      // A signature type itself cannot be malformed or malbounded, only its
-      // signature function's result type or parameter types may be.
-      ASSERT(!signature_type.IsMalformed());
-      ASSERT(!signature_type.IsMalbounded());
-      // The type of the parameter is now the signature type.
-      parameter.type = &signature_type;
-    }
-  }
-
-  if ((CurrentToken() == Token::kASSIGN) || (CurrentToken() == Token::kCOLON)) {
-    if ((!params->has_optional_positional_parameters &&
-         !params->has_optional_named_parameters) ||
-        !allow_explicit_default_value) {
-      ReportError("parameter must not specify a default value");
-    }
-    if (params->has_optional_positional_parameters) {
-      ExpectToken(Token::kASSIGN);
-    } else {
-      ConsumeToken();
-    }
-    params->num_optional_parameters++;
-    params->has_explicit_default_values = true;  // Also if explicitly NULL.
-    if (is_top_level_) {
-      // Skip default value parsing.
-      SkipExpr();
-    } else {
-      const Instance& const_value = ParseConstExpr()->literal();
-      parameter.default_value = &const_value;
-    }
-  } else {
-    if (params->has_optional_positional_parameters ||
-        params->has_optional_named_parameters) {
-      // Implicit default value is null.
-      params->num_optional_parameters++;
-      parameter.default_value = &Object::null_instance();
-    } else {
-      params->num_fixed_parameters++;
-      ASSERT(params->num_optional_parameters == 0);
-    }
-  }
-  if (params->implicitly_final) {
-    parameter.is_final = true;
-  }
-  params->parameters->Add(parameter);
-  if (parameter.is_covariant) {
-    params->has_covariant = true;
-  }
-}
-
-// Parses a sequence of normal or optional formal parameters.
-void Parser::ParseFormalParameters(bool use_function_type_syntax,
-                                   bool allow_explicit_default_values,
-                                   bool evaluate_metadata,
-                                   ParamList* params) {
-  TRACE_PARSER("ParseFormalParameters");
-  // Optional parameter lists cannot be empty.
-  // The completely empty parameter list is handled before getting here.
-  bool has_seen_parameter = false;
-  do {
-    ConsumeToken();
-    if (!params->has_optional_positional_parameters &&
-        !params->has_optional_named_parameters &&
-        (CurrentToken() == Token::kLBRACK)) {
-      // End of normal parameters, start of optional positional parameters.
-      params->has_optional_positional_parameters = true;
-      return;
-    }
-    if (!params->has_optional_positional_parameters &&
-        !params->has_optional_named_parameters &&
-        (CurrentToken() == Token::kLBRACE)) {
-      // End of normal parameters, start of optional named parameters.
-      params->has_optional_named_parameters = true;
-      return;
-    }
-    Token::Kind terminator = params->has_optional_positional_parameters
-                                 ? Token::kRBRACK
-                                 : params->has_optional_named_parameters
-                                       ? Token::kRBRACE
-                                       : Token::kRPAREN;
-    if (has_seen_parameter && CurrentToken() == terminator) {
-      // Allow a trailing comma.
-      break;
-    }
-    if (use_function_type_syntax) {
-      ASSERT(!allow_explicit_default_values && !evaluate_metadata);
-      ParseParameterType(params);
-    } else {
-      ParseFormalParameter(allow_explicit_default_values, evaluate_metadata,
-                           params);
-    }
-    has_seen_parameter = true;
-  } while (CurrentToken() == Token::kCOMMA);
-}
-
-void Parser::ParseFormalParameterList(bool use_function_type_syntax,
-                                      bool allow_explicit_default_values,
-                                      bool evaluate_metadata,
-                                      ParamList* params) {
-  TRACE_PARSER("ParseFormalParameterList");
-  ASSERT(CurrentToken() == Token::kLPAREN);
-
-  if (LookaheadToken(1) != Token::kRPAREN) {
-    // Parse fixed parameters.
-    ParseFormalParameters(use_function_type_syntax,
-                          allow_explicit_default_values, evaluate_metadata,
-                          params);
-    if (params->has_optional_positional_parameters ||
-        params->has_optional_named_parameters) {
-      // Parse optional parameters.
-      ParseFormalParameters(use_function_type_syntax,
-                            allow_explicit_default_values, evaluate_metadata,
-                            params);
-      if (params->has_optional_positional_parameters) {
-        CheckToken(Token::kRBRACK, "',' or ']' expected");
-      } else {
-        CheckToken(Token::kRBRACE, "',' or '}' expected");
-      }
-      ConsumeToken();  // ']' or '}'.
-    }
-    if ((CurrentToken() != Token::kRPAREN) &&
-        !params->has_optional_positional_parameters &&
-        !params->has_optional_named_parameters) {
-      ReportError("',' or ')' expected");
-    }
-  } else {
-    ConsumeToken();
-  }
-  ExpectToken(Token::kRPAREN);
-}
-
-String& Parser::ParseNativeDeclaration() {
-  TRACE_PARSER("ParseNativeDeclaration");
-  ASSERT(IsSymbol(Symbols::Native()));
-  ConsumeToken();
-  CheckToken(Token::kSTRING, "string literal expected");
-  String& native_name = *CurrentLiteral();
-  ConsumeToken();
-  return native_name;
-}
-
-// Resolve and return the dynamic function of the given name in the superclass.
-// If it is not found, and resolve_getter is true, try to resolve a getter of
-// the same name. If it is still not found, return noSuchMethod and
-// set is_no_such_method to true..
-RawFunction* Parser::GetSuperFunction(TokenPosition token_pos,
-                                      const String& name,
-                                      ArgumentListNode* arguments,
-                                      bool resolve_getter,
-                                      bool* is_no_such_method) {
-  const Class& super_class = Class::Handle(Z, current_class().SuperClass());
-  if (super_class.IsNull()) {
-    ReportError(token_pos, "class '%s' does not have a superclass",
-                String::Handle(Z, current_class().Name()).ToCString());
-  }
-  Function& super_func = Function::Handle(
-      Z, Resolver::ResolveDynamicAnyArgs(Z, super_class, name));
-  if (!super_func.IsNull() &&
-      !super_func.AreValidArguments(arguments->type_args_len(),
-                                    arguments->length(), arguments->names(),
-                                    NULL)) {
-    super_func = Function::null();
-  } else if (super_func.IsNull() && resolve_getter) {
-    const String& getter_name =
-        String::ZoneHandle(Z, Field::LookupGetterSymbol(name));
-    if (!getter_name.IsNull()) {
-      super_func = Resolver::ResolveDynamicAnyArgs(Z, super_class, getter_name);
-      ASSERT(super_func.IsNull() ||
-             (super_func.kind() != RawFunction::kImplicitStaticFinalGetter));
-    }
-  }
-  if (super_func.IsNull()) {
-    super_func = Resolver::ResolveDynamicAnyArgs(Z, super_class,
-                                                 Symbols::NoSuchMethod());
-    ASSERT(!super_func.IsNull());
-    *is_no_such_method = true;
-  } else {
-    *is_no_such_method = false;
-  }
-  return super_func.raw();
-}
-
-StaticCallNode* Parser::BuildInvocationMirrorAllocation(
-    TokenPosition call_pos,
-    const String& function_name,
-    const ArgumentListNode& function_args,
-    const LocalVariable* temp_for_last_arg,
-    bool is_super_invocation) {
-  const TokenPosition args_pos = function_args.token_pos();
-  // Build arguments to the call to the static
-  // InvocationMirror._allocateInvocationMirror method.
-  ArgumentListNode* arguments = new ArgumentListNode(args_pos);
-  // The first argument is the original function name.
-  arguments->Add(new LiteralNode(args_pos, function_name));
-  // The second argument is the arguments descriptor of the original function.
-  const Array& args_descriptor = Array::ZoneHandle(
-      ArgumentsDescriptor::New(function_args.type_args_len(),
-                               function_args.length(), function_args.names()));
-  arguments->Add(new LiteralNode(args_pos, args_descriptor));
-  // The third argument is an array containing the original function arguments,
-  // including the function type arguments and the receiver.
-  ArrayNode* args_array =
-      new ArrayNode(args_pos, Type::ZoneHandle(Type::ArrayType()));
-  // A type_args_var is allocated in the generated body of an implicit
-  // closure and in the generated body of a noSuchMethodDispatcher.
-  // Pass the type arguments to the invocation mirror as the first argument.
-  if (function_args.type_args_var() != NULL) {
-    ASSERT(function_args.type_arguments().IsNull());
-    args_array->AddElement(
-        new LoadLocalNode(args_pos, function_args.type_args_var()));
-  } else if (!function_args.type_arguments().IsNull()) {
-    args_array->AddElement(
-        new LiteralNode(args_pos, function_args.type_arguments()));
-  }
-  for (intptr_t i = 0; i < function_args.length(); i++) {
-    AstNode* arg = function_args.NodeAt(i);
-    if ((temp_for_last_arg != NULL) && (i == function_args.length() - 1)) {
-      LetNode* store_arg = new LetNode(arg->token_pos());
-      store_arg->AddNode(
-          new StoreLocalNode(arg->token_pos(), temp_for_last_arg, arg));
-      store_arg->AddNode(
-          new LoadLocalNode(arg->token_pos(), temp_for_last_arg));
-      args_array->AddElement(store_arg);
-    } else {
-      args_array->AddElement(arg);
-    }
-  }
-  arguments->Add(args_array);
-  arguments->Add(new LiteralNode(args_pos, Bool::Get(is_super_invocation)));
-  // Lookup the static InvocationMirror._allocateInvocationMirror method.
-  const Class& mirror_class =
-      Class::Handle(Library::LookupCoreClass(Symbols::InvocationMirror()));
-  ASSERT(!mirror_class.IsNull());
-  const Function& allocation_function =
-      Function::ZoneHandle(mirror_class.LookupStaticFunction(
-          Library::PrivateCoreLibName(Symbols::AllocateInvocationMirror())));
-  ASSERT(!allocation_function.IsNull());
-  return new StaticCallNode(call_pos, allocation_function, arguments,
-                            StaticCallNode::kStatic);
-}
-
-ArgumentListNode* Parser::BuildNoSuchMethodArguments(
-    TokenPosition call_pos,
-    const String& function_name,
-    const ArgumentListNode& function_args,
-    const LocalVariable* temp_for_last_arg,
-    bool is_super_invocation) {
-  ASSERT(function_args.length() >= 1);  // The receiver is the first argument.
-  const TokenPosition args_pos = function_args.token_pos();
-  ArgumentListNode* arguments = new ArgumentListNode(args_pos);
-  arguments->Add(function_args.NodeAt(0));
-  // The second argument is the invocation mirror.
-  arguments->Add(
-      BuildInvocationMirrorAllocation(call_pos, function_name, function_args,
-                                      temp_for_last_arg, is_super_invocation));
-  return arguments;
-}
-
-AstNode* Parser::ParseSuperCall(const String& function_name,
-                                const TypeArguments& func_type_args) {
-  TRACE_PARSER("ParseSuperCall");
-  ASSERT(CurrentToken() == Token::kLPAREN);
-  const TokenPosition supercall_pos = TokenPos();
-
-  // 'this' parameter is the first argument to super call (after the type args).
-  ArgumentListNode* arguments =
-      new ArgumentListNode(supercall_pos, func_type_args);
-  AstNode* receiver = LoadReceiver(supercall_pos);
-  arguments->Add(receiver);
-  ParseActualParameters(arguments, Object::null_type_arguments(), kAllowConst);
-
-  const bool kResolveGetter = true;
-  bool is_no_such_method = false;
-  const Function& super_function = Function::ZoneHandle(
-      Z, GetSuperFunction(supercall_pos, function_name, arguments,
-                          kResolveGetter, &is_no_such_method));
-  if (super_function.IsGetterFunction() ||
-      super_function.IsImplicitGetterFunction()) {
-    const Class& super_class =
-        Class::ZoneHandle(Z, current_class().SuperClass());
-    AstNode* closure = new StaticGetterNode(
-        supercall_pos, LoadReceiver(supercall_pos), super_class, function_name,
-        StaticGetterSetter::kSuper);
-    // 'this' is not passed as parameter to the closure.
-    ArgumentListNode* closure_arguments =
-        new ArgumentListNode(supercall_pos, func_type_args);
-    for (int i = 1; i < arguments->length(); i++) {
-      closure_arguments->Add(arguments->NodeAt(i));
-    }
-    return BuildClosureCall(supercall_pos, closure, closure_arguments);
-  }
-  if (is_no_such_method) {
-    arguments = BuildNoSuchMethodArguments(supercall_pos, function_name,
-                                           *arguments, NULL, true);
-  }
-  return new StaticCallNode(supercall_pos, super_function, arguments,
-                            StaticCallNode::kSuper);
-}
-
-// Simple test if a node is side effect free.
-static bool IsSimpleLocalOrLiteralNode(AstNode* node) {
-  return node->IsLiteralNode() || node->IsLoadLocalNode();
-}
-
-AstNode* Parser::BuildUnarySuperOperator(Token::Kind op, PrimaryNode* super) {
-  ASSERT(super->IsSuper());
-  AstNode* super_op = NULL;
-  const TokenPosition super_pos = super->token_pos();
-  if ((op == Token::kNEGATE) || (op == Token::kBIT_NOT)) {
-    // Resolve the operator function in the superclass.
-    const String& operator_function_name = Symbols::Token(op);
-    ArgumentListNode* op_arguments = new ArgumentListNode(super_pos);
-    AstNode* receiver = LoadReceiver(super_pos);
-    op_arguments->Add(receiver);
-    const bool kResolveGetter = false;
-    bool is_no_such_method = false;
-    const Function& super_operator = Function::ZoneHandle(
-        Z, GetSuperFunction(super_pos, operator_function_name, op_arguments,
-                            kResolveGetter, &is_no_such_method));
-    if (is_no_such_method) {
-      op_arguments = BuildNoSuchMethodArguments(
-          super_pos, operator_function_name, *op_arguments, NULL, true);
-    }
-    super_op = new StaticCallNode(super_pos, super_operator, op_arguments,
-                                  StaticCallNode::kSuper);
-  } else {
-    ReportError(super_pos, "illegal super operator call");
-  }
-  return super_op;
-}
-
-AstNode* Parser::ParseSuperOperator() {
-  TRACE_PARSER("ParseSuperOperator");
-  AstNode* super_op = NULL;
-  const TokenPosition operator_pos = TokenPos();
-
-  if (CurrentToken() == Token::kLBRACK) {
-    ConsumeToken();
-    AstNode* index_expr = ParseExpr(kAllowConst, kConsumeCascades);
-    ExpectToken(Token::kRBRACK);
-    AstNode* receiver = LoadReceiver(operator_pos);
-    const Class& super_class =
-        Class::ZoneHandle(Z, current_class().SuperClass());
-    ASSERT(!super_class.IsNull());
-    super_op =
-        new LoadIndexedNode(operator_pos, receiver, index_expr, super_class);
-  } else {
-    ASSERT(Token::CanBeOverloaded(CurrentToken()) ||
-           (CurrentToken() == Token::kNE));
-    Token::Kind op = CurrentToken();
-    ConsumeToken();
-
-    bool negate_result = false;
-    if (op == Token::kNE) {
-      op = Token::kEQ;
-      negate_result = true;
-    }
-
-    ASSERT(Token::Precedence(op) >= Token::Precedence(Token::kEQ));
-    AstNode* other_operand = ParseBinaryExpr(Token::Precedence(op) + 1);
-
-    ArgumentListNode* op_arguments = new ArgumentListNode(operator_pos);
-    AstNode* receiver = LoadReceiver(operator_pos);
-    op_arguments->Add(receiver);
-    op_arguments->Add(other_operand);
-
-    // Resolve the operator function in the superclass.
-    const String& operator_function_name = Symbols::Token(op);
-    const bool kResolveGetter = false;
-    bool is_no_such_method = false;
-    const Function& super_operator = Function::ZoneHandle(
-        Z, GetSuperFunction(operator_pos, operator_function_name, op_arguments,
-                            kResolveGetter, &is_no_such_method));
-    if (is_no_such_method) {
-      op_arguments = BuildNoSuchMethodArguments(
-          operator_pos, operator_function_name, *op_arguments, NULL, true);
-    }
-    super_op = new StaticCallNode(operator_pos, super_operator, op_arguments,
-                                  StaticCallNode::kSuper);
-    if (negate_result) {
-      super_op = new UnaryOpNode(operator_pos, Token::kNOT, super_op);
-    }
-  }
-  return super_op;
-}
-
-ClosureNode* Parser::CreateImplicitClosureNode(const Function& func,
-                                               TokenPosition token_pos,
-                                               AstNode* receiver) {
-  Function& implicit_closure_function =
-      Function::ZoneHandle(Z, func.ImplicitClosureFunction());
-  return new ClosureNode(token_pos, implicit_closure_function, receiver, NULL);
-}
-
-AstNode* Parser::ParseSuperFieldAccess(const String& field_name,
-                                       TokenPosition field_pos) {
-  TRACE_PARSER("ParseSuperFieldAccess");
-  const Class& super_class = Class::ZoneHandle(Z, current_class().SuperClass());
-  if (super_class.IsNull()) {
-    ReportError("class '%s' does not have a superclass",
-                String::Handle(Z, current_class().Name()).ToCString());
-  }
-  AstNode* implicit_argument = LoadReceiver(field_pos);
-
-  const String& getter_name =
-      String::ZoneHandle(Z, Field::LookupGetterSymbol(field_name));
-  Function& super_getter = Function::ZoneHandle(Z);
-  if (!getter_name.IsNull()) {
-    super_getter = Resolver::ResolveDynamicAnyArgs(Z, super_class, getter_name);
-  }
-  if (super_getter.IsNull()) {
-    const String& setter_name =
-        String::ZoneHandle(Z, Field::LookupSetterSymbol(field_name));
-    Function& super_setter = Function::ZoneHandle(Z);
-    if (!setter_name.IsNull()) {
-      super_setter =
-          Resolver::ResolveDynamicAnyArgs(Z, super_class, setter_name);
-    }
-    if (super_setter.IsNull()) {
-      // Check if this is an access to an implicit closure using 'super'.
-      // If a function exists of the specified field_name then try
-      // accessing it as a getter, at runtime we will handle this by
-      // creating an implicit closure of the function and returning it.
-      const Function& super_function = Function::ZoneHandle(
-          Z, Resolver::ResolveDynamicAnyArgs(Z, super_class, field_name));
-      if (!super_function.IsNull()) {
-        // In case CreateAssignmentNode is called later on this
-        // CreateImplicitClosureNode, it will be replaced by a StaticSetterNode.
-        return CreateImplicitClosureNode(super_function, field_pos,
-                                         implicit_argument);
-      }
-      // No function or field exists of the specified field_name.
-      // Emit a StaticGetterNode anyway, so that noSuchMethod gets called.
-    }
-  }
-  return new (Z) StaticGetterNode(field_pos, implicit_argument, super_class,
-                                  field_name, StaticGetterSetter::kSuper);
-}
-
-StaticCallNode* Parser::GenerateSuperConstructorCall(
-    const Class& cls,
-    TokenPosition supercall_pos,
-    LocalVariable* receiver,
-    ArgumentListNode* forwarding_args) {
-  const Class& super_class = Class::Handle(Z, cls.SuperClass());
-  // Omit the implicit super() if there is no super class (i.e.
-  // we're not compiling class Object), or if the super class is an
-  // artificially generated "wrapper class" that has no constructor.
-  if (super_class.IsNull() ||
-      (super_class.num_native_fields() > 0 &&
-       Class::Handle(Z, super_class.SuperClass()).IsObjectClass())) {
-    return NULL;
-  }
-  String& super_ctor_name = String::Handle(Z, super_class.Name());
-  super_ctor_name = Symbols::FromDot(T, super_ctor_name);
-
-  ArgumentListNode* arguments = new ArgumentListNode(supercall_pos);
-  // Implicit 'this' parameter is the first argument.
-  AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver);
-  arguments->Add(implicit_argument);
-
-  // If this is a super call in a forwarding constructor, add the user-
-  // defined arguments to the super call and adjust the super
-  // constructor name to the respective named constructor if necessary.
-  if (forwarding_args != NULL) {
-    for (int i = 0; i < forwarding_args->length(); i++) {
-      arguments->Add(forwarding_args->NodeAt(i));
-    }
-    String& ctor_name = String::Handle(Z, current_function().name());
-    String& class_name = String::Handle(Z, cls.Name());
-    if (ctor_name.Length() > class_name.Length() + 1) {
-      // Generating a forwarding call to a named constructor 'C.n'.
-      // Add the constructor name 'n' to the super constructor.
-      const intptr_t kLen = class_name.Length() + 1;
-      ctor_name = Symbols::New(T, ctor_name, kLen, ctor_name.Length() - kLen);
-      super_ctor_name = Symbols::FromConcat(T, super_ctor_name, ctor_name);
-    }
-  }
-
-  // Resolve super constructor function and check arguments.
-  const Function& super_ctor =
-      Function::ZoneHandle(Z, super_class.LookupConstructor(super_ctor_name));
-  if (super_ctor.IsNull()) {
-    if (super_class.LookupFactory(super_ctor_name) != Function::null()) {
-      ReportError(supercall_pos,
-                  "illegal implicit call to factory '%s()' in super class",
-                  String::Handle(Z, super_class.Name()).ToCString());
-    }
-    ReportError(supercall_pos,
-                "unresolved implicit call to super constructor '%s()'",
-                String::Handle(Z, super_class.Name()).ToCString());
-  }
-  if (current_function().is_const() && !super_ctor.is_const()) {
-    ReportError(supercall_pos, "implicit call to non-const super constructor");
-  }
-
-  String& error_message = String::Handle(Z);
-  if (!super_ctor.AreValidArguments(arguments->type_args_len(),
-                                    arguments->length(), arguments->names(),
-                                    &error_message)) {
-    ReportError(supercall_pos,
-                "invalid arguments passed to super constructor '%s()': %s",
-                String::Handle(Z, super_class.Name()).ToCString(),
-                error_message.ToCString());
-  }
-  return new StaticCallNode(supercall_pos, super_ctor, arguments,
-                            StaticCallNode::kSuper);
-}
-
-StaticCallNode* Parser::ParseSuperInitializer(const Class& cls,
-                                              LocalVariable* receiver) {
-  TRACE_PARSER("ParseSuperInitializer");
-  ASSERT(CurrentToken() == Token::kSUPER);
-  const TokenPosition supercall_pos = TokenPos();
-  ConsumeToken();
-  const Class& super_class = Class::Handle(Z, cls.SuperClass());
-  ASSERT(!super_class.IsNull());
-  String& ctor_name = String::Handle(Z, super_class.Name());
-  ctor_name = Symbols::FromConcat(T, ctor_name, Symbols::Dot());
-  if (CurrentToken() == Token::kPERIOD) {
-    ConsumeToken();
-    ctor_name = Symbols::FromConcat(
-        T, ctor_name, *ExpectIdentifier("constructor name expected"));
-  }
-  CheckToken(Token::kLPAREN, "parameter list expected");
-
-  ArgumentListNode* arguments = new ArgumentListNode(supercall_pos);
-  // 'this' parameter is the first argument to super class constructor.
-  AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver);
-  arguments->Add(implicit_argument);
-
-  // 'this' parameter must not be accessible to the other super call arguments.
-  receiver->set_invisible(true);
-  ParseActualParameters(arguments, Object::null_type_arguments(), kAllowConst);
-  receiver->set_invisible(false);
-
-  // Resolve the constructor.
-  const Function& super_ctor =
-      Function::ZoneHandle(Z, super_class.LookupConstructor(ctor_name));
-  if (super_ctor.IsNull()) {
-    if (super_class.LookupFactory(ctor_name) != Function::null()) {
-      ReportError(supercall_pos,
-                  "super class constructor '%s' "
-                  "must not be a factory constructor",
-                  ctor_name.ToCString());
-    }
-    ReportError(supercall_pos, "super class constructor '%s' not found",
-                ctor_name.ToCString());
-  }
-  if (current_function().is_const() && !super_ctor.is_const()) {
-    ReportError(supercall_pos, "super constructor must be const");
-  }
-  String& error_message = String::Handle(Z);
-  if (!super_ctor.AreValidArguments(arguments->type_args_len(),
-                                    arguments->length(), arguments->names(),
-                                    &error_message)) {
-    ReportError(supercall_pos,
-                "invalid arguments passed to super class constructor '%s': %s",
-                ctor_name.ToCString(), error_message.ToCString());
-  }
-  if (current_function().is_const()) {
-    // No need to check that the type arguments to the super const contructor
-    // are instantiated, because generic constructors are not supported.
-    ASSERT(arguments->type_args_len() == 0);
-
-    // All arguments to the super const constructor must be potentially const.
-    for (intptr_t i = 0; i < arguments->length(); i++) {
-      AstNode* argument = arguments->NodeAt(i);
-      if (!argument->IsPotentiallyConst()) {
-        ReportError(
-            argument->token_pos(),
-            "super initializer argument must be compile time constant.");
-      }
-      if (argument->EvalConstExpr() != NULL) {
-        // If the expression is a compile-time constant, ensure that it
-        // is evaluated and canonicalized. See issues 27164 and 31106.
-        argument = FoldConstExpr(argument->token_pos(), argument);
-        arguments->SetNodeAt(i, argument);
-      }
-    }
-  }
-  return new StaticCallNode(supercall_pos, super_ctor, arguments,
-                            StaticCallNode::kSuper);
-}
-
-AstNode* Parser::ParseInitializer(const Class& cls,
-                                  LocalVariable* receiver,
-                                  GrowableArray<Field*>* initialized_fields) {
-  TRACE_PARSER("ParseInitializer");
-  const TokenPosition field_pos = TokenPos();
-  if (CurrentToken() == Token::kASSERT) {
-    // Function literals are allowed in assertion initializer.
-    // "this" must not be accessible in assertion initializer.
-    receiver->set_invisible(true);
-    AstNode* init_assert = ParseAssertStatement(current_function().is_const());
-    receiver->set_invisible(false);
-    return init_assert;
-  }
-  if (CurrentToken() == Token::kTHIS) {
-    ConsumeToken();
-    ExpectToken(Token::kPERIOD);
-  }
-  const String& field_name = *ExpectIdentifier("field name expected");
-  ExpectToken(Token::kASSIGN);
-
-  TokenPosition expr_pos = TokenPos();
-  const bool saved_mode = SetAllowFunctionLiterals(false);
-  // "this" must not be accessible in initializer expressions.
-  receiver->set_invisible(true);
-  AstNode* init_expr = ParseConditionalExpr();
-  if (CurrentToken() == Token::kCASCADE) {
-    init_expr = ParseCascades(init_expr);
-  }
-  receiver->set_invisible(false);
-  SetAllowFunctionLiterals(saved_mode);
-  if (current_function().is_const()) {
-    if (!init_expr->IsPotentiallyConst()) {
-      ReportError(expr_pos,
-                  "initializer expression must be compile time constant.");
-    }
-    if (init_expr->EvalConstExpr() != NULL) {
-      // If the expression is a compile-time constant, ensure that it
-      // is evaluated and canonicalized. See issue 27164.
-      init_expr = FoldConstExpr(expr_pos, init_expr);
-    }
-  }
-  Field& field = Field::ZoneHandle(Z, cls.LookupInstanceField(field_name));
-  if (field.IsNull()) {
-    ReportError(field_pos, "unresolved reference to instance field '%s'",
-                field_name.ToCString());
-  }
-  EnsureExpressionTemp();
-  AstNode* instance = new (Z) LoadLocalNode(field_pos, receiver);
-  AstNode* initializer = CheckDuplicateFieldInit(field_pos, initialized_fields,
-                                                 instance, &field, init_expr);
-  if (initializer == NULL) {
-    initializer =
-        new (Z) StoreInstanceFieldNode(field_pos, instance, field, init_expr,
-                                       /* is_initializer = */ true);
-  }
-  return initializer;
-}
-
-void Parser::CheckFieldsInitialized(const Class& cls) {
-  const Array& fields = Array::Handle(Z, cls.fields());
-  Field& field = Field::Handle(Z);
-  SequenceNode* initializers = current_block_->statements;
-  for (int field_num = 0; field_num < fields.Length(); field_num++) {
-    field ^= fields.At(field_num);
-    if (field.is_static()) {
-      continue;
-    }
-
-    bool found = false;
-    for (int i = 0; i < initializers->length(); i++) {
-      found = false;
-      if (initializers->NodeAt(i)->IsStoreInstanceFieldNode()) {
-        StoreInstanceFieldNode* initializer =
-            initializers->NodeAt(i)->AsStoreInstanceFieldNode();
-        ASSERT(field.IsOriginal());
-        if (initializer->field().Original() == field.raw()) {
-          found = true;
-          break;
-        }
-      }
-    }
-
-    if (found) continue;
-
-    field.RecordStore(Object::null_object());
-  }
-}
-
-AstNode* Parser::ParseExternalInitializedField(const Field& field) {
-  // Only use this function if the initialized field originates
-  // from a different class. We need to save and restore the
-  // library and token stream (script).
-  // The current_class remains unchanged, so that type arguments
-  // are resolved in the correct scope class.
-  ASSERT(current_class().raw() != field.Origin());
-  const Library& saved_library = Library::Handle(Z, library().raw());
-  const Script& saved_script = Script::Handle(Z, script().raw());
-  const TokenPosition saved_token_pos = TokenPos();
-
-  const Class& origin_class = Class::Handle(Z, field.Origin());
-  set_library(Library::Handle(Z, origin_class.library()));
-  SetScript(Script::Handle(Z, origin_class.script()), field.token_pos());
-
-  ASSERT(IsIdentifier());
-  ConsumeToken();
-  ExpectToken(Token::kASSIGN);
-  AstNode* init_expr = NULL;
-  TokenPosition expr_pos = TokenPos();
-  if (field.is_const()) {
-    init_expr = ParseConstExpr();
-  } else {
-    init_expr = ParseExpr(kAllowConst, kConsumeCascades);
-    if (init_expr->EvalConstExpr() != NULL) {
-      init_expr = FoldConstExpr(expr_pos, init_expr);
-    }
-  }
-  set_library(saved_library);
-  SetScript(saved_script, saved_token_pos);
-  return init_expr;
-}
-
-void Parser::ParseInitializedInstanceFields(
-    const Class& cls,
-    LocalVariable* receiver,
-    GrowableArray<Field*>* initialized_fields) {
-  TRACE_PARSER("ParseInitializedInstanceFields");
-  const Array& fields = Array::Handle(Z, cls.fields());
-  Field& f = Field::Handle(Z);
-  const TokenPosition saved_pos = TokenPos();
-  for (int i = 0; i < fields.Length(); i++) {
-    f ^= fields.At(i);
-    if (!f.is_static() && f.has_initializer()) {
-      Field& field = Field::ZoneHandle(Z);
-      field ^= fields.At(i);
-      if (field.is_final()) {
-        // Final fields with initializer expression may not be initialized
-        // again by constructors. Remember that this field is already
-        // initialized.
-        initialized_fields->Add(&field);
-      }
-      AstNode* init_expr = NULL;
-      if (current_class().raw() != field.Origin()) {
-        init_expr = ParseExternalInitializedField(field);
-      } else {
-        SetPosition(field.token_pos());
-        ASSERT(IsIdentifier());
-        ConsumeToken();
-        ExpectToken(Token::kASSIGN);
-        if (current_class().is_const()) {
-          // If the class has a const contructor, the initializer
-          // expression must be a compile-time constant.
-          init_expr = ParseConstExpr();
-        } else {
-          TokenPosition expr_pos = TokenPos();
-          init_expr = ParseExpr(kAllowConst, kConsumeCascades);
-          if (init_expr->EvalConstExpr() != NULL) {
-            init_expr = FoldConstExpr(expr_pos, init_expr);
-          }
-        }
-      }
-      ASSERT(init_expr != NULL);
-      AstNode* instance = new LoadLocalNode(field.token_pos(), receiver);
-      EnsureExpressionTemp();
-      AstNode* field_init = new StoreInstanceFieldNode(
-          field.token_pos(), instance, field, init_expr,
-          /* is_initializer = */ true);
-      current_block_->statements->Add(field_init);
-    }
-  }
-  initialized_fields->Add(NULL);  // End of inline initializers.
-  SetPosition(saved_pos);
-}
-
-AstNode* Parser::CheckDuplicateFieldInit(
-    TokenPosition init_pos,
-    GrowableArray<Field*>* initialized_fields,
-    AstNode* instance,
-    Field* field,
-    AstNode* init_value) {
-  ASSERT(!field->is_static());
-  AstNode* result = NULL;
-  const String& field_name = String::Handle(field->name());
-  String& initialized_name = String::Handle(Z);
-
-  // The initializer_list is divided into two sections. The sections
-  // are separated by a NULL entry: [f0, ... fn, NULL, fn+1, ...]
-  // The first fields f0 .. fn are final fields of the class that
-  // have an initializer expression inlined in the class declaration.
-  // The remaining fields are those initialized by the constructor's
-  // initializing formals and initializer list
-  int initializer_idx = 0;
-  while (initializer_idx < initialized_fields->length()) {
-    Field* initialized_field = (*initialized_fields)[initializer_idx];
-    initializer_idx++;
-    if (initialized_field == NULL) {
-      break;
-    }
-
-    initialized_name ^= initialized_field->name();
-    if (initialized_name.Equals(field_name) && field->has_initializer()) {
-      ReportError(init_pos, "final field '%s' is already initialized.",
-                  field_name.ToCString());
-    }
-
-    if (initialized_field->raw() == field->raw()) {
-      // This final field has been initialized by an inlined
-      // initializer expression. This is a runtime error.
-      // Throw a NoSuchMethodError for the missing setter.
-      ASSERT(field->is_final());
-
-      // Build a call to NoSuchMethodError::_throwNew(
-      //     Object receiver,
-      //     String memberName,
-      //     int invocation_type,
-      //     Object typeArguments,
-      //     List arguments,
-      //     List argumentNames);
-
-      ArgumentListNode* nsm_args = new (Z) ArgumentListNode(init_pos);
-      // Object receiver.
-      nsm_args->Add(instance);
-
-      // String memberName.
-      String& setter_name = String::ZoneHandle(field->name());
-      setter_name = Field::SetterSymbol(setter_name);
-      nsm_args->Add(new (Z) LiteralNode(init_pos, setter_name));
-
-      // Smi invocation_type.
-      const int invocation_type = InvocationMirror::EncodeType(
-          InvocationMirror::kDynamic, InvocationMirror::kSetter);
-      nsm_args->Add(new (Z) LiteralNode(
-          init_pos, Smi::ZoneHandle(Z, Smi::New(invocation_type))));
-
-      // Object typeArguments.
-      nsm_args->Add(new (Z)
-                        LiteralNode(init_pos, Object::null_type_arguments()));
-
-      // List arguments.
-      GrowableArray<AstNode*> setter_args;
-      setter_args.Add(init_value);
-      ArrayNode* setter_args_array = new (Z) ArrayNode(
-          init_pos, Type::ZoneHandle(Z, Type::ArrayType()), setter_args);
-      nsm_args->Add(setter_args_array);
-
-      // List argumentNames.
-      // The missing implicit setter of the field has no argument names.
-      nsm_args->Add(new (Z) LiteralNode(init_pos, Object::null_array()));
-
-      AstNode* nsm_call = MakeStaticCall(
-          Symbols::NoSuchMethodError(),
-          Library::PrivateCoreLibName(Symbols::ThrowNew()), nsm_args);
-
-      LetNode* let = new (Z) LetNode(init_pos);
-      let->AddNode(init_value);
-      let->AddNode(nsm_call);
-      result = let;
-    }
-  }
-  // The remaining elements in initialized_fields are fields that
-  // are initialized through initializing formal parameters, or
-  // in the constructor's initializer list. If there is a duplicate,
-  // it is a compile time error.
-  while (initializer_idx < initialized_fields->length()) {
-    Field* initialized_field = (*initialized_fields)[initializer_idx];
-    initializer_idx++;
-    if (initialized_field->raw() == field->raw()) {
-      ReportError(init_pos, "duplicate initializer for field %s",
-                  String::Handle(Z, field->name()).ToCString());
-    }
-  }
-  initialized_fields->Add(field);
-  return result;
-}
-
-void Parser::ParseInitializers(const Class& cls,
-                               LocalVariable* receiver,
-                               GrowableArray<Field*>* initialized_fields) {
-  TRACE_PARSER("ParseInitializers");
-  bool super_init_is_last = false;
-  intptr_t super_init_index = -1;
-  StaticCallNode* super_init_call = NULL;
-  if (CurrentToken() == Token::kCOLON) {
-    do {
-      ConsumeToken();  // Colon or comma.
-      if (CurrentToken() == Token::kSUPER) {
-        if (super_init_call != NULL) {
-          ReportError("duplicate call to super constructor");
-        }
-        super_init_call = ParseSuperInitializer(cls, receiver);
-        super_init_index = current_block_->statements->length();
-        current_block_->statements->Add(super_init_call);
-        super_init_is_last = true;
-      } else {
-        AstNode* init_statement =
-            ParseInitializer(cls, receiver, initialized_fields);
-        super_init_is_last = false;
-        if (init_statement != NULL) {
-          current_block_->statements->Add(init_statement);
-        }
-      }
-    } while (CurrentToken() == Token::kCOMMA);
-  }
-  if (super_init_call == NULL) {
-    // Generate implicit super() if we haven't seen an explicit super call
-    // or constructor redirection.
-    super_init_call =
-        GenerateSuperConstructorCall(cls, TokenPos(), receiver, NULL);
-    if (super_init_call != NULL) {
-      super_init_index = current_block_->statements->length();
-      current_block_->statements->Add(super_init_call);
-      super_init_is_last = true;
-    }
-  }
-  if ((super_init_call != NULL) && !super_init_is_last) {
-    // If the super initializer call is not at the end of the initializer
-    // list, implicitly move it to the end. The actual parameter values
-    // are evaluated at the original position in the list and preserved
-    // in temporary variables. (The following initializer expressions
-    // could have side effects that alter the arguments to the super
-    // initializer.) E.g:
-    // A(x) : super(x), f = x++ { ... }
-    // is transformed to:
-    // A(x) : temp = x, f = x++, super(temp) { ... }
-    ASSERT(super_init_index >= 0);
-    ArgumentListNode* ctor_args = super_init_call->arguments();
-    LetNode* saved_args = new (Z) LetNode(super_init_call->token_pos());
-    // The super initializer call has at least 1 arguments: the
-    // implicit receiver.
-    ASSERT(ctor_args->length() >= 1);
-    for (int i = 1; i < ctor_args->length(); i++) {
-      AstNode* arg = ctor_args->NodeAt(i);
-      LocalVariable* temp = CreateTempConstVariable(arg->token_pos(), "sca");
-      AstNode* save_temp = new (Z) StoreLocalNode(arg->token_pos(), temp, arg);
-      saved_args->AddNode(save_temp);
-      ctor_args->SetNodeAt(i, new (Z) LoadLocalNode(arg->token_pos(), temp));
-    }
-    current_block_->statements->ReplaceNodeAt(super_init_index, saved_args);
-    current_block_->statements->Add(super_init_call);
-  }
-  CheckFieldsInitialized(cls);
-}
-
-void Parser::ParseConstructorRedirection(const Class& cls,
-                                         LocalVariable* receiver) {
-  TRACE_PARSER("ParseConstructorRedirection");
-  ExpectToken(Token::kCOLON);
-  ASSERT(CurrentToken() == Token::kTHIS);
-  const TokenPosition call_pos = TokenPos();
-  ConsumeToken();
-  String& ctor_name = String::Handle(Z, cls.Name());
-  GrowableHandlePtrArray<const String> pieces(Z, 3);
-  pieces.Add(ctor_name);
-  pieces.Add(Symbols::Dot());
-  if (CurrentToken() == Token::kPERIOD) {
-    ConsumeToken();
-    pieces.Add(*ExpectIdentifier("constructor name expected"));
-  }
-  ctor_name = Symbols::FromConcatAll(T, pieces);
-  CheckToken(Token::kLPAREN, "parameter list expected");
-
-  ArgumentListNode* arguments = new ArgumentListNode(call_pos);
-  // 'this' parameter is the first argument to constructor.
-  AstNode* implicit_argument = new LoadLocalNode(call_pos, receiver);
-  arguments->Add(implicit_argument);
-
-  receiver->set_invisible(true);
-  ParseActualParameters(arguments, Object::null_type_arguments(), kAllowConst);
-  receiver->set_invisible(false);
-  // Resolve the constructor.
-  const Function& redirect_ctor =
-      Function::ZoneHandle(Z, cls.LookupConstructor(ctor_name));
-  if (redirect_ctor.IsNull()) {
-    if (cls.LookupFactory(ctor_name) != Function::null()) {
-      ReportError(call_pos,
-                  "redirection constructor '%s' must not be a factory",
-                  String::Handle(Z, String::ScrubName(ctor_name)).ToCString());
-    }
-    ReportError(call_pos, "constructor '%s' not found",
-                String::Handle(Z, String::ScrubName(ctor_name)).ToCString());
-  }
-  if (current_function().is_const() && !redirect_ctor.is_const()) {
-    ReportError(call_pos, "redirection constructor '%s' must be const",
-                String::Handle(Z, redirect_ctor.UserVisibleName()).ToCString());
-  }
-  String& error_message = String::Handle(Z);
-  if (!redirect_ctor.AreValidArguments(arguments->type_args_len(),
-                                       arguments->length(), arguments->names(),
-                                       &error_message)) {
-    ReportError(call_pos, "invalid arguments passed to constructor '%s': %s",
-                String::Handle(Z, redirect_ctor.UserVisibleName()).ToCString(),
-                error_message.ToCString());
-  }
-  current_block_->statements->Add(new StaticCallNode(
-      call_pos, redirect_ctor, arguments, StaticCallNode::kStatic));
-}
-
-SequenceNode* Parser::MakeImplicitConstructor(const Function& func) {
-  ASSERT(func.IsGenerativeConstructor());
-  ASSERT(func.Owner() == current_class().raw());
-  const TokenPosition ctor_pos = TokenPos();
-  OpenFunctionBlock(func);
-
-  LocalVariable* receiver =
-      new LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                        Symbols::This(), *ReceiverType(current_class()));
-  current_block_->scope->InsertParameterAt(0, receiver);
-
-  // Parse expressions of instance fields that have an explicit
-  // initializer expression.
-  // The receiver must not be visible to field initializer expressions.
-  receiver->set_invisible(true);
-  GrowableArray<Field*> initialized_fields;
-  ParseInitializedInstanceFields(current_class(), receiver,
-                                 &initialized_fields);
-  receiver->set_invisible(false);
-
-  // If the class of this implicit constructor is a mixin application alias,
-  // it is a forwarding constructor of the aliased mixin application class.
-  // If the class of this implicit constructor is a mixin application class,
-  // it is a forwarding constructor of the mixin. The forwarding
-  // constructor initializes the instance fields that have initializer
-  // expressions and then calls the respective super constructor with
-  // the same name and number of parameters.
-  ArgumentListNode* forwarding_args = NULL;
-  if (current_class().is_mixin_app_alias() ||
-      current_class().IsMixinApplication()) {
-    // At this point we don't support forwarding constructors
-    // that have optional parameters because we don't know the default
-    // values of the optional parameters. We would have to compile the super
-    // constructor to get the default values. Also, the spec is not clear
-    // whether optional parameters are even allowed in this situation.
-    // TODO(hausner): Remove this limitation if the language spec indeed
-    // allows optional parameters.
-    if (func.HasOptionalParameters()) {
-      const Class& super_class = Class::Handle(Z, current_class().SuperClass());
-      ReportError(ctor_pos,
-                  "cannot generate an implicit mixin application constructor "
-                  "forwarding to a super class constructor with optional "
-                  "parameters; add a constructor without optional parameters "
-                  "to class '%s' that redirects to the constructor with "
-                  "optional parameters and invoke it via super from a "
-                  "constructor of the class extending the mixin application",
-                  String::Handle(Z, super_class.Name()).ToCString());
-    }
-
-    // Prepare user-defined arguments to be forwarded to super call.
-    // The first user-defined argument is at position 1.
-    forwarding_args = new ArgumentListNode(ST(ctor_pos));
-    for (int i = 1; i < func.NumParameters(); i++) {
-      LocalVariable* param =
-          new LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            String::ZoneHandle(Z, func.ParameterNameAt(i)),
-                            Object::dynamic_type());
-      current_block_->scope->InsertParameterAt(i, param);
-      forwarding_args->Add(new LoadLocalNode(ST(ctor_pos), param));
-    }
-  }
-
-  AstNode* super_call = GenerateSuperConstructorCall(current_class(), ctor_pos,
-                                                     receiver, forwarding_args);
-  if (super_call != NULL) {
-    current_block_->statements->Add(super_call);
-  }
-  CheckFieldsInitialized(current_class());
-
-  // Empty constructor body.
-  current_block_->statements->Add(new ReturnNode(ST(ctor_pos)));
-  SequenceNode* statements = CloseBlock();
-  return statements;
-}
-
-// Returns a zone allocated string.
-static char* DumpPendingFunctions(
-    Zone* zone,
-    const GrowableObjectArray& pending_functions) {
-  ASSERT(zone != NULL);
-  char* result = OS::SCreate(zone, "Pending Functions:\n");
-  for (intptr_t i = 0; i < pending_functions.Length(); i++) {
-    const Function& func =
-        Function::Handle(zone, Function::RawCast(pending_functions.At(i)));
-    const String& fname = String::Handle(zone, func.UserVisibleName());
-    result = OS::SCreate(zone, "%s%" Pd ": %s\n", result, i, fname.ToCString());
-  }
-  return result;
-}
-
-void Parser::CheckRecursiveInvocation() {
-  const GrowableObjectArray& pending_functions =
-      GrowableObjectArray::Handle(Z, T->pending_functions());
-  ASSERT(!pending_functions.IsNull());
-  for (int i = 0; i < pending_functions.Length(); i++) {
-    if (pending_functions.At(i) == current_function().raw()) {
-      const String& fname =
-          String::Handle(Z, current_function().UserVisibleName());
-      if (FLAG_trace_service) {
-        const char* pending_function_dump =
-            DumpPendingFunctions(Z, pending_functions);
-        ASSERT(pending_function_dump != NULL);
-        ReportError("circular dependency for function %s\n%s",
-                    fname.ToCString(), pending_function_dump);
-      } else {
-        ReportError("circular dependency for function %s", fname.ToCString());
-      }
-    }
-  }
-  ASSERT(!unregister_pending_function_);
-  pending_functions.Add(current_function(), Heap::kOld);
-  unregister_pending_function_ = true;
-}
-
-// Parser is at the opening parenthesis of the formal parameter declaration
-// of function. Parse the formal parameters, initializers and code.
-SequenceNode* Parser::ParseConstructor(const Function& func) {
-  TRACE_PARSER("ParseConstructor");
-  ASSERT(func.IsGenerativeConstructor());
-  ASSERT(!func.IsFactory());
-  ASSERT(!func.is_static());
-  ASSERT(!func.IsLocalFunction());
-  const Class& cls = Class::Handle(Z, func.Owner());
-  ASSERT(!cls.IsNull());
-
-  CheckRecursiveInvocation();
-
-  if (func.IsImplicitConstructor()) {
-    // Special case: implicit constructor.
-    // The parser adds an implicit default constructor when a class
-    // does not have any explicit constructor or factory (see
-    // Parser::AddImplicitConstructor).
-    // There is no source text to parse. We just build the
-    // sequence node by hand.
-    return MakeImplicitConstructor(func);
-  }
-
-  OpenFunctionBlock(func);
-
-  if (parsed_function_->has_arg_desc_var() && FunctionLevel() == 0) {
-    EnsureExpressionTemp();
-    current_block_->scope->AddVariable(parsed_function_->arg_desc_var());
-  }
-
-  ParamList params;
-  ASSERT(CurrentToken() == Token::kLPAREN);
-
-  // Add implicit receiver parameter which is passed the allocated
-  // but uninitialized instance to construct.
-  ASSERT(current_class().raw() == func.Owner());
-  params.AddReceiver(ReceiverType(current_class()), func.token_pos());
-
-  if (func.is_const()) {
-    params.SetImplicitlyFinal();
-  }
-  const bool use_function_type_syntax = false;
-  const bool allow_explicit_default_values = true;
-  const bool evaluate_metadata = false;
-  ParseFormalParameterList(use_function_type_syntax,
-                           allow_explicit_default_values, evaluate_metadata,
-                           &params);
-  FinalizeFormalParameterTypes(&params);
-
-  SetupDefaultsForOptionalParams(params);
-  ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
-
-  // Now populate function scope with the formal parameters.
-  AddFormalParamsToScope(&params, current_block_->scope);
-
-  const bool is_redirecting_constructor =
-      (CurrentToken() == Token::kCOLON) &&
-      ((LookaheadToken(1) == Token::kTHIS) &&
-       ((LookaheadToken(2) == Token::kLPAREN) ||
-        ((LookaheadToken(2) == Token::kPERIOD) &&
-         (LookaheadToken(4) == Token::kLPAREN))));
-
-  GrowableArray<Field*> initialized_fields;
-  LocalVariable* receiver = (*params.parameters)[0].var;
-  OpenBlock();
-
-  // If this is not a redirecting constructor, initialize
-  // instance fields that have an explicit initializer expression.
-  if (!is_redirecting_constructor) {
-    // The formal parameter names must not be visible to the instance
-    // field initializer expressions, yet the parameters must be added to
-    // the scope so the expressions use the correct offsets for 'this' when
-    // storing values. We make the formal parameters temporarily invisible
-    // while parsing the instance field initializer expressions.
-    params.SetInvisible(true);
-    ParseInitializedInstanceFields(cls, receiver, &initialized_fields);
-    // Make the parameters (which are in the outer scope) visible again.
-    params.SetInvisible(false);
-  }
-
-  // Turn formal field parameters into field initializers.
-  if (params.has_field_initializer) {
-    // The first parameter is the implicit receiver.
-    ASSERT(params.parameters->length() >= 1);
-    for (int i = 1; i < params.parameters->length(); i++) {
-      ParamDesc& param = (*params.parameters)[i];
-      if (param.is_field_initializer) {
-        const String& field_name = *param.name;
-        Field& field =
-            Field::ZoneHandle(Z, cls.LookupInstanceField(field_name));
-        if (field.IsNull()) {
-          ReportError(param.name_pos,
-                      "unresolved reference to instance field '%s'",
-                      field_name.ToCString());
-        }
-        if (is_redirecting_constructor) {
-          ReportError(param.name_pos,
-                      "redirecting constructors may not have "
-                      "initializing formal parameters");
-        }
-
-        if (!param.has_explicit_type) {
-          const AbstractType& field_type =
-              AbstractType::ZoneHandle(Z, field.type());
-          param.type = &field_type;
-          // Parameter type was already set to dynamic when parsing the class
-          // declaration: fix it.
-          func.SetParameterTypeAt(i, field_type);
-        }
-
-        AstNode* instance = new LoadLocalNode(param.name_pos, receiver);
-        // Initializing formals cannot be used in the explicit initializer
-        // list, nor can they be used in the constructor body.
-        // Thus, they are set to be invisible when added to the scope.
-        LocalVariable* p = param.var;
-        ASSERT(p != NULL);
-        AstNode* value = new LoadLocalNode(param.name_pos, p);
-        EnsureExpressionTemp();
-        AstNode* initializer = CheckDuplicateFieldInit(
-            param.name_pos, &initialized_fields, instance, &field, value);
-        if (initializer == NULL) {
-          initializer = new (Z)
-              StoreInstanceFieldNode(param.name_pos, instance, field, value,
-                                     /* is_initializer = */ true);
-        }
-        current_block_->statements->Add(initializer);
-      }
-    }
-  }
-
-  if (is_redirecting_constructor) {
-    ParseConstructorRedirection(cls, receiver);
-  } else {
-    ParseInitializers(cls, receiver, &initialized_fields);
-  }
-
-  SequenceNode* init_statements = CloseBlock();
-  current_block_->statements->Add(init_statements);
-
-  // Parsing of initializers done. Now we parse the constructor body.
-  OpenBlock();  // Block to collect constructor body nodes.
-  params.HideInitFormals();
-  if (CurrentToken() == Token::kLBRACE) {
-    // We checked in the top-level parse phase that a redirecting
-    // constructor does not have a body.
-    ASSERT(!is_redirecting_constructor);
-    ConsumeToken();
-    ParseStatementSequence();
-    ExpectToken(Token::kRBRACE);
-  } else if (CurrentToken() == Token::kARROW) {
-    ReportError("constructors may not return a value");
-  } else if (IsSymbol(Symbols::Native())) {
-    ReportError("native constructors not supported");
-  } else if (CurrentToken() == Token::kSEMICOLON) {
-    // Some constructors have no function body.
-    ConsumeToken();
-    if (func.is_external()) {
-      // Body of an external method contains a single throw.
-      const String& function_name = String::ZoneHandle(func.name());
-      current_block_->statements->Add(ThrowNoSuchMethodError(
-          TokenPos(), cls, function_name,
-          NULL,  // No arguments.
-          InvocationMirror::kStatic, InvocationMirror::kMethod,
-          NULL));  // No existing function.
-    }
-  } else {
-    UnexpectedToken();
-  }
-
-  SequenceNode* ctor_block = CloseBlock();
-  if (ctor_block->length() > 0) {
-    current_block_->statements->Add(ctor_block);
-  }
-  current_block_->statements->Add(new ReturnNode(func.end_token_pos()));
-  SequenceNode* statements = CloseBlock();
-  return statements;
-}
-
-// Parser is at the opening parenthesis of the formal parameter
-// declaration of the function or constructor.
-// Parse the formal parameters and code.
-SequenceNode* Parser::ParseFunc(const Function& func, bool check_semicolon) {
-  TRACE_PARSER("ParseFunc");
-  ASSERT(innermost_function().raw() == func.raw());
-
-  // Save current try index. Try index starts at zero for each function.
-  intptr_t saved_try_index = last_used_try_index_;
-  last_used_try_index_ = 0;
-
-  // In case of nested async functions we also need to save the scope where
-  // temporaries are added.
-  LocalScope* saved_async_temp_scope = async_temp_scope_;
-
-  if (func.IsGenerativeConstructor()) {
-    SequenceNode* statements = ParseConstructor(func);
-    last_used_try_index_ = saved_try_index;
-    return statements;
-  }
-
-  ASSERT(!func.IsGenerativeConstructor());
-  OpenFunctionBlock(func);  // Build local scope for function.
-
-  if (parsed_function_->has_arg_desc_var() && FunctionLevel() == 0) {
-    EnsureExpressionTemp();
-    current_block_->scope->AddVariable(parsed_function_->arg_desc_var());
-  }
-
-  if (FLAG_reify_generic_functions) {
-    // Lookup function type arguments variable in parent function scope, if any.
-    if (func.HasGenericParent()) {
-      const String* variable_name = &Symbols::FunctionTypeArgumentsVar();
-      LocalVariable* parent_type_arguments =
-          current_block_->scope->LookupVariable(*variable_name, true);
-      ASSERT(parent_type_arguments != NULL);
-      // TODO(regis): It may be too early to capture parent_type_arguments here.
-      // In case it is never used, we could save capturing and concatenating.
-      current_block_->scope->CaptureVariable(parent_type_arguments);
-      if (FunctionLevel() == 0) {
-        parsed_function_->set_parent_type_arguments(parent_type_arguments);
-        if (!func.IsGeneric() && parent_type_arguments->is_captured()) {
-          parsed_function_->set_function_type_arguments(parent_type_arguments);
-        }
-      }
-    }
-    if (func.IsGeneric()) {
-      // Insert function type arguments variable to scope.
-      LocalVariable* function_type_arguments = new (Z) LocalVariable(
-          TokenPosition::kNoSource, TokenPosition::kNoSource,
-          Symbols::FunctionTypeArgumentsVar(), Object::dynamic_type());
-      current_block_->scope->AddVariable(function_type_arguments);
-      if (FunctionLevel() == 0) {
-        parsed_function_->set_function_type_arguments(function_type_arguments);
-      }
-    }
-  }
-
-  ParamList params;
-  // An instance closure function may capture and access the receiver, but via
-  // the context and not via the first formal parameter.
-  if (func.IsClosureFunction()) {
-    // The first parameter of a closure function is the closure object.
-    ASSERT(!func.is_const());  // Closure functions cannot be const.
-    params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(),
-                             &Object::dynamic_type());
-  } else if (!func.is_static()) {
-    // Static functions do not have a receiver.
-    ASSERT(current_class().raw() == func.Owner());
-    params.AddReceiver(ReceiverType(current_class()), func.token_pos());
-  } else if (func.IsFactory()) {
-    // The first parameter of a factory is the TypeArguments vector of
-    // the type of the instance to be allocated.
-    params.AddFinalParameter(TokenPos(), &Symbols::TypeArgumentsParameter(),
-                             &Object::dynamic_type());
-  }
-  // Expect the parameter list unless this is a getter function, or the
-  // body closure of an async or generator getter function.
-  ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction() ||
-         (func.is_generated_body() &&
-          Function::Handle(func.parent_function()).IsGetterFunction()));
-  if (func.IsGetterFunction()) {
-    // Populate function scope with the formal parameters. Since in this case
-    // we are compiling a getter this will at most populate the receiver.
-    AddFormalParamsToScope(&params, current_block_->scope);
-  } else if (func.IsAsyncClosure()) {
-    AddAsyncClosureParameters(&params);
-    SetupDefaultsForOptionalParams(params);
-    AddFormalParamsToScope(&params, current_block_->scope);
-    ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
-    ASSERT(func.NumParameters() == params.parameters->length());
-    if (!Function::Handle(func.parent_function()).IsGetterFunction()) {
-      // Skip formal parameters. They are accessed as context variables.
-      // Parsing them again (and discarding them) does not work in case of
-      // default values with same name as already parsed formal parameter.
-      SkipToMatchingParenthesis();
-    }
-  } else if (func.IsSyncGenClosure()) {
-    AddSyncGenClosureParameters(&params);
-    SetupDefaultsForOptionalParams(params);
-    AddFormalParamsToScope(&params, current_block_->scope);
-    ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
-    if (!Function::Handle(func.parent_function()).IsGetterFunction()) {
-      // Skip formal parameters. They are accessed as context variables.
-      // Parsing them again (and discarding them) does not work in case of
-      // default values with same name as already parsed formal parameter.
-      SkipToMatchingParenthesis();
-    }
-  } else if (func.IsAsyncGenClosure()) {
-    AddAsyncGenClosureParameters(&params);
-    SetupDefaultsForOptionalParams(params);
-    AddFormalParamsToScope(&params, current_block_->scope);
-    ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
-    ASSERT(func.NumParameters() == params.parameters->length());
-    if (!Function::Handle(func.parent_function()).IsGetterFunction()) {
-      // Skip formal parameters. They are accessed as context variables.
-      // Parsing them again (and discarding them) does not work in case of
-      // default values with same name as already parsed formal parameter.
-      SkipToMatchingParenthesis();
-    }
-  } else {
-    const bool use_function_type_syntax = false;
-    const bool allow_explicit_default_values = true;
-    const bool evaluate_metadata = false;
-    ParseFormalParameterList(use_function_type_syntax,
-                             allow_explicit_default_values, evaluate_metadata,
-                             &params);
-    if (!is_top_level_) {
-      FinalizeFormalParameterTypes(&params);
-    }
-
-    // The number of parameters and their type are not yet set in local
-    // functions, since they are not 'top-level' parsed.
-    // However, they are already set when the local function is compiled, since
-    // the local function was parsed when its parent was compiled.
-    if (func.parameter_types() == Object::empty_array().raw()) {
-      AddFormalParamsToFunction(&params, func);
-    }
-    ResolveSignatureTypeParameters(func);
-    if (!is_top_level_) {
-      ClassFinalizer::FinalizeSignature(Class::Handle(Z, func.origin()), func);
-    }
-    SetupDefaultsForOptionalParams(params);
-    ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
-
-    // Populate function scope with the formal parameters.
-    AddFormalParamsToScope(&params, current_block_->scope);
-  }
-
-  const TokenPosition modifier_pos = TokenPos();
-  RawFunction::AsyncModifier func_modifier = ParseFunctionModifier();
-  if (!func.is_generated_body()) {
-    // Don't add a modifier to the closure representing the body of
-    // the asynchronous function or generator.
-    func.set_modifier(func_modifier);
-  }
-
-  OpenBlock();  // Open a nested scope for the outermost function block.
-
-  Function& generated_body_closure = Function::ZoneHandle(Z);
-  if (func.IsAsyncFunction()) {
-    ASSERT(!func.is_generated_body());
-    // The code of an async function is synthesized. Disable debugging.
-    func.set_is_debuggable(false);
-    if (FLAG_causal_async_stacks) {
-      // In order to collect causal asynchronous stacks efficiently we rely on
-      // this function not being inlined.
-      func.set_is_inlinable(false);
-    }
-    generated_body_closure = OpenAsyncFunction(func.token_pos());
-  } else if (func.IsAsyncClosure()) {
-    // The closure containing the body of an async function is debuggable.
-    ASSERT(func.is_debuggable());
-    if (FLAG_causal_async_stacks) {
-      // In order to collect causal asynchronous stacks efficiently we rely on
-      // this function not being inlined.
-      func.set_is_inlinable(false);
-    }
-    OpenAsyncClosure();
-  } else if (func.IsSyncGenerator()) {
-    // The code of a sync generator is synthesized. Disable debugging.
-    func.set_is_debuggable(false);
-    generated_body_closure = OpenSyncGeneratorFunction(func.token_pos());
-  } else if (func.IsSyncGenClosure()) {
-    // The closure containing the body of a sync generator is debuggable.
-    ASSERT(func.is_debuggable());
-    async_temp_scope_ = current_block_->scope;
-  } else if (func.IsAsyncGenerator()) {
-    func.set_is_debuggable(false);
-    if (FLAG_causal_async_stacks) {
-      // In order to collect causal asynchronous stacks efficiently we rely on
-      // this function not being inlined.
-      func.set_is_inlinable(false);
-    }
-    generated_body_closure = OpenAsyncGeneratorFunction(func.token_pos());
-  } else if (func.IsAsyncGenClosure()) {
-    // The closure containing the body of an async* function is debuggable.
-    ASSERT(func.is_debuggable());
-    if (FLAG_causal_async_stacks) {
-      // In order to collect causal asynchronous stacks efficiently we rely on
-      // this function not being inlined.
-      func.set_is_inlinable(false);
-    }
-    OpenAsyncGeneratorClosure();
-  }
-
-  // Function level is now correctly set to parse the (possibly async) body.
-  if (I->argument_type_checks() && (FunctionLevel() > 0)) {
-    // We are parsing, but not compiling, a local function.
-    // The instantiator may be required at run time for generic type checks.
-    // Note that the source of this local function may not reference the
-    // generic type explicitly. However, it may assign a value to a captured
-    // variable declared with its generic type in the enclosing function.
-    // Make sure that the receiver of the enclosing instance function
-    // (or implicit first parameter of an enclosing factory) is marked as
-    // captured if type checks are enabled, because they may access it to
-    // instantiate types.
-    // If any enclosing parent of the function being parsed is generic, capture
-    // their function type arguments.
-    CaptureAllInstantiators();
-  }
-
-  BoolScope allow_await(&this->await_is_keyword_,
-                        func.IsAsyncOrGenerator() || func.is_generated_body());
-  TokenPosition end_token_pos = TokenPosition::kNoSource;
-  if (CurrentToken() == Token::kLBRACE) {
-    ConsumeToken();
-    if (String::Handle(Z, func.name()).Equals(Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(Z, func.Owner());
-      if (!owner.IsObjectClass()) {
-        AddEqualityNullCheck();
-      }
-    }
-    ParseStatementSequence();
-    end_token_pos = TokenPos();
-    ExpectToken(Token::kRBRACE);
-  } else if (CurrentToken() == Token::kARROW) {
-    if (func.IsGenerator()) {
-      ReportError(modifier_pos,
-                  "=> style function may not be sync* or async* generator");
-    }
-    ConsumeToken();
-    if (String::Handle(Z, func.name()).Equals(Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(Z, func.Owner());
-      if (!owner.IsObjectClass()) {
-        AddEqualityNullCheck();
-      }
-    }
-    const TokenPosition expr_pos = TokenPos();
-    AstNode* expr = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
-    ASSERT(expr != NULL);
-    expr = AddAsyncResultTypeCheck(expr_pos, expr);
-    current_block_->statements->Add(new (Z) ReturnNode(expr_pos, expr));
-    end_token_pos = TokenPos();
-    if (check_semicolon) {
-      ExpectSemicolon();
-    }
-  } else if (IsSymbol(Symbols::Native())) {
-    if (String::Handle(Z, func.name()).Equals(Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(Z, func.Owner());
-      if (!owner.IsObjectClass()) {
-        AddEqualityNullCheck();
-      }
-    }
-    ParseNativeFunctionBlock(&params, func);
-    end_token_pos = TokenPos();
-    ExpectSemicolon();
-  } else if (func.is_external()) {
-    // Body of an external method contains a single throw.
-    const String& function_name = String::ZoneHandle(Z, func.name());
-    current_block_->statements->Add(ThrowNoSuchMethodError(
-        TokenPos(), Class::Handle(func.Owner()), function_name,
-        NULL,  // Ignore arguments.
-        func.is_static() ? InvocationMirror::kStatic
-                         : InvocationMirror::kDynamic,
-        InvocationMirror::kMethod,
-        &func));  // Unpatched external function.
-    end_token_pos = TokenPos();
-  } else {
-    UnexpectedToken();
-  }
-
-  ASSERT(func.end_token_pos() == func.token_pos() ||
-         func.end_token_pos() == end_token_pos);
-  func.set_end_token_pos(end_token_pos);
-  SequenceNode* body = CloseBlock();
-  if (FLAG_reify_generic_functions && func.IsGeneric() &&
-      !generated_body_closure.IsNull()) {
-    LocalVariable* existing_var = body->scope()->LookupVariable(
-        Symbols::FunctionTypeArgumentsVar(), false);
-    ASSERT((existing_var != NULL) && existing_var->is_captured());
-  }
-  if (func.IsAsyncFunction()) {
-    body = CloseAsyncFunction(generated_body_closure, body);
-    generated_body_closure.set_end_token_pos(end_token_pos);
-  } else if (func.IsAsyncClosure()) {
-    body = CloseAsyncClosure(body, end_token_pos);
-  } else if (func.IsSyncGenerator()) {
-    body = CloseSyncGenFunction(generated_body_closure, body);
-    generated_body_closure.set_end_token_pos(end_token_pos);
-  } else if (func.IsSyncGenClosure()) {
-    // body is unchanged.
-  } else if (func.IsAsyncGenerator()) {
-    body = CloseAsyncGeneratorFunction(generated_body_closure, body);
-    generated_body_closure.set_end_token_pos(end_token_pos);
-  } else if (func.IsAsyncGenClosure()) {
-    body = CloseAsyncGeneratorClosure(body);
-  }
-  EnsureHasReturnStatement(body, end_token_pos);
-  current_block_->statements->Add(body);
-  last_used_try_index_ = saved_try_index;
-  async_temp_scope_ = saved_async_temp_scope;
-  return CloseBlock();
-}
-
-void Parser::AddEqualityNullCheck() {
-  AstNode* argument = new LoadLocalNode(
-      TokenPosition::kNoSource, current_block_->scope->parent()->VariableAt(1));
-  LiteralNode* null_operand =
-      new LiteralNode(TokenPosition::kNoSource, Instance::ZoneHandle(Z));
-  ComparisonNode* check_arg = new ComparisonNode(
-      TokenPosition::kNoSource, Token::kEQ_STRICT, argument, null_operand);
-  ComparisonNode* result =
-      new ComparisonNode(TokenPosition::kNoSource, Token::kEQ_STRICT,
-                         LoadReceiver(TokenPosition::kNoSource), null_operand);
-  SequenceNode* arg_is_null =
-      new SequenceNode(TokenPosition::kNoSource, current_block_->scope);
-  arg_is_null->Add(new ReturnNode(TokenPosition::kNoSource, result));
-  IfNode* if_arg_null =
-      new IfNode(TokenPosition::kNoSource, check_arg, arg_is_null, NULL);
-  current_block_->statements->Add(if_arg_null);
-}
-
-AstNode* Parser::AddAsyncResultTypeCheck(TokenPosition expr_pos,
-                                         AstNode* expr) {
-  if (I->type_checks() &&
-      (((FunctionLevel() == 0) && current_function().IsAsyncClosure()))) {
-    // In checked mode, when the declared result type is Future<T>, verify
-    // that the returned expression is of type T or Future<T> as follows:
-    // return temp = expr, temp is Future ? temp as Future<T> : temp as T;
-    // In case of a mismatch, we need a TypeError and not a CastError, so
-    // we do not actually implement an "as" test, but an "assignable" test.
-    Function& async_func =
-        Function::Handle(Z, current_function().parent_function());
-    const AbstractType& result_type =
-        AbstractType::ZoneHandle(Z, async_func.result_type());
-    const Class& future_class =
-        Class::ZoneHandle(Z, I->object_store()->future_class());
-    ASSERT(!future_class.IsNull());
-    if (result_type.type_class() == future_class.raw()) {
-      const TypeArguments& result_type_args =
-          TypeArguments::ZoneHandle(Z, result_type.arguments());
-      if (!result_type_args.IsNull() && (result_type_args.Length() == 1)) {
-        const AbstractType& result_type_arg =
-            AbstractType::ZoneHandle(Z, result_type_args.TypeAt(0));
-        LetNode* checked_expr = new (Z) LetNode(expr_pos);
-        LocalVariable* temp = checked_expr->AddInitializer(expr);
-        temp->set_is_final();
-        const AbstractType& future_type =
-            AbstractType::ZoneHandle(Z, future_class.RareType());
-        AstNode* is_future = new (Z) LoadLocalNode(expr_pos, temp);
-        is_future =
-            new (Z) ComparisonNode(expr_pos, Token::kIS, is_future,
-                                   new (Z) TypeNode(expr_pos, future_type));
-        AstNode* as_future_t = new (Z) LoadLocalNode(expr_pos, temp);
-        as_future_t = new (Z) AssignableNode(expr_pos, as_future_t, result_type,
-                                             Symbols::FunctionResult());
-        AstNode* as_t = new (Z) LoadLocalNode(expr_pos, temp);
-        as_t = new (Z) AssignableNode(expr_pos, as_t, result_type_arg,
-                                      Symbols::FunctionResult());
-        checked_expr->AddNode(new (Z) ConditionalExprNode(expr_pos, is_future,
-                                                          as_future_t, as_t));
-        expr = checked_expr;
-      }
-    }
-  }
-  return expr;
-}
-
-void Parser::SkipIf(Token::Kind token) {
-  if (CurrentToken() == token) {
-    ConsumeToken();
-  }
-}
-
-void Parser::SkipInitializers() {
-  ASSERT(CurrentToken() == Token::kCOLON);
-  do {
-    ConsumeToken();  // Colon or comma.
-    if (CurrentToken() == Token::kSUPER) {
-      ConsumeToken();
-      if (CurrentToken() == Token::kPERIOD) {
-        ConsumeToken();
-        ExpectIdentifier("identifier expected");
-      }
-      CheckToken(Token::kLPAREN);
-      SkipToMatchingParenthesis();
-    } else if (CurrentToken() == Token::kASSERT) {
-      ConsumeToken();
-      CheckToken(Token::kLPAREN);
-      SkipToMatchingParenthesis();
-    } else {
-      SkipIf(Token::kTHIS);
-      SkipIf(Token::kPERIOD);
-      ExpectIdentifier("identifier expected");
-      ExpectToken(Token::kASSIGN);
-      SetAllowFunctionLiterals(false);
-      SkipExpr();
-      SetAllowFunctionLiterals(true);
-    }
-  } while (CurrentToken() == Token::kCOMMA);
-}
-
-// If the current identifier is a library prefix followed by a period,
-// consume the identifier and period, and return the resolved library
-// prefix.
-RawLibraryPrefix* Parser::ParsePrefix() {
-  ASSERT(IsIdentifier());
-  // A library prefix can never stand by itself. It must be followed by
-  // a period.
-  Token::Kind next_token = LookaheadToken(1);
-  if (next_token != Token::kPERIOD) {
-    return LibraryPrefix::null();
-  }
-  const String& ident = *CurrentLiteral();
-
-  // It is relatively fast to look up a name in the library dictionary,
-  // compared to searching the nested local scopes. Look up the name
-  // in the library scope and return in the common case where ident is
-  // not a library prefix.
-  LibraryPrefix& prefix =
-      LibraryPrefix::Handle(Z, library_.LookupLocalLibraryPrefix(ident));
-  if (prefix.IsNull()) {
-    return LibraryPrefix::null();
-  }
-
-  // A library prefix with the name exists. Now check whether it is
-  // shadowed by a local definition.
-  if (!is_top_level_ &&
-      ResolveIdentInLocalScope(TokenPos(), ident, NULL, NULL)) {
-    return LibraryPrefix::null();
-  }
-  // Check whether the identifier is shadowed by a function type parameter.
-  if (InGenericFunctionScope() && (innermost_function().LookupTypeParameter(
-                                       ident, NULL) != TypeParameter::null())) {
-    return LibraryPrefix::null();
-  }
-  // Check whether the identifier is shadowed by a class type parameter.
-  ASSERT(!current_class().IsNull());
-  if (current_class().LookupTypeParameter(ident) != TypeParameter::null()) {
-    return LibraryPrefix::null();
-  }
-
-  // We have a name that is not shadowed, followed by a period.
-  // Consume the identifier, let the caller consume the period.
-  ConsumeToken();
-  return prefix.raw();
-}
-
-void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) {
-  TRACE_PARSER("ParseMethodOrConstructor");
-  // We are at the beginning of the formal parameters list.
-  ASSERT(CurrentToken() == Token::kLPAREN || CurrentToken() == Token::kLT ||
-         method->IsGetter());
-  ASSERT(method->type != NULL);  // May still be unresolved.
-  ASSERT(current_member_ == method);
-
-  if (method->has_covariant) {
-    ReportError(method->name_pos,
-                "methods and constructors cannot be declared covariant");
-  }
-  if (method->has_var) {
-    ReportError(method->name_pos, "keyword var not allowed for methods");
-  }
-  if (method->has_final) {
-    ReportError(method->name_pos, "'final' not allowed for methods");
-  }
-  if (method->has_abstract && method->has_static) {
-    ReportError(method->name_pos, "static method '%s' cannot be abstract",
-                method->name->ToCString());
-  }
-  if (method->has_const && !method->IsFactoryOrConstructor()) {
-    ReportError(method->name_pos, "'const' not allowed for methods");
-  }
-  if (method->has_abstract && method->IsFactoryOrConstructor()) {
-    ReportError(method->name_pos, "constructor cannot be abstract");
-  }
-  if (method->has_const && method->IsConstructor()) {
-    current_class().set_is_const();
-  }
-
-  Function& func = Function::Handle(
-      Z,
-      Function::New(*method->name,  // May change.
-                    method->kind, method->has_static, method->has_const,
-                    method->has_abstract,  // May change.
-                    method->has_external,
-                    method->has_native,  // May change.
-                    current_class(), method->decl_begin_pos));
-  func.set_has_pragma(IsPragmaAnnotation(method->metadata_pos));
-
-  ASSERT(innermost_function().IsNull());
-  innermost_function_ = func.raw();
-
-  if (CurrentToken() == Token::kLT) {
-    TokenPosition type_param_pos = TokenPos();
-    if (method->IsFactoryOrConstructor()) {
-      ReportError(method->name_pos, "constructor cannot be generic");
-    }
-    if (method->IsGetter() || method->IsSetter()) {
-      ReportError(type_param_pos, "%s cannot be generic",
-                  method->IsGetter() ? "getter" : "setter");
-    }
-    ParseTypeParameters(false);  // Not parameterizing class, but function.
-  }
-
-  // Parse the formal parameters.
-  const TokenPosition formal_param_pos = TokenPos();
-  method->params.Clear();
-  // Static functions do not have a receiver.
-  // The first parameter of a factory is the TypeArguments vector of
-  // the type of the instance to be allocated.
-  if (!method->has_static || method->IsConstructor()) {
-    method->params.AddReceiver(ReceiverType(current_class()), formal_param_pos);
-  } else if (method->IsFactory()) {
-    method->params.AddFinalParameter(formal_param_pos,
-                                     &Symbols::TypeArgumentsParameter(),
-                                     &Object::dynamic_type());
-  }
-  if (method->has_const) {
-    method->params.SetImplicitlyFinal();
-  }
-  if (!method->IsGetter()) {
-    const bool use_function_type_syntax = false;
-    const bool allow_explicit_default_values = true;
-    const bool evaluate_metadata = false;
-    ParseFormalParameterList(use_function_type_syntax,
-                             allow_explicit_default_values, evaluate_metadata,
-                             &method->params);
-  }
-
-  // Now that we know the parameter list, we can distinguish between the
-  // unary and binary operator -.
-  if (method->has_operator) {
-    if ((method->operator_token == Token::kSUB) &&
-        (method->params.num_fixed_parameters == 1)) {
-      // Patch up name for unary operator - so it does not clash with the
-      // name for binary operator -.
-      method->operator_token = Token::kNEGATE;
-      *method->name = Symbols::Token(Token::kNEGATE).raw();
-    }
-    CheckOperatorArity(*method);
-  }
-
-  // Mangle the name for getter and setter functions and check function
-  // arity.
-  if (method->IsGetter() || method->IsSetter()) {
-    int expected_num_parameters = 0;
-    if (method->IsGetter()) {
-      expected_num_parameters = (method->has_static) ? 0 : 1;
-      method->dict_name = method->name;
-      method->name = &String::ZoneHandle(Z, Field::GetterSymbol(*method->name));
-    } else {
-      ASSERT(method->IsSetter());
-      expected_num_parameters = (method->has_static) ? 1 : 2;
-      method->dict_name = &String::ZoneHandle(
-          Z, Symbols::FromConcat(T, *method->name, Symbols::Equals()));
-      method->name = &String::ZoneHandle(Z, Field::SetterSymbol(*method->name));
-    }
-    if ((method->params.num_fixed_parameters != expected_num_parameters) ||
-        (method->params.num_optional_parameters != 0)) {
-      ReportError(method->name_pos, "illegal %s parameters",
-                  method->IsGetter() ? "getter" : "setter");
-    }
-  }
-
-  // Parse redirecting factory constructor.
-  Type& redirection_type = Type::Handle(Z);
-  String& redirection_identifier = String::Handle(Z);
-  bool is_redirecting = false;
-  if (method->IsFactory() && (CurrentToken() == Token::kASSIGN)) {
-    // Default parameter values are disallowed in redirecting factories.
-    if (method->params.has_explicit_default_values) {
-      ReportError(
-          "redirecting factory '%s' may not specify default values "
-          "for optional parameters",
-          method->name->ToCString());
-    }
-    if (method->has_external) {
-      ReportError(TokenPos(),
-                  "external factory constructor '%s' may not have redirection",
-                  method->name->ToCString());
-    }
-    ConsumeToken();
-    const TokenPosition type_pos = TokenPos();
-    is_redirecting = true;
-    const bool consume_unresolved_prefix =
-        (LookaheadToken(3) == Token::kLT) ||
-        (LookaheadToken(3) == Token::kPERIOD);
-    const AbstractType& type = AbstractType::Handle(
-        Z, ParseType(ClassFinalizer::kResolveTypeParameters, true,
-                     consume_unresolved_prefix));
-    if (!type.IsMalformed() && type.IsTypeParameter()) {
-      // Replace the type with a malformed type and compile a throw when called.
-      redirection_type = ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(Z),  // No previous error.
-          script_, type_pos,
-          "factory '%s' may not redirect to type parameter '%s'",
-          method->name->ToCString(),
-          String::Handle(Z, type.UserVisibleName()).ToCString());
-    } else {
-      // We handle malformed and malbounded redirection type at run time.
-      redirection_type ^= type.raw();
-    }
-    if (CurrentToken() == Token::kPERIOD) {
-      // Named constructor or factory.
-      ConsumeToken();
-      redirection_identifier = ExpectIdentifier("identifier expected")->raw();
-    }
-  } else if (CurrentToken() == Token::kCOLON) {
-    // Parse initializers.
-    if (!method->IsConstructor()) {
-      ReportError("initializers only allowed on constructors");
-    }
-    if (method->has_external) {
-      ReportError(TokenPos(),
-                  "external constructor '%s' may not have initializers",
-                  method->name->ToCString());
-    }
-    if ((LookaheadToken(1) == Token::kTHIS) &&
-        ((LookaheadToken(2) == Token::kLPAREN) ||
-         LookaheadToken(4) == Token::kLPAREN)) {
-      // Redirected constructor: either this(...) or this.xxx(...).
-      is_redirecting = true;
-      if (method->params.has_field_initializer) {
-        // Constructors that redirect to another constructor must not
-        // initialize any fields using field initializer parameters.
-        ReportError(formal_param_pos,
-                    "Redirecting constructor "
-                    "may not use field initializer parameters");
-      }
-      ConsumeToken();  // Colon.
-      ExpectToken(Token::kTHIS);
-      GrowableHandlePtrArray<const String> pieces(Z, 3);
-      pieces.Add(members->class_name());
-      pieces.Add(Symbols::Dot());
-      if (CurrentToken() == Token::kPERIOD) {
-        ConsumeToken();
-        pieces.Add(*ExpectIdentifier("constructor name expected"));
-      }
-      String& redir_name =
-          String::ZoneHandle(Z, Symbols::FromConcatAll(T, pieces));
-
-      method->redirect_name = &redir_name;
-      CheckToken(Token::kLPAREN);
-      SkipToMatchingParenthesis();
-    } else {
-      SkipInitializers();
-    }
-  }
-
-  // Only constructors can redirect to another method.
-  ASSERT((method->redirect_name == NULL) || method->IsConstructor());
-
-  if (method->IsConstructor() && method->has_external &&
-      method->params.has_field_initializer) {
-    ReportError(method->name_pos,
-                "external constructor '%s' may not have field initializers",
-                method->name->ToCString());
-  }
-
-  const TokenPosition modifier_pos = TokenPos();
-  RawFunction::AsyncModifier async_modifier = ParseFunctionModifier();
-  if ((method->IsFactoryOrConstructor() || method->IsSetter()) &&
-      (async_modifier != RawFunction::kNoModifier)) {
-    ReportError(modifier_pos, "%s '%s' may not be async, async* or sync*",
-                (method->IsSetter()) ? "setter" : "constructor",
-                method->name->ToCString());
-  }
-
-  TokenPosition method_end_pos = TokenPos();
-  String* native_name = NULL;
-  if ((CurrentToken() == Token::kLBRACE) || (CurrentToken() == Token::kARROW)) {
-    if (method->has_abstract) {
-      ReportError(TokenPos(),
-                  "abstract method '%s' may not have a function body",
-                  method->name->ToCString());
-    } else if (method->has_external) {
-      ReportError(TokenPos(), "external %s '%s' may not have a function body",
-                  method->IsFactoryOrConstructor() ? "constructor" : "method",
-                  method->name->ToCString());
-    } else if (method->IsConstructor() && method->has_const) {
-      ReportError(TokenPos(),
-                  "const constructor '%s' may not have a function body",
-                  method->name->ToCString());
-    } else if (method->IsFactory() && method->has_const) {
-      ReportError(TokenPos(), "const factory '%s' may not have a function body",
-                  method->name->ToCString());
-    }
-    if (method->redirect_name != NULL) {
-      ReportError(method->name_pos,
-                  "Constructor with redirection may not have a function body");
-    }
-    if (CurrentToken() == Token::kLBRACE) {
-      SkipBlock();
-      method_end_pos = TokenPos();
-      ExpectToken(Token::kRBRACE);
-    } else {
-      if ((async_modifier & RawFunction::kGeneratorBit) != 0) {
-        ReportError(modifier_pos,
-                    "=> style function may not be sync* or async* generator");
-      }
-
-      ConsumeToken();
-      BoolScope allow_await(&this->await_is_keyword_,
-                            async_modifier != RawFunction::kNoModifier);
-      SkipExpr();
-      method_end_pos = TokenPos();
-      ExpectSemicolon();
-    }
-  } else if (IsSymbol(Symbols::Native())) {
-    if (method->has_abstract) {
-      ReportError(method->name_pos,
-                  "abstract method '%s' may not have a function body",
-                  method->name->ToCString());
-    } else if (method->IsConstructor() && method->has_const) {
-      ReportError(method->name_pos, "const constructor '%s' may not be native",
-                  method->name->ToCString());
-    }
-    if (method->redirect_name != NULL) {
-      ReportError(method->name_pos,
-                  "Constructor with redirection may not have a function body");
-    }
-    native_name = &ParseNativeDeclaration();
-    method_end_pos = TokenPos();
-    ExpectSemicolon();
-    method->has_native = true;
-  } else {
-    // We haven't found a method body. Issue error if one is required.
-    const bool must_have_body = method->has_static && !method->has_external &&
-                                redirection_type.IsNull();
-    if (must_have_body) {
-      ReportError(method->name_pos, "function body expected for method '%s'",
-                  method->name->ToCString());
-    }
-
-    if (CurrentToken() == Token::kSEMICOLON) {
-      ConsumeToken();
-      if (!method->has_static && !method->has_external &&
-          !method->IsConstructor()) {
-        // Methods, getters and setters without a body are
-        // implicitly abstract.
-        method->has_abstract = true;
-      }
-    } else {
-      // Signature is not followed by semicolon or body. Issue an
-      // appropriate error.
-      const bool must_have_semicolon =
-          (method->redirect_name != NULL) ||
-          (method->IsConstructor() && method->has_const) ||
-          method->has_external;
-      if (must_have_semicolon) {
-        ExpectSemicolon();
-      } else {
-        ReportError(method->name_pos,
-                    "function body or semicolon expected for method '%s'",
-                    method->name->ToCString());
-      }
-    }
-  }
-
-  if (method->has_abstract && (async_modifier != RawFunction::kNoModifier)) {
-    ReportError(modifier_pos,
-                "abstract function '%s' may not be async, async* or sync*",
-                method->name->ToCString());
-  }
-
-  // Update function object.
-  func.set_name(*method->name);
-  func.set_is_abstract(method->has_abstract);
-  func.set_is_native(method->has_native);
-  func.set_result_type(*method->type);
-  // The result type may refer to func's type parameters,
-  // but was not parsed in the scope of func. Adjust.
-  method->type->SetScopeFunction(func);
-
-  func.set_end_token_pos(method_end_pos);
-  func.set_is_redirecting(is_redirecting);
-  func.set_modifier(async_modifier);
-  if (library_.is_dart_scheme() && library_.IsPrivate(*method->name)) {
-    func.set_is_reflectable(false);
-  }
-  if (is_patch_source() && IsPatchAnnotation(method->metadata_pos)) {
-    // Currently, we just ignore the patch annotation. If the function
-    // name already exists in the patched class, this function will replace
-    // the one in the patched class.
-    method->metadata_pos = TokenPosition::kNoSource;
-  }
-  if (method->metadata_pos.IsReal()) {
-    library_.AddFunctionMetadata(func, method->metadata_pos);
-  }
-  if (method->has_native) {
-    func.set_native_name(*native_name);
-  }
-
-  // If this method is a redirecting factory, set the redirection information.
-  if (!redirection_type.IsNull()) {
-    ASSERT(func.IsFactory());
-    func.SetRedirectionType(redirection_type);
-    if (!redirection_identifier.IsNull()) {
-      func.SetRedirectionIdentifier(redirection_identifier);
-    }
-  }
-
-  ASSERT(is_top_level_);
-  AddFormalParamsToFunction(&method->params, func);
-  ASSERT(innermost_function().raw() == func.raw());
-  innermost_function_ = Function::null();
-  ResolveSignatureTypeParameters(func);
-  members->AddFunction(func);
-}
-
-void Parser::ParseFieldDefinition(ClassDesc* members, MemberDesc* field) {
-  TRACE_PARSER("ParseFieldDefinition");
-  // The parser has read the first field name and is now at the token
-  // after the field name.
-  ASSERT(CurrentToken() == Token::kSEMICOLON ||
-         CurrentToken() == Token::kCOMMA || CurrentToken() == Token::kASSIGN);
-  ASSERT(field->type != NULL);
-  ASSERT(field->name_pos.IsReal());
-  ASSERT(current_member_ == field);
-  // All const fields are also final.
-  ASSERT(!field->has_const || field->has_final);
-
-  if (field->has_covariant) {
-    if (field->has_static) {
-      ReportError("static fields cannot be declared covariant");
-    } else if (field->has_final) {
-      ReportError("final fields cannot be declared covariant");
-    }
-  }
-  if (field->has_abstract) {
-    ReportError("keyword 'abstract' not allowed in field declaration");
-  }
-  if (field->has_external) {
-    ReportError("keyword 'external' not allowed in field declaration");
-  }
-  if (field->has_factory) {
-    ReportError("keyword 'factory' not allowed in field declaration");
-  }
-  if (!field->has_static && field->has_const) {
-    ReportError(field->name_pos, "instance field may not be 'const'");
-  }
-  Function& getter = Function::Handle(Z);
-  Function& setter = Function::Handle(Z);
-  Field& class_field = Field::ZoneHandle(Z);
-  Instance& init_value = Instance::Handle(Z);
-  while (true) {
-    bool has_initializer = CurrentToken() == Token::kASSIGN;
-    bool has_simple_literal = false;
-    if (has_initializer) {
-      ConsumeToken();
-      init_value = Object::sentinel().raw();
-      // For static fields, the initialization expression will be parsed
-      // through the kImplicitStaticFinalGetter method invocation/compilation.
-      // For instance fields, the expression is parsed when a constructor
-      // is compiled.
-      // For static fields with very simple initializer expressions
-      // (e.g. a literal number or string), we optimize away the
-      // kImplicitStaticFinalGetter and initialize the field here.
-      // However, the class finalizer will check the value type for
-      // assignability once the declared field type can be resolved. If the
-      // value is not assignable (assuming checked mode and disregarding actual
-      // mode), the field value is reset and a kImplicitStaticFinalGetter is
-      // created at finalization time.
-      if ((LookaheadToken(1) == Token::kSEMICOLON) ||
-          (LookaheadToken(1) == Token::kCOMMA)) {
-        has_simple_literal = IsSimpleLiteral(*field->type, &init_value);
-      }
-      SkipExpr();
-    } else {
-      // Static const and static final fields must have an initializer.
-      // Static const fields are implicitly final.
-      if (field->has_static && field->has_final) {
-        ReportError(field->name_pos,
-                    "static %s field '%s' must have an initializer expression",
-                    field->has_const ? "const" : "final",
-                    field->name->ToCString());
-      }
-    }
-
-    TokenPosition end_token_pos = TokenPos();
-
-    // Create the field object.
-    const bool is_reflectable =
-        !(library_.is_dart_scheme() && library_.IsPrivate(*field->name));
-    class_field = Field::New(*field->name, field->has_static, field->has_final,
-                             field->has_const, is_reflectable, current_class(),
-                             *field->type, field->name_pos, end_token_pos);
-    class_field.set_has_initializer(has_initializer);
-    members->AddField(class_field);
-    field->field_ = &class_field;
-    if (IsPragmaAnnotation(field->metadata_pos)) {
-      current_class().set_has_pragma(true);
-    }
-    if (is_patch_source() && IsPatchAnnotation(field->metadata_pos)) {
-      // Currently, we just ignore the patch annotation on fields.
-      // All fields in the patch class are added to the patched class.
-      field->metadata_pos = TokenPosition::kNoSource;
-    }
-    if ((field->metadata_pos.IsReal())) {
-      library_.AddFieldMetadata(class_field, field->metadata_pos);
-    }
-
-    // Start tracking types for fields with simple initializers in their
-    // definition. This avoids some of the overhead to track this at runtime
-    // and rules out many fields from being unnecessary unboxing candidates.
-    if (!field->has_static && has_initializer && has_simple_literal) {
-      class_field.RecordStore(init_value);
-      if (!init_value.IsNull() && init_value.IsDouble()) {
-        class_field.set_is_double_initialized(true);
-      }
-    }
-
-    // For static final fields (this includes static const fields), set value to
-    // "uninitialized" and create a kImplicitStaticFinalGetter getter method.
-    if (field->has_static && has_initializer) {
-      class_field.SetStaticValue(init_value, true);
-      if (!has_simple_literal) {
-        String& getter_name =
-            String::Handle(Z, Field::GetterSymbol(*field->name));
-        getter = Function::New(
-            getter_name, RawFunction::kImplicitStaticFinalGetter,
-            field->has_static, field->has_const,
-            /* is_abstract = */ false,
-            /* is_external = */ false,
-            /* is_native = */ false, current_class(), field->name_pos);
-        getter.set_result_type(*field->type);
-        getter.set_is_debuggable(false);
-        if (library_.is_dart_scheme() && library_.IsPrivate(*field->name)) {
-          getter.set_is_reflectable(false);
-        }
-        members->AddFunction(getter);
-      }
-    }
-
-    // For instance fields, we create implicit getter and setter methods.
-    if (!field->has_static) {
-      String& getter_name =
-          String::Handle(Z, Field::GetterSymbol(*field->name));
-      getter = Function::New(getter_name, RawFunction::kImplicitGetter,
-                             field->has_static, field->has_final,
-                             /* is_abstract = */ false,
-                             /* is_external = */ false,
-                             /* is_native = */ false, current_class(),
-                             field->name_pos);
-      ParamList params;
-      ASSERT(current_class().raw() == getter.Owner());
-      params.AddReceiver(ReceiverType(current_class()), field->name_pos);
-      getter.set_result_type(*field->type);
-      getter.set_is_debuggable(false);
-      AddFormalParamsToFunction(&params, getter);
-      ResolveSignatureTypeParameters(getter);
-      members->AddFunction(getter);
-      if (!field->has_final) {
-        // Build a setter accessor for non-const fields.
-        String& setter_name =
-            String::Handle(Z, Field::SetterSymbol(*field->name));
-        setter = Function::New(setter_name, RawFunction::kImplicitSetter,
-                               field->has_static, field->has_final,
-                               /* is_abstract = */ false,
-                               /* is_external = */ false,
-                               /* is_native = */ false, current_class(),
-                               field->name_pos);
-        ParamList params;
-        ASSERT(current_class().raw() == setter.Owner());
-        params.AddReceiver(ReceiverType(current_class()), field->name_pos);
-        params.AddFinalParameter(TokenPos(), &Symbols::Value(), field->type);
-        setter.set_result_type(Object::void_type());
-        setter.set_is_debuggable(false);
-        if (library_.is_dart_scheme() && library_.IsPrivate(*field->name)) {
-          setter.set_is_reflectable(false);
-        }
-        AddFormalParamsToFunction(&params, setter);
-        ResolveSignatureTypeParameters(setter);
-        members->AddFunction(setter);
-      }
-    }
-
-    if (CurrentToken() != Token::kCOMMA) {
-      break;
-    }
-    ConsumeToken();
-    field->name_pos = this->TokenPos();
-    field->name = ExpectIdentifier("field name expected");
-  }
-  ExpectSemicolon();
-}
-
-void Parser::CheckOperatorArity(const MemberDesc& member) {
-  intptr_t expected_num_parameters;  // Includes receiver.
-  Token::Kind op = member.operator_token;
-  if (op == Token::kASSIGN_INDEX) {
-    expected_num_parameters = 3;
-  } else if ((op == Token::kBIT_NOT) || (op == Token::kNEGATE)) {
-    expected_num_parameters = 1;
-  } else {
-    expected_num_parameters = 2;
-  }
-  if ((member.params.num_optional_parameters > 0) ||
-      member.params.has_optional_positional_parameters ||
-      member.params.has_optional_named_parameters ||
-      (member.params.num_fixed_parameters != expected_num_parameters)) {
-    // Subtract receiver when reporting number of expected arguments.
-    ReportError(member.name_pos, "operator %s expects %" Pd " argument(s)",
-                member.name->ToCString(), (expected_num_parameters - 1));
-  }
-}
-
-void Parser::CheckMemberNameConflict(ClassDesc* members, MemberDesc* member) {
-  const String& name = *member->DictName();
-  if (name.Equals(members->class_name())) {
-    ReportError(member->name_pos, "%s '%s' conflicts with class name",
-                member->ToCString(), name.ToCString());
-  }
-  if (members->clazz().LookupTypeParameter(name) != TypeParameter::null()) {
-    ReportError(member->name_pos, "%s '%s' conflicts with type parameter",
-                member->ToCString(), name.ToCString());
-  }
-  for (int i = 0; i < members->members().length(); i++) {
-    MemberDesc* existing_member = &members->members()[i];
-    if (name.Equals(*existing_member->DictName())) {
-      ReportError(
-          member->name_pos, "%s '%s' conflicts with previously declared %s",
-          member->ToCString(), name.ToCString(), existing_member->ToCString());
-    }
-  }
-}
-
-void Parser::ParseClassMemberDefinition(ClassDesc* members,
-                                        TokenPosition metadata_pos) {
-  TRACE_PARSER("ParseClassMemberDefinition");
-  MemberDesc member;
-  current_member_ = &member;
-  member.metadata_pos = metadata_pos;
-  member.decl_begin_pos = TokenPos();
-  if ((CurrentToken() == Token::kEXTERNAL) &&
-      (LookaheadToken(1) != Token::kLPAREN)) {
-    ConsumeToken();
-    member.has_external = true;
-  }
-  if ((CurrentToken() == Token::kSTATIC) &&
-      (LookaheadToken(1) != Token::kLPAREN)) {
-    ConsumeToken();
-    member.has_static = true;
-  }
-  if (CurrentToken() == Token::kCOVARIANT) {
-    ConsumeToken();
-    member.has_covariant = true;
-  }
-  if (CurrentToken() == Token::kCONST) {
-    ConsumeToken();
-    member.has_const = true;
-  } else if (CurrentToken() == Token::kFINAL) {
-    ConsumeToken();
-    member.has_final = true;
-  }
-  if (CurrentToken() == Token::kVAR) {
-    if (member.has_const) {
-      ReportError("identifier expected after 'const'");
-    }
-    if (member.has_final) {
-      ReportError("identifier expected after 'final'");
-    }
-    ConsumeToken();
-    member.has_var = true;
-    // The member type is the 'dynamic' type.
-    member.type = &Object::dynamic_type();
-  } else if ((CurrentToken() == Token::kFACTORY) &&
-             (LookaheadToken(1) != Token::kLPAREN)) {
-    ConsumeToken();
-    if (member.has_static) {
-      ReportError("factory method cannot be explicitly marked static");
-    }
-    member.has_factory = true;
-    member.has_static = true;
-    // The result type depends on the name of the factory method.
-  }
-
-  // Optionally parse a type.
-  bool found_type = false;
-  {
-    // Lookahead to determine whether the next tokens are a return type.
-    TokenPosScope saved_pos(this);
-    if (TryParseType(true)) {
-      if (IsIdentifier() || (CurrentToken() == Token::kGET) ||
-          (CurrentToken() == Token::kSET) ||
-          (CurrentToken() == Token::kOPERATOR)) {
-        found_type = true;
-      }
-    }
-  }
-  if (found_type) {
-    // It is too early to resolve the type here, since it can be a result type
-    // referring to a not yet declared function type parameter.
-    member.type = &AbstractType::ZoneHandle(
-        Z, ParseTypeOrFunctionType(true, ClassFinalizer::kDoNotResolve));
-  }
-
-  // Optionally parse a (possibly named) constructor name or factory.
-  if (IsIdentifier() &&
-      (CurrentLiteral()->Equals(members->class_name()) || member.has_factory)) {
-    member.name_pos = TokenPos();
-    member.name = CurrentLiteral();  // Unqualified identifier.
-    ConsumeToken();
-    if (member.has_factory) {
-      // The factory name may be qualified, but the first identifier must match
-      // the name of the immediately enclosing class.
-      if (!member.name->Equals(members->class_name())) {
-        ReportError(member.name_pos, "factory name must be '%s'",
-                    members->class_name().ToCString());
-      }
-    } else if (member.has_static) {
-      ReportError(member.name_pos, "constructor cannot be static");
-    }
-    if (member.type != NULL) {
-      ReportError(member.name_pos, "constructor must not specify return type");
-    }
-    // Do not bypass class resolution by using current_class() directly, since
-    // it may be a patch class.
-    const Object& result_type_class =
-        Object::Handle(Z, UnresolvedClass::New(LibraryPrefix::Handle(Z),
-                                               *member.name, member.name_pos));
-    // The type arguments of the result type are the type parameters of the
-    // current class. Note that in the case of a patch class, they are copied
-    // from the class being patched.
-    member.type = &Type::ZoneHandle(
-        Z,
-        Type::New(result_type_class,
-                  TypeArguments::Handle(Z, current_class().type_parameters()),
-                  member.name_pos));
-
-    // We must be dealing with a constructor or named constructor.
-    member.kind = RawFunction::kConstructor;
-    GrowableHandlePtrArray<const String> to_concat(Z, 3);
-    to_concat.Add(*member.name);
-    to_concat.Add(Symbols::Dot());
-    if (CurrentToken() == Token::kPERIOD) {
-      // Named constructor.
-      ConsumeToken();
-      member.dict_name = ExpectIdentifier("identifier expected");
-      to_concat.Add(*member.dict_name);
-    }
-    *member.name = Symbols::FromConcatAll(T, to_concat);
-    CheckToken(Token::kLPAREN);
-  } else if ((CurrentToken() == Token::kGET) && !member.has_var &&
-             (LookaheadToken(1) != Token::kLPAREN) &&
-             (LookaheadToken(1) != Token::kLT) &&
-             (LookaheadToken(1) != Token::kASSIGN) &&
-             (LookaheadToken(1) != Token::kCOMMA) &&
-             (LookaheadToken(1) != Token::kSEMICOLON)) {
-    ConsumeToken();
-    member.kind = RawFunction::kGetterFunction;
-    member.name_pos = this->TokenPos();
-    member.name = ExpectIdentifier("identifier expected");
-    // If the result type was not specified, it will be set to DynamicType.
-  } else if ((CurrentToken() == Token::kSET) && !member.has_var &&
-             (LookaheadToken(1) != Token::kLPAREN) &&
-             (LookaheadToken(1) != Token::kLT) &&
-             (LookaheadToken(1) != Token::kASSIGN) &&
-             (LookaheadToken(1) != Token::kCOMMA) &&
-             (LookaheadToken(1) != Token::kSEMICOLON)) {
-    ConsumeToken();
-    member.kind = RawFunction::kSetterFunction;
-    member.name_pos = this->TokenPos();
-    member.name = ExpectIdentifier("identifier expected");
-    CheckToken(Token::kLPAREN);
-    // The grammar allows a return type, so member.type is not always NULL here.
-    // If no return type is specified, the return type of the setter is dynamic.
-    if (member.type == NULL) {
-      member.type = &Object::dynamic_type();
-    }
-  } else if ((CurrentToken() == Token::kOPERATOR) && !member.has_var &&
-             (LookaheadToken(1) != Token::kLPAREN) &&
-             (LookaheadToken(1) != Token::kASSIGN) &&
-             (LookaheadToken(1) != Token::kCOMMA) &&
-             (LookaheadToken(1) != Token::kSEMICOLON)) {
-    // TODO(hausner): handle the case of a generic function named 'operator':
-    // eg: T operator<T>(a, b) => ...
-    ConsumeToken();
-    if (!Token::CanBeOverloaded(CurrentToken())) {
-      ReportError("invalid operator overloading");
-    }
-    if (member.has_static) {
-      ReportError("operator overloading functions cannot be static");
-    }
-    member.operator_token = CurrentToken();
-    member.has_operator = true;
-    member.kind = RawFunction::kRegularFunction;
-    member.name_pos = this->TokenPos();
-    member.name =
-        &String::ZoneHandle(Z, Symbols::Token(member.operator_token).raw());
-    ConsumeToken();
-  } else if (IsIdentifier()) {
-    member.name = CurrentLiteral();
-    member.name_pos = TokenPos();
-    ConsumeToken();
-  } else {
-    ReportError("identifier expected");
-  }
-
-  ASSERT(member.name != NULL);
-  if (IsParameterPart() || member.IsGetter()) {
-    // Constructor or method.
-    if (member.type == NULL) {
-      member.type = &Object::dynamic_type();
-    }
-    ASSERT(member.IsFactory() == member.has_factory);
-    // Note that member.type may still be unresolved and may refer to not yet
-    // parsed function type parameters.
-    ParseMethodOrConstructor(members, &member);
-  } else if (CurrentToken() == Token::kSEMICOLON ||
-             CurrentToken() == Token::kCOMMA ||
-             CurrentToken() == Token::kASSIGN) {
-    // Field definition.
-    if (member.has_const) {
-      // const fields are implicitly final.
-      member.has_final = true;
-    }
-    if (member.type == NULL) {
-      if (member.has_final) {
-        member.type = &Object::dynamic_type();
-      } else {
-        ReportError(
-            "missing 'var', 'final', 'const' or type"
-            " in field declaration");
-      }
-    }
-    if (!member.type->IsResolved()) {
-      AbstractType& type = AbstractType::ZoneHandle(Z, member.type->raw());
-      ResolveTypeParameters(&type);
-      member.type = &type;
-    }
-    ParseFieldDefinition(members, &member);
-  } else {
-    UnexpectedToken();
-  }
-  current_member_ = NULL;
-  CheckMemberNameConflict(members, &member);
-  members->AddMember(member);
-}
-
-void Parser::ParseEnumDeclaration(const GrowableObjectArray& pending_classes,
-                                  const Object& tl_owner,
-                                  TokenPosition metadata_pos) {
-  TRACE_PARSER("ParseEnumDeclaration");
-  const TokenPosition declaration_pos =
-      (metadata_pos.IsReal()) ? metadata_pos : TokenPos();
-  ConsumeToken();
-  const TokenPosition name_pos = TokenPos();
-  String* enum_name =
-      ExpectUserDefinedTypeIdentifier("enum type name expected");
-  if (FLAG_trace_parser) {
-    OS::PrintErr("TopLevel parsing enum '%s'\n", enum_name->ToCString());
-  }
-  ExpectToken(Token::kLBRACE);
-  if (!IsIdentifier()) {
-    ReportError("Enumeration must have at least one name");
-  }
-  while (IsIdentifier()) {
-    ConsumeToken();
-    if (CurrentToken() == Token::kCOMMA) {
-      ConsumeToken();
-      if (CurrentToken() == Token::kRBRACE) {
-        break;
-      }
-    } else if (CurrentToken() == Token::kRBRACE) {
-      break;
-    } else {
-      ReportError(", or } expected");
-    }
-  }
-  ExpectToken(Token::kRBRACE);
-
-  Object& obj = Object::Handle(Z, library_.LookupLocalObject(*enum_name));
-  if (!obj.IsNull()) {
-    ReportError(name_pos, "'%s' is already defined", enum_name->ToCString());
-  }
-  Class& cls = Class::Handle(Z);
-  cls = Class::New(library_, *enum_name, script_, declaration_pos);
-  library_.AddClass(cls);
-  cls.set_is_synthesized_class();
-  cls.set_is_enum_class();
-  if (metadata_pos.IsReal()) {
-    library_.AddClassMetadata(cls, tl_owner, metadata_pos);
-  }
-  cls.set_super_type(Type::Handle(Z, Type::ObjectType()));
-  pending_classes.Add(cls, Heap::kOld);
-}
-
-void Parser::ParseClassDeclaration(const GrowableObjectArray& pending_classes,
-                                   const Object& tl_owner,
-                                   TokenPosition metadata_pos) {
-  TRACE_PARSER("ParseClassDeclaration");
-  bool is_patch = false;
-  bool is_abstract = false;
-  TokenPosition declaration_pos =
-      metadata_pos.IsReal() ? metadata_pos : TokenPos();
-  const bool is_pragma = IsPragmaAnnotation(metadata_pos);
-  if (is_patch_source() && IsPatchAnnotation(metadata_pos)) {
-    is_patch = true;
-    metadata_pos = TokenPosition::kNoSource;
-    declaration_pos = TokenPos();
-  } else if (CurrentToken() == Token::kABSTRACT) {
-    is_abstract = true;
-    ConsumeToken();
-  }
-  ExpectToken(Token::kCLASS);
-  const TokenPosition classname_pos = TokenPos();
-  String& class_name = *ExpectUserDefinedTypeIdentifier("class name expected");
-  if (FLAG_trace_parser) {
-    OS::PrintErr("TopLevel parsing class '%s'\n", class_name.ToCString());
-  }
-  Class& cls = Class::Handle(Z);
-  TypeArguments& orig_type_parameters = TypeArguments::Handle(Z);
-  Object& obj = Object::Handle(Z, library_.LookupLocalObject(class_name));
-  if (obj.IsNull()) {
-    if (is_patch) {
-      ReportError(classname_pos, "missing class '%s' cannot be patched",
-                  class_name.ToCString());
-    }
-    cls = Class::New(library_, class_name, script_, declaration_pos);
-    library_.AddClass(cls);
-  } else {
-    if (!obj.IsClass()) {
-      ReportError(classname_pos, "'%s' is already defined",
-                  class_name.ToCString());
-    }
-    cls ^= obj.raw();
-    if (is_patch) {
-      // Preserve and reuse the original type parameters and bounds since the
-      // ones defined in the patch class will not be finalized.
-      orig_type_parameters = cls.type_parameters();
-      cls = Class::New(library_, class_name, script_, declaration_pos);
-    } else {
-      // Not patching a class, but it has been found. This must be one of the
-      // pre-registered classes from object.cc or a duplicate definition.
-      if (!(cls.is_prefinalized() || cls.IsClosureClass() ||
-            RawObject::IsImplicitFieldClassId(cls.id()))) {
-        ReportError(classname_pos, "class '%s' is already defined",
-                    class_name.ToCString());
-      }
-      // Pre-registered classes need their scripts connected at this time.
-      cls.set_script(script_);
-      cls.set_token_pos(declaration_pos);
-    }
-  }
-  if (is_pragma) {
-    cls.set_has_pragma(true);
-  }
-  ASSERT(!cls.IsNull());
-  ASSERT(cls.functions() == Object::empty_array().raw());
-  set_current_class(cls);
-  ParseTypeParameters(true);  // Parameterizing current class.
-  if (is_patch) {
-    // Check that the new type parameters are identical to the original ones.
-    const TypeArguments& new_type_parameters =
-        TypeArguments::Handle(Z, cls.type_parameters());
-    const int new_type_params_count =
-        new_type_parameters.IsNull() ? 0 : new_type_parameters.Length();
-    const int orig_type_params_count =
-        orig_type_parameters.IsNull() ? 0 : orig_type_parameters.Length();
-    if (new_type_params_count != orig_type_params_count) {
-      ReportError(classname_pos,
-                  "class '%s' must be patched with identical type parameters",
-                  class_name.ToCString());
-    }
-    TypeParameter& new_type_param = TypeParameter::Handle(Z);
-    TypeParameter& orig_type_param = TypeParameter::Handle(Z);
-    String& new_name = String::Handle(Z);
-    String& orig_name = String::Handle(Z);
-    AbstractType& new_bound = AbstractType::Handle(Z);
-    AbstractType& orig_bound = AbstractType::Handle(Z);
-    for (int i = 0; i < new_type_params_count; i++) {
-      new_type_param ^= new_type_parameters.TypeAt(i);
-      orig_type_param ^= orig_type_parameters.TypeAt(i);
-      new_name = new_type_param.name();
-      orig_name = orig_type_param.name();
-      if (!new_name.Equals(orig_name)) {
-        ReportError(new_type_param.token_pos(),
-                    "type parameter '%s' of patch class '%s' does not match "
-                    "original type parameter '%s'",
-                    new_name.ToCString(), class_name.ToCString(),
-                    orig_name.ToCString());
-      }
-      new_bound = new_type_param.bound();
-      orig_bound = orig_type_param.bound();
-      if (!new_bound.Equals(orig_bound)) {
-        ReportError(new_type_param.token_pos(),
-                    "bound '%s' of type parameter '%s' of patch class '%s' "
-                    "does not match original type parameter bound '%s'",
-                    String::Handle(new_bound.UserVisibleName()).ToCString(),
-                    new_name.ToCString(), class_name.ToCString(),
-                    String::Handle(orig_bound.UserVisibleName()).ToCString());
-      }
-      }
-    cls.set_type_parameters(orig_type_parameters);
-  }
-
-  if (is_abstract) {
-    cls.set_is_abstract();
-  }
-  if (metadata_pos.IsReal()) {
-    library_.AddClassMetadata(cls, tl_owner, metadata_pos);
-  }
-
-  const bool is_mixin_declaration = (CurrentToken() == Token::kASSIGN);
-  if (is_mixin_declaration && is_patch) {
-    ReportError(classname_pos,
-                "mixin application '%s' may not be a patch class",
-                class_name.ToCString());
-  }
-
-  AbstractType& super_type = Type::Handle(Z);
-  if ((CurrentToken() == Token::kEXTENDS) || is_mixin_declaration) {
-    ConsumeToken();  // extends or =
-    const TokenPosition type_pos = TokenPos();
-    super_type = ParseType(ClassFinalizer::kResolveTypeParameters);
-    if (super_type.IsMalformedOrMalbounded()) {
-      ReportError(Error::Handle(Z, super_type.error()));
-    }
-    if (super_type.IsDynamicType()) {
-      // Unlikely here, since super type is not resolved yet.
-      ReportError(type_pos, "class '%s' may not extend 'dynamic'",
-                  class_name.ToCString());
-    }
-    if (super_type.IsTypeParameter()) {
-      ReportError(type_pos, "class '%s' may not extend type parameter '%s'",
-                  class_name.ToCString(),
-                  String::Handle(Z, super_type.UserVisibleName()).ToCString());
-    }
-    // The class finalizer will check whether the super type is malbounded.
-    if (is_mixin_declaration) {
-      if (CurrentToken() != Token::kWITH) {
-        ReportError("mixin application clause 'with type' expected");
-      }
-      cls.set_is_mixin_app_alias();
-      cls.set_is_synthesized_class();
-    }
-    if (CurrentToken() == Token::kWITH) {
-      super_type = ParseMixins(super_type);
-    }
-  } else {
-    // No extends clause: implicitly extend Object, unless Object itself.
-    if (!cls.IsObjectClass()) {
-      super_type = Type::ObjectType();
-    }
-  }
-  ASSERT(!super_type.IsNull() || cls.IsObjectClass());
-  cls.set_super_type(super_type);
-
-  if (CurrentToken() == Token::kIMPLEMENTS) {
-    ParseInterfaceList(cls);
-  }
-
-  if (is_patch) {
-    cls.set_is_patch();
-    // Apply the changes to the patched class looked up above.
-    ASSERT(obj.raw() == library_.LookupLocalObject(class_name));
-    const Class& orig_class = Class::Cast(obj);
-    if (orig_class.is_finalized()) {
-      orig_class.SetRefinalizeAfterPatch();
-      pending_classes.Add(orig_class, Heap::kOld);
-    }
-    library_.AddPatchClass(cls);
-  }
-  pending_classes.Add(cls, Heap::kOld);
-
-  if (is_mixin_declaration) {
-    ExpectSemicolon();
-  } else {
-    CheckToken(Token::kLBRACE);
-    SkipBlock();
-    ExpectToken(Token::kRBRACE);
-  }
-}
-
-void Parser::ParseClassDefinition(const Class& cls) {
-  TRACE_PARSER("ParseClassDefinition");
-  INC_STAT(thread(), num_classes_parsed, 1);
-  set_current_class(cls);
-  is_top_level_ = true;
-  String& class_name = String::Handle(Z, cls.Name());
-  SkipMetadata();
-  if (CurrentToken() == Token::kABSTRACT) {
-    ConsumeToken();
-  }
-  ExpectToken(Token::kCLASS);
-  const TokenPosition class_pos = TokenPos();
-  ClassDesc members(Z, cls, class_name, false, class_pos);
-  while (CurrentToken() != Token::kLBRACE) {
-    ConsumeToken();
-  }
-  ExpectToken(Token::kLBRACE);
-  while (CurrentToken() != Token::kRBRACE) {
-    TokenPosition metadata_pos = SkipMetadata();
-    ParseClassMemberDefinition(&members, metadata_pos);
-  }
-  ExpectToken(Token::kRBRACE);
-
-  if (cls.LookupTypeParameter(class_name) != TypeParameter::null()) {
-    ReportError(class_pos, "class name conflicts with type parameter '%s'",
-                class_name.ToCString());
-  }
-  CheckConstructors(&members);
-
-  // Need to compute this here since MakeFixedLength() will clear the
-  // functions array in members.
-  const bool need_implicit_constructor =
-      !members.has_constructor() && !cls.is_patch();
-
-  cls.AddFields(members.fields());
-
-  // Creating a new array for functions marks the class as parsed.
-  Array& array = Array::Handle(Z, members.MakeFunctionsArray());
-  cls.SetFunctions(array);
-
-  // Add an implicit constructor if no explicit constructor is present.
-  // No implicit constructors are needed for patch classes.
-  if (need_implicit_constructor) {
-    AddImplicitConstructor(cls);
-  }
-
-  if (cls.is_patch()) {
-    // Apply the changes to the patched class looked up above.
-    Object& obj = Object::Handle(Z, library_.LookupLocalObject(class_name));
-    // The patched class must not be finalized yet.
-    const Class& orig_class = Class::Cast(obj);
-    ASSERT(!orig_class.is_finalized());
-    Error& error = Error::Handle(Z);
-    // Check if this is a case of patching a class after it has already
-    // been finalized.
-    if (orig_class.is_refinalize_after_patch()) {
-      if (!cls.ValidatePostFinalizePatch(orig_class, &error)) {
-        Report::LongJumpF(error, script_, class_pos,
-                          "patch validation failed, not applying patch.\n");
-      }
-    }
-    if (!orig_class.ApplyPatch(cls, &error)) {
-      Report::LongJumpF(error, script_, class_pos, "applying patch failed");
-    }
-  }
-}
-
-void Parser::ParseEnumDefinition(const Class& cls) {
-  TRACE_PARSER("ParseEnumDefinition");
-  INC_STAT(thread(), num_classes_parsed, 1);
-  set_current_class(cls);
-  const Class& helper_class =
-      Class::Handle(Z, Library::LookupCoreClass(Symbols::_EnumHelper()));
-  ASSERT(!helper_class.IsNull());
-
-  SkipMetadata();
-  ExpectToken(Token::kENUM);
-
-  const String& enum_name = String::Handle(Z, cls.ScrubbedName());
-  ClassDesc enum_members(Z, cls, enum_name, false, cls.token_pos());
-
-  // Add instance field 'final int index'.
-  Field& index_field = Field::ZoneHandle(Z);
-  const Type& int_type = Type::Handle(Z, Type::IntType());
-  index_field = Field::New(Symbols::Index(),
-                           false,  // Not static.
-                           true,   // Field is final.
-                           false,  // Not const.
-                           true,   // Is reflectable.
-                           cls, int_type, cls.token_pos(), cls.token_pos());
-  enum_members.AddField(index_field);
-
-  // Add implicit getter for index field.
-  const String& getter_name =
-      String::Handle(Z, Field::GetterSymbol(Symbols::Index()));
-  Function& getter = Function::Handle(Z);
-  getter = Function::New(getter_name, RawFunction::kImplicitGetter,
-                         /* is_static = */ false,
-                         /* is_const = */ true,
-                         /* is_abstract = */ false,
-                         /* is_external = */ false,
-                         /* is_native = */ false, cls, cls.token_pos());
-  getter.set_result_type(int_type);
-  getter.set_is_debuggable(false);
-  ParamList params;
-  params.AddReceiver(&Object::dynamic_type(), cls.token_pos());
-  AddFormalParamsToFunction(&params, getter);
-  ResolveSignatureTypeParameters(getter);
-  enum_members.AddFunction(getter);
-
-  ASSERT(IsIdentifier());
-  ASSERT(CurrentLiteral()->raw() == cls.Name());
-
-  ConsumeToken();  // Enum type name.
-  ExpectToken(Token::kLBRACE);
-  Field& enum_value = Field::Handle(Z);
-  intptr_t i = 0;
-  GrowableArray<String*> declared_names(8);
-
-  while (IsIdentifier()) {
-    String* enum_ident = CurrentLiteral();
-
-    // Check for name conflicts.
-    if (enum_ident->raw() == cls.Name()) {
-      ReportError("enum identifier '%s' cannot be equal to enum type name",
-                  CurrentLiteral()->ToCString());
-    } else if (enum_ident->raw() == Symbols::Index().raw()) {
-      ReportError(
-          "enum identifier conflicts with "
-          "implicit instance field 'index'");
-    } else if (enum_ident->raw() == Symbols::Values().raw()) {
-      ReportError(
-          "enum identifier conflicts with "
-          "implicit static field 'values'");
-    } else if (enum_ident->raw() == Symbols::toString().raw()) {
-      ReportError(
-          "enum identifier conflicts with "
-          "implicit instance method 'toString()'");
-    }
-    for (intptr_t n = 0; n < declared_names.length(); n++) {
-      if (enum_ident->Equals(*declared_names[n])) {
-        ReportError("Duplicate name '%s' in enum definition '%s'",
-                    enum_ident->ToCString(), enum_name.ToCString());
-      }
-    }
-    declared_names.Add(enum_ident);
-
-    // Create the static const field for the enumeration value.
-    // Note that we do not set the field type to E, because we temporarily store
-    // a Smi in the field. The class finalizer would detect the bad type and
-    // reset the value to sentinel.
-    enum_value =
-        Field::New(*enum_ident,
-                   /* is_static = */ true,
-                   /* is_final = */ true,
-                   /* is_const = */ true,
-                   /* is_reflectable = */ true, cls, Object::dynamic_type(),
-                   cls.token_pos(), cls.token_pos());
-    enum_value.set_has_initializer(false);
-    enum_members.AddField(enum_value);
-    // Initialize the field with the ordinal value. It will be patched
-    // later with the enum constant instance.
-    const Smi& ordinal_value = Smi::Handle(Z, Smi::New(i));
-    enum_value.SetStaticValue(ordinal_value, true);
-    enum_value.RecordStore(ordinal_value);
-    i++;
-
-    ConsumeToken();  // Enum value name.
-    if (CurrentToken() == Token::kCOMMA) {
-      ConsumeToken();
-    }
-  }
-  ExpectToken(Token::kRBRACE);
-
-  const Class& array_class = Class::Handle(Z, I->object_store()->array_class());
-  TypeArguments& values_type_args =
-      TypeArguments::ZoneHandle(Z, TypeArguments::New(1));
-  const Type& enum_type = Type::Handle(Type::NewNonParameterizedType(cls));
-  values_type_args.SetTypeAt(0, enum_type);
-  Type& values_type = Type::ZoneHandle(
-      Z, Type::New(array_class, values_type_args, cls.token_pos(), Heap::kOld));
-  values_type ^= CanonicalizeType(values_type);
-  values_type_args = values_type.arguments();  // Get canonical type arguments.
-  // Add static field 'const List<E> values'.
-  Field& values_field = Field::ZoneHandle(Z);
-  values_field = Field::New(Symbols::Values(),
-                            /* is_static = */ true,
-                            /* is_final = */ true,
-                            /* is_const = */ true,
-                            /* is_reflectable = */ true, cls, values_type,
-                            cls.token_pos(), cls.token_pos());
-  enum_members.AddField(values_field);
-
-  // Add static field 'const _deleted_enum_sentinel'.
-  // This field does not need to be of type E.
-  Field& deleted_enum_sentinel = Field::ZoneHandle(Z);
-  deleted_enum_sentinel =
-      Field::New(Symbols::_DeletedEnumSentinel(),
-                 /* is_static = */ true,
-                 /* is_final = */ true,
-                 /* is_const = */ true,
-                 /* is_reflectable = */ false, cls, Object::dynamic_type(),
-                 cls.token_pos(), cls.token_pos());
-  enum_members.AddField(deleted_enum_sentinel);
-
-  // Allocate the immutable array containing the enumeration values.
-  // The actual enum instance values will be patched in later.
-  const Array& values_array = Array::Handle(Z, Array::New(i, Heap::kOld));
-  values_array.SetTypeArguments(values_type_args);
-  values_field.SetStaticValue(values_array, true);
-  values_field.RecordStore(values_array);
-
-  // Clone the _name field from the helper class.
-  Field& _name_field = Field::Handle(
-      Z, helper_class.LookupInstanceFieldAllowPrivate(Symbols::_name()));
-  ASSERT(!_name_field.IsNull());
-  _name_field = _name_field.Clone(cls);
-  enum_members.AddField(_name_field);
-
-  // Add an implicit getter function for the _name field. We use the field's
-  // name directly here so that the private key matches those of the other
-  // cloned helper functions and fields.
-  const Type& string_type = Type::Handle(Z, Type::StringType());
-  const String& name_getter_name = String::Handle(
-      Z, Field::GetterSymbol(String::Handle(_name_field.name())));
-  Function& name_getter = Function::Handle(Z);
-  name_getter = Function::New(name_getter_name, RawFunction::kImplicitGetter,
-                              /* is_static = */ false,
-                              /* is_const = */ true,
-                              /* is_abstract = */ false,
-                              /* is_external = */ false,
-                              /* is_native = */ false, cls, cls.token_pos());
-  name_getter.set_result_type(string_type);
-  name_getter.set_is_debuggable(false);
-  ParamList name_params;
-  name_params.AddReceiver(&Object::dynamic_type(), cls.token_pos());
-  AddFormalParamsToFunction(&name_params, name_getter);
-  ResolveSignatureTypeParameters(name_getter);
-  enum_members.AddFunction(name_getter);
-
-  // Clone the toString() function from the helper class.
-  Function& to_string_func = Function::Handle(
-      Z, helper_class.LookupDynamicFunctionAllowPrivate(Symbols::toString()));
-  ASSERT(!to_string_func.IsNull());
-  to_string_func = to_string_func.Clone(cls);
-  enum_members.AddFunction(to_string_func);
-
-  // Clone the hashCode getter function from the helper class.
-  Function& hash_code_func = Function::Handle(
-      Z, helper_class.LookupDynamicFunctionAllowPrivate(Symbols::hashCode()));
-  ASSERT(!hash_code_func.IsNull());
-  hash_code_func = hash_code_func.Clone(cls);
-  enum_members.AddFunction(hash_code_func);
-
-  cls.AddFields(enum_members.fields());
-  const Array& functions = Array::Handle(Z, enum_members.MakeFunctionsArray());
-  cls.SetFunctions(functions);
-}
-
-// Add an implicit constructor to the given class.
-void Parser::AddImplicitConstructor(const Class& cls) {
-  // The implicit constructor is unnamed, has no explicit parameter.
-  String& ctor_name = String::ZoneHandle(Z, cls.Name());
-  ctor_name = Symbols::FromDot(T, ctor_name);
-  // To indicate that this is an implicit constructor, we set the
-  // token position and end token position of the function
-  // to the token position of the class.
-  Function& ctor = Function::Handle(
-      Z, Function::New(ctor_name, RawFunction::kConstructor,
-                       /* is_static = */ false,
-                       /* is_const = */ false,
-                       /* is_abstract = */ false,
-                       /* is_external = */ false,
-                       /* is_native = */ false, cls, cls.token_pos()));
-  ctor.set_end_token_pos(ctor.token_pos());
-  ctor.set_is_debuggable(false);
-  if (library_.is_dart_scheme() && library_.IsPrivate(ctor_name)) {
-    ctor.set_is_reflectable(false);
-  }
-
-  ParamList params;
-  // Add implicit 'this' parameter.
-  const AbstractType* receiver_type = ReceiverType(cls);
-  params.AddReceiver(receiver_type, cls.token_pos());
-
-  AddFormalParamsToFunction(&params, ctor);
-  ctor.set_result_type(Object::dynamic_type());
-  ResolveSignatureTypeParameters(ctor);
-  // The body of the constructor cannot modify the type of the constructed
-  // instance, which is passed in as the receiver.
-  ctor.set_result_type(*receiver_type);
-  cls.AddFunction(ctor);
-}
-
-void Parser::CheckFinalInitializationConflicts(const ClassDesc* class_desc,
-                                               const MemberDesc* member) {
-  const ParamList* params = &member->params;
-  if (!params->has_field_initializer) {
-    return;
-  }
-
-  const ZoneGrowableArray<ParamDesc>& parameters = *params->parameters;
-  const GrowableArray<const Field*>& fields = class_desc->fields();
-  String& field_name = String::Handle(Z);
-
-  for (intptr_t p = 0; p < parameters.length(); p++) {
-    const ParamDesc& current_param = parameters[p];
-    if (!current_param.is_field_initializer) {
-      continue;
-    }
-
-    const String& param_name = *current_param.name;
-    for (intptr_t i = 0; i < fields.length(); i++) {
-      const Field* current_field = fields.At(i);
-      if (!current_field->is_final() || !current_field->has_initializer()) {
-        continue;
-      }
-
-      field_name ^= current_field->name();
-      if (param_name.Equals(field_name)) {
-        ReportError(current_param.name_pos,
-                    "final field '%s' is already initialized.",
-                    param_name.ToCString());
-      }
-    }
-  }
-}
-
-// Check for cycles in constructor redirection.
-void Parser::CheckConstructors(ClassDesc* class_desc) {
-  // Check for cycles in constructor redirection.
-  const GrowableArray<MemberDesc>& members = class_desc->members();
-  for (int i = 0; i < members.length(); i++) {
-    MemberDesc* member = &members[i];
-    if (member->IsConstructor()) {
-      // Check that our constructors don't try and reinitialize an initialized
-      // final variable.
-      CheckFinalInitializationConflicts(class_desc, member);
-    }
-    if (member->redirect_name == NULL) {
-      continue;
-    }
-    GrowableArray<MemberDesc*> ctors;
-    while ((member != NULL) && (member->redirect_name != NULL)) {
-      ASSERT(member->IsConstructor());
-      // Check whether we have already seen this member.
-      for (int i = 0; i < ctors.length(); i++) {
-        if (ctors[i] == member) {
-          ReportError(member->name_pos,
-                      "cyclic reference in constructor redirection");
-        }
-      }
-      // We haven't seen this member. Add it to the list and follow
-      // the next redirection. If we can't find the constructor to
-      // which the current one redirects, we ignore the unresolved
-      // reference. We'll catch it later when the constructor gets
-      // compiled.
-      ctors.Add(member);
-      member = class_desc->LookupMember(*member->redirect_name);
-    }
-  }
-}
-
-void Parser::ParseMixinAppAlias(const GrowableObjectArray& pending_classes,
-                                const Object& tl_owner,
-                                TokenPosition metadata_pos) {
-  TRACE_PARSER("ParseMixinAppAlias");
-  const TokenPosition classname_pos = TokenPos();
-  String& class_name = *ExpectUserDefinedTypeIdentifier("class name expected");
-  if (FLAG_trace_parser) {
-    OS::PrintErr("toplevel parsing mixin application alias class '%s'\n",
-                 class_name.ToCString());
-  }
-  const Object& obj = Object::Handle(Z, library_.LookupLocalObject(class_name));
-  if (!obj.IsNull()) {
-    ReportError(classname_pos, "'%s' is already defined",
-                class_name.ToCString());
-  }
-  const Class& mixin_application = Class::Handle(
-      Z, Class::New(library_, class_name, script_, classname_pos));
-  mixin_application.set_is_mixin_app_alias();
-  library_.AddClass(mixin_application);
-  set_current_class(mixin_application);
-  ParseTypeParameters(true);  // Parameterizing current class.
-
-  ExpectToken(Token::kASSIGN);
-
-  if (CurrentToken() == Token::kABSTRACT) {
-    mixin_application.set_is_abstract();
-    ConsumeToken();
-  }
-
-  const TokenPosition type_pos = TokenPos();
-  AbstractType& type = AbstractType::Handle(
-      Z, ParseType(ClassFinalizer::kResolveTypeParameters));
-  if (type.IsTypeParameter()) {
-    ReportError(type_pos, "class '%s' may not extend type parameter '%s'",
-                class_name.ToCString(),
-                String::Handle(Z, type.UserVisibleName()).ToCString());
-  }
-
-  CheckToken(Token::kWITH, "mixin application 'with Type' expected");
-  type = ParseMixins(type);
-
-  mixin_application.set_super_type(type);
-  mixin_application.set_is_synthesized_class();
-
-  // This mixin application alias needs an implicit constructor, but it is
-  // too early to call 'AddImplicitConstructor(mixin_application)' here,
-  // because this class should be lazily compiled.
-  if (CurrentToken() == Token::kIMPLEMENTS) {
-    ParseInterfaceList(mixin_application);
-  }
-  ExpectSemicolon();
-  pending_classes.Add(mixin_application, Heap::kOld);
-  if (metadata_pos.IsReal()) {
-    library_.AddClassMetadata(mixin_application, tl_owner, metadata_pos);
-  }
-}
-
-// Look ahead to detect if we are seeing ident [ TypeParameters ] ("(" | "=").
-// We need this lookahead to distinguish between the optional return type
-// and the alias name of a function type alias.
-// Token position remains unchanged.
-bool Parser::IsFunctionTypeAliasName(bool* use_function_type_syntax) {
-  if (IsIdentifier()) {
-    const Token::Kind ahead = LookaheadToken(1);
-    if ((ahead == Token::kLPAREN) || (ahead == Token::kASSIGN)) {
-      *use_function_type_syntax = (ahead == Token::kASSIGN);
-      return true;
-    }
-  }
-  const TokenPosScope saved_pos(this);
-  if (IsIdentifier() && (LookaheadToken(1) == Token::kLT)) {
-    ConsumeToken();
-    if (TryParseTypeParameters()) {
-      const Token::Kind current = CurrentToken();
-      if ((current == Token::kLPAREN) || (current == Token::kASSIGN)) {
-        *use_function_type_syntax = (current == Token::kASSIGN);
-        return true;
-      }
-    }
-  }
-  *use_function_type_syntax = false;
-  return false;
-}
-
-void Parser::ParseTypedef(const GrowableObjectArray& pending_classes,
-                          const Object& tl_owner,
-                          TokenPosition metadata_pos) {
-  TRACE_PARSER("ParseTypedef");
-  TokenPosition declaration_pos =
-      metadata_pos.IsReal() ? metadata_pos : TokenPos();
-  ExpectToken(Token::kTYPEDEF);
-
-  // Distinguish between two possible typedef forms:
-  // 1) returnType? identifier typeParameters? formalParameterList ’;’
-  // 2) identifier typeParameters? '=' functionType ’;’
-
-  bool use_function_type_syntax;  // Set to false for form 1, true for form 2.
-
-  // If present, parse the result type of the function type.
-  AbstractType& result_type = Type::Handle(Z);
-  if (CurrentToken() == Token::kVOID) {
-    ConsumeToken();
-    result_type = Type::VoidType();
-    use_function_type_syntax = false;
-  } else if (!IsFunctionTypeAliasName(&use_function_type_syntax)) {
-    // Type annotations in typedef are never ignored, even in production mode.
-    // Wait until we have an owner class before resolving the result type.
-    result_type = ParseType(ClassFinalizer::kDoNotResolve);
-    ASSERT(!use_function_type_syntax);
-  }
-
-  const TokenPosition alias_name_pos = TokenPos();
-  const String* alias_name =
-      ExpectUserDefinedTypeIdentifier("function alias name expected");
-
-  // Lookup alias name and report an error if it is already defined in
-  // the library scope.
-  const Object& obj =
-      Object::Handle(Z, library_.LookupLocalObject(*alias_name));
-  if (!obj.IsNull()) {
-    ReportError(alias_name_pos, "'%s' is already defined",
-                alias_name->ToCString());
-  }
-
-  // Create the function type alias scope class. It will be linked to its
-  // signature function after it has been parsed. The type parameters, in order
-  // to be properly finalized, need to be associated to this scope class as
-  // they are parsed.
-  const Class& function_type_alias = Class::Handle(
-      Z, Class::New(library_, *alias_name, script_, declaration_pos));
-  function_type_alias.set_is_synthesized_class();
-  function_type_alias.set_is_abstract();
-  function_type_alias.set_is_prefinalized();
-  // Make sure the function type alias can be recognized as a typedef class by
-  // setting its signature function. When use_function_type_syntax is true, this
-  // temporary signature function is replaced while parsing the function type.
-  Function& signature_function = Function::Handle(
-      Z, Function::NewSignatureFunction(function_type_alias,
-                                        Function::Handle(Z), alias_name_pos));
-  function_type_alias.set_signature_function(signature_function);
-  library_.AddClass(function_type_alias);
-  ASSERT(function_type_alias.IsTypedefClass());
-  ASSERT(current_class().IsTopLevel());
-  set_current_class(function_type_alias);
-  // Parse the type parameters of the typedef class.
-  ParseTypeParameters(true);  // Parameterizing current class.
-  ASSERT(innermost_function().IsNull());
-  if (use_function_type_syntax) {
-    ExpectToken(Token::kASSIGN);
-    ASSERT(result_type.IsNull());  // Not parsed yet.
-    const Type& function_type = Type::Handle(
-        Z, ParseFunctionType(result_type, ClassFinalizer::kDoNotResolve));
-    signature_function = function_type.signature();
-  } else {
-    innermost_function_ = signature_function.raw();
-    ParamList params;
-    // Parse the formal parameters of the function type.
-    CheckToken(Token::kLPAREN, "formal parameter list expected");
-    // Add implicit closure object parameter.
-    params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(),
-                             &Object::dynamic_type());
-    const bool allow_explicit_default_values = false;
-    const bool evaluate_metadata = false;
-    ParseFormalParameterList(use_function_type_syntax,
-                             allow_explicit_default_values, evaluate_metadata,
-                             &params);
-    if (result_type.IsNull()) {
-      result_type = Type::DynamicType();
-    }
-    signature_function.set_result_type(result_type);
-    // The result type may refer to the signature function's type parameters,
-    // but was not parsed in the scope of the signature function. Adjust.
-    result_type.SetScopeFunction(signature_function);
-    AddFormalParamsToFunction(&params, signature_function);
-    ASSERT(innermost_function().raw() == signature_function.raw());
-    innermost_function_ = Function::null();
-  }
-  ExpectSemicolon();
-  ASSERT(innermost_function().IsNull());
-  ASSERT(function_type_alias.signature_function() == signature_function.raw());
-
-  // At this point, all function type parameters have been parsed and the class
-  // function_type_alias is recognized as a typedef, so we can resolve all type
-  // parameters in the signature type defined by the typedef.
-  AbstractType& function_type =
-      Type::Handle(Z, signature_function.SignatureType());
-  ASSERT(current_class().raw() == function_type_alias.raw());
-  ResolveTypeParameters(&function_type);
-  // Resolving does not replace type or signature.
-  ASSERT(function_type_alias.signature_function() ==
-         Type::Cast(function_type).signature());
-
-  if (FLAG_trace_parser) {
-    OS::PrintErr("TopLevel parsing function type alias '%s'\n",
-                 String::Handle(Z, signature_function.Signature()).ToCString());
-  }
-  // The alias should not be marked as finalized yet, since it needs to be
-  // checked in the class finalizer for illegal self references.
-  ASSERT(!function_type_alias.is_finalized());
-  pending_classes.Add(function_type_alias, Heap::kOld);
-  if (metadata_pos.IsReal()) {
-    library_.AddClassMetadata(function_type_alias, tl_owner, metadata_pos);
-  }
-}
-
-// Consumes exactly one right angle bracket. If the current token is
-// a single bracket token, it is consumed normally. However, if it is
-// a double bracket, it is replaced by a single bracket token without
-// incrementing the token index.
-void Parser::ConsumeRightAngleBracket() {
-  if (token_kind_ == Token::kGT) {
-    ConsumeToken();
-  } else if (token_kind_ == Token::kSHR) {
-    token_kind_ = Token::kGT;
-  } else {
-    UNREACHABLE();
-  }
-}
-
-bool Parser::IsPatchAnnotation(TokenPosition pos) {
-  if (pos == TokenPosition::kNoSource) {
-    return false;
-  }
-  TokenPosScope saved_pos(this);
-  SetPosition(pos);
-  while (CurrentToken() == Token::kAT) {
-    ConsumeToken();
-    if (IsSymbol(Symbols::Patch())) return true;
-    SkipOneMetadata();
-  }
-  return false;
-}
-
-bool Parser::IsPragmaAnnotation(TokenPosition pos) {
-  if (pos == TokenPosition::kNoSource) {
-    return false;
-  }
-  TokenPosScope saved_pos(this);
-  SetPosition(pos);
-  while (CurrentToken() == Token::kAT) {
-    ConsumeToken();
-    if (IsSymbol(Symbols::Pragma())) return true;
-    SkipOneMetadata();
-  }
-  return false;
-}
-
-void Parser::SkipOneMetadata() {
-  ExpectIdentifier("identifier expected");
-  if (CurrentToken() == Token::kPERIOD) {
-    ConsumeToken();
-    ExpectIdentifier("identifier expected");
-    if (CurrentToken() == Token::kPERIOD) {
-      ConsumeToken();
-      ExpectIdentifier("identifier expected");
-    }
-  }
-  if (CurrentToken() == Token::kLPAREN) {
-    SkipToMatchingParenthesis();
-  }
-}
-
-TokenPosition Parser::SkipMetadata() {
-  if (CurrentToken() != Token::kAT) {
-    return TokenPosition::kNoSource;
-  }
-  TokenPosition metadata_pos = TokenPos();
-  while (CurrentToken() == Token::kAT) {
-    ConsumeToken();
-    SkipOneMetadata();
-  }
-  return metadata_pos;
-}
-
-void Parser::SkipTypeArguments() {
-  if (CurrentToken() == Token::kLT) {
-    do {
-      ConsumeToken();
-      SkipTypeOrFunctionType(true);
-    } while (CurrentToken() == Token::kCOMMA);
-    Token::Kind token = CurrentToken();
-    if ((token == Token::kGT) || (token == Token::kSHR)) {
-      ConsumeRightAngleBracket();
-    } else {
-      ReportError("right angle bracket expected");
-    }
-  }
-}
-
-void Parser::SkipTypeParameters() {
-  // Function already parsed.
-  if (IsTypeParameters()) {
-    const bool skipped = TryParseTypeParameters();
-    ASSERT(skipped);
-  }
-}
-
-void Parser::SkipType(bool allow_void) {
-  if (CurrentToken() == Token::kVOID) {
-    if (!allow_void) {
-      ReportError("'void' not allowed here");
-    }
-    ConsumeToken();
-  } else {
-    ExpectIdentifier("type name expected");
-    if (CurrentToken() == Token::kPERIOD) {
-      ConsumeToken();
-      ExpectIdentifier("name expected");
-    }
-    SkipTypeArguments();
-  }
-}
-
-void Parser::SkipTypeOrFunctionType(bool allow_void) {
-  if (CurrentToken() == Token::kVOID) {
-    TokenPosition void_pos = TokenPos();
-    ConsumeToken();
-    // 'void' is always allowed as result type of a function type.
-    if (!allow_void && !IsFunctionTypeSymbol()) {
-      ReportError(void_pos, "'void' not allowed here");
-    }
-  } else if (!IsFunctionTypeSymbol()) {
-    // Including 'Function' not followed by '(' or '<'.
-    SkipType(false);
-  }
-  while (IsFunctionTypeSymbol()) {
-    ConsumeToken();
-    SkipTypeArguments();
-    if (CurrentToken() == Token::kLPAREN) {
-      SkipToMatchingParenthesis();
-    } else {
-      ReportError("'(' expected");
-    }
-  }
-}
-
-void Parser::ParseTypeParameters(bool parameterizing_class) {
-  TRACE_PARSER("ParseTypeParameters");
-  if (CurrentToken() == Token::kLT) {
-    GrowableArray<AbstractType*> type_parameters_array(Z, 2);
-    intptr_t index = 0;
-    TypeParameter& type_parameter = TypeParameter::Handle(Z);
-    TypeParameter& existing_type_parameter = TypeParameter::Handle(Z);
-    String& existing_type_parameter_name = String::Handle(Z);
-    AbstractType& type_parameter_bound = Type::Handle(Z);
-    do {
-      ConsumeToken();
-      const TokenPosition metadata_pos = SkipMetadata();
-      const TokenPosition type_parameter_pos = TokenPos();
-      const TokenPosition declaration_pos =
-          metadata_pos.IsReal() ? metadata_pos : type_parameter_pos;
-      String& type_parameter_name =
-          *ExpectUserDefinedTypeIdentifier("type parameter expected");
-      // Check for duplicate type parameters.
-      for (intptr_t i = 0; i < index; i++) {
-        existing_type_parameter ^= type_parameters_array.At(i)->raw();
-        existing_type_parameter_name = existing_type_parameter.name();
-        if (existing_type_parameter_name.Equals(type_parameter_name)) {
-          ReportError(type_parameter_pos, "duplicate type parameter '%s'",
-                      type_parameter_name.ToCString());
-        }
-      }
-      if (CurrentToken() == Token::kEXTENDS) {
-        ConsumeToken();
-        // A bound may refer to the owner of the type parameter it applies to,
-        // i.e. to the class or function currently being parsed.
-        // Postpone resolution in order to avoid resolving the owner and its
-        // type parameters, as they are not fully parsed yet.
-        type_parameter_bound =
-            ParseTypeOrFunctionType(false, ClassFinalizer::kDoNotResolve);
-      } else {
-        type_parameter_bound = I->object_store()->object_type();
-      }
-      // Note that we cannot yet calculate the final index of a function type
-      // parameter, because we may not have parsed the parent function yet.
-      type_parameter = TypeParameter::New(
-          parameterizing_class ? current_class() : Class::Handle(Z),
-          parameterizing_class ? Function::Handle(Z) : innermost_function(),
-          index, type_parameter_name, type_parameter_bound, declaration_pos);
-      type_parameters_array.Add(
-          &AbstractType::ZoneHandle(Z, type_parameter.raw()));
-      if (metadata_pos.IsReal()) {
-        library_.AddTypeParameterMetadata(type_parameter, metadata_pos);
-      }
-      index++;
-    } while (CurrentToken() == Token::kCOMMA);
-    Token::Kind token = CurrentToken();
-    if ((token == Token::kGT) || (token == Token::kSHR)) {
-      ConsumeRightAngleBracket();
-    } else {
-      ReportError("right angle bracket expected");
-    }
-    const TypeArguments& type_parameters =
-        TypeArguments::Handle(Z, NewTypeArguments(type_parameters_array));
-    if (parameterizing_class) {
-      current_class().set_type_parameters(type_parameters);
-    } else {
-      innermost_function().set_type_parameters(type_parameters);
-    }
-    // Resolve type parameters referenced by upper bounds.
-    const intptr_t num_types = type_parameters.Length();
-    for (intptr_t i = 0; i < num_types; i++) {
-      type_parameter ^= type_parameters.TypeAt(i);
-      type_parameter_bound = type_parameter.bound();
-      ResolveTypeParameters(&type_parameter_bound);
-      type_parameter.set_bound(type_parameter_bound);
-    }
-  }
-}
-
-RawTypeArguments* Parser::ParseTypeArguments(
-    ClassFinalizer::FinalizationKind finalization) {
-  TRACE_PARSER("ParseTypeArguments");
-  if (CurrentToken() == Token::kLT) {
-    GrowableArray<AbstractType*> types;
-    AbstractType& type = AbstractType::Handle(Z);
-    do {
-      ConsumeToken();
-      type = ParseTypeOrFunctionType(true, finalization);
-      // Map a malformed type argument to dynamic.
-      if (type.IsMalformed()) {
-        type = Type::DynamicType();
-      }
-      types.Add(&AbstractType::ZoneHandle(Z, type.raw()));
-    } while (CurrentToken() == Token::kCOMMA);
-    Token::Kind token = CurrentToken();
-    if ((token == Token::kGT) || (token == Token::kSHR)) {
-      ConsumeRightAngleBracket();
-    } else {
-      ReportError("right angle bracket expected");
-    }
-    if (finalization != ClassFinalizer::kIgnore) {
-      TypeArguments& type_args = TypeArguments::Handle(NewTypeArguments(types));
-      if (finalization == ClassFinalizer::kCanonicalize) {
-        type_args = type_args.Canonicalize();
-      }
-      return type_args.raw();
-    }
-  }
-  return TypeArguments::null();
-}
-
-// Parse interface list and add to class cls.
-void Parser::ParseInterfaceList(const Class& cls) {
-  TRACE_PARSER("ParseInterfaceList");
-  ASSERT(CurrentToken() == Token::kIMPLEMENTS);
-  const GrowableObjectArray& all_interfaces =
-      GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld));
-  AbstractType& interface = AbstractType::Handle(Z);
-  // First get all the interfaces already implemented by class.
-  Array& cls_interfaces = Array::Handle(Z, cls.interfaces());
-  for (intptr_t i = 0; i < cls_interfaces.Length(); i++) {
-    interface ^= cls_interfaces.At(i);
-    all_interfaces.Add(interface, Heap::kOld);
-  }
-  // Now parse and add the new interfaces.
-  do {
-    ConsumeToken();
-    TokenPosition interface_pos = TokenPos();
-    interface = ParseType(ClassFinalizer::kResolveTypeParameters);
-    if (interface.IsTypeParameter()) {
-      ReportError(interface_pos,
-                  "type parameter '%s' may not be used in interface list",
-                  String::Handle(Z, interface.UserVisibleName()).ToCString());
-    }
-    all_interfaces.Add(interface, Heap::kOld);
-  } while (CurrentToken() == Token::kCOMMA);
-  cls_interfaces = Array::MakeFixedLength(all_interfaces);
-  cls.set_interfaces(cls_interfaces);
-}
-
-RawAbstractType* Parser::ParseMixins(const AbstractType& super_type) {
-  TRACE_PARSER("ParseMixins");
-  ASSERT(CurrentToken() == Token::kWITH);
-  const GrowableObjectArray& mixin_types =
-      GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld));
-  AbstractType& mixin_type = AbstractType::Handle(Z);
-  do {
-    ConsumeToken();
-    mixin_type = ParseType(ClassFinalizer::kResolveTypeParameters);
-    if (mixin_type.IsDynamicType()) {
-      // The string 'dynamic' is not resolved yet at this point, but a malformed
-      // type mapped to dynamic can be encountered here.
-      ReportError(mixin_type.token_pos(), "illegal mixin of a malformed type");
-    }
-    if (mixin_type.IsTypeParameter()) {
-      ReportError(mixin_type.token_pos(),
-                  "mixin type '%s' may not be a type parameter",
-                  String::Handle(Z, mixin_type.UserVisibleName()).ToCString());
-    }
-    mixin_types.Add(mixin_type, Heap::kOld);
-  } while (CurrentToken() == Token::kCOMMA);
-  return MixinAppType::New(
-      super_type, Array::Handle(Z, Array::MakeFixedLength(mixin_types)));
-}
-
-void Parser::ParseTopLevelVariable(TopLevel* top_level,
-                                   const Object& owner,
-                                   TokenPosition metadata_pos) {
-  TRACE_PARSER("ParseTopLevelVariable");
-  const bool is_const = (CurrentToken() == Token::kCONST);
-  // Const fields are implicitly final.
-  const bool is_final = is_const || (CurrentToken() == Token::kFINAL);
-  const bool is_static = true;
-  const AbstractType& type = AbstractType::ZoneHandle(
-      Z, ParseConstFinalVarOrType(ClassFinalizer::kResolveTypeParameters));
-  Field& field = Field::Handle(Z);
-  Function& getter = Function::Handle(Z);
-  while (true) {
-    const TokenPosition name_pos = TokenPos();
-    String& var_name = *ExpectIdentifier("variable name expected");
-
-    if (library_.LookupLocalObject(var_name) != Object::null()) {
-      ReportError(name_pos, "'%s' is already defined", var_name.ToCString());
-    }
-
-    // Check whether a getter or setter for this name exists. A const
-    // or final field implies a setter which throws a NoSuchMethodError,
-    // thus we need to check for conflicts with existing setters and
-    // getters.
-    String& accessor_name =
-        String::Handle(Z, Field::LookupGetterSymbol(var_name));
-    if (!accessor_name.IsNull() &&
-        library_.LookupLocalObject(accessor_name) != Object::null()) {
-      ReportError(name_pos, "getter for '%s' is already defined",
-                  var_name.ToCString());
-    }
-    accessor_name = Field::LookupSetterSymbol(var_name);
-    if (!accessor_name.IsNull() &&
-        library_.LookupLocalObject(accessor_name) != Object::null()) {
-      ReportError(name_pos, "setter for '%s' is already defined",
-                  var_name.ToCString());
-    }
-
-    bool has_initializer = CurrentToken() == Token::kASSIGN;
-    bool has_simple_literal = false;
-    Instance& field_value = Instance::Handle(Z, Object::sentinel().raw());
-    if (has_initializer) {
-      ConsumeToken();
-      if (LookaheadToken(1) == Token::kSEMICOLON) {
-        has_simple_literal = IsSimpleLiteral(type, &field_value);
-      }
-      SkipExpr();
-    } else if (is_final) {
-      ReportError(name_pos, "missing initializer for final or const variable");
-    }
-
-    TokenPosition end_token_pos = TokenPos();
-
-    // Create the field object.
-    const bool is_reflectable =
-        !(library_.is_dart_scheme() && library_.IsPrivate(var_name));
-    field = Field::NewTopLevel(var_name, is_final, is_const, owner, name_pos,
-                               end_token_pos);
-    field.SetFieldType(type);
-    field.set_has_initializer(has_initializer);
-    field.set_is_reflectable(is_reflectable);
-    top_level->AddField(field);
-    library_.AddObject(field, var_name);
-    if (metadata_pos.IsReal()) {
-      library_.AddFieldMetadata(field, metadata_pos);
-    }
-    if (IsPragmaAnnotation(metadata_pos)) {
-      Class& toplevel = Class::Handle(library_.toplevel_class());
-      ASSERT(!toplevel.IsNull());
-      toplevel.set_has_pragma(true);
-    }
-
-    if (has_initializer) {
-      field.SetStaticValue(field_value, true);
-      if (!has_simple_literal) {
-        // Create a static final getter.
-        String& getter_name = String::Handle(Z, Field::GetterSymbol(var_name));
-        getter =
-            Function::New(getter_name, RawFunction::kImplicitStaticFinalGetter,
-                          is_static, is_const,
-                          /* is_abstract = */ false,
-                          /* is_external = */ false,
-                          /* is_native = */ false, owner, name_pos);
-        getter.set_result_type(type);
-        getter.set_is_debuggable(false);
-        getter.set_is_reflectable(is_reflectable);
-        top_level->AddFunction(getter);
-      }
-    }
-
-    if (CurrentToken() == Token::kCOMMA) {
-      ConsumeToken();
-    } else if (CurrentToken() == Token::kSEMICOLON) {
-      ConsumeToken();
-      break;
-    } else {
-      ExpectSemicolon();  // Reports error.
-    }
-  }
-}
-
-RawFunction::AsyncModifier Parser::ParseFunctionModifier() {
-  if (IsSymbol(Symbols::Async())) {
-    ConsumeToken();
-    if (CurrentToken() == Token::kMUL) {
-      const bool enableAsyncStar = true;
-      if (!enableAsyncStar) {
-        ReportError("async* generator functions are not yet supported");
-      }
-      ConsumeToken();
-      return RawFunction::kAsyncGen;
-    } else {
-      return RawFunction::kAsync;
-    }
-  } else if (IsSymbol(Symbols::Sync()) && (LookaheadToken(1) == Token::kMUL)) {
-    const bool enableSyncStar = true;
-    if (!enableSyncStar) {
-      ReportError("sync* generator functions are not yet supported");
-    }
-    ConsumeToken();
-    ConsumeToken();
-    return RawFunction::kSyncGen;
-  }
-  return RawFunction::kNoModifier;
-}
-
-void Parser::ParseTopLevelFunction(TopLevel* top_level,
-                                   const Object& owner,
-                                   TokenPosition metadata_pos) {
-  TRACE_PARSER("ParseTopLevelFunction");
-  const TokenPosition decl_begin_pos = TokenPos();
-  AbstractType& result_type = Type::Handle(Z, Type::DynamicType());
-  bool is_external = false;
-  bool is_patch = false;
-  if (is_patch_source() && IsPatchAnnotation(metadata_pos)) {
-    is_patch = true;
-    metadata_pos = TokenPosition::kNoSource;
-  } else if (CurrentToken() == Token::kEXTERNAL) {
-    ConsumeToken();
-    is_external = true;
-  }
-  const bool has_pragma = IsPragmaAnnotation(metadata_pos);
-
-  // Parse optional result type.
-  if (IsFunctionReturnType()) {
-    // It is too early to resolve the type here, since it can be a result type
-    // referring to a not yet declared function type parameter.
-    result_type = ParseTypeOrFunctionType(true, ClassFinalizer::kDoNotResolve);
-  }
-  const TokenPosition name_pos = TokenPos();
-  const String& func_name = *ExpectIdentifier("function name expected");
-
-  bool found = library_.LookupLocalObject(func_name) != Object::null();
-  if (found && !is_patch) {
-    ReportError(name_pos, "'%s' is already defined", func_name.ToCString());
-  } else if (!found && is_patch) {
-    ReportError(name_pos, "missing '%s' cannot be patched",
-                func_name.ToCString());
-  }
-  const String& accessor_name =
-      String::Handle(Z, Field::LookupGetterSymbol(func_name));
-  if (!accessor_name.IsNull() &&
-      library_.LookupLocalObject(accessor_name) != Object::null()) {
-    ReportError(name_pos, "'%s' is already defined as getter",
-                func_name.ToCString());
-  }
-  // A setter named x= may co-exist with a function named x, thus we do
-  // not need to check setters.
-
-  Function& func = Function::Handle(
-      Z, Function::New(func_name, RawFunction::kRegularFunction,
-                       /* is_static = */ true,
-                       /* is_const = */ false,
-                       /* is_abstract = */ false, is_external,
-                       /* is_native = */ false,  // May change.
-                       owner, decl_begin_pos));
-  func.set_has_pragma(has_pragma);
-  ASSERT(innermost_function().IsNull());
-  innermost_function_ = func.raw();
-
-  if (CurrentToken() == Token::kLT) {
-    ParseTypeParameters(false);  // Not parameterizing class, but function.
-  }
-
-  CheckToken(Token::kLPAREN);
-  const TokenPosition function_pos = TokenPos();
-  ParamList params;
-  const bool use_function_type_syntax = false;
-  const bool allow_explicit_default_values = true;
-  const bool evaluate_metadata = false;
-  ParseFormalParameterList(use_function_type_syntax,
-                           allow_explicit_default_values, evaluate_metadata,
-                           &params);
-
-  const TokenPosition modifier_pos = TokenPos();
-  RawFunction::AsyncModifier func_modifier = ParseFunctionModifier();
-
-  TokenPosition function_end_pos = function_pos;
-  bool is_native = false;
-  String* native_name = NULL;
-  if (is_external) {
-    function_end_pos = TokenPos();
-    ExpectSemicolon();
-  } else if (CurrentToken() == Token::kLBRACE) {
-    SkipBlock();
-    function_end_pos = TokenPos();
-    ExpectToken(Token::kRBRACE);
-  } else if (CurrentToken() == Token::kARROW) {
-    if ((func_modifier & RawFunction::kGeneratorBit) != 0) {
-      ReportError(modifier_pos,
-                  "=> style function may not be sync* or async* generator");
-    }
-    ConsumeToken();
-    BoolScope allow_await(&this->await_is_keyword_,
-                          func_modifier != RawFunction::kNoModifier);
-    SkipExpr();
-    function_end_pos = TokenPos();
-    ExpectSemicolon();
-  } else if (IsSymbol(Symbols::Native())) {
-    native_name = &ParseNativeDeclaration();
-    function_end_pos = TokenPos();
-    ExpectSemicolon();
-    is_native = true;
-    func.set_is_native(true);
-  } else {
-    ReportError("function block expected");
-  }
-  func.set_result_type(result_type);
-  // The result type may refer to func's type parameters,
-  // but was not parsed in the scope of func. Adjust.
-  result_type.SetScopeFunction(func);
-  func.set_end_token_pos(function_end_pos);
-  func.set_modifier(func_modifier);
-  if (library_.is_dart_scheme() &&
-      (library_.IsPrivate(func_name) ||
-       library_.raw() == Library::InternalLibrary())) {
-    func.set_is_reflectable(false);
-  }
-  if (is_native) {
-    func.set_native_name(*native_name);
-  }
-  AddFormalParamsToFunction(&params, func);
-  ASSERT(innermost_function().raw() == func.raw());
-  innermost_function_ = Function::null();
-  ResolveSignatureTypeParameters(func);
-  top_level->AddFunction(func);
-  if (!is_patch) {
-    library_.AddObject(func, func_name);
-  } else {
-    // Need to remove the previously added function that is being patched.
-    const Class& toplevel_cls = Class::Handle(Z, library_.toplevel_class());
-    const Function& replaced_func =
-        Function::Handle(Z, toplevel_cls.LookupStaticFunction(func_name));
-    ASSERT(!replaced_func.IsNull());
-    toplevel_cls.RemoveFunction(replaced_func);
-    library_.ReplaceObject(func, func_name);
-  }
-  if (metadata_pos.IsReal()) {
-    library_.AddFunctionMetadata(func, metadata_pos);
-  }
-}
-
-void Parser::ParseTopLevelAccessor(TopLevel* top_level,
-                                   const Object& owner,
-                                   TokenPosition metadata_pos) {
-  TRACE_PARSER("ParseTopLevelAccessor");
-  const TokenPosition decl_begin_pos = TokenPos();
-  const bool is_static = true;
-  bool is_external = false;
-  bool is_patch = false;
-  AbstractType& result_type = AbstractType::Handle(Z);
-  if (is_patch_source() && IsPatchAnnotation(metadata_pos)) {
-    is_patch = true;
-    metadata_pos = TokenPosition::kNoSource;
-  } else if (CurrentToken() == Token::kEXTERNAL) {
-    ConsumeToken();
-    is_external = true;
-  }
-  bool is_getter = (CurrentToken() == Token::kGET);
-  if (CurrentToken() == Token::kGET || CurrentToken() == Token::kSET) {
-    ConsumeToken();
-    result_type = Type::DynamicType();
-  } else {
-    result_type =
-        ParseTypeOrFunctionType(true, ClassFinalizer::kResolveTypeParameters);
-    is_getter = (CurrentToken() == Token::kGET);
-    if (CurrentToken() == Token::kGET || CurrentToken() == Token::kSET) {
-      ConsumeToken();
-    } else {
-      UnexpectedToken();
-    }
-  }
-  const TokenPosition name_pos = TokenPos();
-  const String* field_name = ExpectIdentifier("accessor name expected");
-
-  const TokenPosition accessor_pos = TokenPos();
-  ParamList params;
-
-  if (!is_getter) {
-    const bool use_function_type_syntax = false;
-    const bool allow_explicit_default_values = true;
-    const bool evaluate_metadata = false;
-    ParseFormalParameterList(use_function_type_syntax,
-                             allow_explicit_default_values, evaluate_metadata,
-                             &params);
-  }
-  String& accessor_name = String::ZoneHandle(Z);
-  int expected_num_parameters = -1;
-  if (is_getter) {
-    expected_num_parameters = 0;
-    accessor_name = Field::GetterSymbol(*field_name);
-  } else {
-    expected_num_parameters = 1;
-    accessor_name = Field::SetterSymbol(*field_name);
-  }
-  if ((params.num_fixed_parameters != expected_num_parameters) ||
-      (params.num_optional_parameters != 0)) {
-    ReportError(name_pos, "illegal %s parameters",
-                is_getter ? "getter" : "setter");
-  }
-
-  // Check whether this getter conflicts with a function or top-level variable
-  // with the same name.
-  if (is_getter &&
-      (library_.LookupLocalObject(*field_name) != Object::null())) {
-    ReportError(name_pos, "'%s' is already defined in this library",
-                field_name->ToCString());
-  }
-  // Check whether this setter conflicts with the implicit setter
-  // of a top-level variable with the same name.
-  if (!is_getter &&
-      (library_.LookupLocalField(*field_name) != Object::null())) {
-    ReportError(name_pos, "Variable '%s' is already defined in this library",
-                field_name->ToCString());
-  }
-  bool found = library_.LookupLocalObject(accessor_name) != Object::null();
-  if (found && !is_patch) {
-    ReportError(name_pos, "%s for '%s' is already defined",
-                is_getter ? "getter" : "setter", field_name->ToCString());
-  } else if (!found && is_patch) {
-    ReportError(name_pos, "missing %s for '%s' cannot be patched",
-                is_getter ? "getter" : "setter", field_name->ToCString());
-  }
-
-  const TokenPosition modifier_pos = TokenPos();
-  RawFunction::AsyncModifier func_modifier = ParseFunctionModifier();
-  if (!is_getter && (func_modifier != RawFunction::kNoModifier)) {
-    ReportError(modifier_pos,
-                "setter function cannot be async, async* or sync*");
-  }
-
-  TokenPosition accessor_end_pos = accessor_pos;
-  bool is_native = false;
-  String* native_name = NULL;
-  if (is_external) {
-    accessor_end_pos = TokenPos();
-    ExpectSemicolon();
-  } else if (CurrentToken() == Token::kLBRACE) {
-    SkipBlock();
-    accessor_end_pos = TokenPos();
-    ExpectToken(Token::kRBRACE);
-  } else if (CurrentToken() == Token::kARROW) {
-    if (is_getter && ((func_modifier & RawFunction::kGeneratorBit) != 0)) {
-      ReportError(modifier_pos,
-                  "=> style getter may not be sync* or async* generator");
-    }
-    ConsumeToken();
-    BoolScope allow_await(&this->await_is_keyword_,
-                          func_modifier != RawFunction::kNoModifier);
-    SkipExpr();
-    accessor_end_pos = TokenPos();
-    ExpectSemicolon();
-  } else if (IsSymbol(Symbols::Native())) {
-    native_name = &ParseNativeDeclaration();
-    accessor_end_pos = TokenPos();
-    ExpectSemicolon();
-    is_native = true;
-  } else {
-    ReportError("function block expected");
-  }
-  Function& func = Function::Handle(
-      Z, Function::New(accessor_name,
-                       is_getter ? RawFunction::kGetterFunction
-                                 : RawFunction::kSetterFunction,
-                       is_static,
-                       /* is_const = */ false,
-                       /* is_abstract = */ false, is_external, is_native, owner,
-                       decl_begin_pos));
-  func.set_result_type(result_type);
-  // The result type may refer to func's type parameters,
-  // but was not parsed in the scope of func. Adjust.
-  result_type.SetScopeFunction(func);
-  func.set_end_token_pos(accessor_end_pos);
-  func.set_modifier(func_modifier);
-  if (is_native) {
-    func.set_is_debuggable(false);
-    func.set_native_name(*native_name);
-  }
-  if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) {
-    func.set_is_reflectable(false);
-  }
-  AddFormalParamsToFunction(&params, func);
-  ResolveSignatureTypeParameters(func);
-  top_level->AddFunction(func);
-  if (!is_patch) {
-    library_.AddObject(func, accessor_name);
-  } else {
-    // Need to remove the previously added accessor that is being patched.
-    const Class& toplevel_cls = Class::Handle(
-        Z, owner.IsClass() ? Class::Cast(owner).raw()
-                           : PatchClass::Cast(owner).patched_class());
-    const Function& replaced_func =
-        Function::Handle(Z, toplevel_cls.LookupFunction(accessor_name));
-    ASSERT(!replaced_func.IsNull());
-    toplevel_cls.RemoveFunction(replaced_func);
-    library_.ReplaceObject(func, accessor_name);
-  }
-  if (metadata_pos.IsReal()) {
-    library_.AddFunctionMetadata(func, metadata_pos);
-  }
-}
-
-RawObject* Parser::CallLibraryTagHandler(Dart_LibraryTag tag,
-                                         TokenPosition token_pos,
-                                         const String& url) {
-  Dart_LibraryTagHandler handler = I->library_tag_handler();
-  if (handler == NULL) {
-    if (url.StartsWith(Symbols::DartScheme())) {
-      if (tag == Dart_kCanonicalizeUrl) {
-        return url.raw();
-      }
-      return Object::null();
-    }
-    ReportError(token_pos, "no library handler registered");
-  }
-  // Block class finalization attempts when calling into the library
-  // tag handler.
-  I->BlockClassFinalization();
-  Object& result = Object::Handle(Z);
-  {
-    TransitionVMToNative transition(T);
-    Api::Scope api_scope(T);
-    Dart_Handle retval = handler(tag, Api::NewHandle(T, library_.raw()),
-                                 Api::NewHandle(T, url.raw()));
-    result = Api::UnwrapHandle(retval);
-  }
-  I->UnblockClassFinalization();
-  if (result.IsError()) {
-    // In case of an error we append an explanatory error message to the
-    // error obtained from the library tag handler.
-    const Error& prev_error = Error::Cast(result);
-    Report::LongJumpF(prev_error, script_, token_pos, "library handler failed");
-  }
-  if (tag == Dart_kCanonicalizeUrl) {
-    if (!result.IsString()) {
-      ReportError(token_pos, "library handler failed URI canonicalization");
-    }
-  }
-  return result.raw();
-}
-
-void Parser::ParseLibraryName() {
-  ASSERT(CurrentToken() == Token::kLIBRARY);
-  ConsumeToken();
-  String& lib_name = *ExpectIdentifier("library name expected");
-  if (CurrentToken() == Token::kPERIOD) {
-    GrowableHandlePtrArray<const String> pieces(Z, 3);
-    pieces.Add(lib_name);
-    while (CurrentToken() == Token::kPERIOD) {
-      ConsumeToken();
-      pieces.Add(Symbols::Dot());
-      pieces.Add(*ExpectIdentifier("malformed library name"));
-    }
-    lib_name = Symbols::FromConcatAll(T, pieces);
-  }
-  library_.SetName(lib_name);
-  ExpectSemicolon();
-}
-
-void Parser::ParseIdentList(GrowableObjectArray* names) {
-  if (!IsIdentifier()) {
-    ReportError("identifier expected");
-  }
-  while (IsIdentifier()) {
-    names->Add(*CurrentLiteral(), allocation_space_);
-    ConsumeToken();  // Identifier.
-    if (CurrentToken() != Token::kCOMMA) {
-      return;
-    }
-    ConsumeToken();  // Comma.
-  }
-}
-
-void Parser::ParseLibraryImportExport(const Object& tl_owner,
-                                      TokenPosition metadata_pos) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-  bool is_import = (CurrentToken() == Token::kIMPORT);
-  bool is_export = (CurrentToken() == Token::kEXPORT);
-  ASSERT(is_import || is_export);
-  const TokenPosition import_pos = TokenPos();
-  ConsumeToken();
-  CheckToken(Token::kSTRING, "library url expected");
-  AstNode* url_literal = ParseStringLiteral(false);
-  if (FLAG_conditional_directives) {
-    bool condition_triggered = false;
-    while (CurrentToken() == Token::kIF) {
-      // Conditional import: if (env == val) uri.
-      ConsumeToken();
-      ExpectToken(Token::kLPAREN);
-      // Parse dotted name.
-      const GrowableObjectArray& pieces = GrowableObjectArray::Handle(
-          Z, GrowableObjectArray::New(allocation_space_));
-      pieces.Add(*ExpectIdentifier("identifier expected"), allocation_space_);
-      while (CurrentToken() == Token::kPERIOD) {
-        pieces.Add(Symbols::Dot(), allocation_space_);
-        ConsumeToken();
-        pieces.Add(*ExpectIdentifier("identifier expected"), allocation_space_);
-      }
-      if (I->obfuscate()) {
-        // If we are obfuscating then we need to deobfuscate environment name.
-        Obfuscator::Deobfuscate(T, pieces);
-      }
-      AstNode* valueNode = NULL;
-      if (CurrentToken() == Token::kEQ) {
-        ConsumeToken();
-        CheckToken(Token::kSTRING, "string literal expected");
-        valueNode = ParseStringLiteral(false);
-        ASSERT(valueNode->IsLiteralNode());
-        ASSERT(valueNode->AsLiteralNode()->literal().IsString());
-      }
-      ExpectToken(Token::kRPAREN);
-      CheckToken(Token::kSTRING, "library url expected");
-      AstNode* conditional_url_literal = ParseStringLiteral(false);
-
-      // If there was already a condition that triggered, don't try to match
-      // again.
-      if (condition_triggered) {
-        continue;
-      }
-      // Check if this conditional line overrides the default import.
-      const String& key = String::Handle(String::ConcatAll(
-          Array::Handle(Array::MakeFixedLength(pieces)), allocation_space_));
-      const String& value =
-          (valueNode == NULL)
-              ? Symbols::True()
-              : String::Cast(valueNode->AsLiteralNode()->literal());
-      // Call the embedder to supply us with the environment.
-      const String& env_value =
-          String::Handle(Api::GetEnvironmentValue(T, key));
-      if (!env_value.IsNull() && env_value.Equals(value)) {
-        condition_triggered = true;
-        url_literal = conditional_url_literal;
-      }
-    }
-  }
-  ASSERT(url_literal->IsLiteralNode());
-  ASSERT(url_literal->AsLiteralNode()->literal().IsString());
-  const String& url = String::Cast(url_literal->AsLiteralNode()->literal());
-  if (url.Length() == 0) {
-    ReportError("library url expected");
-  }
-  bool is_deferred_import = false;
-  if (is_import && (CurrentToken() == Token::kDEFERRED)) {
-    is_deferred_import = true;
-    ConsumeToken();
-    CheckToken(Token::kAS, "'as' expected");
-  }
-  String& prefix = String::Handle(Z);
-  TokenPosition prefix_pos = TokenPosition::kNoSource;
-  if (is_import && (CurrentToken() == Token::kAS)) {
-    ConsumeToken();
-    prefix_pos = TokenPos();
-    prefix =
-        ExpectUserDefinedTypeIdentifier("prefix identifier expected")->raw();
-  }
-
-  Array& show_names = Array::Handle(Z);
-  Array& hide_names = Array::Handle(Z);
-  if (is_deferred_import || IsSymbol(Symbols::Show()) ||
-      IsSymbol(Symbols::Hide())) {
-    GrowableObjectArray& show_list = GrowableObjectArray::Handle(
-        Z, GrowableObjectArray::New(allocation_space_));
-    GrowableObjectArray& hide_list = GrowableObjectArray::Handle(
-        Z, GrowableObjectArray::New(allocation_space_));
-    // Libraries imported through deferred import automatically hide
-    // the name 'loadLibrary'.
-    if (is_deferred_import) {
-      hide_list.Add(Symbols::LoadLibrary());
-    }
-    for (;;) {
-      if (IsSymbol(Symbols::Show())) {
-        ConsumeToken();
-        ParseIdentList(&show_list);
-      } else if (IsSymbol(Symbols::Hide())) {
-        ConsumeToken();
-        ParseIdentList(&hide_list);
-      } else {
-        break;
-      }
-    }
-    if (show_list.Length() > 0) {
-      show_names = Array::MakeFixedLength(show_list);
-    }
-    if (hide_list.Length() > 0) {
-      hide_names = Array::MakeFixedLength(hide_list);
-    }
-  }
-  ExpectSemicolon();
-
-  // Canonicalize library URL.
-  const String& canon_url = String::CheckedHandle(
-      CallLibraryTagHandler(Dart_kCanonicalizeUrl, import_pos, url));
-
-  // Create a new library if it does not exist yet.
-  Library& library = Library::Handle(Z, Library::LookupLibrary(T, canon_url));
-  if (library.IsNull()) {
-    library = Library::New(canon_url);
-    library.Register(T);
-  }
-
-  // If loading hasn't been requested yet, and if this is not a deferred
-  // library import, call the library tag handler to request loading
-  // the library.
-  if (library.LoadNotStarted() &&
-      (!is_deferred_import || FLAG_load_deferred_eagerly)) {
-    library.SetLoadRequested();
-    CallLibraryTagHandler(Dart_kImportTag, import_pos, canon_url);
-  }
-
-  Namespace& ns =
-      Namespace::Handle(Z, Namespace::New(library, show_names, hide_names));
-  if (metadata_pos.IsReal()) {
-    ns.AddMetadata(tl_owner, metadata_pos);
-  }
-
-  // Ensure that private dart:_ libraries are only imported into dart:
-  // libraries, including indirectly through exports.
-  const String& lib_url = String::Handle(Z, library_.url());
-  if (canon_url.StartsWith(Symbols::DartSchemePrivate()) &&
-      !lib_url.StartsWith(Symbols::DartScheme()) &&
-      !lib_url.StartsWith(Symbols::DartInternalPackage())) {
-    ReportError(import_pos, "private library is not accessible");
-  }
-
-  if (!FLAG_enable_mirrors && Symbols::DartMirrors().Equals(canon_url)) {
-    ReportError(import_pos,
-                "import of dart:mirrors with --enable-mirrors=false");
-  }
-
-  if (is_import) {
-    if (prefix.IsNull() || (prefix.Length() == 0)) {
-      ASSERT(!is_deferred_import);
-      library_.AddImport(ns);
-    } else {
-      LibraryPrefix& library_prefix = LibraryPrefix::Handle(Z);
-      library_prefix = library_.LookupLocalLibraryPrefix(prefix);
-      if (!library_prefix.IsNull()) {
-        // Check that prefix names of deferred import clauses are
-        // unique.
-        if (!is_deferred_import && library_prefix.is_deferred_load()) {
-          ReportError(prefix_pos,
-                      "prefix '%s' already used in a deferred import clause",
-                      prefix.ToCString());
-        }
-        if (is_deferred_import) {
-          ReportError(prefix_pos, "prefix of deferred import must be unique");
-        }
-        library_prefix.AddImport(ns);
-      } else {
-        library_prefix =
-            LibraryPrefix::New(prefix, ns, is_deferred_import, library_);
-        library_.AddObject(library_prefix, prefix);
-      }
-    }
-  } else {
-    ASSERT(is_export);
-    library_.AddExport(ns);
-  }
-}
-
-void Parser::ParseLibraryPart() {
-  const TokenPosition source_pos = TokenPos();
-  ConsumeToken();  // Consume "part".
-  if (IsSymbol(Symbols::Of())) {
-    ReportError("part of declarations are not allowed in script files");
-  }
-  CheckToken(Token::kSTRING, "url expected");
-  AstNode* url_literal = ParseStringLiteral(false);
-  ASSERT(url_literal->IsLiteralNode());
-  ASSERT(url_literal->AsLiteralNode()->literal().IsString());
-  const String& url = String::Cast(url_literal->AsLiteralNode()->literal());
-  ExpectSemicolon();
-  const String& canon_url = String::CheckedHandle(
-      CallLibraryTagHandler(Dart_kCanonicalizeUrl, source_pos, url));
-  CallLibraryTagHandler(Dart_kSourceTag, source_pos, canon_url);
-}
-
-void Parser::ParseLibraryDefinition(const Object& tl_owner) {
-  TRACE_PARSER("ParseLibraryDefinition");
-
-  // Handle the script tag.
-  if (CurrentToken() == Token::kSCRIPTTAG) {
-    // Nothing to do for script tags except to skip them.
-    ConsumeToken();
-  }
-
-  ASSERT(script_.kind() != RawScript::kSourceTag);
-
-  // We may read metadata tokens that are part of the toplevel
-  // declaration that follows the library definitions. Therefore, we
-  // need to remember the position of the last token that was
-  // successfully consumed.
-  TokenPosition rewind_pos = TokenPos();
-  TokenPosition metadata_pos = SkipMetadata();
-  if (CurrentToken() == Token::kLIBRARY) {
-    if (is_patch_source()) {
-      ReportError("patch cannot override library name");
-    }
-    ParseLibraryName();
-    if (metadata_pos.IsReal()) {
-      library_.AddLibraryMetadata(tl_owner, metadata_pos);
-    }
-    rewind_pos = TokenPos();
-    metadata_pos = SkipMetadata();
-  }
-  while ((CurrentToken() == Token::kIMPORT) ||
-         (CurrentToken() == Token::kEXPORT)) {
-    ParseLibraryImportExport(tl_owner, metadata_pos);
-    rewind_pos = TokenPos();
-    metadata_pos = SkipMetadata();
-  }
-  // Core lib has not been explicitly imported, so we implicitly
-  // import it here.
-  if (!library_.ImportsCorelib()) {
-    Library& core_lib = Library::Handle(Z, Library::CoreLibrary());
-    ASSERT(!core_lib.IsNull());
-    const Namespace& core_ns = Namespace::Handle(
-        Z,
-        Namespace::New(core_lib, Object::null_array(), Object::null_array()));
-    library_.AddImport(core_ns);
-  }
-  while (CurrentToken() == Token::kPART) {
-    ParseLibraryPart();
-    rewind_pos = TokenPos();
-    metadata_pos = SkipMetadata();
-  }
-  SetPosition(rewind_pos);
-}
-
-void Parser::ParsePartHeader() {
-  SkipMetadata();
-  CheckToken(Token::kPART, "'part of' expected");
-  ConsumeToken();
-  if (!IsSymbol(Symbols::Of())) {
-    ReportError("'part of' expected");
-  }
-  ConsumeToken();
-  // The VM is not required to check that the library name or URI matches the
-  // name or URI of the current library, so we ignore them.
-  if (CurrentToken() == Token::kSTRING) {
-    ParseStringLiteral(false);
-  } else {
-    ExpectIdentifier("library name expected");
-    while (CurrentToken() == Token::kPERIOD) {
-      ConsumeToken();
-      ExpectIdentifier("malformed library name");
-    }
-  }
-  ExpectSemicolon();
-}
-
-void Parser::ParseTopLevel() {
-  TRACE_PARSER("ParseTopLevel");
-  // Collect the classes found at the top level in this growable array.
-  // They need to be registered with class finalization after parsing
-  // has been completed.
-  ObjectStore* object_store = I->object_store();
-  const GrowableObjectArray& pending_classes =
-      GrowableObjectArray::Handle(Z, object_store->pending_classes());
-  SetPosition(TokenPosition::kMinSource);
-  is_top_level_ = true;
-  TopLevel top_level(Z);
-
-  Object& tl_owner = Object::Handle(Z);
-  Class& toplevel_class = Class::Handle(Z, library_.toplevel_class());
-  if (toplevel_class.IsNull()) {
-    toplevel_class =
-        Class::New(library_, Symbols::TopLevel(), script_, TokenPos());
-    toplevel_class.set_library(library_);
-    library_.set_toplevel_class(toplevel_class);
-    tl_owner = toplevel_class.raw();
-  } else {
-    tl_owner = PatchClass::New(toplevel_class, script_);
-  }
-
-  if (is_library_source() || is_patch_source()) {
-    set_current_class(toplevel_class);
-    ParseLibraryDefinition(tl_owner);
-  } else if (is_part_source()) {
-    ParsePartHeader();
-  }
-
-  const Class& cls = Class::Handle(Z);
-  while (true) {
-    set_current_class(cls);  // No current class.
-    TokenPosition metadata_pos = SkipMetadata();
-    if (CurrentToken() == Token::kCLASS) {
-      ParseClassDeclaration(pending_classes, tl_owner, metadata_pos);
-    } else if (CurrentToken() == Token::kENUM) {
-      ParseEnumDeclaration(pending_classes, tl_owner, metadata_pos);
-    } else if ((CurrentToken() == Token::kTYPEDEF) &&
-               (LookaheadToken(1) != Token::kLPAREN)) {
-      set_current_class(toplevel_class);
-      ParseTypedef(pending_classes, tl_owner, metadata_pos);
-    } else if ((CurrentToken() == Token::kABSTRACT) &&
-               (LookaheadToken(1) == Token::kCLASS)) {
-      ParseClassDeclaration(pending_classes, tl_owner, metadata_pos);
-    } else {
-      set_current_class(toplevel_class);
-      if (IsVariableDeclaration()) {
-        ParseTopLevelVariable(&top_level, tl_owner, metadata_pos);
-      } else if (IsFunctionDeclaration()) {
-        ParseTopLevelFunction(&top_level, tl_owner, metadata_pos);
-      } else if (IsTopLevelAccessor()) {
-        ParseTopLevelAccessor(&top_level, tl_owner, metadata_pos);
-      } else if (CurrentToken() == Token::kEOS) {
-        break;
-      } else {
-        UnexpectedToken();
-      }
-    }
-  }
-
-  if (top_level.fields().length() > 0) {
-    toplevel_class.AddFields(top_level.fields());
-  }
-  for (intptr_t i = 0; i < top_level.functions().length(); i++) {
-    toplevel_class.AddFunction(*top_level.functions()[i]);
-  }
-  if (toplevel_class.is_finalized()) {
-    toplevel_class.ResetFinalization();
-  }
-  pending_classes.Add(toplevel_class, Heap::kOld);
-}
-
-void Parser::ChainNewBlock(LocalScope* outer_scope) {
-  Block* block = new (Z) Block(current_block_, outer_scope,
-                               new (Z) SequenceNode(TokenPos(), outer_scope));
-  current_block_ = block;
-}
-
-void Parser::OpenBlock() {
-  ASSERT(current_block_ != NULL);
-  LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new (Z) LocalScope(outer_scope, outer_scope->function_level(),
-                                   outer_scope->loop_level()));
-}
-
-void Parser::OpenLoopBlock() {
-  ASSERT(current_block_ != NULL);
-  LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new (Z) LocalScope(outer_scope, outer_scope->function_level(),
-                                   outer_scope->loop_level() + 1));
-}
-
-void Parser::OpenFunctionBlock(const Function& func) {
-  LocalScope* outer_scope;
-  if (current_block_ == NULL) {
-    if (!func.IsLocalFunction()) {
-      // We are compiling a non-nested function.
-      outer_scope = new (Z) LocalScope(NULL, 0, 0);
-    } else {
-      // We are compiling the function of an invoked closure.
-      // Restore the outer scope containing all captured variables.
-      const ContextScope& context_scope =
-          ContextScope::Handle(Z, func.context_scope());
-      ASSERT(!context_scope.IsNull());
-      outer_scope = new (Z)
-          LocalScope(LocalScope::RestoreOuterScope(context_scope), 0, 0);
-    }
-  } else {
-    // We are parsing a nested function while compiling the enclosing function.
-    outer_scope = new (Z) LocalScope(
-        current_block_->scope, current_block_->scope->function_level() + 1, 0);
-  }
-  ChainNewBlock(outer_scope);
-}
-
-void Parser::OpenAsyncClosure() {
-  TRACE_PARSER("OpenAsyncClosure");
-  async_temp_scope_ = current_block_->scope;
-  OpenAsyncTryBlock();
-}
-
-SequenceNode* Parser::CloseAsyncGeneratorTryBlock(SequenceNode* body) {
-  TRACE_PARSER("CloseAsyncGeneratorTryBlock");
-  // The generated try-catch-finally that wraps the async generator function
-  // body is the outermost try statement.
-  ASSERT(try_stack_ != NULL);
-  ASSERT(try_stack_->outer_try() == NULL);
-  // We only get here when parsing an async generator body.
-  ASSERT(innermost_function().IsAsyncGenClosure());
-
-  const TokenPosition try_end_pos = innermost_function().end_token_pos();
-
-  // The try-block (closure body code) has been parsed. We are now
-  // generating the code for the catch block.
-  LocalScope* try_scope = current_block_->scope;
-  try_stack_->enter_catch();
-  OpenBlock();  // Catch handler list.
-  OpenBlock();  // Catch block.
-
-  // Add the exception and stack trace parameters to the scope.
-  CatchParamDesc exception_param;
-  CatchParamDesc stack_trace_param;
-  exception_param.token_pos = TokenPosition::kNoSource;
-  exception_param.type = &Object::dynamic_type();
-  exception_param.name = &Symbols::ExceptionParameter();
-  stack_trace_param.token_pos = TokenPosition::kNoSource;
-  stack_trace_param.type = &Object::dynamic_type();
-  stack_trace_param.name = &Symbols::StackTraceParameter();
-
-  AddCatchParamsToScope(&exception_param, &stack_trace_param,
-                        current_block_->scope);
-
-  // Generate code to save the exception object and stack trace
-  // in local variables.
-  LocalVariable* context_var =
-      try_scope->LocalLookupVariable(Symbols::SavedTryContextVar());
-  ASSERT(context_var != NULL);
-
-  LocalVariable* exception_var =
-      try_scope->LocalLookupVariable(Symbols::ExceptionVar());
-  ASSERT(exception_var != NULL);
-  if (exception_param.var != NULL) {
-    // Generate code to load the exception object (:exception_var) into
-    // the exception variable specified in this block.
-    current_block_->statements->Add(new (Z) StoreLocalNode(
-        TokenPosition::kNoSource, exception_param.var,
-        new (Z) LoadLocalNode(TokenPosition::kNoSource, exception_var)));
-  }
-
-  LocalVariable* stack_trace_var =
-      try_scope->LocalLookupVariable(Symbols::StackTraceVar());
-  ASSERT(stack_trace_var != NULL);
-  if (stack_trace_param.var != NULL) {
-    // A stack trace variable is specified in this block, so generate code
-    // to load the stack trace object (:stack_trace_var) into the stack
-    // trace variable specified in this block.
-    current_block_->statements->Add(new (Z) StoreLocalNode(
-        TokenPosition::kNoSource, stack_trace_param.var,
-        new (Z) LoadLocalNode(TokenPosition::kNoSource, stack_trace_var)));
-  }
-  LocalVariable* saved_exception_var =
-      try_scope->LocalLookupVariable(Symbols::SavedExceptionVar());
-  LocalVariable* saved_stack_trace_var =
-      try_scope->LocalLookupVariable(Symbols::SavedStackTraceVar());
-  SaveExceptionAndStackTrace(current_block_->statements, exception_var,
-                             stack_trace_var, saved_exception_var,
-                             saved_stack_trace_var);
-
-  // Catch block: add the error to the stream.
-  // :controller.AddError(:exception, :stack_trace);
-  // return;  // The finally block will close the stream.
-  LocalVariable* controller =
-      current_block_->scope->LookupVariable(Symbols::ColonController(), false);
-  ASSERT(controller != NULL);
-  ArgumentListNode* args = new (Z) ArgumentListNode(TokenPosition::kNoSource);
-  args->Add(new (Z)
-                LoadLocalNode(TokenPosition::kNoSource, exception_param.var));
-  args->Add(new (Z)
-                LoadLocalNode(TokenPosition::kNoSource, stack_trace_param.var));
-  current_block_->statements->Add(new (Z) InstanceCallNode(
-      try_end_pos, new (Z) LoadLocalNode(TokenPosition::kNoSource, controller),
-      Symbols::AddError(), args));
-  ReturnNode* return_node = new (Z) ReturnNode(try_end_pos);
-  AddNodeForFinallyInlining(return_node);
-  current_block_->statements->Add(return_node);
-  AstNode* catch_block = CloseBlock();
-  current_block_->statements->Add(catch_block);
-  SequenceNode* catch_handler_list = CloseBlock();
-
-  TryStack* try_statement = PopTry();
-  ASSERT(try_stack_ == NULL);  // We popped the outermost try block.
-
-  // Finally block: closing the stream and returning. Instead of simply
-  // returning, create an await state and suspend. There may be outstanding
-  // calls to schedule the generator body. This suspension ensures that we
-  // do not repeat any code of the generator body.
-  // :controller.close();
-  // suspend;
-  // We need to inline this code in all recorded exit points.
-  intptr_t node_index = 0;
-  SequenceNode* finally_clause = NULL;
-  if (try_stack_ != NULL) {
-    try_stack_->enter_finally();
-  }
-  do {
-    OpenBlock();
-    ArgumentListNode* no_args =
-        new (Z) ArgumentListNode(TokenPosition::kNoSource);
-    current_block_->statements->Add(new (Z) InstanceCallNode(
-        try_end_pos,
-        new (Z) LoadLocalNode(TokenPosition::kNoSource, controller),
-        Symbols::Close(), no_args));
-
-    // Suspend after the close.
-    AwaitMarkerNode* await_marker = new (Z) AwaitMarkerNode(
-        async_temp_scope_, current_block_->scope, TokenPosition::kNoSource);
-    current_block_->statements->Add(await_marker);
-    ReturnNode* continuation_ret = new (Z) ReturnNode(try_end_pos);
-    continuation_ret->set_return_type(ReturnNode::kContinuationTarget);
-    current_block_->statements->Add(continuation_ret);
-
-    finally_clause = CloseBlock();
-    AstNode* node_to_inline = try_statement->GetNodeToInlineFinally(node_index);
-    if (node_to_inline != NULL) {
-      InlinedFinallyNode* node =
-          new (Z) InlinedFinallyNode(try_end_pos, finally_clause, context_var,
-                                     // No outer try statement
-                                     CatchClauseNode::kInvalidTryIndex);
-      finally_clause = NULL;
-      AddFinallyClauseToNode(true, node_to_inline, node);
-      node_index++;
-    }
-  } while (finally_clause == NULL);
-
-  if (try_stack_ != NULL) {
-    try_stack_->exit_finally();
-  }
-
-  // Catch block handles all exceptions.
-  const Array& handler_types = Array::ZoneHandle(Z, Array::New(1, Heap::kOld));
-  handler_types.SetAt(0, Object::dynamic_type());
-
-  CatchClauseNode* catch_clause = new (Z) CatchClauseNode(
-      TokenPosition::kNoSource, catch_handler_list, handler_types, context_var,
-      exception_var, stack_trace_var, saved_exception_var,
-      saved_stack_trace_var, AllocateTryIndex(), true);
-
-  const intptr_t try_index = try_statement->try_index();
-
-  AstNode* try_catch_node = new (Z)
-      TryCatchNode(TokenPosition::kNoSource, body, context_var, catch_clause,
-                   finally_clause, try_index, finally_clause);
-  current_block_->statements->Add(try_catch_node);
-  return CloseBlock();
-}
-
-SequenceNode* Parser::CloseAsyncTryBlock(SequenceNode* try_block,
-                                         TokenPosition func_end_pos) {
-  // This is the outermost try-catch of the function.
-  ASSERT(try_stack_ != NULL);
-  ASSERT(try_stack_->outer_try() == NULL);
-  ASSERT(innermost_function().IsAsyncClosure());
-  LocalScope* try_scope = current_block_->scope;
-
-  try_stack_->enter_catch();
-
-  OpenBlock();  // Catch handler list.
-  OpenBlock();  // Catch block.
-  CatchParamDesc exception_param;
-  CatchParamDesc stack_trace_param;
-  exception_param.token_pos = TokenPosition::kNoSource;
-  exception_param.type = &Object::dynamic_type();
-  exception_param.name = &Symbols::ExceptionParameter();
-  stack_trace_param.token_pos = TokenPosition::kNoSource;
-  stack_trace_param.type = &Object::dynamic_type();
-  stack_trace_param.name = &Symbols::StackTraceParameter();
-
-  AddCatchParamsToScope(&exception_param, &stack_trace_param,
-                        current_block_->scope);
-
-  LocalVariable* context_var =
-      try_scope->LocalLookupVariable(Symbols::SavedTryContextVar());
-  ASSERT(context_var != NULL);
-
-  LocalVariable* exception_var =
-      try_scope->LocalLookupVariable(Symbols::ExceptionVar());
-  if (exception_param.var != NULL) {
-    // Generate code to load the exception object (:exception_var) into
-    // the exception variable specified in this block.
-    ASSERT(exception_var != NULL);
-    current_block_->statements->Add(new (Z) StoreLocalNode(
-        TokenPosition::kNoSource, exception_param.var,
-        new (Z) LoadLocalNode(TokenPosition::kNoSource, exception_var)));
-  }
-
-  LocalVariable* stack_trace_var =
-      try_scope->LocalLookupVariable(Symbols::StackTraceVar());
-  if (stack_trace_param.var != NULL) {
-    // A stack trace variable is specified in this block, so generate code
-    // to load the stack trace object (:stack_trace_var) into the stack
-    // trace variable specified in this block.
-    ASSERT(stack_trace_var != NULL);
-    current_block_->statements->Add(new (Z) StoreLocalNode(
-        TokenPosition::kNoSource, stack_trace_param.var,
-        new (Z) LoadLocalNode(TokenPosition::kNoSource, stack_trace_var)));
-  }
-  LocalVariable* saved_exception_var =
-      try_scope->LocalLookupVariable(Symbols::SavedExceptionVar());
-  LocalVariable* saved_stack_trace_var =
-      try_scope->LocalLookupVariable(Symbols::SavedStackTraceVar());
-  SaveExceptionAndStackTrace(current_block_->statements, exception_var,
-                             stack_trace_var, saved_exception_var,
-                             saved_stack_trace_var);
-
-  // Complete the async future with an error. This catch block executes
-  // unconditionally, there is no need to generate a type check for.
-  LocalVariable* async_completer =
-      current_block_->scope->LookupVariable(Symbols::AsyncCompleter(), false);
-  ASSERT(async_completer != NULL);
-  ArgumentListNode* completer_args =
-      new (Z) ArgumentListNode(TokenPosition::kNoSource);
-  completer_args->Add(
-      new (Z) LoadLocalNode(TokenPosition::kNoSource, exception_param.var));
-  completer_args->Add(
-      new (Z) LoadLocalNode(TokenPosition::kNoSource, stack_trace_param.var));
-  current_block_->statements->Add(new (Z) InstanceCallNode(
-      TokenPosition::kNoSource,
-      new (Z) LoadLocalNode(TokenPosition::kNoSource, async_completer),
-      Symbols::CompleterCompleteError(), completer_args));
-  ReturnNode* return_node = new (Z) ReturnNode(TokenPosition::kNoSource);
-  // Behavior like a continuation return, i.e,. don't call a completer.
-  return_node->set_return_type(ReturnNode::kContinuation);
-  current_block_->statements->Add(return_node);
-  AstNode* catch_block = CloseBlock();
-  current_block_->statements->Add(catch_block);
-  SequenceNode* catch_handler_list = CloseBlock();
-
-  const Array& handler_types = Array::ZoneHandle(Z, Array::New(1, Heap::kOld));
-  handler_types.SetAt(0, *exception_param.type);
-
-  TryStack* try_statement = PopTry();
-  const intptr_t try_index = try_statement->try_index();
-
-  CatchClauseNode* catch_clause = new (Z) CatchClauseNode(
-      TokenPosition::kNoSource, catch_handler_list, handler_types, context_var,
-      exception_var, stack_trace_var, saved_exception_var,
-      saved_stack_trace_var, CatchClauseNode::kInvalidTryIndex, true);
-  AstNode* try_catch_node = new (Z) TryCatchNode(
-      TokenPosition::kNoSource, try_block, context_var, catch_clause,
-      NULL,  // No finally clause.
-      try_index,
-      NULL);  // No rethrow-finally clause.
-  current_block_->statements->Add(try_catch_node);
-  return CloseBlock();
-}
-
-// Wrap the body of the async or async* closure in a try/catch block.
-void Parser::OpenAsyncTryBlock() {
-  ASSERT(innermost_function().IsAsyncClosure() ||
-         innermost_function().IsAsyncGenClosure());
-  LocalVariable* context_var = NULL;
-  LocalVariable* exception_var = NULL;
-  LocalVariable* stack_trace_var = NULL;
-  LocalVariable* saved_exception_var = NULL;
-  LocalVariable* saved_stack_trace_var = NULL;
-  SetupExceptionVariables(current_block_->scope, true, &context_var,
-                          &exception_var, &stack_trace_var,
-                          &saved_exception_var, &saved_stack_trace_var);
-
-  // Open the try block.
-  OpenBlock();
-  // This is the outermost try-catch in the function.
-  ASSERT(try_stack_ == NULL);
-  PushTry(current_block_);
-  // Validate that we always get try index of 0.
-  ASSERT(try_stack_->try_index() == CatchClauseNode::kImplicitAsyncTryIndex);
-
-  SetupSavedTryContext(context_var);
-}
-
-void Parser::AddSyncGenClosureParameters(ParamList* params) {
-  // Create the parameter list for the body closure of a sync generator:
-  // 1) Implicit closure parameter;
-  // 2) Iterator
-  // Add implicit closure parameter if not already present.
-  if (params->parameters->length() == 0) {
-    params->AddFinalParameter(TokenPosition::kMinSource,
-                              &Symbols::ClosureParameter(),
-                              &Object::dynamic_type());
-  }
-  ParamDesc iterator_param;
-  iterator_param.name = &Symbols::IteratorParameter();
-  iterator_param.type = &Object::dynamic_type();
-  params->parameters->Add(iterator_param);
-  params->num_fixed_parameters++;
-}
-
-void Parser::AddAsyncGenClosureParameters(ParamList* params) {
-  // Create the parameter list for the body closure of an async generator.
-  // The closure has the same parameters as an asynchronous non-generator.
-  AddAsyncClosureParameters(params);
-}
-
-RawFunction* Parser::OpenSyncGeneratorFunction(TokenPosition func_pos) {
-  Function& body = Function::Handle(Z);
-  String& body_closure_name = String::Handle(Z);
-  bool is_new_closure = false;
-
-  AddContinuationVariables();
-
-  // Check whether a function for the body of this generator
-  // function has already been created by a previous
-  // compilation.
-  const Function& found_func = Function::Handle(
-      Z, I->LookupClosureFunction(innermost_function(), func_pos));
-  if (!found_func.IsNull()) {
-    ASSERT(found_func.IsSyncGenClosure());
-    body = found_func.raw();
-    body_closure_name = body.name();
-  } else {
-    // Create the closure containing the body of this generator function.
-    String& generator_name = String::Handle(Z, innermost_function().name());
-    body_closure_name =
-        Symbols::NewFormatted(T, "<%s_sync_body>", generator_name.ToCString());
-    body = Function::NewClosureFunction(body_closure_name, innermost_function(),
-                                        func_pos);
-    body.set_is_generated_body(true);
-    body.set_result_type(Object::dynamic_type());
-    is_new_closure = true;
-  }
-
-  ParamList closure_params;
-  AddSyncGenClosureParameters(&closure_params);
-
-  if (is_new_closure) {
-    // Add the parameters to the newly created closure.
-    AddFormalParamsToFunction(&closure_params, body);
-    ResolveSignatureTypeParameters(body);
-    // Finalize function type.
-    Type& signature_type = Type::Handle(Z, body.SignatureType());
-    signature_type ^= CanonicalizeType(signature_type);
-    body.SetSignatureType(signature_type);
-    ASSERT(AbstractType::Handle(Z, body.result_type()).IsResolved());
-    ASSERT(body.NumParameters() == closure_params.parameters->length());
-  }
-
-  OpenFunctionBlock(body);
-  AddFormalParamsToScope(&closure_params, current_block_->scope);
-  async_temp_scope_ = current_block_->scope;
-  return body.raw();
-}
-
-SequenceNode* Parser::CloseSyncGenFunction(const Function& closure,
-                                           SequenceNode* closure_body) {
-  // Explicitly reference variables of the sync generator function from the
-  // closure body in order to mark them as captured.
-  LocalVariable* existing_var =
-      closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var =
-      closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-
-  // :await_jump_var = -1;
-  LocalVariable* jump_var =
-      current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false);
-  LiteralNode* init_value = new (Z)
-      LiteralNode(TokenPosition::kNoSource, Smi::ZoneHandle(Smi::New(-1)));
-  current_block_->statements->Add(
-      new (Z) StoreLocalNode(TokenPosition::kNoSource, jump_var, init_value));
-
-  // return new SyncIterable(body_closure);
-  const Class& iterable_class =
-      Class::Handle(Z, Library::LookupCoreClass(Symbols::_SyncIterable()));
-  ASSERT(!iterable_class.IsNull());
-  const Function& iterable_constructor =
-      Function::ZoneHandle(Z, iterable_class.LookupConstructorAllowPrivate(
-                                  Symbols::_SyncIterableConstructor()));
-  ASSERT(!iterable_constructor.IsNull());
-
-  const String& closure_name = String::Handle(Z, closure.name());
-  ASSERT(closure_name.IsSymbol());
-
-  ArgumentListNode* arguments =
-      new (Z) ArgumentListNode(TokenPosition::kNoSource);
-  ClosureNode* closure_obj = new (Z) ClosureNode(
-      TokenPosition::kNoSource, closure, NULL, closure_body->scope());
-  arguments->Add(closure_obj);
-  ConstructorCallNode* new_iterable = new (Z) ConstructorCallNode(
-      TokenPosition::kNoSource, TypeArguments::ZoneHandle(Z),
-      iterable_constructor, arguments);
-  ReturnNode* return_node =
-      new (Z) ReturnNode(TokenPosition::kNoSource, new_iterable);
-  current_block_->statements->Add(return_node);
-  return CloseBlock();
-}
-
-void Parser::AddAsyncClosureParameters(ParamList* params) {
-  // Async closures have three optional parameters:
-  // * A continuation result.
-  // * A continuation error.
-  // * A continuation stack trace.
-  ASSERT(params->parameters->length() <= 1);
-  // Add implicit closure parameter if not yet present.
-  if (params->parameters->length() == 0) {
-    params->AddFinalParameter(TokenPosition::kMinSource,
-                              &Symbols::ClosureParameter(),
-                              &Object::dynamic_type());
-  }
-  ParamDesc result_param;
-  result_param.name = &Symbols::AsyncOperationParam();
-  result_param.default_value = &Object::null_instance();
-  result_param.type = &Object::dynamic_type();
-  params->parameters->Add(result_param);
-  ParamDesc error_param;
-  error_param.name = &Symbols::AsyncOperationErrorParam();
-  error_param.default_value = &Object::null_instance();
-  error_param.type = &Object::dynamic_type();
-  params->parameters->Add(error_param);
-  ParamDesc stack_trace_param;
-  stack_trace_param.name = &Symbols::AsyncOperationStackTraceParam();
-  stack_trace_param.default_value = &Object::null_instance();
-  stack_trace_param.type = &Object::dynamic_type();
-  params->parameters->Add(stack_trace_param);
-  params->has_optional_positional_parameters = true;
-  params->num_optional_parameters += 3;
-}
-
-RawFunction* Parser::OpenAsyncFunction(TokenPosition async_func_pos) {
-  TRACE_PARSER("OpenAsyncFunction");
-  AddContinuationVariables();
-  AddAsyncClosureVariables();
-  Function& closure = Function::Handle(Z);
-  bool is_new_closure = false;
-
-  // Check whether a function for the asynchronous function body of
-  // this async function has already been created by a previous
-  // compilation of this function.
-  const Function& found_func = Function::Handle(
-      Z, I->LookupClosureFunction(innermost_function(), async_func_pos));
-  if (!found_func.IsNull()) {
-    ASSERT(found_func.IsAsyncClosure());
-    closure = found_func.raw();
-  } else {
-    // Create the closure containing the body of this async function.
-    const String& async_func_name =
-        String::Handle(Z, innermost_function().name());
-    String& closure_name =
-        String::Handle(Z, Symbols::NewFormatted(T, "<%s_async_body>",
-                                                async_func_name.ToCString()));
-    closure = Function::NewClosureFunction(closure_name, innermost_function(),
-                                           async_func_pos);
-    closure.set_is_generated_body(true);
-    closure.set_result_type(Object::dynamic_type());
-    is_new_closure = true;
-  }
-  // Create the parameter list for the async body closure.
-  ParamList closure_params;
-  AddAsyncClosureParameters(&closure_params);
-  if (is_new_closure) {
-    // Add the parameters to the newly created closure.
-    AddFormalParamsToFunction(&closure_params, closure);
-    ResolveSignatureTypeParameters(closure);
-
-    // Finalize function type.
-    Type& signature_type = Type::Handle(Z, closure.SignatureType());
-    signature_type ^= CanonicalizeType(signature_type);
-    closure.SetSignatureType(signature_type);
-    ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved());
-    ASSERT(closure.NumParameters() == closure_params.parameters->length());
-  }
-  OpenFunctionBlock(closure);
-  AddFormalParamsToScope(&closure_params, current_block_->scope);
-  async_temp_scope_ = current_block_->scope;
-  return closure.raw();
-}
-
-void Parser::AddContinuationVariables() {
-  // Add to current block's scope:
-  //   var :await_jump_var;
-  //   var :await_ctx_var;
-  LocalVariable* await_jump_var =
-      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            Symbols::AwaitJumpVar(), Object::dynamic_type());
-  current_block_->scope->AddVariable(await_jump_var);
-  LocalVariable* await_ctx_var =
-      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            Symbols::AwaitContextVar(), Object::dynamic_type());
-  current_block_->scope->AddVariable(await_ctx_var);
-}
-
-void Parser::AddAsyncClosureVariables() {
-  // Add to current block's scope:
-  //   var :async_op;
-  //   var :async_then_callback;
-  //   var :async_catch_error_callback;
-  //   var :async_completer;
-  //   var :async_stack_trace;
-  LocalVariable* async_op_var =
-      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            Symbols::AsyncOperation(), Object::dynamic_type());
-  current_block_->scope->AddVariable(async_op_var);
-  LocalVariable* async_then_callback_var = new (Z)
-      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                    Symbols::AsyncThenCallback(), Object::dynamic_type());
-  current_block_->scope->AddVariable(async_then_callback_var);
-  LocalVariable* async_catch_error_callback_var = new (Z)
-      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                    Symbols::AsyncCatchErrorCallback(), Object::dynamic_type());
-  current_block_->scope->AddVariable(async_catch_error_callback_var);
-  LocalVariable* async_completer =
-      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            Symbols::AsyncCompleter(), Object::dynamic_type());
-  current_block_->scope->AddVariable(async_completer);
-  LocalVariable* async_stack_trace = new (Z)
-      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                    Symbols::AsyncStackTraceVar(), Object::dynamic_type());
-  current_block_->scope->AddVariable(async_stack_trace);
-}
-
-void Parser::AddAsyncGeneratorVariables() {
-  // Add to current block's scope:
-  //   var :controller;
-  // The :controller variable is used by the async generator closure to
-  // store the StreamController object to which the yielded expressions
-  // are added.
-  //   var :async_op;
-  //   var :async_then_callback;
-  //   var :async_catch_error_callback;
-  //   var :async_stack_trace;
-  //   var :controller_stream;
-  // These variables are used to store the async generator closure containing
-  // the body of the async* function. They are used by the await operator.
-  LocalVariable* controller_var =
-      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            Symbols::ColonController(), Object::dynamic_type());
-  current_block_->scope->AddVariable(controller_var);
-  LocalVariable* async_op_var =
-      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            Symbols::AsyncOperation(), Object::dynamic_type());
-  current_block_->scope->AddVariable(async_op_var);
-  LocalVariable* async_then_callback_var = new (Z)
-      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                    Symbols::AsyncThenCallback(), Object::dynamic_type());
-  current_block_->scope->AddVariable(async_then_callback_var);
-  LocalVariable* async_catch_error_callback_var = new (Z)
-      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                    Symbols::AsyncCatchErrorCallback(), Object::dynamic_type());
-  current_block_->scope->AddVariable(async_catch_error_callback_var);
-  LocalVariable* async_stack_trace = new (Z)
-      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                    Symbols::AsyncStackTraceVar(), Object::dynamic_type());
-  current_block_->scope->AddVariable(async_stack_trace);
-  LocalVariable* controller_stream = new (Z)
-      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                    Symbols::ControllerStream(), Object::dynamic_type());
-  current_block_->scope->AddVariable(controller_stream);
-}
-
-RawFunction* Parser::OpenAsyncGeneratorFunction(TokenPosition async_func_pos) {
-  TRACE_PARSER("OpenAsyncGeneratorFunction");
-  AddContinuationVariables();
-  AddAsyncGeneratorVariables();
-
-  Function& closure = Function::Handle(Z);
-  bool is_new_closure = false;
-
-  // Check whether a function for the asynchronous function body of
-  // this async generator has already been created by a previous
-  // compilation of this function.
-  const Function& found_func = Function::Handle(
-      Z, I->LookupClosureFunction(innermost_function(), async_func_pos));
-  if (!found_func.IsNull()) {
-    ASSERT(found_func.IsAsyncGenClosure());
-    closure = found_func.raw();
-  } else {
-    // Create the closure containing the body of this async generator function.
-    const String& async_generator_name =
-        String::Handle(Z, innermost_function().name());
-    const String& closure_name = String::Handle(
-        Z, Symbols::NewFormatted(T, "<%s_async_gen_body>",
-                                 async_generator_name.ToCString()));
-    closure = Function::NewClosureFunction(closure_name, innermost_function(),
-                                           async_func_pos);
-    closure.set_is_generated_body(true);
-    closure.set_result_type(Object::dynamic_type());
-    is_new_closure = true;
-  }
-
-  ParamList closure_params;
-  AddAsyncGenClosureParameters(&closure_params);
-
-  if (is_new_closure) {
-    // Add the parameters to the newly created closure.
-    AddFormalParamsToFunction(&closure_params, closure);
-    ResolveSignatureTypeParameters(closure);
-
-    // Finalize function type.
-    Type& signature_type = Type::Handle(Z, closure.SignatureType());
-    signature_type ^= CanonicalizeType(signature_type);
-    closure.SetSignatureType(signature_type);
-    ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved());
-    ASSERT(closure.NumParameters() == closure_params.parameters->length());
-  }
-
-  OpenFunctionBlock(closure);
-  AddFormalParamsToScope(&closure_params, current_block_->scope);
-  async_temp_scope_ = current_block_->scope;
-  return closure.raw();
-}
-
-// Generate the Ast nodes for the implicit code of the async* function.
-//
-// f(...) async* {
-//   var :controller;
-//   var :await_jump_var = -1;
-//   var :await_context_var;
-//   f_async_body() {
-//     ... source code of f ...
-//   }
-//   var :async_op = f_async_body;
-//   var :async_then_callback = _asyncThenWrapperHelper(:async_op);
-//   var :async_catch_error_callback = _asyncCatchErrorWrapperHelper(:async_op);
-//   :controller = new _AsyncStarStreamController(:async_op);
-//   var :controller_stream = :controller.stream;
-//   return :controller_stream;
-// }
-SequenceNode* Parser::CloseAsyncGeneratorFunction(const Function& closure_func,
-                                                  SequenceNode* closure_body) {
-  TRACE_PARSER("CloseAsyncGeneratorFunction");
-  ASSERT(!closure_func.IsNull());
-  ASSERT(closure_body != NULL);
-
-  // Explicitly reference variables of the async generator function from the
-  // closure body in order to mark them as captured.
-  LocalVariable* existing_var =
-      closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var =
-      closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var =
-      closure_body->scope()->LookupVariable(Symbols::ColonController(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var =
-      closure_body->scope()->LookupVariable(Symbols::AsyncOperation(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var = closure_body->scope()->LookupVariable(
-      Symbols::AsyncThenCallback(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var = closure_body->scope()->LookupVariable(
-      Symbols::AsyncCatchErrorCallback(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var = closure_body->scope()->LookupVariable(
-      Symbols::AsyncStackTraceVar(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var =
-      closure_body->scope()->LookupVariable(Symbols::ControllerStream(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-
-  const Library& async_lib = Library::Handle(Library::AsyncLibrary());
-
-  const Class& controller_class = Class::Handle(
-      Z,
-      async_lib.LookupClassAllowPrivate(Symbols::_AsyncStarStreamController()));
-  ASSERT(!controller_class.IsNull());
-  const Function& controller_constructor = Function::ZoneHandle(
-      Z, controller_class.LookupConstructorAllowPrivate(
-             Symbols::_AsyncStarStreamControllerConstructor()));
-
-  // :await_jump_var = -1;
-  LocalVariable* jump_var =
-      current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false);
-  LiteralNode* init_value = new (Z)
-      LiteralNode(TokenPosition::kNoSource, Smi::ZoneHandle(Smi::New(-1)));
-  current_block_->statements->Add(
-      new (Z) StoreLocalNode(TokenPosition::kNoSource, jump_var, init_value));
-
-  TokenPosition token_pos = TokenPosition::kNoSource;
-
-  // Add to AST:
-  //   :async_op = <closure>;  (containing the original body)
-  LocalVariable* async_op_var =
-      current_block_->scope->LookupVariable(Symbols::AsyncOperation(), false);
-  ClosureNode* closure_obj = new (Z) ClosureNode(
-      TokenPosition::kNoSource, closure_func, NULL, closure_body->scope());
-  StoreLocalNode* store_async_op = new (Z)
-      StoreLocalNode(TokenPosition::kNoSource, async_op_var, closure_obj);
-
-  current_block_->statements->Add(store_async_op);
-
-  if (FLAG_causal_async_stacks) {
-    // Add to AST:
-    //   :async_stack_trace = _asyncStackTraceHelper(:async_op);
-    const Function& async_stack_trace_helper = Function::ZoneHandle(
-        Z,
-        async_lib.LookupFunctionAllowPrivate(Symbols::AsyncStackTraceHelper()));
-    ASSERT(!async_stack_trace_helper.IsNull());
-    ArgumentListNode* async_stack_trace_helper_args =
-        new (Z) ArgumentListNode(TokenPosition::kNoSource);
-    async_stack_trace_helper_args->Add(
-        new (Z) LoadLocalNode(TokenPosition::kNoSource, async_op_var));
-    StaticCallNode* async_stack_trace_helper_call = new (Z)
-        StaticCallNode(token_pos, async_stack_trace_helper,
-                       async_stack_trace_helper_args, StaticCallNode::kStatic);
-    LocalVariable* async_stack_trace_var =
-        current_block_->scope->LookupVariable(Symbols::AsyncStackTraceVar(),
-                                              false);
-    StoreLocalNode* store_async_stack_trace = new (Z) StoreLocalNode(
-        token_pos, async_stack_trace_var, async_stack_trace_helper_call);
-    current_block_->statements->Add(store_async_stack_trace);
-  }
-
-  // :async_then_callback = _asyncThenWrapperHelper(:async_op)
-  const Function& async_then_wrapper_helper = Function::ZoneHandle(
-      Z,
-      async_lib.LookupFunctionAllowPrivate(Symbols::AsyncThenWrapperHelper()));
-  ASSERT(!async_then_wrapper_helper.IsNull());
-  ArgumentListNode* async_then_wrapper_helper_args =
-      new (Z) ArgumentListNode(TokenPosition::kNoSource);
-  async_then_wrapper_helper_args->Add(
-      new (Z) LoadLocalNode(TokenPosition::kNoSource, async_op_var));
-  StaticCallNode* then_wrapper_call = new (Z)
-      StaticCallNode(TokenPosition::kNoSource, async_then_wrapper_helper,
-                     async_then_wrapper_helper_args, StaticCallNode::kStatic);
-  LocalVariable* async_then_callback_var =
-      current_block_->scope->LookupVariable(Symbols::AsyncThenCallback(),
-                                            false);
-  StoreLocalNode* store_async_then_callback = new (Z) StoreLocalNode(
-      TokenPosition::kNoSource, async_then_callback_var, then_wrapper_call);
-
-  current_block_->statements->Add(store_async_then_callback);
-
-  // :async_catch_error_callback = _asyncErrorWrapperHelper(:async_op)
-
-  const Function& async_error_wrapper_helper = Function::ZoneHandle(
-      Z,
-      async_lib.LookupFunctionAllowPrivate(Symbols::AsyncErrorWrapperHelper()));
-  ASSERT(!async_error_wrapper_helper.IsNull());
-  ArgumentListNode* async_error_wrapper_helper_args =
-      new (Z) ArgumentListNode(TokenPosition::kNoSource);
-  async_error_wrapper_helper_args->Add(
-      new (Z) LoadLocalNode(TokenPosition::kNoSource, async_op_var));
-  StaticCallNode* error_wrapper_call = new (Z)
-      StaticCallNode(TokenPosition::kNoSource, async_error_wrapper_helper,
-                     async_error_wrapper_helper_args, StaticCallNode::kStatic);
-  LocalVariable* async_catch_error_callback_var =
-      current_block_->scope->LookupVariable(Symbols::AsyncCatchErrorCallback(),
-                                            false);
-  StoreLocalNode* store_async_catch_error_callback = new (Z)
-      StoreLocalNode(TokenPosition::kNoSource, async_catch_error_callback_var,
-                     error_wrapper_call);
-
-  current_block_->statements->Add(store_async_catch_error_callback);
-
-  // :controller = new _AsyncStarStreamController(body_closure);
-  ArgumentListNode* arguments =
-      new (Z) ArgumentListNode(TokenPosition::kNoSource);
-  arguments->Add(new (Z) LoadLocalNode(TokenPosition::kNoSource, async_op_var));
-  ConstructorCallNode* controller_constructor_call =
-      new (Z) ConstructorCallNode(TokenPosition::kNoSource,
-                                  TypeArguments::ZoneHandle(Z),
-                                  controller_constructor, arguments);
-  LocalVariable* controller_var =
-      current_block_->scope->LookupVariable(Symbols::ColonController(), false);
-  StoreLocalNode* store_controller = new (Z) StoreLocalNode(
-      TokenPosition::kNoSource, controller_var, controller_constructor_call);
-  current_block_->statements->Add(store_controller);
-
-  // Grab :controller.stream
-  InstanceGetterNode* controller_stream = new (Z) InstanceGetterNode(
-      TokenPosition::kNoSource,
-      new (Z) LoadLocalNode(TokenPosition::kNoSource, controller_var),
-      Symbols::Stream());
-
-  // Store :controller.stream into :controller_stream inside the closure.
-  // We have to remember the stream because a new instance is generated for
-  // each getter invocation and in order to recreate the linkage, we need the
-  // awaited on instance.
-  LocalVariable* controller_stream_var =
-      current_block_->scope->LookupVariable(Symbols::ControllerStream(), false);
-  ASSERT(controller_stream_var != NULL);
-
-  StoreLocalNode* store_controller_stream = new (Z) StoreLocalNode(
-      TokenPosition::kNoSource, controller_stream_var, controller_stream);
-  current_block_->statements->Add(store_controller_stream);
-
-  // return :controller.stream;
-  ReturnNode* return_node = new (Z) ReturnNode(
-      TokenPosition::kNoSource,
-      new (Z) LoadLocalNode(TokenPosition::kNoSource, controller_stream_var));
-  current_block_->statements->Add(return_node);
-  return CloseBlock();
-}
-
-void Parser::OpenAsyncGeneratorClosure() {
-  async_temp_scope_ = current_block_->scope;
-  OpenAsyncTryBlock();
-}
-
-SequenceNode* Parser::CloseAsyncGeneratorClosure(SequenceNode* body) {
-  // We need a temporary expression to store intermediate return values.
-  parsed_function()->EnsureExpressionTemp();
-
-  SequenceNode* new_body = CloseAsyncGeneratorTryBlock(body);
-  ASSERT(new_body != NULL);
-  ASSERT(new_body->scope() != NULL);
-  return new_body;
-}
-
-// Add a return node to the sequence if necessary.
-void Parser::EnsureHasReturnStatement(SequenceNode* seq,
-                                      TokenPosition return_pos) {
-  if ((seq->length() == 0) || !seq->NodeAt(seq->length() - 1)->IsReturnNode()) {
-    const Function& func = innermost_function();
-    // The implicit return value of synchronous generator closures is false,
-    // to indicate that there are no more elements in the iterable.
-    // In other cases the implicit return value is null.
-    AstNode* return_value =
-        func.IsSyncGenClosure()
-            ? new LiteralNode(return_pos, Bool::False())
-            : new LiteralNode(return_pos, Instance::ZoneHandle());
-    seq->Add(new ReturnNode(return_pos, return_value));
-  }
-}
-
-SequenceNode* Parser::CloseBlock() {
-  SequenceNode* statements = current_block_->statements;
-  if (current_block_->scope != NULL) {
-    // Record the begin and end token index of the scope.
-    ASSERT(statements != NULL);
-    current_block_->scope->set_begin_token_pos(statements->token_pos());
-    current_block_->scope->set_end_token_pos(TokenPos());
-  }
-  current_block_ = current_block_->parent;
-  return statements;
-}
-
-SequenceNode* Parser::CloseAsyncFunction(const Function& closure,
-                                         SequenceNode* closure_body) {
-  TRACE_PARSER("CloseAsyncFunction");
-  ASSERT(!closure.IsNull());
-  ASSERT(closure_body != NULL);
-
-  // Explicitly reference variables of the async function from the
-  // closure body in order to mark them as captured.
-  LocalVariable* existing_var =
-      closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var =
-      closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var =
-      closure_body->scope()->LookupVariable(Symbols::AsyncCompleter(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-  existing_var = closure_body->scope()->LookupVariable(
-      Symbols::AsyncStackTraceVar(), false);
-  ASSERT((existing_var != NULL) && existing_var->is_captured());
-
-  // Create a completer that executes a closure with the current body and
-  // return the corresponding future.
-
-  // No need to capture parameters or other variables, since they have already
-  // been captured in the corresponding scope as the body has been parsed within
-  // a nested block (contained in the async function's block).
-
-  const Library& async_lib = Library::Handle(Z, Library::AsyncLibrary());
-
-  LocalVariable* async_completer =
-      current_block_->scope->LookupVariable(Symbols::AsyncCompleter(), false);
-
-  const TokenPosition token_pos = ST(closure_body->token_pos());
-
-  Function& completer_constructor = Function::ZoneHandle(Z);
-  if (FLAG_sync_async) {
-    const Class& completer_class = Class::Handle(
-        Z, async_lib.LookupClassAllowPrivate(Symbols::_AsyncAwaitCompleter()));
-    ASSERT(!completer_class.IsNull());
-    completer_constructor = completer_class.LookupConstructorAllowPrivate(
-        Symbols::_AsyncAwaitCompleterConstructor());
-    ASSERT(!completer_constructor.IsNull());
-
-    // Add to AST:
-    //   :async_completer = new _AsyncAwaitCompleter();
-  } else {
-    const Class& completer =
-        Class::Handle(Z, I->object_store()->completer_class());
-    ASSERT(!completer.IsNull());
-    completer_constructor =
-        completer.LookupFunction(Symbols::CompleterSyncConstructor());
-    ASSERT(!completer_constructor.IsNull());
-
-    // Add to AST:
-    //   :async_completer = new Completer.sync();
-  }
-  ArgumentListNode* empty_args = new (Z) ArgumentListNode(token_pos);
-  ConstructorCallNode* completer_constructor_node =
-      new (Z) ConstructorCallNode(token_pos, TypeArguments::ZoneHandle(Z),
-                                  completer_constructor, empty_args);
-  StoreLocalNode* store_completer = new (Z)
-      StoreLocalNode(token_pos, async_completer, completer_constructor_node);
-  current_block_->statements->Add(store_completer);
-
-  // :await_jump_var = -1;
-  LocalVariable* jump_var =
-      current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false);
-  LiteralNode* init_value =
-      new (Z) LiteralNode(token_pos, Smi::ZoneHandle(Smi::New(-1)));
-  current_block_->statements->Add(
-      new (Z) StoreLocalNode(token_pos, jump_var, init_value));
-
-  // Add to AST:
-  //   :async_op = <closure>;  (containing the original body)
-  LocalVariable* async_op_var =
-      current_block_->scope->LookupVariable(Symbols::AsyncOperation(), false);
-  ClosureNode* cn =
-      new (Z) ClosureNode(token_pos, closure, NULL, closure_body->scope());
-  StoreLocalNode* store_async_op =
-      new (Z) StoreLocalNode(token_pos, async_op_var, cn);
-  current_block_->statements->Add(store_async_op);
-
-  if (FLAG_causal_async_stacks) {
-    // Add to AST:
-    //   :async_stack_trace = _asyncStackTraceHelper();
-    const Function& async_stack_trace_helper = Function::ZoneHandle(
-        Z,
-        async_lib.LookupFunctionAllowPrivate(Symbols::AsyncStackTraceHelper()));
-    ASSERT(!async_stack_trace_helper.IsNull());
-    ArgumentListNode* async_stack_trace_helper_args =
-        new (Z) ArgumentListNode(token_pos);
-    async_stack_trace_helper_args->Add(
-        new (Z) LoadLocalNode(token_pos, async_op_var));
-    StaticCallNode* async_stack_trace_helper_call = new (Z)
-        StaticCallNode(token_pos, async_stack_trace_helper,
-                       async_stack_trace_helper_args, StaticCallNode::kStatic);
-    LocalVariable* async_stack_trace_var =
-        current_block_->scope->LookupVariable(Symbols::AsyncStackTraceVar(),
-                                              false);
-    StoreLocalNode* store_async_stack_trace = new (Z) StoreLocalNode(
-        token_pos, async_stack_trace_var, async_stack_trace_helper_call);
-    current_block_->statements->Add(store_async_stack_trace);
-  }
-
-  // :async_then_callback = _asyncThenWrapperHelper(:async_op)
-  const Function& async_then_wrapper_helper = Function::ZoneHandle(
-      Z,
-      async_lib.LookupFunctionAllowPrivate(Symbols::AsyncThenWrapperHelper()));
-  ASSERT(!async_then_wrapper_helper.IsNull());
-  ArgumentListNode* async_then_wrapper_helper_args =
-      new (Z) ArgumentListNode(token_pos);
-  async_then_wrapper_helper_args->Add(
-      new (Z) LoadLocalNode(token_pos, async_op_var));
-  StaticCallNode* then_wrapper_call = new (Z)
-      StaticCallNode(token_pos, async_then_wrapper_helper,
-                     async_then_wrapper_helper_args, StaticCallNode::kStatic);
-  LocalVariable* async_then_callback_var =
-      current_block_->scope->LookupVariable(Symbols::AsyncThenCallback(),
-                                            false);
-  StoreLocalNode* store_async_then_callback = new (Z)
-      StoreLocalNode(token_pos, async_then_callback_var, then_wrapper_call);
-
-  current_block_->statements->Add(store_async_then_callback);
-
-  // :async_catch_error_callback = _asyncErrorWrapperHelper(:async_op)
-
-  const Function& async_error_wrapper_helper = Function::ZoneHandle(
-      Z,
-      async_lib.LookupFunctionAllowPrivate(Symbols::AsyncErrorWrapperHelper()));
-  ASSERT(!async_error_wrapper_helper.IsNull());
-  ArgumentListNode* async_error_wrapper_helper_args =
-      new (Z) ArgumentListNode(token_pos);
-  async_error_wrapper_helper_args->Add(
-      new (Z) LoadLocalNode(token_pos, async_op_var));
-  StaticCallNode* error_wrapper_call = new (Z)
-      StaticCallNode(token_pos, async_error_wrapper_helper,
-                     async_error_wrapper_helper_args, StaticCallNode::kStatic);
-  LocalVariable* async_catch_error_callback_var =
-      current_block_->scope->LookupVariable(Symbols::AsyncCatchErrorCallback(),
-                                            false);
-  StoreLocalNode* store_async_catch_error_callback = new (Z) StoreLocalNode(
-      token_pos, async_catch_error_callback_var, error_wrapper_call);
-
-  current_block_->statements->Add(store_async_catch_error_callback);
-
-  if (FLAG_sync_async) {
-    // Add to AST:
-    //   :async_completer.start(:async_op);
-    ArgumentListNode* arguments = new (Z) ArgumentListNode(token_pos);
-    arguments->Add(new (Z) LoadLocalNode(token_pos, async_op_var));
-    InstanceCallNode* start_call = new (Z) InstanceCallNode(
-        token_pos, new (Z) LoadLocalNode(token_pos, async_completer),
-        Symbols::_AsyncAwaitStart(), arguments);
-    current_block_->statements->Add(start_call);
-  } else {
-    // Add to AST:
-    //   new Future.microtask(:async_op);
-    const Class& future = Class::Handle(Z, I->object_store()->future_class());
-    ASSERT(!future.IsNull());
-    const Function& constructor = Function::ZoneHandle(
-        Z, future.LookupFunction(Symbols::FutureMicrotask()));
-    ASSERT(!constructor.IsNull());
-    ArgumentListNode* arguments = new (Z) ArgumentListNode(token_pos);
-    arguments->Add(new (Z) LoadLocalNode(token_pos, async_op_var));
-    ConstructorCallNode* future_node = new (Z) ConstructorCallNode(
-        token_pos, TypeArguments::ZoneHandle(Z), constructor, arguments);
-    current_block_->statements->Add(future_node);
-  }
-
-  // Add to AST:
-  //   return :async_completer.future;
-  ReturnNode* return_node = new (Z) ReturnNode(
-      token_pos,
-      new (Z) InstanceGetterNode(
-          token_pos, new (Z) LoadLocalNode(token_pos, async_completer),
-          Symbols::CompleterFuture()));
-  current_block_->statements->Add(return_node);
-  return CloseBlock();
-}
-
-SequenceNode* Parser::CloseAsyncClosure(SequenceNode* body,
-                                        TokenPosition func_end_pos) {
-  // We need a temporary expression to store intermediate return values.
-  parsed_function()->EnsureExpressionTemp();
-
-  SequenceNode* new_body = CloseAsyncTryBlock(body, func_end_pos);
-  ASSERT(new_body != NULL);
-  ASSERT(new_body->scope() != NULL);
-  return new_body;
-}
-
-// Set up default values for all optional parameters to the function.
-void Parser::SetupDefaultsForOptionalParams(const ParamList& params) {
-  if ((current_function().raw() == innermost_function().raw()) &&
-      (params.num_optional_parameters > 0)) {
-    ZoneGrowableArray<const Instance*>* default_values =
-        new ZoneGrowableArray<const Instance*>(zone(),
-                                               params.num_optional_parameters);
-    // Build array of default parameter values.
-    const ZoneGrowableArray<ParamDesc>& parameters = *params.parameters;
-    const int first_opt_param_offset = params.num_fixed_parameters;
-    for (int i = 0; i < params.num_optional_parameters; i++) {
-      const Instance* default_value =
-          parameters[i + first_opt_param_offset].default_value;
-      default_values->Add(default_value);
-    }
-    parsed_function()->set_default_parameter_values(default_values);
-  }
-}
-
-void Parser::FinalizeFormalParameterTypes(const ParamList* params) {
-  ASSERT((params != NULL) && (params->parameters != NULL));
-  const int num_parameters = params->parameters->length();
-  AbstractType& type = AbstractType::Handle(Z);
-  for (int i = 0; i < num_parameters; i++) {
-    ParamDesc& param_desc = (*params->parameters)[i];
-    type = param_desc.type->raw();
-    ResolveTypeParameters(&type);
-    type = CanonicalizeType(type);
-    if (type.raw() != param_desc.type->raw()) {
-      param_desc.type = &AbstractType::ZoneHandle(Z, type.raw());
-    }
-  }
-}
-
-// Populate the parameter type array and parameter name array of the function
-// with the formal parameter types and names.
-void Parser::AddFormalParamsToFunction(const ParamList* params,
-                                       const Function& func) {
-  ASSERT((params != NULL) && (params->parameters != NULL));
-  ASSERT((params->num_optional_parameters > 0) ==
-         (params->has_optional_positional_parameters ||
-          params->has_optional_named_parameters));
-  if (!Utils::IsUint(RawFunction::kMaxFixedParametersBits,
-                     params->num_fixed_parameters) ||
-      !Utils::IsUint(RawFunction::kMaxOptionalParametersBits,
-                     params->num_optional_parameters)) {
-    const Script& script = Script::Handle(Class::Handle(func.Owner()).script());
-    Report::MessageF(Report::kError, script, func.token_pos(),
-                     Report::AtLocation, "too many formal parameters");
-  }
-  func.set_num_fixed_parameters(params->num_fixed_parameters);
-  func.SetNumOptionalParameters(params->num_optional_parameters,
-                                params->has_optional_positional_parameters);
-  const int num_parameters = params->parameters->length();
-  ASSERT(num_parameters == func.NumParameters());
-  ASSERT(func.parameter_types() == Object::empty_array().raw());
-  ASSERT(func.parameter_names() == Object::empty_array().raw());
-  func.set_parameter_types(
-      Array::Handle(Array::New(num_parameters, Heap::kOld)));
-  func.set_parameter_names(
-      Array::Handle(Array::New(num_parameters, Heap::kOld)));
-  AbstractType& param_type = AbstractType::Handle();
-  for (int i = 0; i < num_parameters; i++) {
-    ParamDesc& param_desc = (*params->parameters)[i];
-    param_type = param_desc.type->raw();
-    if (param_desc.is_covariant) {
-      if (!func.IsDynamicFunction(true)) {
-        ReportError(param_desc.name_pos,
-                    "only instance functions may have "
-                    "covariant parameters");
-      }
-      // In non-strong mode, the covariant keyword is ignored. In strong mode,
-      // the parameter type is changed to Object.
-      if (FLAG_strong) {
-        param_type = Type::ObjectType();
-      }
-    }
-    func.SetParameterTypeAt(i, param_type);
-    func.SetParameterNameAt(i, *param_desc.name);
-    if (param_desc.is_field_initializer && !func.IsGenerativeConstructor()) {
-      // Redirecting constructors are detected later in ParseConstructor.
-      ReportError(param_desc.name_pos,
-                  "only generative constructors may have "
-                  "initializing formal parameters");
-    }
-  }
-}
-
-// Populate local scope with the formal parameters.
-void Parser::AddFormalParamsToScope(const ParamList* params,
-                                    LocalScope* scope) {
-  ASSERT((params != NULL) && (params->parameters != NULL));
-  ASSERT(scope != NULL);
-  const int num_parameters = params->parameters->length();
-  for (int i = 0; i < num_parameters; i++) {
-    ParamDesc& param_desc = (*params->parameters)[i];
-    const String* name = param_desc.name;
-    LocalVariable* parameter = new (Z) LocalVariable(
-        param_desc.name_pos, param_desc.name_pos, *name, *param_desc.type);
-    if (!scope->InsertParameterAt(i, parameter)) {
-      ReportError(param_desc.name_pos, "name '%s' already exists in scope",
-                  param_desc.name->ToCString());
-    }
-    param_desc.var = parameter;
-    if (param_desc.is_final) {
-      parameter->set_is_final();
-    }
-    // Field initializer parameters are implicitly final.
-    ASSERT(!param_desc.is_field_initializer || param_desc.is_final);
-  }
-}
-
-// Builds ReturnNode/NativeBodyNode for a native function.
-void Parser::ParseNativeFunctionBlock(const ParamList* params,
-                                      const Function& func) {
-  ASSERT(func.is_native());
-  ASSERT(func.NumParameters() == params->parameters->length());
-  TRACE_PARSER("ParseNativeFunctionBlock");
-
-  // Parse the function name out.
-  const String& native_name = ParseNativeDeclaration();
-
-  // Now add the NativeBodyNode and return statement.
-  current_block_->statements->Add(new (Z) ReturnNode(
-      TokenPos(),
-      new (Z) NativeBodyNode(TokenPos(), Function::ZoneHandle(Z, func.raw()),
-                             native_name, current_block_->scope,
-                             FLAG_link_natives_lazily)));
-}
-
-LocalVariable* Parser::LookupReceiver(LocalScope* from_scope, bool test_only) {
-  ASSERT(!current_function().is_static());
-  return from_scope->LookupVariable(Symbols::This(), test_only);
-}
-
-LocalVariable* Parser::LookupTypeArgumentsParameter(LocalScope* from_scope,
-                                                    bool test_only) {
-  ASSERT(current_function().IsInFactoryScope());
-  return from_scope->LookupVariable(Symbols::TypeArgumentsParameter(),
-                                    test_only);
-}
-
-void Parser::CaptureInstantiator() {
-  ASSERT(FunctionLevel() > 0);
-  const String* variable_name = current_function().IsInFactoryScope()
-                                    ? &Symbols::TypeArgumentsParameter()
-                                    : &Symbols::This();
-  current_block_->scope->CaptureVariable(
-      current_block_->scope->LookupVariable(*variable_name, true));
-}
-
-void Parser::CaptureFunctionTypeArguments() {
-  ASSERT(InGenericFunctionScope());
-  ASSERT(FunctionLevel() > 0);
-  if (!FLAG_reify_generic_functions) {
-    return;
-  }
-  const String* variable_name = &Symbols::FunctionTypeArgumentsVar();
-  current_block_->scope->CaptureVariable(
-      current_block_->scope->LookupVariable(*variable_name, true));
-}
-
-void Parser::CaptureAllInstantiators() {
-  if (IsInstantiatorRequired()) {
-    CaptureInstantiator();
-  }
-  if (innermost_function().HasGenericParent()) {
-    CaptureFunctionTypeArguments();
-  }
-}
-
-AstNode* Parser::LoadReceiver(TokenPosition token_pos) {
-  // A nested function may access 'this', referring to the receiver of the
-  // outermost enclosing function.
-  const bool kTestOnly = false;
-  LocalVariable* receiver = LookupReceiver(current_block_->scope, kTestOnly);
-  if (receiver == NULL) {
-    ReportError(token_pos, "illegal implicit access to receiver 'this'");
-  }
-  return new (Z) LoadLocalNode(TokenPos(), receiver);
-}
-
-InstanceGetterNode* Parser::CallGetter(TokenPosition token_pos,
-                                       AstNode* object,
-                                       const String& name) {
-  return new (Z) InstanceGetterNode(token_pos, object, name);
-}
-
-// Returns ast nodes of the variable initialization.
-AstNode* Parser::ParseVariableDeclaration(const AbstractType& type,
-                                          bool is_final,
-                                          bool is_const,
-                                          SequenceNode** await_preamble) {
-  TRACE_PARSER("ParseVariableDeclaration");
-  ASSERT(IsIdentifier());
-  const TokenPosition ident_pos = TokenPos();
-  const String& ident = *CurrentLiteral();
-  ConsumeToken();  // Variable identifier.
-  const TokenPosition assign_pos = TokenPos();
-  AstNode* initialization = NULL;
-  LocalVariable* variable = NULL;
-  if (CurrentToken() == Token::kASSIGN) {
-    // Variable initialization.
-    ConsumeToken();
-    AstNode* expr =
-        ParseAwaitableExpr(is_const, kConsumeCascades, await_preamble);
-    const TokenPosition expr_end_pos = TokenPos();
-    variable = new (Z) LocalVariable(ident_pos, expr_end_pos, ident, type);
-    initialization = new (Z) StoreLocalNode(assign_pos, variable, expr);
-    if (is_const) {
-      ASSERT(expr->IsLiteralNode());
-      variable->SetConstValue(expr->AsLiteralNode()->literal());
-    }
-  } else if (is_final || is_const) {
-    ReportError(ident_pos,
-                "missing initialization of 'final' or 'const' variable");
-  } else {
-    // Initialize variable with null.
-    variable = new (Z) LocalVariable(ident_pos, assign_pos, ident, type);
-    AstNode* null_expr =
-        new (Z) LiteralNode(ident_pos, Object::null_instance());
-    initialization = new (Z) StoreLocalNode(ident_pos, variable, null_expr);
-  }
-
-  ASSERT(current_block_ != NULL);
-  const TokenPosition previous_pos =
-      current_block_->scope->PreviousReferencePos(ident);
-  if (previous_pos.IsReal()) {
-    ASSERT(!script_.IsNull());
-    if (previous_pos > ident_pos) {
-      ReportError(ident_pos, "initializer of '%s' may not refer to itself",
-                  ident.ToCString());
-
-    } else {
-      intptr_t line_number;
-      script_.GetTokenLocation(previous_pos, &line_number, NULL);
-      ReportError(ident_pos, "identifier '%s' previously used in line %" Pd "",
-                  ident.ToCString(), line_number);
-    }
-  }
-
-  // Add variable to scope after parsing the initializer expression.
-  // The expression must not be able to refer to the variable.
-  if (!current_block_->scope->AddVariable(variable)) {
-    LocalVariable* existing_var =
-        current_block_->scope->LookupVariable(variable->name(), true);
-    ASSERT(existing_var != NULL);
-    // Use before define cases have already been detected and reported above.
-    ASSERT(existing_var->owner() == current_block_->scope);
-    ReportError(ident_pos, "identifier '%s' already defined",
-                variable->name().ToCString());
-  }
-  if (is_final || is_const) {
-    variable->set_is_final();
-  }
-  return initialization;
-}
-
-// Parses ('var' | 'final' [type] | 'const' [type] | type).
-// The presence of 'final' or 'const' must be detected and remembered
-// before the call. If a type is parsed, it may be resolved and finalized
-// according to the given type finalization mode.
-RawAbstractType* Parser::ParseConstFinalVarOrType(
-    ClassFinalizer::FinalizationKind finalization) {
-  TRACE_PARSER("ParseConstFinalVarOrType");
-  if (CurrentToken() == Token::kVAR) {
-    ConsumeToken();
-    return Type::DynamicType();
-  }
-  bool type_is_optional = false;
-  if ((CurrentToken() == Token::kFINAL) || (CurrentToken() == Token::kCONST)) {
-    ConsumeToken();
-    type_is_optional = true;
-  }
-  if ((CurrentToken() == Token::kVOID) || IsFunctionTypeSymbol()) {
-    return ParseTypeOrFunctionType(true, finalization);
-  }
-  if (CurrentToken() != Token::kIDENT) {
-    if (type_is_optional) {
-      return Type::DynamicType();
-    } else {
-      ReportError("type name expected");
-    }
-  }
-  if (type_is_optional) {
-    Token::Kind follower = LookaheadToken(1);
-    // We have an identifier followed by a 'follower' token.
-    // We either parse a type or return now.
-    if ((follower != Token::kLT) &&        // Parameterized type.
-        (follower != Token::kPERIOD) &&    // Qualified class name of type.
-        !Token::IsIdentifier(follower) &&  // Variable name following a type.
-        (follower != Token::kTHIS)) {      // Field parameter following a type.
-      return Type::DynamicType();
-    }
-  }
-  return ParseTypeOrFunctionType(false, finalization);  // void handled above.
-}
-
-// Returns ast nodes of the variable initialization. Variables without an
-// explicit initializer are initialized to null. If several variables are
-// declared, the individual initializers are collected in a sequence node.
-AstNode* Parser::ParseVariableDeclarationList() {
-  TRACE_PARSER("ParseVariableDeclarationList");
-  SkipMetadata();
-  bool is_final = (CurrentToken() == Token::kFINAL);
-  bool is_const = (CurrentToken() == Token::kCONST);
-  const AbstractType& type = AbstractType::ZoneHandle(
-      Z,
-      ParseConstFinalVarOrType(I->type_checks() ? ClassFinalizer::kCanonicalize
-                                                : ClassFinalizer::kIgnore));
-  if (!IsIdentifier()) {
-    ReportError("identifier expected");
-  }
-
-  SequenceNode* preamble = NULL;
-  AstNode* initializers =
-      ParseVariableDeclaration(type, is_final, is_const, &preamble);
-  ASSERT(initializers != NULL);
-  if (preamble != NULL) {
-    preamble->Add(initializers);
-    initializers = preamble;
-  }
-  while (CurrentToken() == Token::kCOMMA) {
-    ConsumeToken();
-    if (!IsIdentifier()) {
-      ReportError("identifier expected after comma");
-    }
-    // We have a second initializer. Allocate a sequence node now.
-    // The sequence does not own the current scope. Set its own scope to NULL.
-    SequenceNode* sequence =
-        NodeAsSequenceNode(initializers->token_pos(), initializers, NULL);
-    preamble = NULL;
-    AstNode* declaration =
-        ParseVariableDeclaration(type, is_final, is_const, &preamble);
-    if (preamble != NULL) {
-      sequence->Add(preamble);
-    }
-    sequence->Add(declaration);
-    initializers = sequence;
-  }
-  return initializers;
-}
-
-AstNode* Parser::ParseFunctionStatement(bool is_literal) {
-  TRACE_PARSER("ParseFunctionStatement");
-  AbstractType& result_type = AbstractType::Handle(Z, Type::DynamicType());
-  const String* function_name = NULL;
-  const TokenPosition function_pos = TokenPos();
-  TokenPosition function_name_pos = TokenPosition::kNoSource;
-  TokenPosition metadata_pos = TokenPosition::kNoSource;
-  if (is_literal) {
-    ASSERT(CurrentToken() == Token::kLPAREN || CurrentToken() == Token::kLT);
-    function_name = &Symbols::AnonymousClosure();
-  } else {
-    metadata_pos = SkipMetadata();
-    // Parse optional result type.
-    if (IsFunctionReturnType()) {
-      // It is too early to resolve the type here, since it can be a result type
-      // referring to a not yet declared function type parameter.
-      result_type =
-          ParseTypeOrFunctionType(true, ClassFinalizer::kDoNotResolve);
-    }
-    function_name_pos = TokenPos();
-    function_name = ExpectIdentifier("function name expected");
-
-    // Check that the function name has not been referenced
-    // before this declaration.
-    ASSERT(current_block_ != NULL);
-    const TokenPosition previous_pos =
-        current_block_->scope->PreviousReferencePos(*function_name);
-    if (previous_pos.IsReal()) {
-      ASSERT(!script_.IsNull());
-      intptr_t line_number;
-      script_.GetTokenLocation(previous_pos, &line_number, NULL);
-      ReportError(function_name_pos,
-                  "identifier '%s' previously used in line %" Pd "",
-                  function_name->ToCString(), line_number);
-    }
-  }
-
-  // Check whether we have parsed this closure function before, in a previous
-  // compilation. If so, reuse the function object, else create a new one
-  // and register it in the current class.
-  // Note that we cannot share the same closure function between the closurized
-  // and non-closurized versions of the same parent function.
-  Function& function = Function::ZoneHandle(Z);
-  bool found_func = true;
-  // TODO(hausner): There could be two different closures at the given
-  // function_pos, one enclosed in a closurized function and one enclosed in the
-  // non-closurized version of this same function.
-  function = I->LookupClosureFunction(innermost_function(), function_pos);
-  if (function.IsNull()) {
-    // The function will be registered in the lookup table by the
-    // EffectGraphVisitor::VisitClosureNode when the newly allocated closure
-    // function has been properly setup.
-    found_func = false;
-    function = Function::NewClosureFunction(*function_name,
-                                            innermost_function(), function_pos);
-    function.set_result_type(result_type);
-    // The result type may refer to the function's type parameters,
-    // but was not parsed in the scope of the function. Adjust.
-    result_type.SetScopeFunction(function);
-    if (metadata_pos.IsReal()) {
-      library_.AddFunctionMetadata(function, metadata_pos);
-    }
-  }
-
-  ASSERT(function.parent_function() == innermost_function_.raw());
-  innermost_function_ = function.raw();
-
-  if (CurrentToken() == Token::kLT) {
-    if (!found_func) {
-      ParseTypeParameters(false);  // Not parameterizing class, but function.
-    } else {
-      TryParseTypeParameters();
-    }
-  }
-
-  CheckToken(Token::kLPAREN);
-
-  // The function type needs to be finalized at compile time, since the closure
-  // may be type checked at run time when assigned to a function variable,
-  // passed as a function argument, or returned as a function result.
-
-  LocalVariable* function_variable = NULL;
-  Type& function_type = Type::ZoneHandle(Z);
-  if (!is_literal) {
-    // Since the function type depends on the signature of the closure function,
-    // it cannot be determined before the formal parameter list of the closure
-    // function is parsed. Therefore, we set the function type to a new
-    // function type to be patched after the actual type is known.
-    // We temporarily use the Closure class as scope class.
-    const Class& unknown_scope_class =
-        Class::Handle(Z, I->object_store()->closure_class());
-    function_type =
-        Type::New(unknown_scope_class, TypeArguments::Handle(Z), function_pos);
-    function_type.set_signature(function);
-    function_type.SetIsFinalized();  // No finalization needed.
-
-    // Add the function variable to the scope before parsing the function in
-    // order to allow self reference from inside the function.
-    function_variable = new (Z) LocalVariable(function_name_pos, function_pos,
-                                              *function_name, function_type);
-    function_variable->set_is_final();
-    ASSERT(current_block_ != NULL);
-    ASSERT(current_block_->scope != NULL);
-    if (!current_block_->scope->AddVariable(function_variable)) {
-      LocalVariable* existing_var = current_block_->scope->LookupVariable(
-          function_variable->name(), true);
-      ASSERT(existing_var != NULL);
-      // Use before define cases have already been detected and reported above.
-      ASSERT(existing_var->owner() == current_block_->scope);
-      ReportError(function_pos, "identifier '%s' already defined",
-                  function_variable->name().ToCString());
-    }
-  }
-
-  Type& signature_type = Type::ZoneHandle(Z);
-  SequenceNode* statements = NULL;
-  if (!found_func) {
-    // Parse the local function. As a side effect of the parsing, the
-    // variables of this function's scope that are referenced by the local
-    // function (and its inner nested functions) will be marked as captured.
-
-    ResolveTypeParameters(&result_type);
-    function.set_result_type(result_type);  // Update type without scope change.
-    // Type parameters appearing in parameter types are resolved in ParseFunc.
-    statements = Parser::ParseFunc(function, !is_literal);
-    INC_STAT(thread(), num_functions_parsed, 1);
-
-    // Now that the local function has formal parameters, finalize its signature
-    signature_type = function.SignatureType();
-    signature_type ^= CanonicalizeType(signature_type);
-    function.SetSignatureType(signature_type);
-  } else {
-    // The local function was parsed before. The captured variables are
-    // saved in the function's context scope. Iterate over the context scope
-    // and mark its variables as captured.
-    const ContextScope& context_scope =
-        ContextScope::Handle(Z, function.context_scope());
-    ASSERT(!context_scope.IsNull());
-    String& var_name = String::Handle(Z);
-    for (int i = 0; i < context_scope.num_variables(); i++) {
-      var_name = context_scope.NameAt(i);
-      // We need to look up the name in a way that returns even hidden
-      // variables, e.g. 'this' in an initializer list.
-      LocalVariable* v = current_block_->scope->LookupVariable(var_name, true);
-      ASSERT(v != NULL);
-      current_block_->scope->CaptureVariable(v);
-    }
-    SkipFunctionLiteral();
-    signature_type = function.SignatureType();
-  }
-
-  // Local functions are registered in the enclosing class, but
-  // ignored during class finalization. The enclosing class has
-  // already been finalized.
-  ASSERT(current_class().is_finalized());
-  ASSERT(signature_type.IsFinalized());
-
-  // Make sure that the instantiators are captured.
-  if ((FunctionLevel() > 0) && !signature_type.IsInstantiated()) {
-    CaptureAllInstantiators();
-  }
-
-  // A local signature type itself cannot be malformed or malbounded, only its
-  // signature function's result type or parameter types may be.
-  ASSERT(!signature_type.IsMalformed());
-  ASSERT(!signature_type.IsMalbounded());
-
-  if (!is_literal) {
-    // Patch the function type of the variable now that the signature is known.
-    function_type.set_type_class(Class::Handle(Z, signature_type.type_class()));
-    function_type.set_arguments(
-        TypeArguments::Handle(Z, signature_type.arguments()));
-    ASSERT(function_type.signature() == function.raw());
-
-    // The function type was initially marked as instantiated, but it may
-    // actually be uninstantiated.
-    function_type.ResetIsFinalized();
-
-    // The function variable type should have been patched above.
-    ASSERT(function_variable->type().raw() == function_type.raw());
-  }
-
-  // The code generator does not compile the closure function when visiting
-  // a ClosureNode. The generated code allocates a new Closure object containing
-  // the current context. The type of the Closure object refers to the closure
-  // function, which will be compiled on first invocation of the closure object.
-  // Therefore, we ignore the parsed default_parameter_values and the
-  // node_sequence representing the body of the closure function, which will be
-  // parsed again when compiled later.
-  // The only purpose of parsing the function now (besides reporting obvious
-  // errors) is to mark referenced variables of the enclosing scopes as
-  // captured. The captured variables will be recorded along with their
-  // allocation information in a Scope object stored in the function object.
-  // This Scope object is then provided to the compiler when compiling the local
-  // function. It would be too early to record the captured variables here,
-  // since further closure functions may capture more variables.
-  // This Scope object is constructed after all variables have been allocated.
-  // The local scope of the parsed function can be pruned, since contained
-  // variables are not relevant for the compilation of the enclosing function.
-  // This pruning is done by omitting to hook the local scope in its parent
-  // scope in the constructor of LocalScope.
-  AstNode* closure =
-      new (Z) ClosureNode(function_pos, function, NULL,
-                          statements != NULL ? statements->scope() : NULL);
-
-  ASSERT(innermost_function_.raw() == function.raw());
-  innermost_function_ = function.parent_function();
-  return is_literal
-             ? closure
-             : new (Z) StoreLocalNode(function_pos, function_variable, closure);
-}
-
-// Returns true if the current and next tokens can be parsed as type
-// parameters. Current token position is not saved and restored.
-bool Parser::TryParseTypeParameters() {
-  ASSERT(CurrentToken() == Token::kLT);
-  int nesting_level = 0;
-  do {
-    Token::Kind ct = CurrentToken();
-    if (ct == Token::kLT) {
-      nesting_level++;
-    } else if (ct == Token::kGT) {
-      nesting_level--;
-    } else if (ct == Token::kSHR) {
-      nesting_level -= 2;
-    } else if (ct == Token::kIDENT) {
-      // Check to see if it is a qualified identifier.
-      if (LookaheadToken(1) == Token::kPERIOD) {
-        // Consume the identifier, the period will be consumed below.
-        ConsumeToken();
-      }
-    } else if ((ct != Token::kCOMMA) && (ct != Token::kEXTENDS)) {
-      // We are looking at something other than type parameters.
-      return false;
-    }
-    ConsumeToken();
-  } while (nesting_level > 0);
-  if (nesting_level < 0) {
-    return false;
-  }
-  return true;
-}
-
-// Returns true if the next tokens can be parsed as type parameters.
-bool Parser::IsTypeParameters() {
-  if (CurrentToken() == Token::kLT) {
-    TokenPosScope param_pos(this);
-    if (!TryParseTypeParameters()) {
-      return false;
-    }
-    return true;
-  }
-  return false;
-}
-
-// Returns true if the next tokens are [ typeParameters ] '('.
-bool Parser::IsParameterPart() {
-  if (CurrentToken() == Token::kLPAREN) {
-    return true;
-  }
-  if (CurrentToken() == Token::kLT) {
-    TokenPosScope type_arg_pos(this);
-    if (!TryParseTypeParameters()) {
-      return false;
-    }
-    return CurrentToken() == Token::kLPAREN;
-  }
-  return false;
-}
-
-// Returns true if the current and next tokens can be parsed as type
-// arguments. Current token position is not saved and restored.
-bool Parser::TryParseTypeArguments() {
-  ASSERT(CurrentToken() == Token::kLT);
-  int nesting_level = 0;
-  do {
-    Token::Kind ct = CurrentToken();
-    if (ct == Token::kLT) {
-      nesting_level++;
-    } else if (ct == Token::kGT) {
-      nesting_level--;
-    } else if (ct == Token::kSHR) {
-      nesting_level -= 2;
-    } else if (ct == Token::kVOID) {
-      ConsumeToken();
-      continue;
-    } else if (ct == Token::kIDENT) {
-      if (IsFunctionTypeSymbol()) {
-        if (!TryParseType(false)) {
-          return false;
-        }
-        continue;
-      } else {
-        // Check to see if it is a qualified identifier.
-        if (LookaheadToken(1) == Token::kPERIOD) {
-          // Consume the identifier, the period will be consumed below.
-          ConsumeToken();
-        }
-      }
-    } else if (ct != Token::kCOMMA) {
-      return false;
-    }
-    ConsumeToken();
-  } while (nesting_level > 0);
-  if (nesting_level < 0) {
-    return false;
-  }
-  return true;
-}
-
-// Returns true if the next tokens are [ typeArguments ] '('.
-bool Parser::IsArgumentPart() {
-  if (CurrentToken() == Token::kLPAREN) {
-    return true;
-  }
-  if (CurrentToken() == Token::kLT) {
-    TokenPosScope type_arg_pos(this);
-    if (!TryParseTypeArguments()) {
-      return false;
-    }
-    return CurrentToken() == Token::kLPAREN;
-  }
-  return false;
-}
-
-bool Parser::IsSimpleLiteral(const AbstractType& type, Instance* value) {
-  // Assigning null never causes a type error.
-  if (CurrentToken() == Token::kNULL) {
-    *value = Instance::null();
-    return true;
-  }
-  // If the type of the const field is guaranteed to be instantiated once
-  // resolved at class finalization time, and if the type of the literal is one
-  // of int, double, String, or bool, then preset the field with the value and
-  // perform the type check (in checked mode only) at finalization time.
-  if (type.IsTypeParameter() || (type.arguments() != TypeArguments::null())) {
-    // Type parameters are always resolved eagerly by the parser and never
-    // resolved later by the class finalizer. Therefore, we know here that if
-    // 'type' is not a type parameter (an unresolved type will not get resolved
-    // to a type parameter later) and if 'type' has no type arguments, then it
-    // will be instantiated at class finalization time. Otherwise, we return
-    // false, since the type test would not be possible at finalization time for
-    // an uninstantiated type.
-    return false;
-  }
-  if (CurrentToken() == Token::kINTEGER) {
-    *value = CurrentIntegerLiteral();
-    return true;
-  } else if (CurrentToken() == Token::kDOUBLE) {
-    *value = CurrentDoubleLiteral();
-    return true;
-  } else if (CurrentToken() == Token::kSTRING) {
-    *value = CurrentLiteral()->raw();
-    return true;
-  } else if (CurrentToken() == Token::kTRUE) {
-    *value = Bool::True().raw();
-    return true;
-  } else if (CurrentToken() == Token::kFALSE) {
-    *value = Bool::False().raw();
-    return true;
-  }
-  return false;
-}
-
-// Returns true if the current token is kIDENT or a pseudo-keyword.
-bool Parser::IsIdentifier() {
-  return Token::IsIdentifier(CurrentToken()) &&
-         !(await_is_keyword_ &&
-           ((CurrentLiteral()->raw() == Symbols::Await().raw()) ||
-            (CurrentLiteral()->raw() == Symbols::Async().raw()) ||
-            (CurrentLiteral()->raw() == Symbols::YieldKw().raw())));
-}
-
-bool Parser::IsSymbol(const String& symbol) {
-  return (CurrentLiteral()->raw() == symbol.raw()) &&
-         (CurrentToken() == Token::kIDENT);
-}
-
-// Returns true if the current token is 'Function' followed by '<' or '('.
-// 'Function' not followed by '<' or '(' denotes the Function class.
-bool Parser::IsFunctionTypeSymbol() {
-  return IsSymbol(Symbols::Function()) &&
-         ((LookaheadToken(1) == Token::kLPAREN) ||
-          (LookaheadToken(1) == Token::kLT));
-}
-
-// Returns true if the next tokens can be parsed as a an optionally
-// qualified identifier: [ident '.'] ident.
-// Current token position is not restored.
-bool Parser::TryParseQualIdent() {
-  if (CurrentToken() != Token::kIDENT) {
-    return false;
-  }
-  ConsumeToken();
-  if (CurrentToken() == Token::kPERIOD) {
-    ConsumeToken();
-    if (CurrentToken() != Token::kIDENT) {
-      return false;
-    }
-    ConsumeToken();
-  }
-  return true;
-}
-
-// Returns true if the next tokens can be parsed as a type with optional
-// type parameters. Current token position is not restored.
-// Allow 'void' as type if 'allow_void' is true.
-// Note that 'void Function()' is always allowed, since it is a function type
-// and not the void type.
-// TODO(regis): Consider removing allow_void argument, since this call is only
-// used where void is allowed. Wait for Dart 2 spec to stabilize.
-bool Parser::TryParseType(bool allow_void) {
-  bool found = false;
-  if (CurrentToken() == Token::kVOID) {
-    ConsumeToken();
-    if (allow_void) {
-      found = true;
-    } else if (!IsFunctionTypeSymbol()) {
-      return false;
-    }
-  } else if ((CurrentToken() == Token::kIDENT) && !IsFunctionTypeSymbol()) {
-    // 'Function' not followed by '(' or '<' means the Function class.
-    if (!TryParseQualIdent()) {
-      return false;
-    }
-    if ((CurrentToken() == Token::kLT) && !TryParseTypeArguments()) {
-      return false;
-    }
-    found = true;
-  }
-  while (IsFunctionTypeSymbol()) {
-    ConsumeToken();
-    if ((CurrentToken() == Token::kLT) && !TryParseTypeParameters()) {
-      return false;
-    }
-    if (CurrentToken() == Token::kLPAREN) {
-      SkipToMatchingParenthesis();
-    } else {
-      return false;
-    }
-    found = true;
-  }
-  return found;
-}
-
-// Look ahead to detect whether the next tokens should be parsed as
-// a variable declaration. Ignores optional metadata.
-// Returns true if we detect the token pattern:
-//     'var'
-//   | 'final'
-//   | const [type] ident (';' | '=' | ',')
-//   | type ident (';' | '=' | ',')
-// Token position remains unchanged.
-bool Parser::IsVariableDeclaration() {
-  if ((CurrentToken() == Token::kVAR) || (CurrentToken() == Token::kFINAL)) {
-    return true;
-  }
-  // Skip optional metadata.
-  if (CurrentToken() == Token::kAT) {
-    const TokenPosition saved_pos = TokenPos();
-    SkipMetadata();
-    const bool is_var_decl = IsVariableDeclaration();
-    SetPosition(saved_pos);
-    return is_var_decl;
-  }
-  if ((CurrentToken() != Token::kIDENT) && (CurrentToken() != Token::kVOID) &&
-      (CurrentToken() != Token::kCONST)) {
-    // Not a legal type identifier or void or const keyword or metadata.
-    return false;
-  }
-  const TokenPosition saved_pos = TokenPos();
-  bool is_var_decl = false;
-  bool have_type = false;
-  if (CurrentToken() == Token::kCONST) {
-    ConsumeToken();
-    have_type = true;  // Type is dynamic if 'const' is not followed by a type.
-  }
-  if ((CurrentToken() == Token::kVOID) || IsFunctionTypeSymbol()) {
-    if (TryParseType(true)) {
-      have_type = true;
-    }
-  } else if (IsIdentifier()) {  // Type or variable name.
-    Token::Kind follower = LookaheadToken(1);
-    if ((follower == Token::kLT) ||       // Parameterized type.
-        (follower == Token::kPERIOD) ||   // Qualified class name of type.
-        Token::IsIdentifier(follower)) {  // Variable name following a type.
-      // We see the beginning of something that could be a type.
-      const TokenPosition type_pos = TokenPos();
-      if (TryParseType(false)) {  // void handled above.
-        have_type = true;
-      } else {
-        SetPosition(type_pos);
-      }
-    }
-  }
-  if (have_type && IsIdentifier()) {
-    ConsumeToken();
-    if ((CurrentToken() == Token::kSEMICOLON) ||
-        (CurrentToken() == Token::kCOMMA) ||
-        (CurrentToken() == Token::kASSIGN)) {
-      is_var_decl = true;
-    }
-  }
-  SetPosition(saved_pos);
-  return is_var_decl;
-}
-
-// Look ahead to see if the following tokens are a return type followed
-// by an identifier.
-bool Parser::IsFunctionReturnType() {
-  TokenPosScope decl_pos(this);
-  if (TryParseType(true)) {
-    if (IsIdentifier()) {
-      // Return type followed by function name.
-      return true;
-    }
-  }
-  return false;
-}
-
-// Look ahead to detect whether the next tokens should be parsed as
-// a function declaration. Token position remains unchanged.
-bool Parser::IsFunctionDeclaration() {
-  bool is_external = false;
-  TokenPosScope decl_pos(this);
-  SkipMetadata();
-  if ((is_top_level_) && (CurrentToken() == Token::kEXTERNAL)) {
-    // Skip over 'external' for top-level function declarations.
-    is_external = true;
-    ConsumeToken();
-  }
-  const TokenPosition type_or_name_pos = TokenPos();
-  if (TryParseType(true)) {
-    if (!IsIdentifier()) {
-      SetPosition(type_or_name_pos);
-    }
-  } else {
-    SetPosition(type_or_name_pos);
-  }
-  // Check for function name followed by optional type parameters.
-  if (!IsIdentifier()) {
-    return false;
-  }
-  ConsumeToken();
-  if ((CurrentToken() == Token::kLT) && !TryParseTypeParameters()) {
-    return false;
-  }
-
-  // Optional type, function name and optinal type parameters are parsed.
-  if (CurrentToken() != Token::kLPAREN) {
-    return false;
-  }
-
-  // Check parameter list and the following token.
-  SkipToMatchingParenthesis();
-  if ((CurrentToken() == Token::kLBRACE) || (CurrentToken() == Token::kARROW) ||
-      (is_top_level_ && IsSymbol(Symbols::Native())) || is_external ||
-      IsSymbol(Symbols::Async()) || IsSymbol(Symbols::Sync())) {
-    return true;
-  }
-  return false;
-}
-
-bool Parser::IsTopLevelAccessor() {
-  const TokenPosScope saved_pos(this);
-  if (CurrentToken() == Token::kEXTERNAL) {
-    ConsumeToken();
-  }
-  if ((CurrentToken() == Token::kGET) || (CurrentToken() == Token::kSET)) {
-    return true;
-  }
-  if (TryParseType(true)) {
-    if ((CurrentToken() == Token::kGET) || (CurrentToken() == Token::kSET)) {
-      if (Token::IsIdentifier(LookaheadToken(1))) {  // Accessor name.
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-bool Parser::IsFunctionLiteral() {
-  if (!allow_function_literals_) {
-    return false;
-  }
-  if ((CurrentToken() == Token::kLPAREN) || (CurrentToken() == Token::kLT)) {
-    TokenPosScope saved_pos(this);
-    if ((CurrentToken() == Token::kLT) && !TryParseTypeParameters()) {
-      return false;
-    }
-    if (CurrentToken() != Token::kLPAREN) {
-      return false;
-    }
-    SkipToMatchingParenthesis();
-    ParseFunctionModifier();
-    if ((CurrentToken() == Token::kLBRACE) ||
-        (CurrentToken() == Token::kARROW)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Current token position is the token after the opening ( of the for
-// statement. Returns true if we recognize a for ( .. in expr)
-// statement.
-bool Parser::IsForInStatement() {
-  const TokenPosScope saved_pos(this);
-  // Allow const modifier as well when recognizing a for-in statement
-  // pattern. We will get an error later if the loop variable is
-  // declared with const.
-  if (CurrentToken() == Token::kVAR || CurrentToken() == Token::kFINAL ||
-      CurrentToken() == Token::kCONST) {
-    ConsumeToken();
-  }
-  // void as the loop variable type does not make much sense, but it is not
-  // disallowed by the spec.
-  if (IsIdentifier() || (CurrentToken() == Token::kVOID)) {
-    if ((CurrentToken() != Token::kVOID) && (LookaheadToken(1) == Token::kIN)) {
-      return true;
-    } else if (TryParseType(true)) {
-      if (IsIdentifier()) {
-        ConsumeToken();
-      }
-      return CurrentToken() == Token::kIN;
-    }
-  }
-  return false;
-}
-
-static bool ContainsAbruptCompletingStatement(SequenceNode* seq);
-
-static bool IsAbruptCompleting(AstNode* statement) {
-  return statement->IsReturnNode() || statement->IsJumpNode() ||
-         statement->IsThrowNode() ||
-         (statement->IsSequenceNode() &&
-          ContainsAbruptCompletingStatement(statement->AsSequenceNode()));
-}
-
-static bool ContainsAbruptCompletingStatement(SequenceNode* seq) {
-  for (int i = 0; i < seq->length(); i++) {
-    if (IsAbruptCompleting(seq->NodeAt(i))) {
-      return true;
-    }
-  }
-  return false;
-}
-
-void Parser::ParseStatementSequence() {
-  TRACE_PARSER("ParseStatementSequence");
-  const bool dead_code_allowed = true;
-  bool abrupt_completing_seen = false;
-  RecursionChecker rc(this);
-  while (CurrentToken() != Token::kRBRACE) {
-    const TokenPosition statement_pos = TokenPos();
-    AstNode* statement = ParseStatement();
-    // Do not add statements with no effect (e.g., LoadLocalNode).
-    if ((statement != NULL) && statement->IsLoadLocalNode()) {
-      // Skip load local.
-      continue;
-    }
-    if (statement != NULL) {
-      if (!dead_code_allowed && abrupt_completing_seen) {
-        ReportError(statement_pos,
-                    "dead code after abrupt completing statement");
-      }
-      current_block_->statements->Add(statement);
-      abrupt_completing_seen |= IsAbruptCompleting(statement);
-    }
-  }
-}
-
-// Parse nested statement of if, while, for, etc. We automatically generate
-// a sequence of one statement if there are no curly braces.
-// The argument 'parsing_loop_body' indicates the parsing of a loop statement.
-SequenceNode* Parser::ParseNestedStatement(bool parsing_loop_body,
-                                           SourceLabel* label) {
-  TRACE_PARSER("ParseNestedStatement");
-  if (parsing_loop_body) {
-    OpenLoopBlock();
-  } else {
-    OpenBlock();
-  }
-  if (label != NULL) {
-    current_block_->scope->AddLabel(label);
-  }
-  if (CurrentToken() == Token::kLBRACE) {
-    ConsumeToken();
-    ParseStatementSequence();
-    ExpectToken(Token::kRBRACE);
-  } else {
-    RecursionChecker rc(this);
-    AstNode* statement = ParseStatement();
-    if (statement != NULL) {
-      current_block_->statements->Add(statement);
-    }
-  }
-  SequenceNode* sequence = CloseBlock();
-  return sequence;
-}
-
-AstNode* Parser::ParseIfStatement(String* label_name) {
-  TRACE_PARSER("ParseIfStatement");
-  ASSERT(CurrentToken() == Token::kIF);
-  const TokenPosition if_pos = TokenPos();
-  SourceLabel* label = NULL;
-  if (label_name != NULL) {
-    label = SourceLabel::New(if_pos, label_name, SourceLabel::kStatement);
-    OpenBlock();
-    current_block_->scope->AddLabel(label);
-  }
-  ConsumeToken();
-  ExpectToken(Token::kLPAREN);
-  AstNode* cond_expr = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
-  ExpectToken(Token::kRPAREN);
-  const bool parsing_loop_body = false;
-  SequenceNode* true_branch = ParseNestedStatement(parsing_loop_body, NULL);
-  SequenceNode* false_branch = NULL;
-  if (CurrentToken() == Token::kELSE) {
-    ConsumeToken();
-    false_branch = ParseNestedStatement(parsing_loop_body, NULL);
-  }
-  AstNode* if_node =
-      new (Z) IfNode(if_pos, cond_expr, true_branch, false_branch);
-  if (label != NULL) {
-    current_block_->statements->Add(if_node);
-    SequenceNode* sequence = CloseBlock();
-    sequence->set_label(label);
-    if_node = sequence;
-  }
-  return if_node;
-}
-
-// Return true if the type class of the given value implements the
-// == operator.
-static bool ImplementsEqualOperator(Zone* zone, const Instance& value) {
-  Class& cls = Class::Handle(value.clazz());
-  const Function& equal_op = Function::Handle(
-      zone,
-      Resolver::ResolveDynamicAnyArgs(zone, cls, Symbols::EqualOperator()));
-  ASSERT(!equal_op.IsNull());
-  cls = equal_op.Owner();
-  return !cls.IsObjectClass();
-}
-
-// Check that all case expressions are of the same type, either int, String,
-// or any other class that does not override the == operator.
-// The expressions are compile-time constants and are thus in the form
-// of a LiteralNode.
-RawClass* Parser::CheckCaseExpressions(
-    const GrowableArray<LiteralNode*>& values) {
-  const intptr_t num_expressions = values.length();
-  if (num_expressions == 0) {
-    return Object::dynamic_class();
-  }
-  const Instance& first_value = values[0]->literal();
-  for (intptr_t i = 0; i < num_expressions; i++) {
-    const Instance& val = values[i]->literal();
-    const TokenPosition val_pos = values[i]->token_pos();
-    if (first_value.IsInteger()) {
-      if (!val.IsInteger()) {
-        ReportError(val_pos, "expected case expression of type int");
-      }
-      continue;
-    }
-    if (first_value.IsString()) {
-      if (!val.IsString()) {
-        ReportError(val_pos, "expected case expression of type String");
-      }
-      continue;
-    }
-    if (val.IsDouble()) {
-      ReportError(val_pos, "case expression may not be of type double");
-    }
-    if (val.clazz() != first_value.clazz()) {
-      ReportError(val_pos, "all case expressions must be of same type");
-    }
-    if (val.clazz() == I->object_store()->symbol_class()) {
-      continue;
-    }
-    if (i == 0) {
-      // The value is of some type other than int, String or double.
-      // Check that the type class does not override the == operator.
-      // Check this only in the first loop iteration since all values
-      // are of the same type, which we check above.
-      if (ImplementsEqualOperator(Z, val)) {
-        ReportError(val_pos,
-                    "type class of case expression must not "
-                    "implement operator ==");
-      }
-    }
-  }
-  if (first_value.IsInteger()) {
-    return Type::Handle(Z, Type::IntType()).type_class();
-  } else if (first_value.IsString()) {
-    return Type::Handle(Z, Type::StringType()).type_class();
-  }
-  return first_value.clazz();
-}
-
-CaseNode* Parser::ParseCaseClause(LocalVariable* switch_expr_value,
-                                  GrowableArray<LiteralNode*>* case_expr_values,
-                                  SourceLabel* case_label) {
-  TRACE_PARSER("ParseCaseClause");
-  bool default_seen = false;
-  const TokenPosition case_pos = TokenPos();
-  // The case expressions node sequence does not own the enclosing scope.
-  SequenceNode* case_expressions = new (Z) SequenceNode(case_pos, NULL);
-  while (CurrentToken() == Token::kCASE || CurrentToken() == Token::kDEFAULT) {
-    if (CurrentToken() == Token::kCASE) {
-      if (default_seen) {
-        ReportError("default clause must be last case");
-      }
-      ConsumeToken();  // Keyword case.
-      const TokenPosition expr_pos = TokenPos();
-      AstNode* expr = ParseExpr(kRequireConst, kConsumeCascades);
-      ASSERT(expr->IsLiteralNode());
-      case_expr_values->Add(expr->AsLiteralNode());
-
-      AstNode* switch_expr_load =
-          new (Z) LoadLocalNode(case_pos, switch_expr_value);
-      AstNode* case_comparison =
-          new (Z) ComparisonNode(expr_pos, Token::kEQ, expr, switch_expr_load);
-      case_expressions->Add(case_comparison);
-    } else {
-      if (default_seen) {
-        ReportError("only one default clause is allowed");
-      }
-      ConsumeToken();  // Keyword default.
-      default_seen = true;
-      // The default case always succeeds.
-    }
-    ExpectToken(Token::kCOLON);
-  }
-
-  OpenBlock();
-  bool abrupt_completing_seen = false;
-  while (true) {
-    // Check whether the next statement still belongs to the current case
-    // clause. If we see 'case' or 'default', optionally preceeded by
-    // a label, or closing brace, we stop parsing statements.
-    Token::Kind next_token;
-    if (IsIdentifier() && LookaheadToken(1) == Token::kCOLON) {
-      next_token = LookaheadToken(2);
-    } else {
-      next_token = CurrentToken();
-    }
-    if (next_token == Token::kRBRACE) {
-      // End of switch statement.
-      break;
-    }
-    if ((next_token == Token::kCASE) || (next_token == Token::kDEFAULT)) {
-      // End of this case clause. If there is a possible fall-through to
-      // the next case clause, throw an implicit FallThroughError.
-      if (!abrupt_completing_seen) {
-        ArgumentListNode* arguments = new (Z) ArgumentListNode(TokenPos());
-        arguments->Add(new (Z) LiteralNode(
-            TokenPos(), Integer::ZoneHandle(
-                            Z, Integer::New(TokenPos().value(), Heap::kOld))));
-        current_block_->statements->Add(MakeStaticCall(
-            Symbols::FallThroughError(),
-            Library::PrivateCoreLibName(Symbols::ThrowNew()), arguments));
-      }
-      break;
-    }
-    // The next statement still belongs to this case.
-    AstNode* statement = ParseStatement();
-    if (statement != NULL) {
-      current_block_->statements->Add(statement);
-      abrupt_completing_seen |= IsAbruptCompleting(statement);
-    }
-  }
-  SequenceNode* statements = CloseBlock();
-  return new (Z) CaseNode(case_pos, case_label, case_expressions, default_seen,
-                          switch_expr_value, statements);
-}
-
-AstNode* Parser::ParseSwitchStatement(String* label_name) {
-  TRACE_PARSER("ParseSwitchStatement");
-  ASSERT(CurrentToken() == Token::kSWITCH);
-  const TokenPosition switch_pos = TokenPos();
-  SourceLabel* label =
-      SourceLabel::New(switch_pos, label_name, SourceLabel::kSwitch);
-  ConsumeToken();
-  ExpectToken(Token::kLPAREN);
-  const TokenPosition expr_pos = TokenPos();
-  AstNode* switch_expr =
-      ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
-  ExpectToken(Token::kRPAREN);
-  ExpectToken(Token::kLBRACE);
-  OpenBlock();
-  current_block_->scope->AddLabel(label);
-
-  // Store switch expression in temporary local variable. The type of the
-  // variable is set to dynamic. It will later be patched to match the
-  // type of the case clause expressions. Therefore, we have to allocate
-  // a new type representing dynamic and can't reuse the canonical
-  // type object for dynamic.
-  const Type& temp_var_type =
-      Type::ZoneHandle(Z, Type::New(Class::Handle(Z, Object::dynamic_class()),
-                                    TypeArguments::Handle(Z), expr_pos));
-  temp_var_type.SetIsFinalized();
-  LocalVariable* temp_variable = new (Z)
-      LocalVariable(expr_pos, expr_pos, Symbols::SwitchExpr(), temp_var_type);
-  current_block_->scope->AddVariable(temp_variable);
-  AstNode* save_switch_expr =
-      new (Z) StoreLocalNode(expr_pos, temp_variable, switch_expr);
-  current_block_->statements->Add(save_switch_expr);
-
-  // Parse case clauses
-  bool default_seen = false;
-  GrowableArray<LiteralNode*> case_expr_values;
-  while (true) {
-    // Check for statement label
-    SourceLabel* case_label = NULL;
-    if (IsIdentifier() && LookaheadToken(1) == Token::kCOLON) {
-      // Case statements start with a label.
-      String* label_name = CurrentLiteral();
-      const TokenPosition label_pos = TokenPos();
-      ConsumeToken();  // Consume label identifier.
-      ConsumeToken();  // Consume colon.
-      case_label = current_block_->scope->LocalLookupLabel(*label_name);
-      if (case_label == NULL) {
-        // Label does not exist yet. Add it to scope of switch statement.
-        case_label =
-            new (Z) SourceLabel(label_pos, *label_name, SourceLabel::kCase);
-        current_block_->scope->AddLabel(case_label);
-      } else if (case_label->kind() == SourceLabel::kForward) {
-        // We have seen a 'continue' with this label name. Resolve
-        // the forward reference.
-        case_label->ResolveForwardReference();
-        RemoveNodesForFinallyInlining(case_label);
-      } else {
-        ReportError(label_pos, "label '%s' already exists in scope",
-                    label_name->ToCString());
-      }
-      ASSERT(case_label->kind() == SourceLabel::kCase);
-    }
-    if (CurrentToken() == Token::kCASE || CurrentToken() == Token::kDEFAULT) {
-      if (default_seen) {
-        ReportError("no case clauses allowed after default clause");
-      }
-      CaseNode* case_clause =
-          ParseCaseClause(temp_variable, &case_expr_values, case_label);
-      default_seen = case_clause->contains_default();
-      current_block_->statements->Add(case_clause);
-    } else if (CurrentToken() != Token::kRBRACE) {
-      ReportError("'case' or '}' expected");
-    } else if (case_label != NULL) {
-      ReportError("expecting at least one case clause after label");
-    } else {
-      break;
-    }
-  }
-
-  // Check that all expressions in case clauses are of the same class,
-  // or implement int, double or String. Patch the type of the temporary
-  // variable holding the switch expression to match the type of the
-  // case clause constants.
-  temp_var_type.set_type_class(
-      Class::Handle(Z, CheckCaseExpressions(case_expr_values)));
-
-  // Check for unresolved label references.
-  SourceLabel* unresolved_label =
-      current_block_->scope->CheckUnresolvedLabels();
-  if (unresolved_label != NULL) {
-    ReportError("unresolved reference to label '%s'",
-                unresolved_label->name().ToCString());
-  }
-
-  SequenceNode* switch_body = CloseBlock();
-  ExpectToken(Token::kRBRACE);
-  return new (Z) SwitchNode(switch_pos, label, switch_body);
-}
-
-AstNode* Parser::ParseWhileStatement(String* label_name) {
-  TRACE_PARSER("ParseWhileStatement");
-  const TokenPosition while_pos = TokenPos();
-  SourceLabel* label =
-      SourceLabel::New(while_pos, label_name, SourceLabel::kWhile);
-  ConsumeToken();
-  ExpectToken(Token::kLPAREN);
-  SequenceNode* await_preamble = NULL;
-  AstNode* cond_expr =
-      ParseAwaitableExpr(kAllowConst, kConsumeCascades, &await_preamble);
-  ExpectToken(Token::kRPAREN);
-  const bool parsing_loop_body = true;
-  SequenceNode* while_body = ParseNestedStatement(parsing_loop_body, label);
-  WhileNode* while_node = new (Z)
-      WhileNode(while_pos, label, cond_expr, await_preamble, while_body);
-  return while_node;
-}
-
-AstNode* Parser::ParseDoWhileStatement(String* label_name) {
-  TRACE_PARSER("ParseDoWhileStatement");
-  const TokenPosition do_pos = TokenPos();
-  SourceLabel* label =
-      SourceLabel::New(do_pos, label_name, SourceLabel::kDoWhile);
-  ConsumeToken();
-  const bool parsing_loop_body = true;
-  SequenceNode* dowhile_body = ParseNestedStatement(parsing_loop_body, label);
-  ExpectToken(Token::kWHILE);
-  ExpectToken(Token::kLPAREN);
-  SequenceNode* await_preamble = NULL;
-  TokenPosition expr_pos = TokenPos();
-  AstNode* cond_expr =
-      ParseAwaitableExpr(kAllowConst, kConsumeCascades, &await_preamble);
-  if (await_preamble != NULL) {
-    // Prepend the preamble to the condition.
-    LetNode* await_cond = new (Z) LetNode(expr_pos);
-    await_cond->AddNode(await_preamble);
-    await_cond->AddNode(cond_expr);
-    cond_expr = await_cond;
-  }
-  ExpectToken(Token::kRPAREN);
-  ExpectSemicolon();
-  return new (Z) DoWhileNode(do_pos, label, cond_expr, dowhile_body);
-}
-
-static LocalVariable* LookupSavedTryContextVar(LocalScope* scope) {
-  LocalVariable* var =
-      scope->LocalLookupVariable(Symbols::SavedTryContextVar());
-  ASSERT((var != NULL) && !var->is_captured());
-  return var;
-}
-
-static LocalVariable* LookupAsyncSavedTryContextVar(Thread* thread,
-                                                    LocalScope* scope,
-                                                    uint16_t try_index) {
-  Zone* zone = thread->zone();
-  const String& async_saved_try_ctx_name = String::ZoneHandle(
-      zone, Symbols::NewFormatted(
-                thread, "%s%d",
-                Symbols::AsyncSavedTryCtxVarPrefix().ToCString(), try_index));
-  LocalVariable* var = scope->LocalLookupVariable(async_saved_try_ctx_name);
-  ASSERT(var != NULL);
-  return var;
-}
-
-// If the await or yield being parsed is in a try block, the continuation code
-// needs to restore the corresponding stack-based variable :saved_try_ctx_var,
-// and the stack-based variable :saved_try_ctx_var of the outer try block.
-// The inner :saved_try_ctx_var is used by a finally clause handling an
-// exception thrown by the continuation code in a try block or catch block.
-// If no finally clause exists, the catch or finally clause of the outer try
-// block, if any, uses the outer :saved_try_ctx_var to handle the exception.
-//
-// * Try blocks and catch blocks:
-//     Set the context variable for this try block and for the outer try block.
-// * Finally blocks:
-//     Set the context variable for the outer try block. Note that the try
-//     declaring the finally is popped before parsing the finally clause, so the
-//     outer try block is at the top of the try block list.
-void Parser::CheckAsyncOpInTryBlock(
-    LocalVariable** saved_try_ctx,
-    LocalVariable** async_saved_try_ctx,
-    LocalVariable** outer_saved_try_ctx,
-    LocalVariable** outer_async_saved_try_ctx) const {
-  *saved_try_ctx = NULL;
-  *async_saved_try_ctx = NULL;
-  *outer_saved_try_ctx = NULL;
-  *outer_async_saved_try_ctx = NULL;
-  if (try_stack_ != NULL) {
-    LocalScope* scope = try_stack_->try_block()->scope;
-    uint16_t try_index = try_stack_->try_index();
-    const int current_function_level = FunctionLevel();
-    if (scope->function_level() == current_function_level) {
-      // The block declaring :saved_try_ctx_var variable is the parent of the
-      // pushed try block.
-      *saved_try_ctx = LookupSavedTryContextVar(scope->parent());
-      *async_saved_try_ctx =
-          LookupAsyncSavedTryContextVar(T, async_temp_scope_, try_index);
-      if ((try_stack_->outer_try() != NULL) && !try_stack_->inside_finally()) {
-        // Collecting the outer try scope is not necessary if we
-        // are in a finally block.
-        scope = try_stack_->outer_try()->try_block()->scope;
-        try_index = try_stack_->outer_try()->try_index();
-        if (scope->function_level() == current_function_level) {
-          *outer_saved_try_ctx = LookupSavedTryContextVar(scope->parent());
-          *outer_async_saved_try_ctx =
-              LookupAsyncSavedTryContextVar(T, async_temp_scope_, try_index);
-        }
-      }
-    }
-  }
-  // An async or async* has an implicitly created try-catch around the
-  // function body, so the await or yield inside the async closure should always
-  // be created with a try scope.
-  ASSERT((*saved_try_ctx != NULL) || innermost_function().IsAsyncFunction() ||
-         innermost_function().IsAsyncGenerator() ||
-         innermost_function().IsSyncGenClosure() ||
-         innermost_function().IsSyncGenerator());
-}
-
-// Build an AST node for static call to Dart function print(str).
-// Used during debugging to insert print in generated dart code.
-AstNode* Parser::DartPrint(const char* str) {
-  const Library& lib = Library::Handle(Library::CoreLibrary());
-  const Function& print_fn =
-      Function::ZoneHandle(Z, lib.LookupFunctionAllowPrivate(Symbols::print()));
-  ASSERT(!print_fn.IsNull());
-  ArgumentListNode* one_arg =
-      new (Z) ArgumentListNode(TokenPosition::kNoSource);
-  String& msg = String::ZoneHandle(Symbols::NewFormatted(T, "%s", str));
-  one_arg->Add(new (Z) LiteralNode(TokenPosition::kNoSource, msg));
-  AstNode* print_call = new (Z) StaticCallNode(
-      TokenPosition::kNoSource, print_fn, one_arg, StaticCallNode::kStatic);
-  return print_call;
-}
-
-AstNode* Parser::ParseAwaitForStatement(String* label_name) {
-  TRACE_PARSER("ParseAwaitForStatement");
-  ASSERT(IsAwaitKeyword());
-  const TokenPosition await_for_pos = TokenPos();
-  ConsumeToken();  // await.
-  ASSERT(CurrentToken() == Token::kFOR);
-  ConsumeToken();  // for.
-  ExpectToken(Token::kLPAREN);
-
-  if (!innermost_function().IsAsyncFunction() &&
-      !innermost_function().IsAsyncClosure() &&
-      !innermost_function().IsAsyncGenerator() &&
-      !innermost_function().IsAsyncGenClosure()) {
-    ReportError(await_for_pos,
-                "await for loop is only allowed in an asynchronous function");
-  }
-
-  // Parse loop variable.
-  bool loop_var_is_final = (CurrentToken() == Token::kFINAL);
-  if (CurrentToken() == Token::kCONST) {
-    ReportError("Loop variable cannot be 'const'");
-  }
-  bool new_loop_var = false;
-  AbstractType& loop_var_type = AbstractType::ZoneHandle(Z);
-  if (LookaheadToken(1) != Token::kIN) {
-    // Declaration of a new loop variable.
-    // Delay creation of the local variable until we know its actual
-    // position, which is inside the loop body.
-    new_loop_var = true;
-    loop_var_type = ParseConstFinalVarOrType(I->type_checks()
-                                                 ? ClassFinalizer::kCanonicalize
-                                                 : ClassFinalizer::kIgnore);
-  }
-  TokenPosition loop_var_pos = TokenPos();
-  const String* loop_var_name = ExpectIdentifier("variable name expected");
-
-  // Parse stream expression.
-  ExpectToken(Token::kIN);
-
-  // Open a block for the iterator variable and the try-finally statement
-  // that contains the loop. Ensure that the block starts at a different
-  // token position than the following loop block. Both blocks can allocate
-  // contexts and if they have a matching token position range,
-  // it can be an issue (cf. bug 26941).
-  OpenBlock();
-  const Block* await_for_block = current_block_;
-
-  const TokenPosition stream_expr_pos = TokenPos();
-  AstNode* stream_expr =
-      ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
-  ExpectToken(Token::kRPAREN);
-
-  // Create :stream to store the stream into temporarily.
-  LocalVariable* stream_var =
-      new (Z) LocalVariable(stream_expr_pos, stream_expr_pos,
-                            Symbols::ColonStream(), Object::dynamic_type());
-  current_block_->scope->AddVariable(stream_var);
-
-  // Store the stream expression into a variable.
-  StoreLocalNode* store_stream_var =
-      new (Z) StoreLocalNode(stream_expr_pos, stream_var, stream_expr);
-  current_block_->statements->Add(store_stream_var);
-
-  // Register the awaiter on the stream by invoking `_asyncStarListenHelper`.
-  const Library& async_lib = Library::Handle(Library::AsyncLibrary());
-  const Function& async_star_listen_helper = Function::ZoneHandle(
-      Z,
-      async_lib.LookupFunctionAllowPrivate(Symbols::_AsyncStarListenHelper()));
-  ASSERT(!async_star_listen_helper.IsNull());
-  LocalVariable* async_op_var =
-      current_block_->scope->LookupVariable(Symbols::AsyncOperation(), false);
-  ASSERT(async_op_var != NULL);
-  ArgumentListNode* async_star_listen_helper_args =
-      new (Z) ArgumentListNode(stream_expr_pos);
-  async_star_listen_helper_args->Add(
-      new (Z) LoadLocalNode(stream_expr_pos, stream_var));
-  async_star_listen_helper_args->Add(
-      new (Z) LoadLocalNode(stream_expr_pos, async_op_var));
-  StaticCallNode* async_star_listen_helper_call = new (Z)
-      StaticCallNode(stream_expr_pos, async_star_listen_helper,
-                     async_star_listen_helper_args, StaticCallNode::kStatic);
-
-  current_block_->statements->Add(async_star_listen_helper_call);
-
-  // Build creation of implicit StreamIterator.
-  // var :for-in-iter = new StreamIterator(stream_expr).
-  const Class& stream_iterator_cls =
-      Class::ZoneHandle(Z, async_lib.LookupClass(Symbols::StreamIterator()));
-  ASSERT(!stream_iterator_cls.IsNull());
-  const Function& iterator_ctor = Function::ZoneHandle(
-      Z,
-      stream_iterator_cls.LookupFunction(Symbols::StreamIteratorConstructor()));
-  ASSERT(!iterator_ctor.IsNull());
-  ArgumentListNode* ctor_args = new (Z) ArgumentListNode(stream_expr_pos);
-  ctor_args->Add(new (Z) LoadLocalNode(stream_expr_pos, stream_var));
-  ConstructorCallNode* ctor_call = new (Z) ConstructorCallNode(
-      stream_expr_pos, TypeArguments::ZoneHandle(Z), iterator_ctor, ctor_args);
-  const AbstractType& iterator_type = Object::dynamic_type();
-  LocalVariable* iterator_var = new (Z) LocalVariable(
-      stream_expr_pos, stream_expr_pos, Symbols::ForInIter(), iterator_type);
-  current_block_->scope->AddVariable(iterator_var);
-  AstNode* iterator_init =
-      new (Z) StoreLocalNode(stream_expr_pos, iterator_var, ctor_call);
-  current_block_->statements->Add(iterator_init);
-
-  // We need to ensure that the stream is cancelled after the loop.
-  // Thus, wrap the loop in a try-finally that calls :for-in-iter.close()
-  // in the finally clause. It is harmless to call close() if the stream
-  // is already cancelled (when moveNext() returns false).
-  // Note: even though this is async code, we do not need to set up
-  // the closurized saved_exception_var and saved_stack_trace_var because
-  // there can not be a suspend/resume event before the exception is
-  // rethrown in the catch clause. The catch block of the implicit
-  // try-finally is empty.
-  LocalVariable* context_var = NULL;
-  LocalVariable* exception_var = NULL;
-  LocalVariable* stack_trace_var = NULL;
-  LocalVariable* saved_exception_var = NULL;
-  LocalVariable* saved_stack_trace_var = NULL;
-  SetupExceptionVariables(current_block_->scope,
-                          false,  // Do not create the saved_ vars.
-                          &context_var, &exception_var, &stack_trace_var,
-                          &saved_exception_var, &saved_stack_trace_var);
-  OpenBlock();  // try block.
-  PushTry(current_block_);
-  SetupSavedTryContext(context_var);
-
-  // Build while loop condition.
-  // while (await :for-in-iter.moveNext())
-  LocalVariable* saved_try_ctx;
-  LocalVariable* async_saved_try_ctx;
-  LocalVariable* outer_saved_try_ctx;
-  LocalVariable* outer_async_saved_try_ctx;
-  CheckAsyncOpInTryBlock(&saved_try_ctx, &async_saved_try_ctx,
-                         &outer_saved_try_ctx, &outer_async_saved_try_ctx);
-  ArgumentListNode* no_args = new (Z) ArgumentListNode(stream_expr_pos);
-  AstNode* iterator_moveNext = new (Z) InstanceCallNode(
-      stream_expr_pos, new (Z) LoadLocalNode(stream_expr_pos, iterator_var),
-      Symbols::MoveNext(), no_args);
-  OpenBlock();
-#if !defined(PRODUCT)
-  // Call '_asyncStarMoveNextHelper' so that the debugger can intercept and
-  // handle single stepping into a async* generator.
-  const Function& async_star_move_next_helper = Function::ZoneHandle(
-      Z, isolate()->object_store()->async_star_move_next_helper());
-  ASSERT(!async_star_move_next_helper.IsNull());
-  ArgumentListNode* async_star_move_next_helper_args =
-      new (Z) ArgumentListNode(stream_expr_pos);
-  async_star_move_next_helper_args->Add(
-      new (Z) LoadLocalNode(stream_expr_pos, stream_var));
-  StaticCallNode* async_star_move_next_helper_call = new (Z)
-      StaticCallNode(stream_expr_pos, async_star_move_next_helper,
-                     async_star_move_next_helper_args, StaticCallNode::kStatic);
-  current_block_->statements->Add(async_star_move_next_helper_call);
-#endif
-  AstNode* await_moveNext = new (Z) AwaitNode(
-      stream_expr_pos, iterator_moveNext, saved_try_ctx, async_saved_try_ctx,
-      outer_saved_try_ctx, outer_async_saved_try_ctx, current_block_->scope);
-  AwaitTransformer at(current_block_->statements, async_temp_scope_);
-  await_moveNext = at.Transform(await_moveNext);
-  SequenceNode* await_preamble = CloseBlock();
-
-  // Parse the for loop body. Ideally, we would use ParseNestedStatement()
-  // here, but that does not work well because we have to insert an implicit
-  // variable assignment and potentially a variable declaration in the
-  // loop body.
-  OpenLoopBlock();
-
-  SourceLabel* label =
-      SourceLabel::New(await_for_pos, label_name, SourceLabel::kFor);
-  current_block_->scope->AddLabel(label);
-  const TokenPosition loop_var_assignment_pos = TokenPos();
-
-  AstNode* iterator_current = new (Z) InstanceGetterNode(
-      loop_var_assignment_pos,
-      new (Z) LoadLocalNode(loop_var_assignment_pos, iterator_var),
-      Symbols::Current());
-
-  // Generate assignment of next iterator value to loop variable.
-  AstNode* loop_var_assignment = NULL;
-  if (new_loop_var) {
-    // The for loop variable is new for each iteration.
-    // Create a variable and add it to the loop body scope.
-    // Note that the variable token position needs to be inside the
-    // loop block, so it gets put in the loop context level.
-    LocalVariable* loop_var =
-        new (Z) LocalVariable(loop_var_assignment_pos, loop_var_assignment_pos,
-                              *loop_var_name, loop_var_type);
-    if (loop_var_is_final) {
-      loop_var->set_is_final();
-    }
-    current_block_->scope->AddVariable(loop_var);
-    loop_var_assignment = new (Z)
-        StoreLocalNode(loop_var_assignment_pos, loop_var, iterator_current);
-  } else {
-    AstNode* loop_var_primary =
-        ResolveIdent(loop_var_pos, *loop_var_name, false);
-    ASSERT(!loop_var_primary->IsPrimaryNode());
-    loop_var_assignment =
-        CreateAssignmentNode(loop_var_primary, iterator_current, loop_var_name,
-                             loop_var_assignment_pos);
-    ASSERT(loop_var_assignment != NULL);
-  }
-  current_block_->statements->Add(loop_var_assignment);
-
-  // Now parse the for-in loop statement or block.
-  if (CurrentToken() == Token::kLBRACE) {
-    ConsumeToken();
-    ParseStatementSequence();
-    ExpectToken(Token::kRBRACE);
-  } else {
-    AstNode* statement = ParseStatement();
-    if (statement != NULL) {
-      current_block_->statements->Add(statement);
-    }
-  }
-  SequenceNode* for_loop_block = CloseBlock();
-
-  WhileNode* while_node = new (Z) WhileNode(
-      await_for_pos, label, await_moveNext, await_preamble, for_loop_block);
-  // Add the while loop to the try block.
-  current_block_->statements->Add(while_node);
-  SequenceNode* try_block = CloseBlock();
-
-  // Create an empty "catch all" block that rethrows the current
-  // exception and stacktrace.
-  try_stack_->enter_catch();
-  SequenceNode* catch_block = new (Z) SequenceNode(await_for_pos, NULL);
-
-  if (outer_saved_try_ctx != NULL) {
-    catch_block->Add(new (Z) StoreLocalNode(
-        TokenPosition::kNoSource, outer_saved_try_ctx,
-        new (Z) LoadLocalNode(TokenPosition::kNoSource,
-                              outer_async_saved_try_ctx)));
-  }
-
-  // We don't need to copy the current exception and stack trace variables
-  // into :saved_exception_var and :saved_stack_trace_var here because there
-  // is no code in the catch clause that could suspend the function.
-
-  // Rethrow the exception.
-  catch_block->Add(new (Z) ThrowNode(
-      await_for_pos, new (Z) LoadLocalNode(await_for_pos, exception_var),
-      new (Z) LoadLocalNode(await_for_pos, stack_trace_var)));
-
-  TryStack* try_statement = PopTry();
-  const intptr_t try_index = try_statement->try_index();
-  TryStack* outer_try = try_stack_;
-  const intptr_t outer_try_index = (outer_try != NULL)
-                                       ? outer_try->try_index()
-                                       : CatchClauseNode::kInvalidTryIndex;
-
-  // The finally block contains a call to cancel the stream.
-  // :for-in-iter.cancel();
-
-  // Inline the finally block to the exit points in the try block.
-  intptr_t node_index = 0;
-  SequenceNode* finally_clause = NULL;
-  if (try_stack_ != NULL) {
-    try_stack_->enter_finally();
-  }
-  do {
-    OpenBlock();
-
-    // Restore the saved try context of the enclosing try block if one
-    // exists.
-    if (outer_saved_try_ctx != NULL) {
-      current_block_->statements->Add(new (Z) StoreLocalNode(
-          TokenPosition::kNoSource, outer_saved_try_ctx,
-          new (Z) LoadLocalNode(TokenPosition::kNoSource,
-                                outer_async_saved_try_ctx)));
-    }
-    // :for-in-iter.cancel();
-    ArgumentListNode* no_args =
-        new (Z) ArgumentListNode(TokenPosition::kNoSource);
-    current_block_->statements->Add(new (Z) InstanceCallNode(
-        ST(await_for_pos),
-        new (Z) LoadLocalNode(TokenPosition::kNoSource, iterator_var),
-        Symbols::Cancel(), no_args));
-    finally_clause = CloseBlock();
-
-    AstNode* node_to_inline = try_statement->GetNodeToInlineFinally(node_index);
-    if (node_to_inline != NULL) {
-      InlinedFinallyNode* node =
-          new (Z) InlinedFinallyNode(TokenPosition::kNoSource, finally_clause,
-                                     context_var, outer_try_index);
-      finally_clause = NULL;
-      AddFinallyClauseToNode(true, node_to_inline, node);
-      node_index++;
-    }
-  } while (finally_clause == NULL);
-
-  if (try_stack_ != NULL) {
-    try_stack_->exit_finally();
-  }
-
-  // Create the try-statement and add to the current sequence, which is
-  // the block around the loop statement.
-
-  const Array& handler_types = Array::ZoneHandle(Z, Array::New(1, Heap::kOld));
-  // Catch block handles all exceptions.
-  handler_types.SetAt(0, Object::dynamic_type());
-
-  CatchClauseNode* catch_clause = new (Z) CatchClauseNode(
-      await_for_pos, catch_block, handler_types, context_var, exception_var,
-      stack_trace_var, exception_var, stack_trace_var, AllocateTryIndex(),
-      true);  // Needs stack trace.
-
-  AstNode* try_catch_node =
-      new (Z) TryCatchNode(await_for_pos, try_block, context_var, catch_clause,
-                           finally_clause, try_index, finally_clause);
-
-  ASSERT(current_block_ == await_for_block);
-  await_for_block->statements->Add(try_catch_node);
-
-  return CloseBlock();  // Implicit block around while loop.
-}
-
-AstNode* Parser::ParseForInStatement(TokenPosition forin_pos,
-                                     SourceLabel* label) {
-  TRACE_PARSER("ParseForInStatement");
-  bool loop_var_is_final = (CurrentToken() == Token::kFINAL);
-  if (CurrentToken() == Token::kCONST) {
-    ReportError("Loop variable cannot be 'const'");
-  }
-  const String* loop_var_name = NULL;
-  TokenPosition loop_var_pos = TokenPosition::kNoSource;
-  bool new_loop_var = false;
-  AbstractType& loop_var_type = AbstractType::ZoneHandle(Z);
-  if (LookaheadToken(1) == Token::kIN) {
-    loop_var_pos = TokenPos();
-    loop_var_name = ExpectIdentifier("variable name expected");
-  } else {
-    // The case without a type is handled above, so require a type here.
-    // Delay creation of the local variable until we know its actual
-    // position, which is inside the loop body.
-    new_loop_var = true;
-    loop_var_type = ParseConstFinalVarOrType(I->type_checks()
-                                                 ? ClassFinalizer::kCanonicalize
-                                                 : ClassFinalizer::kIgnore);
-    loop_var_pos = TokenPos();
-    loop_var_name = ExpectIdentifier("variable name expected");
-  }
-  ExpectToken(Token::kIN);
-
-  // Ensure that the block token range contains the call to moveNext and it
-  // also starts the block at a different token position than the following
-  // loop block. Both blocks can allocate contexts and if they have a matching
-  // token position range, it can be an issue (cf. bug 26941).
-  OpenBlock();  // Implicit block around while loop.
-
-  const TokenPosition collection_pos = TokenPos();
-  AstNode* collection_expr =
-      ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
-  ExpectToken(Token::kRPAREN);
-
-  // Generate implicit iterator variable and add to scope.
-  // We could set the type of the implicit iterator variable to Iterator<T>
-  // where T is the type of the for loop variable. However, the type error
-  // would refer to the compiler generated iterator and could confuse the user.
-  // It is better to leave the iterator untyped and postpone the type error
-  // until the loop variable is assigned to.
-  const AbstractType& iterator_type = Object::dynamic_type();
-  LocalVariable* iterator_var = new (Z) LocalVariable(
-      collection_pos, collection_pos, Symbols::ForInIter(), iterator_type);
-  current_block_->scope->AddVariable(iterator_var);
-
-  // Generate initialization of iterator variable.
-  ArgumentListNode* no_args = new (Z) ArgumentListNode(collection_pos);
-  AstNode* get_iterator = new (Z)
-      InstanceGetterNode(collection_pos, collection_expr, Symbols::Iterator());
-  AstNode* iterator_init =
-      new (Z) StoreLocalNode(collection_pos, iterator_var, get_iterator);
-  current_block_->statements->Add(iterator_init);
-
-  // Generate while loop condition.
-  AstNode* iterator_moveNext = new (Z) InstanceCallNode(
-      collection_pos, new (Z) LoadLocalNode(collection_pos, iterator_var),
-      Symbols::MoveNext(), no_args);
-
-  // Parse the for loop body. Ideally, we would use ParseNestedStatement()
-  // here, but that does not work well because we have to insert an implicit
-  // variable assignment and potentially a variable declaration in the
-  // loop body.
-  OpenLoopBlock();
-  current_block_->scope->AddLabel(label);
-  const TokenPosition loop_var_assignment_pos = TokenPos();
-
-  AstNode* iterator_current = new (Z) InstanceGetterNode(
-      loop_var_assignment_pos,
-      new (Z) LoadLocalNode(loop_var_assignment_pos, iterator_var),
-      Symbols::Current());
-
-  // Generate assignment of next iterator value to loop variable.
-  AstNode* loop_var_assignment = NULL;
-  if (new_loop_var) {
-    // The for loop variable is new for each iteration.
-    // Create a variable and add it to the loop body scope.
-    LocalVariable* loop_var = new (Z) LocalVariable(
-        loop_var_pos, loop_var_assignment_pos, *loop_var_name, loop_var_type);
-    if (loop_var_is_final) {
-      loop_var->set_is_final();
-    }
-    current_block_->scope->AddVariable(loop_var);
-    loop_var_assignment = new (Z)
-        StoreLocalNode(loop_var_assignment_pos, loop_var, iterator_current);
-  } else {
-    AstNode* loop_var_primary =
-        ResolveIdent(loop_var_pos, *loop_var_name, false);
-    ASSERT(!loop_var_primary->IsPrimaryNode());
-    loop_var_assignment =
-        CreateAssignmentNode(loop_var_primary, iterator_current, loop_var_name,
-                             loop_var_assignment_pos);
-    ASSERT(loop_var_assignment != NULL);
-  }
-  current_block_->statements->Add(loop_var_assignment);
-
-  // Now parse the for-in loop statement or block.
-  if (CurrentToken() == Token::kLBRACE) {
-    ConsumeToken();
-    ParseStatementSequence();
-    ExpectToken(Token::kRBRACE);
-  } else {
-    AstNode* statement = ParseStatement();
-    if (statement != NULL) {
-      current_block_->statements->Add(statement);
-    }
-  }
-
-  SequenceNode* for_loop_statement = CloseBlock();
-
-  AstNode* while_statement = new (Z)
-      WhileNode(forin_pos, label, iterator_moveNext, NULL, for_loop_statement);
-  current_block_->statements->Add(while_statement);
-
-  return CloseBlock();  // Implicit block around while loop.
-}
-
-AstNode* Parser::ParseForStatement(String* label_name) {
-  TRACE_PARSER("ParseForStatement");
-  const TokenPosition for_pos = TokenPos();
-  ConsumeToken();
-  ExpectToken(Token::kLPAREN);
-  SourceLabel* label = SourceLabel::New(for_pos, label_name, SourceLabel::kFor);
-  if (IsForInStatement()) {
-    return ParseForInStatement(for_pos, label);
-  }
-  // Open a block that contains the loop variable. Make it a loop block so
-  // that we allocate a new context if the loop variable is captured.
-  OpenLoopBlock();
-  AstNode* initializer = NULL;
-  const TokenPosition init_pos = TokenPos();
-  LocalScope* init_scope = current_block_->scope;
-  if (CurrentToken() != Token::kSEMICOLON) {
-    if (IsVariableDeclaration()) {
-      initializer = ParseVariableDeclarationList();
-    } else {
-      initializer = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
-    }
-  }
-  ExpectSemicolon();
-  AstNode* condition = NULL;
-  SequenceNode* condition_preamble = NULL;
-  if (CurrentToken() != Token::kSEMICOLON) {
-    condition =
-        ParseAwaitableExpr(kAllowConst, kConsumeCascades, &condition_preamble);
-  }
-  ExpectSemicolon();
-  AstNode* increment = NULL;
-  const TokenPosition incr_pos = TokenPos();
-  if (CurrentToken() != Token::kRPAREN) {
-    increment = ParseAwaitableExprList();
-  }
-  ExpectToken(Token::kRPAREN);
-  const bool parsing_loop_body = true;
-  SequenceNode* body = ParseNestedStatement(parsing_loop_body, label);
-
-  // Check whether any of the variables in the initializer part of
-  // the for statement are captured by a closure. If so, we insert a
-  // node that creates a new Context for the loop variable before
-  // the increment expression is evaluated.
-  for (int i = 0; i < init_scope->num_variables(); i++) {
-    if (init_scope->VariableAt(i)->is_captured() &&
-        (init_scope->VariableAt(i)->owner() == init_scope)) {
-      SequenceNode* incr_sequence = new (Z) SequenceNode(incr_pos, NULL);
-      incr_sequence->Add(new (Z) CloneContextNode(for_pos, init_scope));
-      if (increment != NULL) {
-        incr_sequence->Add(increment);
-      }
-      increment = incr_sequence;
-      break;
-    }
-  }
-  AstNode* for_node = new (Z)
-      ForNode(for_pos, label, NodeAsSequenceNode(init_pos, initializer, NULL),
-              condition, condition_preamble,
-              NodeAsSequenceNode(incr_pos, increment, NULL), body);
-  current_block_->statements->Add(for_node);
-  return CloseBlock();
-}
-
-// Calling VM-internal helpers, uses implementation core library.
-AstNode* Parser::MakeStaticCall(const String& cls_name,
-                                const String& func_name,
-                                ArgumentListNode* arguments) {
-  const Class& cls = Class::Handle(Z, Library::LookupCoreClass(cls_name));
-  ASSERT(!cls.IsNull());
-  const intptr_t kTypeArgsLen = 0;  // Not passing type args to generic func.
-  const Function& func = Function::ZoneHandle(
-      Z, Resolver::ResolveStatic(cls, func_name, kTypeArgsLen,
-                                 arguments->length(), arguments->names()));
-  ASSERT(!func.IsNull());
-  return new (Z) StaticCallNode(arguments->token_pos(), func, arguments,
-                                StaticCallNode::kStatic);
-}
-
-AstNode* Parser::ParseAssertStatement(bool is_const) {
-  TRACE_PARSER("ParseAssertStatement");
-  ConsumeToken();  // Consume assert keyword.
-  ExpectToken(Token::kLPAREN);
-  const TokenPosition condition_pos = TokenPos();
-  if (!I->asserts()) {
-    SkipExpr();
-    if (CurrentToken() == Token::kCOMMA) {
-      ConsumeToken();
-      if (CurrentToken() != Token::kRPAREN) {
-        SkipExpr();
-        if (CurrentToken() == Token::kCOMMA) {
-          // Allow trailing comma.
-          ConsumeToken();
-        }
-      }
-    }
-    ExpectToken(Token::kRPAREN);
-    return NULL;
-  }
-
-  BoolScope saved_seen_await(&parsed_function()->have_seen_await_expr_, false);
-  AstNode* condition = ParseExpr(kAllowConst, kConsumeCascades);
-  if (is_const && !condition->IsPotentiallyConst()) {
-    ReportError(condition_pos,
-                "initializer assert expression must be compile time constant.");
-  }
-  const TokenPosition condition_end = TokenPos();
-  AstNode* message = NULL;
-  TokenPosition message_pos = TokenPosition::kNoSource;
-  if (CurrentToken() == Token::kCOMMA) {
-    ConsumeToken();
-    if (CurrentToken() != Token::kRPAREN) {
-      message_pos = TokenPos();
-      message = ParseExpr(kAllowConst, kConsumeCascades);
-      if (is_const && !message->IsPotentiallyConst()) {
-        ReportError(
-            message_pos,
-            "initializer assert expression must be compile time constant.");
-      }
-      if (CurrentToken() == Token::kCOMMA) {
-        // Allow trailing comma.
-        ConsumeToken();
-      }
-    }
-  }
-  ExpectToken(Token::kRPAREN);
-
-  if (!is_const) {
-    // Check for assertion condition being a function if not const.
-    ArgumentListNode* arguments = new (Z) ArgumentListNode(condition_pos);
-    arguments->Add(condition);
-    condition = MakeStaticCall(
-        Symbols::AssertionError(),
-        Library::PrivateCoreLibName(Symbols::EvaluateAssertion()), arguments);
-  }
-  AstNode* not_condition =
-      new (Z) UnaryOpNode(condition_pos, Token::kNOT, condition);
-
-  // Build call to _AsertionError._throwNew(start, end, message)
-  ArgumentListNode* arguments = new (Z) ArgumentListNode(condition_pos);
-  arguments->Add(new (Z) LiteralNode(
-      condition_pos,
-      Integer::ZoneHandle(Z, Integer::New(condition_pos.Pos()))));
-  arguments->Add(new (Z) LiteralNode(
-      condition_end,
-      Integer::ZoneHandle(Z, Integer::New(condition_end.Pos()))));
-  if (message == NULL) {
-    message = new (Z) LiteralNode(condition_end, Instance::ZoneHandle(Z));
-  }
-  arguments->Add(message);
-  AstNode* assert_throw = MakeStaticCall(
-      Symbols::AssertionError(),
-      Library::PrivateCoreLibName(Symbols::ThrowNew()), arguments);
-
-  AstNode* assertion_check = NULL;
-  if (parsed_function()->have_seen_await()) {
-    // The await transformation must be done manually because assertions
-    // are parsed as statements, not expressions. Thus, we need to check
-    // explicitly whether the arguments contain await operators. (Note that
-    // we must not parse the arguments with ParseAwaitableExpr(). In the
-    // corner case of assert(await a, await b), this would create two
-    // sibling scopes containing the temporary values for a and b. Both
-    // values would be allocated in the same internal context variable.)
-    //
-    // Build !condition ? _AsertionError._throwNew(...) : null;
-    // We need to use a conditional expression because the await transformer
-    // cannot transform if statements.
-    assertion_check = new (Z) ConditionalExprNode(
-        condition_pos, not_condition, assert_throw,
-        new (Z) LiteralNode(condition_pos, Object::null_instance()));
-    OpenBlock();
-    AwaitTransformer at(current_block_->statements, async_temp_scope_);
-    AstNode* transformed_assertion = at.Transform(assertion_check);
-    SequenceNode* preamble = CloseBlock();
-    preamble->Add(transformed_assertion);
-    assertion_check = preamble;
-  } else {
-    // Build if (!condition) _AsertionError._throwNew(...)
-    assertion_check = new (Z)
-        IfNode(condition_pos, not_condition,
-               NodeAsSequenceNode(condition_pos, assert_throw, NULL), NULL);
-  }
-  return assertion_check;
-}
-
-// Populate local scope of the catch block with the catch parameters.
-void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param,
-                                   CatchParamDesc* stack_trace_param,
-                                   LocalScope* scope) {
-  if (exception_param->name != NULL) {
-    LocalVariable* var = new (Z)
-        LocalVariable(exception_param->token_pos, exception_param->token_pos,
-                      *exception_param->name, *exception_param->type);
-    var->set_is_final();
-    bool added_to_scope = scope->AddVariable(var);
-    ASSERT(added_to_scope);
-    exception_param->var = var;
-  }
-  if (stack_trace_param->name != NULL) {
-    LocalVariable* var = new (Z) LocalVariable(
-        stack_trace_param->token_pos, stack_trace_param->token_pos,
-        *stack_trace_param->name, *stack_trace_param->type);
-    var->set_is_final();
-    bool added_to_scope = scope->AddVariable(var);
-    if (!added_to_scope) {
-      // The name of the exception param is reused for the stack trace param.
-      ReportError(stack_trace_param->token_pos,
-                  "name '%s' already exists in scope",
-                  stack_trace_param->name->ToCString());
-    }
-    stack_trace_param->var = var;
-  }
-}
-
-// Generate code to load the exception object (:exception_var) into
-// the saved exception variable (:saved_exception_var) used to rethrow.
-// Generate code to load the stack trace object (:stack_trace_var) into
-// the saved stacktrace variable (:saved_stack_trace_var) used to rethrow.
-void Parser::SaveExceptionAndStackTrace(SequenceNode* statements,
-                                        LocalVariable* exception_var,
-                                        LocalVariable* stack_trace_var,
-                                        LocalVariable* saved_exception_var,
-                                        LocalVariable* saved_stack_trace_var) {
-  ASSERT(innermost_function().IsAsyncClosure() ||
-         innermost_function().IsAsyncFunction() ||
-         innermost_function().IsSyncGenClosure() ||
-         innermost_function().IsSyncGenerator() ||
-         innermost_function().IsAsyncGenClosure() ||
-         innermost_function().IsAsyncGenerator());
-
-  ASSERT(saved_exception_var != NULL);
-  ASSERT(exception_var != NULL);
-  statements->Add(new (Z) StoreLocalNode(
-      TokenPosition::kNoSource, saved_exception_var,
-      new (Z) LoadLocalNode(TokenPosition::kNoSource, exception_var)));
-
-  ASSERT(saved_stack_trace_var != NULL);
-  ASSERT(stack_trace_var != NULL);
-  statements->Add(new (Z) StoreLocalNode(
-      TokenPosition::kNoSource, saved_stack_trace_var,
-      new (Z) LoadLocalNode(TokenPosition::kNoSource, stack_trace_var)));
-}
-
-SequenceNode* Parser::EnsureFinallyClause(
-    bool parse,
-    bool is_async,
-    LocalVariable* exception_var,
-    LocalVariable* stack_trace_var,
-    LocalVariable* rethrow_exception_var,
-    LocalVariable* rethrow_stack_trace_var) {
-  TRACE_PARSER("EnsureFinallyClause");
-  ASSERT(parse || (is_async && (try_stack_ != NULL)));
-  // Increasing the loop level prevents the reuse of a parent context and forces
-  // the allocation of a local context to hold captured variables declared
-  // inside the finally clause. Otherwise, a captured variable gets allocated at
-  // different slots in the parent context each time the finally clause is
-  // reparsed, which is done to duplicate the ast. Since only one closure is
-  // kept due to canonicalization, it will access the correct slot in only one
-  // copy of the finally clause and the wrong slot in all others. By allocating
-  // a local context, all copies use the same slot in different local contexts.
-  // See issue #26948. This is a temporary fix until we eliminate reparsing.
-  OpenLoopBlock();
-  if (parse) {
-    ExpectToken(Token::kLBRACE);
-  }
-
-  if (try_stack_ != NULL) {
-    try_stack_->enter_finally();
-  }
-  // In case of async closures we need to restore the saved try context of an
-  // outer try block (if it exists).  The current try block has already been
-  // removed from the stack of try blocks.
-  if (is_async) {
-    if (try_stack_ != NULL) {
-      LocalScope* scope = try_stack_->try_block()->scope;
-      if (scope->function_level() == current_block_->scope->function_level()) {
-        LocalVariable* saved_try_ctx =
-            LookupSavedTryContextVar(scope->parent());
-        LocalVariable* async_saved_try_ctx = LookupAsyncSavedTryContextVar(
-            T, async_temp_scope_, try_stack_->try_index());
-        current_block_->statements->Add(new (Z) StoreLocalNode(
-            TokenPosition::kNoSource, saved_try_ctx,
-            new (Z)
-                LoadLocalNode(TokenPosition::kNoSource, async_saved_try_ctx)));
-      }
-    }
-    // We need to save the exception variables as in catch clauses, whether
-    // there is an outer try or not. Note that this is only necessary if the
-    // finally clause contains an await or yield.
-    // TODO(hausner): Optimize.
-    SaveExceptionAndStackTrace(current_block_->statements, exception_var,
-                               stack_trace_var, rethrow_exception_var,
-                               rethrow_stack_trace_var);
-  }
-
-  if (parse) {
-    ParseStatementSequence();
-    ExpectToken(Token::kRBRACE);
-  }
-  SequenceNode* finally_clause = CloseBlock();
-  if (try_stack_ != NULL) {
-    try_stack_->exit_finally();
-  }
-  return finally_clause;
-}
-
-void Parser::PushTry(Block* try_block) {
-  intptr_t try_index = AllocateTryIndex();
-  try_stack_ = new (Z) TryStack(try_block, try_stack_, try_index);
-}
-
-Parser::TryStack* Parser::PopTry() {
-  TryStack* innermost_try = try_stack_;
-  try_stack_ = try_stack_->outer_try();
-  return innermost_try;
-}
-
-void Parser::AddNodeForFinallyInlining(AstNode* node) {
-  if (node == NULL) {
-    return;
-  }
-  ASSERT(node->IsReturnNode() || node->IsJumpNode());
-  const intptr_t func_level = FunctionLevel();
-  TryStack* iterator = try_stack_;
-  while ((iterator != NULL) &&
-         (iterator->try_block()->scope->function_level() == func_level)) {
-    // For continue and break node check if the target label is in scope.
-    if (node->IsJumpNode()) {
-      SourceLabel* label = node->AsJumpNode()->label();
-      ASSERT(label != NULL);
-      LocalScope* try_scope = iterator->try_block()->scope;
-      // If the label is defined in a scope which is a child (nested scope)
-      // of the try scope then we are not breaking out of this try block
-      // so we do not need to inline the finally code. Otherwise we need
-      // to inline the finally code of this try block and then move on to the
-      // next outer try block.
-      // For unresolved forward jumps to switch cases, we don't yet know
-      // to which scope the label will be resolved. Tentatively add the
-      // jump to all nested try statements and remove the outermost ones
-      // when we know the exact jump target. (See
-      // RemoveNodesForFinallyInlining below.)
-      if (!label->IsUnresolved() && label->owner()->IsNestedWithin(try_scope)) {
-        break;
-      }
-    }
-    iterator->AddNodeForFinallyInlining(node);
-    iterator = iterator->outer_try();
-  }
-}
-
-void Parser::RemoveNodesForFinallyInlining(SourceLabel* label) {
-  TryStack* iterator = try_stack_;
-  const intptr_t func_level = FunctionLevel();
-  while ((iterator != NULL) &&
-         (iterator->try_block()->scope->function_level() == func_level)) {
-    iterator->RemoveJumpToLabel(label);
-    iterator = iterator->outer_try();
-  }
-}
-
-// Add the inlined finally clause to the specified node.
-void Parser::AddFinallyClauseToNode(bool is_async,
-                                    AstNode* node,
-                                    InlinedFinallyNode* finally_clause) {
-  ReturnNode* return_node = node->AsReturnNode();
-  if (return_node != NULL) {
-    if (FunctionLevel() == 0) {
-      parsed_function()->EnsureFinallyReturnTemp(is_async);
-    }
-    return_node->AddInlinedFinallyNode(finally_clause);
-    return;
-  }
-  JumpNode* jump_node = node->AsJumpNode();
-  ASSERT(jump_node != NULL);
-  jump_node->AddInlinedFinallyNode(finally_clause);
-}
-
-SequenceNode* Parser::ParseCatchClauses(
-    TokenPosition handler_pos,
-    bool is_async,
-    LocalVariable* exception_var,
-    LocalVariable* stack_trace_var,
-    LocalVariable* rethrow_exception_var,
-    LocalVariable* rethrow_stack_trace_var,
-    const GrowableObjectArray& handler_types,
-    bool* needs_stack_trace) {
-  // All catch blocks are merged into an if-then-else sequence of the
-  // different types specified using the 'is' operator.  While parsing
-  // record the type tests (either a ComparisonNode or else the LiteralNode
-  // true for a generic catch) and the catch bodies in a pair of parallel
-  // lists.  Afterward, construct the nested if-then-else.
-  bool generic_catch_seen = false;
-  GrowableArray<AstNode*> type_tests;
-  GrowableArray<SequenceNode*> catch_blocks;
-  while ((CurrentToken() == Token::kCATCH) || IsSymbol(Symbols::On())) {
-    // Open a block that contains the if or an unconditional body.  It's
-    // closed in the loop that builds the if-then-else nest.
-    OpenBlock();
-    const TokenPosition catch_pos = TokenPos();
-    CatchParamDesc exception_param;
-    CatchParamDesc stack_trace_param;
-    if (IsSymbol(Symbols::On())) {
-      ConsumeToken();
-      exception_param.type = &AbstractType::ZoneHandle(
-          Z, ParseTypeOrFunctionType(false, ClassFinalizer::kCanonicalize));
-    } else {
-      exception_param.type = &Object::dynamic_type();
-    }
-    if (CurrentToken() == Token::kCATCH) {
-      ConsumeToken();  // Consume the 'catch'.
-      ExpectToken(Token::kLPAREN);
-      exception_param.token_pos = TokenPos();
-      exception_param.name = ExpectIdentifier("identifier expected");
-      if (CurrentToken() == Token::kCOMMA) {
-        ConsumeToken();
-        stack_trace_param.type = &Object::dynamic_type();
-        stack_trace_param.token_pos = TokenPos();
-        stack_trace_param.name = ExpectIdentifier("identifier expected");
-      }
-      ExpectToken(Token::kRPAREN);
-    }
-
-    // Create a block containing the catch clause parameters and the
-    // following code:
-    // 1) Store exception object and stack trace object into user-defined
-    //    variables (as needed).
-    // 2) In async code, save exception object and stack trace object into
-    //    captured :saved_exception_var and :saved_stack_trace_var.
-    // 3) Nested block with source code from catch clause block.
-    OpenBlock();
-    AddCatchParamsToScope(&exception_param, &stack_trace_param,
-                          current_block_->scope);
-
-    if (exception_param.var != NULL) {
-      // Generate code to load the exception object (:exception_var) into
-      // the exception variable specified in this block.
-      ASSERT(exception_var != NULL);
-      current_block_->statements->Add(new (Z) StoreLocalNode(
-          catch_pos, exception_param.var,
-          new (Z) LoadLocalNode(catch_pos, exception_var)));
-    }
-    if (stack_trace_param.var != NULL) {
-      // A stack trace variable is specified in this block, so generate code
-      // to load the stack trace object (:stack_trace_var) into the stack
-      // trace variable specified in this block.
-      *needs_stack_trace = true;
-      ASSERT(stack_trace_var != NULL);
-      current_block_->statements->Add(new (Z) StoreLocalNode(
-          catch_pos, stack_trace_param.var,
-          new (Z) LoadLocalNode(catch_pos, stack_trace_var)));
-    }
-
-    // Add nested block with user-defined code.  This block allows
-    // declarations in the body to shadow the catch parameters.
-    CheckToken(Token::kLBRACE);
-
-    current_block_->statements->Add(ParseNestedStatement(false, NULL));
-    catch_blocks.Add(CloseBlock());
-
-    const bool is_bad_type = exception_param.type->IsMalformed() ||
-                             exception_param.type->IsMalbounded();
-    if (exception_param.type->IsDynamicType() || is_bad_type) {
-      // There is no exception type or else it is malformed or malbounded.
-      // In the first case, unconditionally execute the catch body.  In the
-      // second case, unconditionally throw.
-      generic_catch_seen = true;
-      type_tests.Add(new (Z) LiteralNode(catch_pos, Bool::True()));
-      if (is_bad_type) {
-        // Replace the body with one that throws.
-        SequenceNode* block = new (Z) SequenceNode(catch_pos, NULL);
-        block->Add(ThrowTypeError(catch_pos, *exception_param.type));
-        catch_blocks.Last() = block;
-      }
-      // This catch clause will handle all exceptions. We can safely forget
-      // all previous catch clause types.
-      handler_types.SetLength(0);
-      handler_types.Add(*exception_param.type, Heap::kOld);
-    } else {
-      // Has a type specification that is not malformed or malbounded.  Now
-      // form an 'if type check' to guard the catch handler code.
-      if (!exception_param.type->IsInstantiated() && (FunctionLevel() > 0)) {
-        // Make sure that the instantiators are captured.
-        CaptureAllInstantiators();
-      }
-      TypeNode* exception_type =
-          new (Z) TypeNode(catch_pos, *exception_param.type);
-      AstNode* exception_value =
-          new (Z) LoadLocalNode(catch_pos, exception_var);
-      if (!exception_type->type().IsInstantiated()) {
-        EnsureExpressionTemp();
-      }
-      type_tests.Add(new (Z) ComparisonNode(catch_pos, Token::kIS,
-                                            exception_value, exception_type));
-
-      // Do not add uninstantiated types (e.g. type parameter T or generic
-      // type List<T>), since the debugger won't be able to instantiate it
-      // when walking the stack.
-      //
-      // This means that the debugger is not able to determine whether an
-      // exception is caught if the catch clause uses generic types.  It
-      // will report the exception as uncaught when in fact it might be
-      // caught and handled when we unwind the stack.
-      if (!generic_catch_seen && exception_param.type->IsInstantiated()) {
-        handler_types.Add(*exception_param.type, Heap::kOld);
-      }
-    }
-
-    ASSERT(type_tests.length() == catch_blocks.length());
-  }
-
-  // Build the if/then/else nest from the inside out.  Keep the AST simple
-  // for the case of a single generic catch clause.  The initial value of
-  // current is the last (innermost) else block if there were any catch
-  // clauses.
-  SequenceNode* current = NULL;
-  if (!generic_catch_seen) {
-    // There isn't a generic catch clause so create a clause body that
-    // rethrows the exception.  This includes the case that there were no
-    // catch clauses.
-    // An await cannot possibly be executed in between the catch entry and here,
-    // therefore, it is safe to rethrow the stack-based :exception_var instead
-    // of the captured copy :saved_exception_var.
-    current = new (Z) SequenceNode(handler_pos, NULL);
-    current->Add(new (Z) ThrowNode(
-        handler_pos, new (Z) LoadLocalNode(handler_pos, exception_var),
-        new (Z) LoadLocalNode(handler_pos, stack_trace_var)));
-  } else if (type_tests.Last()->IsLiteralNode()) {
-    ASSERT(type_tests.Last()->AsLiteralNode()->literal().raw() ==
-           Bool::True().raw());
-    // The last body is entered unconditionally.  Start building the
-    // if/then/else nest with that body as the innermost else block.
-    // Note that it is nested inside an extra block which we opened
-    // before we knew the body was entered unconditionally.
-    type_tests.RemoveLast();
-    current_block_->statements->Add(catch_blocks.RemoveLast());
-    current = CloseBlock();
-  }
-  // If the last body was entered conditionally and there is no need to add
-  // a rethrow, use an empty else body (current = NULL above).
-  while (!type_tests.is_empty()) {
-    AstNode* type_test = type_tests.RemoveLast();
-    SequenceNode* catch_block = catch_blocks.RemoveLast();
-    current_block_->statements->Add(new (Z) IfNode(
-        type_test->token_pos(), type_test, catch_block, current));
-    current = CloseBlock();
-  }
-  // In case of async closures, restore :saved_try_context_var before executing
-  // the catch clauses.
-  if (is_async && (current != NULL)) {
-    ASSERT(try_stack_ != NULL);
-    SequenceNode* async_code = new (Z) SequenceNode(handler_pos, NULL);
-    const TryStack* try_block = try_stack_->outer_try();
-    if (try_block != NULL) {
-      LocalScope* scope = try_block->try_block()->scope;
-      if (scope->function_level() == current_block_->scope->function_level()) {
-        LocalVariable* saved_try_ctx =
-            LookupSavedTryContextVar(scope->parent());
-        LocalVariable* async_saved_try_ctx = LookupAsyncSavedTryContextVar(
-            T, async_temp_scope_, try_block->try_index());
-        async_code->Add(new (Z) StoreLocalNode(
-            TokenPosition::kNoSource, saved_try_ctx,
-            new (Z)
-                LoadLocalNode(TokenPosition::kNoSource, async_saved_try_ctx)));
-      }
-    }
-    SaveExceptionAndStackTrace(async_code, exception_var, stack_trace_var,
-                               rethrow_exception_var, rethrow_stack_trace_var);
-    // The async_code node sequence contains code to restore the context (if
-    // an outer try block is present) and code to save the exception and
-    // stack trace variables.
-    // This async code is inserted before the current node sequence containing
-    // the chain of if/then/else handling all catch clauses.
-    async_code->Add(current);
-    current = async_code;
-  }
-  return current;
-}
-
-void Parser::SetupSavedTryContext(LocalVariable* saved_try_context) {
-  const String& async_saved_try_ctx_name = String::ZoneHandle(
-      Z, Symbols::NewFormatted(T, "%s%d",
-                               Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
-                               last_used_try_index_ - 1));
-  LocalVariable* async_saved_try_ctx =
-      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            async_saved_try_ctx_name, Object::dynamic_type());
-  ASSERT(async_temp_scope_ != NULL);
-  async_temp_scope_->AddVariable(async_saved_try_ctx);
-  ASSERT(saved_try_context != NULL);
-  current_block_->statements->Add(new (Z) StoreLocalNode(
-      TokenPosition::kNoSource, async_saved_try_ctx,
-      new (Z) LoadLocalNode(TokenPosition::kNoSource, saved_try_context)));
-}
-
-// We create three variables for exceptions:
-// ':saved_try_context_var' - Used to save the context before the start of
-//                            the try block. The context register is
-//                            restored from this variable before
-//                            processing the catch block handler.
-// ':exception_var' - Used to save the current exception object that was
-//                    thrown.
-// ':stack_trace_var' - Used to save the current stack trace object which
-//                      the stack trace was copied into when an exception
-//                      was thrown.
-// :exception_var and :stack_trace_var get set with the exception object
-// and the stack trace object when an exception is thrown.  These three
-// implicit variables can never be captured.
-//
-// In case of async code, we create two additional variables:
-// ':saved_exception_var' - Used to capture the exception object above.
-// ':saved_stack_trace_var' - Used to capture the stack trace object above.
-void Parser::SetupExceptionVariables(LocalScope* try_scope,
-                                     bool is_async,
-                                     LocalVariable** context_var,
-                                     LocalVariable** exception_var,
-                                     LocalVariable** stack_trace_var,
-                                     LocalVariable** saved_exception_var,
-                                     LocalVariable** saved_stack_trace_var) {
-  // Consecutive try statements share the same set of variables.
-  *context_var = try_scope->LocalLookupVariable(Symbols::SavedTryContextVar());
-  if (*context_var == NULL) {
-    *context_var = new (Z)
-        LocalVariable(TokenPos(), TokenPos(), Symbols::SavedTryContextVar(),
-                      Object::dynamic_type());
-    try_scope->AddVariable(*context_var);
-  }
-  *exception_var = try_scope->LocalLookupVariable(Symbols::ExceptionVar());
-  if (*exception_var == NULL) {
-    *exception_var =
-        new (Z) LocalVariable(TokenPos(), TokenPos(), Symbols::ExceptionVar(),
-                              Object::dynamic_type());
-    try_scope->AddVariable(*exception_var);
-  }
-  *stack_trace_var = try_scope->LocalLookupVariable(Symbols::StackTraceVar());
-  if (*stack_trace_var == NULL) {
-    *stack_trace_var =
-        new (Z) LocalVariable(TokenPos(), TokenPos(), Symbols::StackTraceVar(),
-                              Object::dynamic_type());
-    try_scope->AddVariable(*stack_trace_var);
-  }
-  if (is_async) {
-    *saved_exception_var =
-        try_scope->LocalLookupVariable(Symbols::SavedExceptionVar());
-    if (*saved_exception_var == NULL) {
-      *saved_exception_var = new (Z)
-          LocalVariable(TokenPos(), TokenPos(), Symbols::SavedExceptionVar(),
-                        Object::dynamic_type());
-      try_scope->AddVariable(*saved_exception_var);
-    }
-    *saved_stack_trace_var =
-        try_scope->LocalLookupVariable(Symbols::SavedStackTraceVar());
-    if (*saved_stack_trace_var == NULL) {
-      *saved_stack_trace_var = new (Z)
-          LocalVariable(TokenPos(), TokenPos(), Symbols::SavedStackTraceVar(),
-                        Object::dynamic_type());
-      try_scope->AddVariable(*saved_stack_trace_var);
-    }
-  }
-}
-
-AstNode* Parser::ParseTryStatement(String* label_name) {
-  TRACE_PARSER("ParseTryStatement");
-
-  const TokenPosition try_pos = TokenPos();
-  SourceLabel* try_label = NULL;
-  if (label_name != NULL) {
-    try_label = SourceLabel::New(try_pos, label_name, SourceLabel::kStatement);
-    OpenBlock();
-    current_block_->scope->AddLabel(try_label);
-  }
-
-  const bool is_async = innermost_function().IsAsyncClosure() ||
-                        innermost_function().IsAsyncFunction() ||
-                        innermost_function().IsSyncGenClosure() ||
-                        innermost_function().IsSyncGenerator() ||
-                        innermost_function().IsAsyncGenClosure() ||
-                        innermost_function().IsAsyncGenerator();
-  LocalVariable* context_var = NULL;
-  LocalVariable* exception_var = NULL;
-  LocalVariable* stack_trace_var = NULL;
-  LocalVariable* saved_exception_var = NULL;
-  LocalVariable* saved_stack_trace_var = NULL;
-  SetupExceptionVariables(current_block_->scope, is_async, &context_var,
-                          &exception_var, &stack_trace_var,
-                          &saved_exception_var, &saved_stack_trace_var);
-
-  ConsumeToken();  // Consume the 'try'.
-
-  // Now parse the 'try' block.
-  OpenBlock();
-  PushTry(current_block_);
-  ExpectToken(Token::kLBRACE);
-
-  if (is_async) {
-    SetupSavedTryContext(context_var);
-  }
-
-  ParseStatementSequence();
-  ExpectToken(Token::kRBRACE);
-  SequenceNode* try_block = CloseBlock();
-
-  if ((CurrentToken() != Token::kCATCH) && !IsSymbol(Symbols::On()) &&
-      (CurrentToken() != Token::kFINALLY)) {
-    ReportError("catch or finally clause expected");
-  }
-
-  // Now parse the 'catch' blocks if any.
-  try_stack_->enter_catch();
-  const TokenPosition handler_pos = TokenPos();
-  const GrowableObjectArray& handler_types =
-      GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld));
-  bool needs_stack_trace = false;
-  SequenceNode* catch_handler_list =
-      ParseCatchClauses(handler_pos, is_async, exception_var, stack_trace_var,
-                        is_async ? saved_exception_var : exception_var,
-                        is_async ? saved_stack_trace_var : stack_trace_var,
-                        handler_types, &needs_stack_trace);
-
-  TryStack* try_statement = PopTry();
-  const intptr_t try_index = try_statement->try_index();
-  TryStack* outer_try = try_stack_;
-  const intptr_t outer_try_index = (outer_try != NULL)
-                                       ? outer_try->try_index()
-                                       : CatchClauseNode::kInvalidTryIndex;
-
-  // Finally, parse or generate the 'finally' clause.
-  // A finally clause is required in async code to restore the saved try context
-  // of an existing outer try. Generate a finally clause to this purpose if it
-  // is not declared.
-  SequenceNode* finally_clause = NULL;
-  SequenceNode* rethrow_clause = NULL;
-  const bool parse = CurrentToken() == Token::kFINALLY;
-  if (parse || (is_async && (try_stack_ != NULL))) {
-    if (parse) {
-      ConsumeToken();  // Consume the 'finally'.
-    }
-    const TokenPosition finally_pos = TokenPos();
-    // Add the finally block to the exit points recorded so far.
-    intptr_t node_index = 0;
-    AstNode* node_to_inline = try_statement->GetNodeToInlineFinally(node_index);
-    while (node_to_inline != NULL) {
-      finally_clause = EnsureFinallyClause(
-          parse, is_async, exception_var, stack_trace_var,
-          is_async ? saved_exception_var : exception_var,
-          is_async ? saved_stack_trace_var : stack_trace_var);
-      InlinedFinallyNode* node = new (Z) InlinedFinallyNode(
-          finally_pos, finally_clause, context_var, outer_try_index);
-      AddFinallyClauseToNode(is_async, node_to_inline, node);
-      node_index += 1;
-      node_to_inline = try_statement->GetNodeToInlineFinally(node_index);
-      tokens_iterator_.SetCurrentPosition(finally_pos);
-    }
-    finally_clause =
-        EnsureFinallyClause(parse, is_async, exception_var, stack_trace_var,
-                            is_async ? saved_exception_var : exception_var,
-                            is_async ? saved_stack_trace_var : stack_trace_var);
-    if (finally_clause != NULL) {
-      // Re-parse to create a duplicate of finally clause to avoid unintended
-      // sharing of try-indices if the finally-block contains a try-catch.
-      // The flow graph builder emits two copies of the finally-block if the
-      // try-block has a normal exit: one for the exception- and one for the
-      // non-exception case (see EffectGraphVisitor::VisitTryCatchNode)
-      tokens_iterator_.SetCurrentPosition(finally_pos);
-      rethrow_clause = EnsureFinallyClause(
-          parse, is_async, exception_var, stack_trace_var,
-          is_async ? saved_exception_var : exception_var,
-          is_async ? saved_stack_trace_var : stack_trace_var);
-    }
-  }
-
-  CatchClauseNode* catch_clause = new (Z) CatchClauseNode(
-      handler_pos, catch_handler_list,
-      Array::ZoneHandle(Z, Array::MakeFixedLength(handler_types)), context_var,
-      exception_var, stack_trace_var,
-      is_async ? saved_exception_var : exception_var,
-      is_async ? saved_stack_trace_var : stack_trace_var,
-      (finally_clause != NULL) ? AllocateTryIndex()
-                               : CatchClauseNode::kInvalidTryIndex,
-      needs_stack_trace);
-
-  // Now create the try/catch ast node and return it. If there is a label
-  // on the try/catch, close the block that's embedding the try statement
-  // and attach the label to it.
-  AstNode* try_catch_node =
-      new (Z) TryCatchNode(try_pos, try_block, context_var, catch_clause,
-                           finally_clause, try_index, rethrow_clause);
-
-  if (try_label != NULL) {
-    current_block_->statements->Add(try_catch_node);
-    SequenceNode* sequence = CloseBlock();
-    sequence->set_label(try_label);
-    try_catch_node = sequence;
-  }
-
-  return try_catch_node;
-}
-
-AstNode* Parser::ParseJump(String* label_name) {
-  TRACE_PARSER("ParseJump");
-  ASSERT(CurrentToken() == Token::kBREAK || CurrentToken() == Token::kCONTINUE);
-  Token::Kind jump_kind = CurrentToken();
-  const TokenPosition jump_pos = TokenPos();
-  SourceLabel* target = NULL;
-  ConsumeToken();
-  if (IsIdentifier()) {
-    // Explicit label after break/continue.
-    const String& target_name = *CurrentLiteral();
-    ConsumeToken();
-    // Handle pathological cases first.
-    if (label_name != NULL && target_name.Equals(*label_name)) {
-      if (jump_kind == Token::kCONTINUE) {
-        ReportError(jump_pos, "'continue' jump to label '%s' is illegal",
-                    target_name.ToCString());
-      }
-      // L: break L; is a no-op.
-      return NULL;
-    }
-    target = current_block_->scope->LookupLabel(target_name);
-    if (target == NULL && jump_kind == Token::kCONTINUE) {
-      // Either a reference to a non-existent label, or a forward reference
-      // to a case label that we haven't seen yet. If we are inside a switch
-      // statement, create a "forward reference" label in the scope of
-      // the switch statement.
-      LocalScope* switch_scope = current_block_->scope->LookupSwitchScope();
-      if (switch_scope != NULL) {
-        // We found a switch scope. Enter a forward reference to the label.
-        target =
-            new (Z) SourceLabel(TokenPos(), target_name, SourceLabel::kForward);
-        switch_scope->AddLabel(target);
-      }
-    }
-    if (target == NULL) {
-      ReportError(jump_pos, "label '%s' not found", target_name.ToCString());
-    }
-  } else if (FLAG_enable_debug_break && (CurrentToken() == Token::kSTRING)) {
-    const char* message = Z->MakeCopyOfString(CurrentLiteral()->ToCString());
-    ConsumeToken();
-    return new (Z) StopNode(jump_pos, message);
-  } else {
-    target = current_block_->scope->LookupInnermostLabel(jump_kind);
-    if (target == NULL) {
-      ReportError(jump_pos, "'%s' is illegal here", Token::Str(jump_kind));
-    }
-  }
-  ASSERT(target != NULL);
-  if (jump_kind == Token::kCONTINUE) {
-    if (target->kind() == SourceLabel::kSwitch) {
-      ReportError(jump_pos, "'continue' jump to switch statement is illegal");
-    } else if (target->kind() == SourceLabel::kStatement) {
-      ReportError(jump_pos, "'continue' jump to label '%s' is illegal",
-                  target->name().ToCString());
-    }
-  }
-  if (jump_kind == Token::kBREAK && target->kind() == SourceLabel::kCase) {
-    ReportError(jump_pos, "'break' to case clause label is illegal");
-  }
-  if (target->FunctionLevel() != FunctionLevel()) {
-    ReportError(jump_pos, "'%s' target must be in same function context",
-                Token::Str(jump_kind));
-  }
-  return new (Z) JumpNode(jump_pos, jump_kind, target);
-}
-
-AstNode* Parser::ParseYieldStatement() {
-  bool is_yield_each = false;
-  const TokenPosition yield_pos = TokenPos();
-  ConsumeToken();  // yield reserved word.
-  if (CurrentToken() == Token::kMUL) {
-    is_yield_each = true;
-    ConsumeToken();
-  }
-  if (!innermost_function().IsGenerator() &&
-      !innermost_function().IsGeneratorClosure()) {
-    ReportError(yield_pos,
-                "yield%s statement only allowed in generator functions",
-                is_yield_each ? "*" : "");
-  }
-
-  AstNode* expr = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
-
-  LetNode* yield = new (Z) LetNode(yield_pos);
-  if (innermost_function().IsSyncGenerator() ||
-      innermost_function().IsSyncGenClosure()) {
-    // Yield statement in sync* function.
-
-    LocalVariable* iterator_param =
-        LookupLocalScope(Symbols::IteratorParameter());
-    ASSERT(iterator_param != NULL);
-    AstNode* iterator =
-        new (Z) LoadLocalNode(TokenPosition::kNoSource, iterator_param);
-    if (is_yield_each) {
-      // Generate :iterator._yieldEachIterable = expr;
-      yield->AddNode(new (Z) InstanceSetterNode(
-          TokenPosition::kNoSource, iterator,
-          Library::PrivateCoreLibName(Symbols::_yieldEachIterable()), expr));
-    } else {
-      // Generate :iterator._current = expr;
-      yield->AddNode(new (Z) InstanceSetterNode(
-          TokenPosition::kNoSource, iterator,
-          Library::PrivateCoreLibName(Symbols::_current()), expr));
-    }
-    AwaitMarkerNode* await_marker = new (Z) AwaitMarkerNode(
-        async_temp_scope_, current_block_->scope, TokenPosition::kNoSource);
-    yield->AddNode(await_marker);
-    // Return true to indicate that a value has been generated.
-    ReturnNode* return_true = new (Z)
-        ReturnNode(yield_pos, new (Z) LiteralNode(TokenPos(), Bool::True()));
-    return_true->set_return_type(ReturnNode::kContinuationTarget);
-    yield->AddNode(return_true);
-
-    // If this expression is part of a try block, also append the code for
-    // restoring the saved try context that lives on the stack and possibly the
-    // saved try context of the outer try block.
-    LocalVariable* saved_try_ctx;
-    LocalVariable* async_saved_try_ctx;
-    LocalVariable* outer_saved_try_ctx;
-    LocalVariable* outer_async_saved_try_ctx;
-    CheckAsyncOpInTryBlock(&saved_try_ctx, &async_saved_try_ctx,
-                           &outer_saved_try_ctx, &outer_async_saved_try_ctx);
-    if (saved_try_ctx != NULL) {
-      yield->AddNode(new (Z) StoreLocalNode(
-          TokenPosition::kNoSource, saved_try_ctx,
-          new (Z)
-              LoadLocalNode(TokenPosition::kNoSource, async_saved_try_ctx)));
-      if (outer_saved_try_ctx != NULL) {
-        yield->AddNode(new (Z) StoreLocalNode(
-            TokenPosition::kNoSource, outer_saved_try_ctx,
-            new (Z) LoadLocalNode(TokenPosition::kNoSource,
-                                  outer_async_saved_try_ctx)));
-      }
-    } else {
-      ASSERT(outer_saved_try_ctx == NULL);
-    }
-  } else {
-    // yield statement in async* function.
-    ASSERT(innermost_function().IsAsyncGenerator() ||
-           innermost_function().IsAsyncGenClosure());
-
-    LocalVariable* controller_var =
-        LookupLocalScope(Symbols::ColonController());
-    ASSERT(controller_var != NULL);
-    // :controller.add[Stream](expr);
-    ArgumentListNode* add_args = new (Z) ArgumentListNode(yield_pos);
-    add_args->Add(expr);
-    AstNode* add_call = new (Z) InstanceCallNode(
-        yield_pos,
-        new (Z) LoadLocalNode(TokenPosition::kNoSource, controller_var),
-        is_yield_each ? Symbols::AddStream() : Symbols::add(), add_args);
-
-    // if (:controller.add[Stream](expr)) {
-    //   return;
-    // }
-    // await_marker;
-    // continuation_return;
-    // restore saved_try_context
-
-    SequenceNode* true_branch =
-        new (Z) SequenceNode(TokenPosition::kNoSource, NULL);
-    AstNode* return_from_generator = new (Z) ReturnNode(yield_pos);
-    true_branch->Add(return_from_generator);
-    AddNodeForFinallyInlining(return_from_generator);
-    AstNode* if_is_cancelled =
-        new (Z) IfNode(TokenPosition::kNoSource, add_call, true_branch, NULL);
-    yield->AddNode(if_is_cancelled);
-
-    AwaitMarkerNode* await_marker = new (Z) AwaitMarkerNode(
-        async_temp_scope_, current_block_->scope, TokenPosition::kNoSource);
-    yield->AddNode(await_marker);
-    ReturnNode* continuation_return = new (Z) ReturnNode(yield_pos);
-    continuation_return->set_return_type(ReturnNode::kContinuationTarget);
-    yield->AddNode(continuation_return);
-
-    // If this expression is part of a try block, also append the code for
-    // restoring the saved try context that lives on the stack and possibly the
-    // saved try context of the outer try block.
-    LocalVariable* saved_try_ctx;
-    LocalVariable* async_saved_try_ctx;
-    LocalVariable* outer_saved_try_ctx;
-    LocalVariable* outer_async_saved_try_ctx;
-    CheckAsyncOpInTryBlock(&saved_try_ctx, &async_saved_try_ctx,
-                           &outer_saved_try_ctx, &outer_async_saved_try_ctx);
-    if (saved_try_ctx != NULL) {
-      yield->AddNode(new (Z) StoreLocalNode(
-          TokenPosition::kNoSource, saved_try_ctx,
-          new (Z)
-              LoadLocalNode(TokenPosition::kNoSource, async_saved_try_ctx)));
-      if (outer_saved_try_ctx != NULL) {
-        yield->AddNode(new (Z) StoreLocalNode(
-            TokenPosition::kNoSource, outer_saved_try_ctx,
-            new (Z) LoadLocalNode(TokenPosition::kNoSource,
-                                  outer_async_saved_try_ctx)));
-      }
-    } else {
-      ASSERT(outer_saved_try_ctx == NULL);
-    }
-  }
-  return yield;
-}
-
-AstNode* Parser::ParseStatement() {
-  TRACE_PARSER("ParseStatement");
-  AstNode* statement = NULL;
-  TokenPosition label_pos = TokenPosition::kNoSource;
-  String* label_name = NULL;
-  if (IsIdentifier()) {
-    if (LookaheadToken(1) == Token::kCOLON) {
-      // Statement starts with a label.
-      label_name = CurrentLiteral();
-      label_pos = TokenPos();
-      ASSERT(label_pos.IsReal());
-      ConsumeToken();  // Consume identifier.
-      ConsumeToken();  // Consume colon.
-    }
-  }
-  const TokenPosition statement_pos = TokenPos();
-  const Token::Kind token = CurrentToken();
-
-  if (token == Token::kWHILE) {
-    statement = ParseWhileStatement(label_name);
-  } else if (token == Token::kFOR) {
-    statement = ParseForStatement(label_name);
-  } else if (IsAwaitKeyword() && (LookaheadToken(1) == Token::kFOR)) {
-    statement = ParseAwaitForStatement(label_name);
-  } else if (token == Token::kDO) {
-    statement = ParseDoWhileStatement(label_name);
-  } else if (token == Token::kSWITCH) {
-    statement = ParseSwitchStatement(label_name);
-  } else if (token == Token::kTRY) {
-    statement = ParseTryStatement(label_name);
-  } else if (token == Token::kRETURN) {
-    const TokenPosition return_pos = TokenPos();
-    ConsumeToken();
-    if (CurrentToken() != Token::kSEMICOLON) {
-      const TokenPosition expr_pos = TokenPos();
-      const int function_level = FunctionLevel();
-      if (current_function().IsGenerativeConstructor() &&
-          (function_level == 0)) {
-        ReportError(expr_pos,
-                    "return of a value is not allowed in constructors");
-      } else if (current_function().IsGeneratorClosure() &&
-                 (function_level == 0)) {
-        ReportError(expr_pos, "generator functions may not return a value");
-      }
-      AstNode* expr = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
-      expr = AddAsyncResultTypeCheck(expr_pos, expr);
-      statement = new (Z) ReturnNode(statement_pos, expr);
-    } else {
-      if (current_function().IsSyncGenClosure() && (FunctionLevel() == 0)) {
-        // In a synchronous generator, return without an expression
-        // returns false, signaling that the iterator terminates and
-        // did not yield a value.
-        statement = new (Z) ReturnNode(
-            statement_pos, new (Z) LiteralNode(return_pos, Bool::False()));
-      } else {
-        statement = new (Z) ReturnNode(statement_pos);
-      }
-    }
-    AddNodeForFinallyInlining(statement);
-    ExpectSemicolon();
-  } else if (IsYieldKeyword()) {
-    statement = ParseYieldStatement();
-    ExpectSemicolon();
-  } else if (token == Token::kIF) {
-    statement = ParseIfStatement(label_name);
-  } else if (token == Token::kASSERT) {
-    statement = ParseAssertStatement();
-    ExpectSemicolon();
-  } else if (IsVariableDeclaration()) {
-    statement = ParseVariableDeclarationList();
-    ExpectSemicolon();
-  } else if (IsFunctionDeclaration()) {
-    statement = ParseFunctionStatement(false);
-  } else if (token == Token::kLBRACE) {
-    SourceLabel* label = NULL;
-    OpenBlock();
-    if (label_name != NULL) {
-      label = SourceLabel::New(label_pos, label_name, SourceLabel::kStatement);
-      current_block_->scope->AddLabel(label);
-    }
-    ConsumeToken();
-    ParseStatementSequence();
-    statement = CloseBlock();
-    if (label != NULL) {
-      statement->AsSequenceNode()->set_label(label);
-    }
-    ExpectToken(Token::kRBRACE);
-  } else if (token == Token::kBREAK) {
-    statement = ParseJump(label_name);
-    if ((statement != NULL) && !statement->IsStopNode()) {
-      AddNodeForFinallyInlining(statement);
-    }
-    ExpectSemicolon();
-  } else if (token == Token::kCONTINUE) {
-    statement = ParseJump(label_name);
-    AddNodeForFinallyInlining(statement);
-    ExpectSemicolon();
-  } else if (token == Token::kSEMICOLON) {
-    // Empty statement, nothing to do.
-    ConsumeToken();
-  } else if (token == Token::kRETHROW) {
-    // Rethrow of current exception.
-    ConsumeToken();
-    ExpectSemicolon();
-    // Check if it is ok to do a rethrow. Find the innermost enclosing
-    // catch block.
-    TryStack* try_statement = try_stack_;
-    while ((try_statement != NULL) && !try_statement->inside_catch()) {
-      try_statement = try_statement->outer_try();
-    }
-    if (try_statement == NULL) {
-      ReportError(statement_pos, "rethrow of an exception is not valid here");
-    }
-
-    // If in async code, use :saved_exception_var and :saved_stack_trace_var
-    // instead of :exception_var and :stack_trace_var.
-    // These variables are bound in the block containing the try.
-    // Look in the try scope directly.
-    LocalScope* scope = try_statement->try_block()->scope->parent();
-    ASSERT(scope != NULL);
-    LocalVariable* excp_var;
-    LocalVariable* trace_var;
-    if (innermost_function().IsAsyncClosure() ||
-        innermost_function().IsAsyncFunction() ||
-        innermost_function().IsSyncGenClosure() ||
-        innermost_function().IsSyncGenerator() ||
-        innermost_function().IsAsyncGenClosure() ||
-        innermost_function().IsAsyncGenerator()) {
-      excp_var = scope->LocalLookupVariable(Symbols::SavedExceptionVar());
-      trace_var = scope->LocalLookupVariable(Symbols::SavedStackTraceVar());
-    } else {
-      excp_var = scope->LocalLookupVariable(Symbols::ExceptionVar());
-      trace_var = scope->LocalLookupVariable(Symbols::StackTraceVar());
-    }
-    ASSERT(excp_var != NULL);
-    ASSERT(trace_var != NULL);
-
-    statement = new (Z)
-        ThrowNode(statement_pos, new (Z) LoadLocalNode(statement_pos, excp_var),
-                  new (Z) LoadLocalNode(statement_pos, trace_var));
-  } else {
-    statement = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
-    ExpectSemicolon();
-  }
-  return statement;
-}
-
-void Parser::ReportError(const Error& error) {
-  Report::LongJump(error);
-  UNREACHABLE();
-}
-
-void Parser::ReportErrors(const Error& prev_error,
-                          const Script& script,
-                          TokenPosition token_pos,
-                          const char* format,
-                          ...) {
-  va_list args;
-  va_start(args, format);
-  Report::LongJumpV(prev_error, script, token_pos, format, args);
-  va_end(args);
-  UNREACHABLE();
-}
-
-void Parser::ReportError(TokenPosition token_pos,
-                         const char* format,
-                         ...) const {
-  va_list args;
-  va_start(args, format);
-  Report::MessageV(Report::kError, script_, token_pos, Report::AtLocation,
-                   format, args);
-  va_end(args);
-  UNREACHABLE();
-}
-
-void Parser::ReportErrorBefore(const char* format, ...) {
-  va_list args;
-  va_start(args, format);
-  Report::MessageV(Report::kError, script_, PrevTokenPos(),
-                   Report::AfterLocation, format, args);
-  va_end(args);
-  UNREACHABLE();
-}
-
-void Parser::ReportError(const char* format, ...) const {
-  va_list args;
-  va_start(args, format);
-  Report::MessageV(Report::kError, script_, TokenPos(), Report::AtLocation,
-                   format, args);
-  va_end(args);
-  UNREACHABLE();
-}
-
-void Parser::ReportWarning(TokenPosition token_pos,
-                           const char* format,
-                           ...) const {
-  va_list args;
-  va_start(args, format);
-  Report::MessageV(Report::kWarning, script_, token_pos, Report::AtLocation,
-                   format, args);
-  va_end(args);
-}
-
-void Parser::ReportWarning(const char* format, ...) const {
-  va_list args;
-  va_start(args, format);
-  Report::MessageV(Report::kWarning, script_, TokenPos(), Report::AtLocation,
-                   format, args);
-  va_end(args);
-}
-
-void Parser::CheckToken(Token::Kind token_expected, const char* msg) {
-  if (CurrentToken() != token_expected) {
-    if (msg != NULL) {
-      ReportError("%s", msg);
-    } else {
-      ReportError("'%s' expected", Token::Str(token_expected));
-    }
-  }
-}
-
-void Parser::ExpectToken(Token::Kind token_expected) {
-  if (CurrentToken() != token_expected) {
-    ReportError("'%s' expected", Token::Str(token_expected));
-  }
-  ConsumeToken();
-}
-
-void Parser::ExpectSemicolon() {
-  if (CurrentToken() != Token::kSEMICOLON) {
-    ReportErrorBefore("semicolon expected");
-  }
-  ConsumeToken();
-}
-
-void Parser::UnexpectedToken() {
-  ReportError("unexpected token '%s'", CurrentToken() == Token::kIDENT
-                                           ? CurrentLiteral()->ToCString()
-                                           : Token::Str(CurrentToken()));
-}
-
-String* Parser::ExpectUserDefinedTypeIdentifier(const char* msg) {
-  if (CurrentToken() != Token::kIDENT) {
-    ReportError("%s", msg);
-  }
-  String* ident = CurrentLiteral();
-  if (ident->Equals("dynamic")) {
-    ReportError("%s", msg);
-  }
-  ConsumeToken();
-  return ident;
-}
-
-// Check whether current token is an identifier or a built-in identifier.
-String* Parser::ExpectIdentifier(const char* msg) {
-  if (!IsIdentifier()) {
-    ReportError("%s", msg);
-  }
-  String* ident = CurrentLiteral();
-  ConsumeToken();
-  return ident;
-}
-
-bool Parser::IsAwaitKeyword() {
-  return (FLAG_await_is_keyword || await_is_keyword_) &&
-         IsSymbol(Symbols::Await());
-}
-
-bool Parser::IsYieldKeyword() {
-  return (FLAG_await_is_keyword || await_is_keyword_) &&
-         IsSymbol(Symbols::YieldKw());
-}
-
-static bool IsIncrementOperator(Token::Kind token) {
-  return token == Token::kINCR || token == Token::kDECR;
-}
-
-static bool IsPrefixOperator(Token::Kind token) {
-  return (token == Token::kSUB) || (token == Token::kNOT) ||
-         (token == Token::kBIT_NOT);
-}
-
-SequenceNode* Parser::NodeAsSequenceNode(TokenPosition sequence_pos,
-                                         AstNode* node,
-                                         LocalScope* scope) {
-  if ((node == NULL) || !node->IsSequenceNode()) {
-    SequenceNode* sequence = new SequenceNode(sequence_pos, scope);
-    if (node != NULL) {
-      sequence->Add(node);
-    }
-    return sequence;
-  }
-  return node->AsSequenceNode();
-}
-
-AstNode* Parser::ThrowTypeError(TokenPosition type_pos,
-                                const AbstractType& type,
-                                LibraryPrefix* prefix) {
-  ArgumentListNode* arguments = new (Z) ArgumentListNode(type_pos);
-
-  String& method_name = String::Handle(Z);
-  if (prefix == NULL) {
-    method_name = Library::PrivateCoreLibName(Symbols::ThrowNew()).raw();
-  } else {
-    arguments->Add(new (Z) LiteralNode(type_pos, *prefix));
-    method_name =
-        Library::PrivateCoreLibName(Symbols::ThrowNewIfNotLoaded()).raw();
-  }
-  // Location argument.
-  arguments->Add(new (Z) LiteralNode(
-      type_pos,
-      Integer::ZoneHandle(Z, Integer::New(type_pos.value(), Heap::kOld))));
-  // Src value argument.
-  arguments->Add(new (Z) LiteralNode(type_pos, Object::null_instance()));
-  // Dst type argument.
-  arguments->Add(new (Z) LiteralNode(type_pos, type));
-  // Dst name argument.
-  arguments->Add(new (Z) LiteralNode(type_pos, Symbols::Empty()));
-  // Bound error msg argument.
-  arguments->Add(new (Z) LiteralNode(type_pos, Object::null_instance()));
-  return MakeStaticCall(Symbols::TypeError(), method_name, arguments);
-}
-
-// Call _throwNewIfNotLoaded if prefix is not NULL, otherwise call _throwNew.
-AstNode* Parser::ThrowNoSuchMethodError(TokenPosition call_pos,
-                                        const Class& cls,
-                                        const String& function_name,
-                                        ArgumentListNode* function_arguments,
-                                        InvocationMirror::Level im_level,
-                                        InvocationMirror::Kind im_kind,
-                                        const Function* func,
-                                        const LibraryPrefix* prefix) {
-  ArgumentListNode* arguments = new (Z) ArgumentListNode(call_pos);
-
-  String& method_name = String::Handle(Z);
-  if (prefix == NULL || !prefix->is_deferred_load()) {
-    method_name = Library::PrivateCoreLibName(Symbols::ThrowNew()).raw();
-  } else {
-    arguments->Add(new (Z) LiteralNode(call_pos, *prefix));
-    method_name =
-        Library::PrivateCoreLibName(Symbols::ThrowNewIfNotLoaded()).raw();
-  }
-  // Object receiver.
-  // If the function is external and dynamic, pass the actual receiver,
-  // otherwise, pass a class literal of the unresolved method's owner.
-  if ((func != NULL) && !func->IsNull() && func->is_external() &&
-      !func->is_static()) {
-    arguments->Add(LoadReceiver(func->token_pos()));
-  } else {
-    AbstractType& type = AbstractType::ZoneHandle(Z);
-    type ^= Type::New(cls, TypeArguments::Handle(Z), call_pos, Heap::kOld);
-    type ^= CanonicalizeType(type);
-    arguments->Add(new (Z) LiteralNode(call_pos, type));
-  }
-  // String memberName.
-  arguments->Add(new (Z) LiteralNode(
-      call_pos, String::ZoneHandle(Z, Symbols::New(T, function_name))));
-  // Smi invocation_type.
-  if (cls.IsTopLevel()) {
-    ASSERT(im_level == InvocationMirror::kStatic ||
-           im_level == InvocationMirror::kTopLevel);
-    im_level = InvocationMirror::kTopLevel;
-  }
-  arguments->Add(new (Z) LiteralNode(
-      call_pos, Smi::ZoneHandle(Z, Smi::New(InvocationMirror::EncodeType(
-                                       im_level, im_kind)))));
-  // Type arguments.
-  arguments->Add(new (Z) LiteralNode(
-      call_pos, function_arguments == NULL
-                    ? TypeArguments::ZoneHandle(Z, TypeArguments::null())
-                    : function_arguments->type_arguments()));
-  // List arguments.
-  if (function_arguments == NULL) {
-    arguments->Add(new (Z) LiteralNode(call_pos, Object::null_array()));
-  } else {
-    ArrayNode* array =
-        new (Z) ArrayNode(call_pos, Type::ZoneHandle(Z, Type::ArrayType()),
-                          function_arguments->nodes());
-    arguments->Add(array);
-  }
-  // List argumentNames.
-  if (function_arguments == NULL) {
-    arguments->Add(new (Z) LiteralNode(call_pos, Object::null_array()));
-  } else {
-    arguments->Add(new (Z) LiteralNode(call_pos, function_arguments->names()));
-  }
-  return MakeStaticCall(Symbols::NoSuchMethodError(), method_name, arguments);
-}
-
-AstNode* Parser::ParseBinaryExpr(int min_preced) {
-  TRACE_PARSER("ParseBinaryExpr");
-  ASSERT(min_preced >= Token::Precedence(Token::kIFNULL));
-  AstNode* left_operand = ParseUnaryExpr();
-  if (left_operand->IsPrimaryNode() &&
-      (left_operand->AsPrimaryNode()->IsSuper())) {
-    ReportError(left_operand->token_pos(), "illegal use of 'super'");
-  }
-  int current_preced = Token::Precedence(CurrentToken());
-  while (current_preced >= min_preced) {
-    while (Token::Precedence(CurrentToken()) == current_preced) {
-      Token::Kind op_kind = CurrentToken();
-      const TokenPosition op_pos = TokenPos();
-      ConsumeToken();
-      AstNode* right_operand = NULL;
-      if ((op_kind != Token::kIS) && (op_kind != Token::kAS)) {
-        right_operand = ParseBinaryExpr(current_preced + 1);
-      } else {
-        // For 'is' and 'as' we expect the right operand to be a type.
-        if ((op_kind == Token::kIS) && (CurrentToken() == Token::kNOT)) {
-          ConsumeToken();
-          op_kind = Token::kISNOT;
-        }
-        const TokenPosition type_pos = TokenPos();
-        const AbstractType& type = AbstractType::ZoneHandle(
-            Z, ParseTypeOrFunctionType(false, ClassFinalizer::kCanonicalize));
-        if (!type.IsInstantiated() && (FunctionLevel() > 0)) {
-          // Make sure that the instantiators are captured.
-          CaptureAllInstantiators();
-        }
-        right_operand = new (Z) TypeNode(type_pos, type);
-        // In production mode, the type may be malformed.
-        // In checked mode, the type may be malformed or malbounded.
-        if (type.IsMalformedOrMalbounded()) {
-          // Note that a type error is thrown in a type test or in
-          // a type cast even if the tested value is null.
-          // We need to evaluate the left operand for potential
-          // side effects.
-          LetNode* let = new (Z) LetNode(left_operand->token_pos());
-          let->AddNode(left_operand);
-          let->AddNode(ThrowTypeError(type_pos, type));
-          left_operand = let;
-          break;  // Type checks and casts can't be chained.
-        }
-      }
-      if (Token::IsRelationalOperator(op_kind) ||
-          Token::IsTypeTestOperator(op_kind) ||
-          Token::IsTypeCastOperator(op_kind) ||
-          Token::IsEqualityOperator(op_kind)) {
-        left_operand = new (Z)
-            ComparisonNode(op_pos, op_kind, left_operand, right_operand);
-        break;  // Equality and relational operators cannot be chained.
-      } else {
-        left_operand =
-            OptimizeBinaryOpNode(op_pos, op_kind, left_operand, right_operand);
-      }
-    }
-    current_preced--;
-  }
-  return left_operand;
-}
-
-AstNode* Parser::ParseAwaitableExprList() {
-  TRACE_PARSER("ParseAwaitableExprList");
-  SequenceNode* preamble = NULL;
-  AstNode* expressions =
-      ParseAwaitableExpr(kAllowConst, kConsumeCascades, &preamble);
-  if (preamble != NULL) {
-    preamble->Add(expressions);
-    expressions = preamble;
-  }
-  if (CurrentToken() == Token::kCOMMA) {
-    // Collect comma-separated expressions in a non scope owning sequence node.
-    SequenceNode* list = new (Z) SequenceNode(TokenPos(), NULL);
-    list->Add(expressions);
-    while (CurrentToken() == Token::kCOMMA) {
-      ConsumeToken();
-      preamble = NULL;
-      AstNode* expr =
-          ParseAwaitableExpr(kAllowConst, kConsumeCascades, &preamble);
-      if (preamble != NULL) {
-        list->Add(preamble);
-      }
-      list->Add(expr);
-    }
-    expressions = list;
-  }
-  return expressions;
-}
-
-void Parser::EnsureExpressionTemp() {
-  // Temporary used later by the flow_graph_builder.
-  parsed_function()->EnsureExpressionTemp();
-}
-
-LocalVariable* Parser::CreateTempConstVariable(TokenPosition token_pos,
-                                               const char* s) {
-  char name[64];
-  Utils::SNPrint(name, 64, ":%s%" Pd "", s, token_pos.value());
-  LocalVariable* temp = new (Z) LocalVariable(
-      token_pos, token_pos, String::ZoneHandle(Z, Symbols::New(T, name)),
-      Object::dynamic_type());
-  temp->set_is_final();
-  current_block_->scope->AddVariable(temp);
-  return temp;
-}
-
-AstNode* Parser::OptimizeBinaryOpNode(TokenPosition op_pos,
-                                      Token::Kind binary_op,
-                                      AstNode* lhs,
-                                      AstNode* rhs) {
-  LiteralNode* lhs_literal = lhs->AsLiteralNode();
-  LiteralNode* rhs_literal = rhs->AsLiteralNode();
-  if ((lhs_literal != NULL) && (rhs_literal != NULL)) {
-    if (lhs_literal->literal().IsDouble() &&
-        rhs_literal->literal().IsDouble()) {
-      double left_double = Double::Cast(lhs_literal->literal()).value();
-      double right_double = Double::Cast(rhs_literal->literal()).value();
-      if (binary_op == Token::kDIV) {
-        const Double& dbl_obj = Double::ZoneHandle(
-            Z, Double::NewCanonical((left_double / right_double)));
-        return new (Z) LiteralNode(op_pos, dbl_obj);
-      }
-    }
-  }
-  if (binary_op == Token::kBIT_AND) {
-    // Normalize so that rhs is a literal if any is.
-    if ((rhs_literal == NULL) && (lhs_literal != NULL)) {
-      // Swap.
-      LiteralNode* temp = rhs_literal;
-      rhs_literal = lhs_literal;
-      lhs_literal = temp;
-    }
-  }
-  if (binary_op == Token::kIFNULL) {
-    // Handle a ?? b.
-    if ((lhs->EvalConstExpr() != NULL) && (rhs->EvalConstExpr() != NULL)) {
-      Instance& expr_value = Instance::ZoneHandle(
-          Z, EvaluateConstExpr(lhs->token_pos(), lhs).raw());
-      if (expr_value.IsNull()) {
-        expr_value = EvaluateConstExpr(rhs->token_pos(), rhs).raw();
-      }
-      return new (Z) LiteralNode(op_pos, expr_value);
-    }
-
-    LetNode* result = new (Z) LetNode(op_pos);
-    LocalVariable* left_temp = result->AddInitializer(lhs);
-    left_temp->set_is_final();
-    const TokenPosition no_pos = TokenPosition::kNoSource;
-    LiteralNode* null_operand =
-        new (Z) LiteralNode(no_pos, Object::null_instance());
-    LoadLocalNode* load_left_temp = new (Z) LoadLocalNode(no_pos, left_temp);
-    ComparisonNode* null_compare = new (Z)
-        ComparisonNode(no_pos, Token::kNE_STRICT, load_left_temp, null_operand);
-    // If the expression is a compile-time constant, ensure that it
-    // is evaluated and canonicalized. See issue 31066.
-    if (rhs->EvalConstExpr() != NULL) {
-      rhs = FoldConstExpr(rhs->token_pos(), rhs);
-    }
-    result->AddNode(
-        new (Z) ConditionalExprNode(op_pos, null_compare, load_left_temp, rhs));
-    return result;
-  }
-  return new (Z) BinaryOpNode(op_pos, binary_op, lhs, rhs);
-}
-
-AstNode* Parser::ExpandAssignableOp(TokenPosition op_pos,
-                                    Token::Kind assignment_op,
-                                    AstNode* lhs,
-                                    AstNode* rhs) {
-  TRACE_PARSER("ExpandAssignableOp");
-  switch (assignment_op) {
-    case Token::kASSIGN:
-      return rhs;
-    case Token::kASSIGN_ADD:
-      return new (Z) BinaryOpNode(op_pos, Token::kADD, lhs, rhs);
-    case Token::kASSIGN_SUB:
-      return new (Z) BinaryOpNode(op_pos, Token::kSUB, lhs, rhs);
-    case Token::kASSIGN_MUL:
-      return new (Z) BinaryOpNode(op_pos, Token::kMUL, lhs, rhs);
-    case Token::kASSIGN_TRUNCDIV:
-      return new (Z) BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs);
-    case Token::kASSIGN_DIV:
-      return new (Z) BinaryOpNode(op_pos, Token::kDIV, lhs, rhs);
-    case Token::kASSIGN_MOD:
-      return new (Z) BinaryOpNode(op_pos, Token::kMOD, lhs, rhs);
-    case Token::kASSIGN_SHR:
-      return new (Z) BinaryOpNode(op_pos, Token::kSHR, lhs, rhs);
-    case Token::kASSIGN_SHL:
-      return new (Z) BinaryOpNode(op_pos, Token::kSHL, lhs, rhs);
-    case Token::kASSIGN_OR:
-      return new (Z) BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs);
-    case Token::kASSIGN_AND:
-      return new (Z) BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs);
-    case Token::kASSIGN_XOR:
-      return new (Z) BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs);
-    case Token::kASSIGN_COND:
-      return new (Z) BinaryOpNode(op_pos, Token::kIFNULL, lhs, rhs);
-    default:
-      ReportError(op_pos,
-                  "internal error: ExpandAssignableOp '%s' unimplemented",
-                  Token::Name(assignment_op));
-      UNIMPLEMENTED();
-      return NULL;
-  }
-}
-
-// Evaluates the value of the compile time constant expression
-// and returns a literal node for the value.
-LiteralNode* Parser::FoldConstExpr(TokenPosition expr_pos, AstNode* expr) {
-  if (expr->IsLiteralNode()) {
-    return expr->AsLiteralNode();
-  }
-  if (expr->EvalConstExpr() == NULL) {
-    ReportError(expr_pos, "expression is not a valid compile-time constant");
-  }
-  return new (Z) LiteralNode(expr_pos, EvaluateConstExpr(expr_pos, expr));
-}
-
-LetNode* Parser::PrepareCompoundAssignmentNodes(AstNode** expr) {
-  AstNode* node = *expr;
-  TokenPosition token_pos = node->token_pos();
-  LetNode* result = new (Z) LetNode(token_pos);
-  if (node->IsLoadIndexedNode()) {
-    LoadIndexedNode* load_indexed = node->AsLoadIndexedNode();
-    AstNode* array = load_indexed->array();
-    AstNode* index = load_indexed->index_expr();
-    if (!IsSimpleLocalOrLiteralNode(load_indexed->array())) {
-      LocalVariable* t0 = result->AddInitializer(load_indexed->array());
-      array = new (Z) LoadLocalNode(token_pos, t0);
-    }
-    if (!IsSimpleLocalOrLiteralNode(load_indexed->index_expr())) {
-      LocalVariable* t1 = result->AddInitializer(load_indexed->index_expr());
-      index = new (Z) LoadLocalNode(token_pos, t1);
-    }
-    *expr = new (Z)
-        LoadIndexedNode(token_pos, array, index, load_indexed->super_class());
-    return result;
-  }
-  if (node->IsInstanceGetterNode()) {
-    InstanceGetterNode* getter = node->AsInstanceGetterNode();
-    AstNode* receiver = getter->receiver();
-    if (!IsSimpleLocalOrLiteralNode(getter->receiver())) {
-      LocalVariable* t0 = result->AddInitializer(getter->receiver());
-      receiver = new (Z) LoadLocalNode(token_pos, t0);
-    }
-    *expr = new (Z) InstanceGetterNode(
-        token_pos, receiver, getter->field_name(), getter->is_conditional());
-    return result;
-  }
-  return result;
-}
-
-// Check whether the syntax of expression expr is a grammatically legal
-// assignable expression. This check is used to detect situations where
-// the expression itself is assignable, but the source is grammatically
-// wrong. The AST representation of an expression cannot distinguish
-// between x = 0 and (x) = 0. The latter is illegal.
-// A syntactically legal assignable expression always ends with an
-// identifier token or a ] token. We rewind the token iterator and
-// check whether the token before end_pos is an identifier or ].
-bool Parser::IsLegalAssignableSyntax(AstNode* expr, TokenPosition end_pos) {
-  ASSERT(expr->token_pos().IsReal());
-  ASSERT(expr->token_pos() < end_pos);
-  SetPosition(expr->token_pos());
-  Token::Kind token = Token::kILLEGAL;
-  while (TokenPos() < end_pos) {
-    token = CurrentToken();
-    ConsumeToken();
-  }
-  ASSERT(TokenPos() == end_pos);
-  return Token::IsIdentifier(token) || (token == Token::kRBRACK);
-}
-
-AstNode* Parser::CreateAssignmentNode(AstNode* original,
-                                      AstNode* rhs,
-                                      const String* left_ident,
-                                      TokenPosition left_pos,
-                                      bool is_compound /* = false */) {
-  AstNode* result = original->MakeAssignmentNode(rhs);
-  if (result == NULL) {
-    String& name = String::ZoneHandle(Z);
-    const Class* target_cls = &current_class();
-    if (original->IsTypeNode()) {
-      name = Symbols::New(T, original->AsTypeNode()->TypeName());
-    } else if (original->IsLoadStaticFieldNode()) {
-      name = original->AsLoadStaticFieldNode()->field().name();
-      target_cls =
-          &Class::Handle(Z, original->AsLoadStaticFieldNode()->field().Owner());
-    } else if ((left_ident != NULL) &&
-               (original->IsLiteralNode() || original->IsLoadLocalNode())) {
-      name = left_ident->raw();
-    }
-    if (name.IsNull()) {
-      ReportError(left_pos, "expression is not assignable");
-    }
-    ArgumentListNode* error_arguments =
-        new (Z) ArgumentListNode(rhs->token_pos());
-    error_arguments->Add(rhs);
-    result = ThrowNoSuchMethodError(
-        original->token_pos(), *target_cls,
-        String::Handle(Z, Field::SetterSymbol(name)), error_arguments,
-        InvocationMirror::kStatic,
-        original->IsLoadLocalNode() ? InvocationMirror::kLocalVar
-                                    : InvocationMirror::kSetter,
-        NULL);  // No existing function.
-  }
-  // The compound assignment operator a ??= b is different from other
-  // a op= b assignments. If a is non-null, the assignment to a must be
-  // dropped:
-  // normally: a op= b ==> a = a op b
-  // however:  a ??= b ==> a ?? (a = b)
-  // Therefore, we need to transform a = (a ?? b) into a ?? (a = b)
-  if (is_compound && rhs->IsBinaryOpNode() &&
-      (rhs->AsBinaryOpNode()->kind() == Token::kIFNULL)) {
-    BinaryOpNode* ifnull = rhs->AsBinaryOpNode();
-    AstNode* modified_assign =
-        CreateAssignmentNode(original, ifnull->right(), left_ident, left_pos);
-    result = OptimizeBinaryOpNode(ifnull->token_pos(), ifnull->kind(),
-                                  ifnull->left(), modified_assign);
-  }
-  return result;
-}
-
-AstNode* Parser::ParseCascades(AstNode* expr) {
-  TokenPosition cascade_pos = TokenPos();
-  LetNode* cascade = new (Z) LetNode(cascade_pos);
-  LocalVariable* cascade_receiver_var = cascade->AddInitializer(expr);
-  while (CurrentToken() == Token::kCASCADE) {
-    cascade_pos = TokenPos();
-    LoadLocalNode* load_cascade_receiver =
-        new (Z) LoadLocalNode(cascade_pos, cascade_receiver_var);
-    if (Token::IsIdentifier(LookaheadToken(1))) {
-      // Replace .. with . for ParseSelectors().
-      token_kind_ = Token::kPERIOD;
-    } else if (LookaheadToken(1) == Token::kLBRACK) {
-      ConsumeToken();
-    } else {
-      ReportError("identifier or [ expected after ..");
-    }
-    String* expr_ident =
-        Token::IsIdentifier(CurrentToken()) ? CurrentLiteral() : NULL;
-    const TokenPosition expr_pos = TokenPos();
-    expr = ParseSelectors(load_cascade_receiver, true);
-
-    // Assignments after a cascade are part of the cascade. The
-    // assigned expression must not contain cascades.
-    if (Token::IsAssignmentOperator(CurrentToken())) {
-      Token::Kind assignment_op = CurrentToken();
-      const TokenPosition assignment_pos = TokenPos();
-      ConsumeToken();
-      AstNode* right_expr = ParseExpr(kAllowConst, kNoCascades);
-      if (assignment_op != Token::kASSIGN) {
-        // Compound assignment: store inputs with side effects into
-        // temporary locals.
-        LetNode* let_expr = PrepareCompoundAssignmentNodes(&expr);
-        right_expr =
-            ExpandAssignableOp(assignment_pos, assignment_op, expr, right_expr);
-        AstNode* assign_expr =
-            CreateAssignmentNode(expr, right_expr, expr_ident, expr_pos, true);
-        ASSERT(assign_expr != NULL);
-        let_expr->AddNode(assign_expr);
-        expr = let_expr;
-      } else {
-        right_expr =
-            ExpandAssignableOp(assignment_pos, assignment_op, expr, right_expr);
-        AstNode* assign_expr =
-            CreateAssignmentNode(expr, right_expr, expr_ident, expr_pos);
-        ASSERT(assign_expr != NULL);
-        expr = assign_expr;
-      }
-    }
-    cascade->AddNode(expr);
-  }
-  // The result is an expression with the (side effects of the) cascade
-  // sequence followed by the (value of the) receiver temp variable load.
-  cascade->AddNode(new (Z) LoadLocalNode(cascade_pos, cascade_receiver_var));
-  return cascade;
-}
-
-// Convert loading of a static const field into a literal node.
-static AstNode* LiteralIfStaticConst(Zone* zone, AstNode* expr) {
-  if (expr->IsLoadStaticFieldNode()) {
-    const Field& field = expr->AsLoadStaticFieldNode()->field();
-    if (field.is_const() &&
-        !expr->AsLoadStaticFieldNode()->is_deferred_reference()) {
-      ASSERT(field.StaticValue() != Object::sentinel().raw());
-      ASSERT(field.StaticValue() != Object::transition_sentinel().raw());
-      return new (zone) LiteralNode(
-          expr->token_pos(), Instance::ZoneHandle(zone, field.StaticValue()));
-    }
-  }
-  return expr;
-}
-
-AstNode* Parser::ParseAwaitableExpr(bool require_compiletime_const,
-                                    bool consume_cascades,
-                                    SequenceNode** await_preamble) {
-  TRACE_PARSER("ParseAwaitableExpr");
-  BoolScope saved_seen_await(&parsed_function()->have_seen_await_expr_, false);
-  AstNode* expr = ParseExpr(require_compiletime_const, consume_cascades);
-  if (parsed_function()->have_seen_await()) {
-    // Make sure we do not reuse the scope to avoid creating contexts that we
-    // are unaware of, i.e, creating contexts that have already been covered.
-    // See FlowGraphBuilder::VisitSequenceNode() for details on when contexts
-    // are created.
-    OpenBlock();
-    AwaitTransformer at(current_block_->statements, async_temp_scope_);
-    AstNode* result = at.Transform(expr);
-    SequenceNode* preamble = CloseBlock();
-    if (await_preamble == NULL) {
-      current_block_->statements->Add(preamble);
-    } else {
-      *await_preamble = preamble;
-    }
-    return result;
-  }
-  return expr;
-}
-
-AstNode* Parser::ParseExpr(bool require_compiletime_const,
-                           bool consume_cascades) {
-  TRACE_PARSER("ParseExpr");
-  String* expr_ident =
-      Token::IsIdentifier(CurrentToken()) ? CurrentLiteral() : NULL;
-  const TokenPosition expr_pos = TokenPos();
-
-  RecursionChecker rc(this);
-
-  if (CurrentToken() == Token::kTHROW) {
-    if (require_compiletime_const) {
-      ReportError("'throw expr' is not a valid compile-time constant");
-    }
-    ConsumeToken();
-    if (CurrentToken() == Token::kSEMICOLON) {
-      ReportError("expression expected after throw");
-    }
-    AstNode* expr = ParseExpr(require_compiletime_const, consume_cascades);
-    return new (Z) ThrowNode(expr_pos, expr, NULL);
-  }
-
-  if (require_compiletime_const) {
-    // Check whether we already have evaluated a compile-time constant
-    // at this source location.
-    Instance& existing_const = Instance::ZoneHandle(Z);
-    if (GetCachedConstant(expr_pos, &existing_const)) {
-      SkipConditionalExpr();
-      return new (Z) LiteralNode(expr_pos, existing_const);
-    }
-  }
-
-  AstNode* expr = ParseConditionalExpr();
-  if (!Token::IsAssignmentOperator(CurrentToken())) {
-    if ((CurrentToken() == Token::kCASCADE) && consume_cascades) {
-      return ParseCascades(expr);
-    }
-    if (require_compiletime_const) {
-      expr = FoldConstExpr(expr_pos, expr);
-    } else {
-      expr = LiteralIfStaticConst(Z, expr);
-    }
-    return expr;
-  }
-  // Assignment expressions.
-  if (!IsLegalAssignableSyntax(expr, TokenPos())) {
-    ReportError(expr_pos, "expression is not assignable");
-  }
-  const Token::Kind assignment_op = CurrentToken();
-  const TokenPosition assignment_pos = TokenPos();
-  if (require_compiletime_const) {
-    ReportError(assignment_pos,
-                "expression is not a valid compile-time constant");
-  }
-  ConsumeToken();
-  AstNode* right_expr = ParseExpr(require_compiletime_const, consume_cascades);
-  if (assignment_op != Token::kASSIGN) {
-    // Compound assignment: store inputs with side effects into temp. locals.
-    LetNode* let_expr = PrepareCompoundAssignmentNodes(&expr);
-    AstNode* assigned_value =
-        ExpandAssignableOp(assignment_pos, assignment_op, expr, right_expr);
-    AstNode* assign_expr =
-        CreateAssignmentNode(expr, assigned_value, expr_ident, expr_pos, true);
-    ASSERT(assign_expr != NULL);
-    let_expr->AddNode(assign_expr);
-    return let_expr;
-  } else {
-    AstNode* assigned_value = LiteralIfStaticConst(Z, right_expr);
-    AstNode* assign_expr =
-        CreateAssignmentNode(expr, assigned_value, expr_ident, expr_pos);
-    ASSERT(assign_expr != NULL);
-    return assign_expr;
-  }
-}
-
-LiteralNode* Parser::ParseConstExpr() {
-  TRACE_PARSER("ParseConstExpr");
-  TokenPosition expr_pos = TokenPos();
-  AstNode* expr = ParseExpr(kRequireConst, kNoCascades);
-  if (!expr->IsLiteralNode()) {
-    ReportError(expr_pos, "expression must be a compile-time constant");
-  }
-  return expr->AsLiteralNode();
-}
-
-AstNode* Parser::ParseConditionalExpr() {
-  TRACE_PARSER("ParseConditionalExpr");
-  const TokenPosition expr_pos = TokenPos();
-  AstNode* expr = ParseBinaryExpr(Token::Precedence(Token::kIFNULL));
-  if (CurrentToken() == Token::kCONDITIONAL) {
-    EnsureExpressionTemp();
-    ConsumeToken();
-    AstNode* expr1 = ParseExpr(kAllowConst, kNoCascades);
-    ExpectToken(Token::kCOLON);
-    AstNode* expr2 = ParseExpr(kAllowConst, kNoCascades);
-    expr = new (Z) ConditionalExprNode(expr_pos, expr, expr1, expr2);
-  }
-  return expr;
-}
-
-AstNode* Parser::ParseUnaryExpr() {
-  TRACE_PARSER("ParseUnaryExpr");
-  AstNode* expr = NULL;
-  const TokenPosition op_pos = TokenPos();
-  if (IsAwaitKeyword()) {
-    TRACE_PARSER("ParseAwaitExpr");
-    if (!innermost_function().IsAsyncFunction() &&
-        !innermost_function().IsAsyncClosure() &&
-        !innermost_function().IsAsyncGenerator() &&
-        !innermost_function().IsAsyncGenClosure()) {
-      ReportError("await operator is only allowed in an asynchronous function");
-    }
-    ConsumeToken();
-    parsed_function()->record_await();
-
-    LocalVariable* saved_try_ctx;
-    LocalVariable* async_saved_try_ctx;
-    LocalVariable* outer_saved_try_ctx;
-    LocalVariable* outer_async_saved_try_ctx;
-    CheckAsyncOpInTryBlock(&saved_try_ctx, &async_saved_try_ctx,
-                           &outer_saved_try_ctx, &outer_async_saved_try_ctx);
-    expr = new (Z) AwaitNode(op_pos, ParseUnaryExpr(), saved_try_ctx,
-                             async_saved_try_ctx, outer_saved_try_ctx,
-                             outer_async_saved_try_ctx, current_block_->scope);
-  } else if (IsPrefixOperator(CurrentToken())) {
-    Token::Kind unary_op = CurrentToken();
-    if (unary_op == Token::kSUB) {
-      unary_op = Token::kNEGATE;
-    }
-    ConsumeToken();
-    expr = ParseUnaryExpr();
-    if (expr->IsPrimaryNode() && (expr->AsPrimaryNode()->IsSuper())) {
-      expr = BuildUnarySuperOperator(unary_op, expr->AsPrimaryNode());
-    } else {
-      expr = UnaryOpNode::UnaryOpOrLiteral(op_pos, unary_op, expr);
-    }
-  } else if (IsIncrementOperator(CurrentToken())) {
-    Token::Kind incr_op = CurrentToken();
-    ConsumeToken();
-    String* expr_ident =
-        Token::IsIdentifier(CurrentToken()) ? CurrentLiteral() : NULL;
-    const TokenPosition expr_pos = TokenPos();
-    expr = ParseUnaryExpr();
-    if (!IsLegalAssignableSyntax(expr, TokenPos())) {
-      ReportError(expr_pos, "expression is not assignable");
-    }
-    // Is prefix.
-    LetNode* let_expr = PrepareCompoundAssignmentNodes(&expr);
-    Token::Kind binary_op =
-        (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new (Z) BinaryOpNode(
-        op_pos, binary_op, expr,
-        new (Z) LiteralNode(op_pos, Smi::ZoneHandle(Z, Smi::New(1))));
-    AstNode* store =
-        CreateAssignmentNode(expr, add, expr_ident, expr_pos, true);
-    ASSERT(store != NULL);
-    let_expr->AddNode(store);
-    expr = let_expr;
-  } else {
-    expr = ParsePostfixExpr();
-  }
-  return expr;
-}
-
-ArgumentListNode* Parser::ParseActualParameters(
-    ArgumentListNode* implicit_arguments,
-    const TypeArguments& func_type_args,
-    bool require_const) {
-  TRACE_PARSER("ParseActualParameters");
-  ASSERT(CurrentToken() == Token::kLPAREN);
-  const bool saved_mode = SetAllowFunctionLiterals(true);
-  ArgumentListNode* arguments;
-  if (implicit_arguments == NULL) {
-    // When require_const is true, no function type arguments are passed, so
-    // there is no need to check that they are instantiated.
-    ASSERT(!require_const || func_type_args.IsNull());
-    arguments = new (Z) ArgumentListNode(TokenPos(), func_type_args);
-  } else {
-    // If implicit arguments are provided, they include type arguments (if any).
-    ASSERT(func_type_args.IsNull());
-    arguments = implicit_arguments;
-  }
-  const GrowableObjectArray& names =
-      GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld));
-  bool named_argument_seen = false;
-  if (LookaheadToken(1) != Token::kRPAREN) {
-    String& arg_name = String::Handle(Z);
-    do {
-      ASSERT((CurrentToken() == Token::kLPAREN) ||
-             (CurrentToken() == Token::kCOMMA));
-      ConsumeToken();
-      if (CurrentToken() == Token::kRPAREN) {
-        // Allow trailing comma.
-        break;
-      }
-      if (IsIdentifier() && (LookaheadToken(1) == Token::kCOLON)) {
-        named_argument_seen = true;
-        // The canonicalization of the arguments descriptor array built in
-        // the code generator requires that the names are symbols, i.e.
-        // canonicalized strings.
-        ASSERT(CurrentLiteral()->IsSymbol());
-        for (int i = 0; i < names.Length(); i++) {
-          arg_name ^= names.At(i);
-          if (CurrentLiteral()->Equals(arg_name)) {
-            ReportError("duplicate named argument");
-          }
-        }
-        names.Add(*CurrentLiteral(), Heap::kOld);
-        ConsumeToken();  // ident.
-        ConsumeToken();  // colon.
-      } else if (named_argument_seen) {
-        ReportError("named argument expected");
-      }
-      arguments->Add(ParseExpr(require_const, kConsumeCascades));
-    } while (CurrentToken() == Token::kCOMMA);
-  } else {
-    ConsumeToken();
-  }
-  ExpectToken(Token::kRPAREN);
-  SetAllowFunctionLiterals(saved_mode);
-  if (named_argument_seen) {
-    arguments->set_names(Array::Handle(Z, Array::MakeFixedLength(names)));
-  }
-  return arguments;
-}
-
-AstNode* Parser::ParseStaticCall(const Class& cls,
-                                 const String& func_name,
-                                 TokenPosition ident_pos,
-                                 const TypeArguments& func_type_args,
-                                 const LibraryPrefix* prefix) {
-  TRACE_PARSER("ParseStaticCall");
-  const TokenPosition call_pos = TokenPos();
-  ASSERT(CurrentToken() == Token::kLPAREN);
-  ArgumentListNode* arguments =
-      ParseActualParameters(NULL, func_type_args, kAllowConst);
-  const int num_arguments = arguments->length();
-  const Function& func = Function::ZoneHandle(
-      Z, Resolver::ResolveStatic(cls, func_name, func_type_args.Length(),
-                                 num_arguments, arguments->names()));
-  if (func.IsNull()) {
-    // Check if there is a static field of the same name, it could be a closure
-    // and so we try and invoke the closure.
-    AstNode* closure = NULL;
-    const Field& field = Field::ZoneHandle(Z, cls.LookupStaticField(func_name));
-    Function& func = Function::ZoneHandle(Z);
-    if (field.IsNull()) {
-      // No field, check if we have an explicit getter function.
-      const String& getter_name =
-          String::ZoneHandle(Z, Field::LookupGetterSymbol(func_name));
-      if (!getter_name.IsNull()) {
-        const int kTypeArgsLen = 0;   // no type arguments.
-        const int kNumArguments = 0;  // no arguments.
-        func = Resolver::ResolveStatic(cls, getter_name, kTypeArgsLen,
-                                       kNumArguments, Object::empty_array());
-        if (!func.IsNull()) {
-          ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-          closure = new (Z)
-              StaticGetterNode(call_pos, NULL, Class::ZoneHandle(Z, cls.raw()),
-                               func_name, StaticGetterSetter::kStatic);
-          return BuildClosureCall(call_pos, closure, arguments);
-        }
-      }
-    } else {
-      closure = GenerateStaticFieldLookup(field, call_pos);
-      return BuildClosureCall(call_pos, closure, arguments);
-    }
-    // Could not resolve static method: throw a NoSuchMethodError.
-    return ThrowNoSuchMethodError(ident_pos, cls, func_name, arguments,
-                                  InvocationMirror::kStatic,
-                                  InvocationMirror::kMethod,
-                                  NULL,  // No existing function.
-                                  prefix);
-  } else if (cls.IsTopLevel() &&
-             (cls.library() == Library::InternalLibrary()) &&
-             (func.name() == Symbols::UnsafeCast().raw())) {
-    ASSERT(num_arguments == 1);
-    return arguments->NodeAt(0);
-  } else if (cls.IsTopLevel() && (cls.library() == Library::CoreLibrary()) &&
-             (func.name() == Symbols::Identical().raw()) &&
-             func_type_args.IsNull()) {
-    // This is the predefined toplevel function identical(a,b).
-    // Create a comparison node instead of a static call to the function.
-    ASSERT(num_arguments == 2);
-
-    // If both arguments are constant expressions of type string,
-    // evaluate and canonicalize them.
-    // This guarantees that identical("ab", "a"+"b") is true.
-    // An alternative way to guarantee this would be to introduce
-    // an AST node that canonicalizes a value.
-    AstNode* arg0 = arguments->NodeAt(0);
-    const Instance* val0 = arg0->EvalConstExpr();
-    if ((val0 != NULL) && (val0->IsString())) {
-      AstNode* arg1 = arguments->NodeAt(1);
-      const Instance* val1 = arg1->EvalConstExpr();
-      if ((val1 != NULL) && (val1->IsString())) {
-        arguments->SetNodeAt(
-            0, new (Z) LiteralNode(arg0->token_pos(),
-                                   EvaluateConstExpr(arg0->token_pos(), arg0)));
-        arguments->SetNodeAt(
-            1, new (Z) LiteralNode(arg1->token_pos(),
-                                   EvaluateConstExpr(arg1->token_pos(), arg1)));
-      }
-    }
-    return new (Z) ComparisonNode(ident_pos, Token::kEQ_STRICT,
-                                  arguments->NodeAt(0), arguments->NodeAt(1));
-  }
-  return new (Z)
-      StaticCallNode(ident_pos, func, arguments, StaticCallNode::kStatic);
-}
-
-AstNode* Parser::ParseInstanceCall(AstNode* receiver,
-                                   const String& func_name,
-                                   TokenPosition ident_pos,
-                                   const TypeArguments& func_type_args,
-                                   bool is_conditional) {
-  TRACE_PARSER("ParseInstanceCall");
-  CheckToken(Token::kLPAREN);
-  ArgumentListNode* arguments =
-      ParseActualParameters(NULL, func_type_args, kAllowConst);
-  return new (Z) InstanceCallNode(ident_pos, receiver, func_name, arguments,
-                                  is_conditional);
-}
-
-AstNode* Parser::ParseClosureCall(AstNode* closure,
-                                  const TypeArguments& func_type_args) {
-  TRACE_PARSER("ParseClosureCall");
-  const TokenPosition call_pos = TokenPos();
-  ASSERT(CurrentToken() == Token::kLPAREN);
-  ArgumentListNode* arguments =
-      ParseActualParameters(NULL, func_type_args, kAllowConst);
-  return BuildClosureCall(call_pos, closure, arguments);
-}
-
-AstNode* Parser::GenerateStaticFieldLookup(const Field& field,
-                                           TokenPosition ident_pos) {
-  // If the static field has an initializer, initialize the field at compile
-  // time, which is only possible if the field is const.
-  AstNode* initializing_getter = RunStaticFieldInitializer(field, ident_pos);
-  if (initializing_getter != NULL) {
-    // The field is not yet initialized and could not be initialized at compile
-    // time. The getter will initialize the field.
-    return initializing_getter;
-  }
-  // The field is initialized.
-  ASSERT(field.is_static());
-  const Class& field_owner = Class::ZoneHandle(Z, field.Owner());
-  const String& field_name = String::ZoneHandle(Z, field.name());
-  const String& getter_name =
-      String::Handle(Z, Field::GetterSymbol(field_name));
-  const Function& getter =
-      Function::Handle(Z, field_owner.LookupStaticFunction(getter_name));
-  // Never load field directly if there is a getter (deterministic AST).
-  if (getter.IsNull() || field.is_const()) {
-    return new (Z)
-        LoadStaticFieldNode(ident_pos, Field::ZoneHandle(Z, field.raw()));
-  } else {
-    ASSERT(getter.kind() == RawFunction::kImplicitStaticFinalGetter);
-    return new (Z)
-        StaticGetterNode(ident_pos,
-                         NULL,  // Receiver.
-                         field_owner, field_name, StaticGetterSetter::kStatic);
-  }
-}
-
-// Reference to 'field_name' with explicit class as primary.
-AstNode* Parser::GenerateStaticFieldAccess(const Class& cls,
-                                           const String& field_name,
-                                           TokenPosition ident_pos) {
-  AstNode* access = NULL;
-  const Field& field = Field::ZoneHandle(Z, cls.LookupStaticField(field_name));
-  Function& func = Function::ZoneHandle(Z);
-  if (field.IsNull()) {
-    // No field, check if we have an explicit getter function.
-    func = cls.LookupGetterFunction(field_name);
-    if (func.IsNull() || func.IsDynamicFunction()) {
-      // We might be referring to an implicit closure, check to see if
-      // there is a function of the same name.
-      func = cls.LookupStaticFunction(field_name);
-      if (!func.IsNull()) {
-        access = CreateImplicitClosureNode(func, ident_pos, NULL);
-      } else {
-        // No function to closurize found found.
-        // This field access may turn out to be a call to the setter.
-        // Create a getter call, which may later be turned into
-        // a setter call, or else the backend will generate
-        // a throw NoSuchMethodError().
-        access = new (Z)
-            StaticGetterNode(ident_pos, NULL, Class::ZoneHandle(Z, cls.raw()),
-                             field_name, StaticGetterSetter::kStatic);
-      }
-    } else {
-      ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-      access = new (Z)
-          StaticGetterNode(ident_pos, NULL, Class::ZoneHandle(Z, cls.raw()),
-                           field_name, StaticGetterSetter::kStatic);
-    }
-  } else {
-    access = GenerateStaticFieldLookup(field, ident_pos);
-  }
-  return access;
-}
-
-AstNode* Parser::LoadFieldIfUnresolved(AstNode* node) {
-  if (!node->IsPrimaryNode()) {
-    return node;
-  }
-  PrimaryNode* primary = node->AsPrimaryNode();
-  if (primary->primary().IsString()) {
-    if (primary->IsSuper()) {
-      return primary;
-    }
-    // In a static method, evaluation of an unresolved identifier causes a
-    // NoSuchMethodError to be thrown.
-    // In an instance method, we convert this into a getter call
-    // for a field (which may be defined in a subclass.)
-    const String& name =
-        String::Cast(Object::ZoneHandle(primary->primary().raw()));
-    if (primary->is_deferred_reference()) {
-      StaticGetterNode* getter = new (Z)
-          StaticGetterNode(primary->token_pos(),
-                           NULL,  // No receiver.
-                           Class::ZoneHandle(Z, library_.toplevel_class()),
-                           name, StaticGetterSetter::kStatic);
-      getter->set_is_deferred(primary->is_deferred_reference());
-      return getter;
-    } else if (current_function().is_static() ||
-               current_function().IsInFactoryScope()) {
-      StaticGetterNode* getter =
-          new (Z) StaticGetterNode(primary->token_pos(),
-                                   NULL,  // No receiver.
-                                   Class::ZoneHandle(Z, current_class().raw()),
-                                   name, StaticGetterSetter::kStatic);
-      getter->set_is_deferred(primary->is_deferred_reference());
-      return getter;
-    } else {
-      AstNode* receiver = LoadReceiver(primary->token_pos());
-      return CallGetter(node->token_pos(), receiver, name);
-    }
-  }
-  return primary;
-}
-
-AstNode* Parser::LoadClosure(PrimaryNode* primary) {
-  ASSERT(primary->primary().IsFunction());
-  const Function& func =
-      Function::Cast(Object::ZoneHandle(primary->primary().raw()));
-  const String& funcname = String::ZoneHandle(Z, func.name());
-  if (func.is_static()) {
-    // Static function access.
-    ClosureNode* closure =
-        CreateImplicitClosureNode(func, primary->token_pos(), NULL);
-    closure->set_is_deferred(primary->is_deferred_reference());
-    return closure;
-  } else {
-    // Instance function access.
-    if (current_function().is_static() ||
-        current_function().IsInFactoryScope()) {
-      ReportError(primary->token_pos(),
-                  "cannot access instance method '%s' from static method",
-                  funcname.ToCString());
-    }
-    AstNode* receiver = LoadReceiver(primary->token_pos());
-    return CallGetter(primary->token_pos(), receiver, funcname);
-  }
-  UNREACHABLE();
-  return NULL;
-}
-
-AstNode* Parser::LoadTypeParameter(PrimaryNode* primary) {
-  const TokenPosition primary_pos = primary->token_pos();
-  TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z);
-  type_parameter = TypeParameter::Cast(primary->primary()).raw();
-  if (type_parameter.IsClassTypeParameter()) {
-    if (ParsingStaticMember()) {
-      const String& name = String::Handle(Z, type_parameter.name());
-      ReportError(primary_pos,
-                  "cannot access type parameter '%s' "
-                  "from static function",
-                  name.ToCString());
-    }
-    if (FunctionLevel() > 0) {
-      // Make sure that the class instantiator is captured.
-      CaptureInstantiator();
-    }
-    type_parameter ^= CanonicalizeType(type_parameter);
-  } else {
-    ASSERT(type_parameter.IsFunctionTypeParameter());
-    if (!FLAG_reify_generic_functions) {
-      Type& type = Type::ZoneHandle(Z, Type::DynamicType());
-      return new (Z) TypeNode(primary_pos, type);
-    }
-    if ((FunctionLevel() > 0) && innermost_function().HasGenericParent()) {
-      // Make sure that the parent function type arguments are captured.
-      CaptureFunctionTypeArguments();
-    }
-  }
-  ASSERT(type_parameter.IsFinalized());
-  ASSERT(!type_parameter.IsMalformed());
-  return new (Z) TypeNode(primary_pos, type_parameter);
-}
-
-AstNode* Parser::ParseSelectors(AstNode* primary, bool is_cascade) {
-  AstNode* left = primary;
-  while (true) {
-    AstNode* selector = NULL;
-    if ((CurrentToken() == Token::kPERIOD) ||
-        (CurrentToken() == Token::kQM_PERIOD)) {
-      // Unconditional or conditional property extraction or method call.
-      bool is_conditional = CurrentToken() == Token::kQM_PERIOD;
-      ConsumeToken();
-      if (left->IsPrimaryNode()) {
-        PrimaryNode* primary_node = left->AsPrimaryNode();
-        if (primary_node->primary().IsFunction()) {
-          left = LoadClosure(primary_node);
-        } else if (primary_node->primary().IsTypeParameter()) {
-          left = LoadTypeParameter(primary_node);
-        } else {
-          // Super field access handled in ParseSuperFieldAccess(),
-          // super calls handled in ParseSuperCall().
-          ASSERT(!primary_node->IsSuper());
-          left = LoadFieldIfUnresolved(left);
-        }
-      }
-      const TokenPosition ident_pos = TokenPos();
-      String* ident = ExpectIdentifier("identifier expected");
-      if (IsArgumentPart()) {
-        // Identifier followed by optional type arguments and opening paren:
-        // method call.
-        TypeArguments& func_type_args = TypeArguments::ZoneHandle(Z);
-        if (CurrentToken() == Token::kLT) {
-          // Type arguments.
-          func_type_args = ParseTypeArguments(ClassFinalizer::kCanonicalize);
-          if (FLAG_reify_generic_functions) {
-            if (!func_type_args.IsNull() && !func_type_args.IsInstantiated() &&
-                (FunctionLevel() > 0)) {
-              // Make sure that the instantiators are captured.
-              CaptureAllInstantiators();
-            }
-          } else {
-            func_type_args = TypeArguments::null();
-          }
-        }
-        PrimaryNode* primary_node = left->AsPrimaryNode();
-        if ((primary_node != NULL) && primary_node->primary().IsClass()) {
-          // Static method call prefixed with class name.
-          const Class& cls = Class::Cast(primary_node->primary());
-          selector = ParseStaticCall(cls, *ident, ident_pos, func_type_args,
-                                     primary_node->prefix());
-        } else {
-          if ((primary_node != NULL) && primary_node->is_deferred_reference()) {
-            const Class& cls = Class::Handle(library_.toplevel_class());
-            selector = ParseStaticCall(cls, *ident, ident_pos, func_type_args,
-                                       primary_node->prefix());
-          } else {
-            selector = ParseInstanceCall(left, *ident, ident_pos,
-                                         func_type_args, is_conditional);
-          }
-        }
-      } else {
-        // Field access.
-        Class& cls = Class::Handle(Z);
-        bool is_deferred = false;
-        if (left->IsPrimaryNode()) {
-          PrimaryNode* primary_node = left->AsPrimaryNode();
-          is_deferred = primary_node->is_deferred_reference();
-          if (primary_node->primary().IsClass()) {
-            // If the primary node referred to a class we are loading a
-            // qualified static field.
-            cls ^= primary_node->primary().raw();
-          } else if (is_deferred) {
-            cls = library_.toplevel_class();
-          }
-        }
-        if (cls.IsNull()) {
-          // Instance field access.
-          selector = new (Z)
-              InstanceGetterNode(ident_pos, left, *ident, is_conditional);
-        } else {
-          // Static field access.
-          selector = GenerateStaticFieldAccess(cls, *ident, ident_pos);
-          ASSERT(selector != NULL);
-          if (selector->IsLoadStaticFieldNode()) {
-            selector->AsLoadStaticFieldNode()->set_is_deferred(is_deferred);
-          } else if (selector->IsStaticGetterNode()) {
-            selector->AsStaticGetterNode()->set_is_deferred(is_deferred);
-          }
-        }
-      }
-    } else if (CurrentToken() == Token::kLBRACK) {
-      // Super index operator handled in ParseSuperOperator().
-      ASSERT(!left->IsPrimaryNode() || !left->AsPrimaryNode()->IsSuper());
-
-      const TokenPosition bracket_pos = TokenPos();
-      ConsumeToken();
-      left = LoadFieldIfUnresolved(left);
-      const bool saved_mode = SetAllowFunctionLiterals(true);
-      AstNode* index = ParseExpr(kAllowConst, kConsumeCascades);
-      SetAllowFunctionLiterals(saved_mode);
-      ExpectToken(Token::kRBRACK);
-      AstNode* array = left;
-      if (left->IsPrimaryNode()) {
-        PrimaryNode* primary_node = left->AsPrimaryNode();
-        const TokenPosition primary_pos = primary_node->token_pos();
-        if (primary_node->primary().IsFunction()) {
-          array = LoadClosure(primary_node);
-        } else if (primary_node->primary().IsClass()) {
-          const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(
-              Z, Type::New(type_class, TypeArguments::Handle(Z), primary_pos,
-                           Heap::kOld));
-          type ^= CanonicalizeType(type);
-          // Type may be malbounded, but not malformed.
-          ASSERT(!type.IsMalformed());
-          array = new (Z) TypeNode(primary_pos, type,
-                                   primary_node->is_deferred_reference());
-        } else if (primary_node->primary().IsTypeParameter()) {
-          array = LoadTypeParameter(primary_node);
-        } else {
-          UNREACHABLE();  // Internal parser error.
-        }
-      }
-      selector = new (Z)
-          LoadIndexedNode(bracket_pos, array, index, Class::ZoneHandle(Z));
-    } else if (IsArgumentPart()) {
-      TypeArguments& func_type_args = TypeArguments::ZoneHandle(Z);
-      if (CurrentToken() == Token::kLT) {
-        // Type arguments.
-        func_type_args = ParseTypeArguments(ClassFinalizer::kCanonicalize);
-        if (FLAG_reify_generic_functions) {
-          if (!func_type_args.IsNull() && !func_type_args.IsInstantiated() &&
-              (FunctionLevel() > 0)) {
-            // Make sure that the instantiators are captured.
-            CaptureAllInstantiators();
-          }
-        } else {
-          func_type_args = TypeArguments::null();
-        }
-      }
-      if (left->IsPrimaryNode()) {
-        PrimaryNode* primary_node = left->AsPrimaryNode();
-        const TokenPosition primary_pos = primary_node->token_pos();
-        if (primary_node->primary().IsFunction()) {
-          const Function& func = Function::Cast(primary_node->primary());
-          const String& func_name = String::ZoneHandle(Z, func.name());
-          if (func.is_static()) {
-            // Parse static function call.
-            Class& cls = Class::Handle(Z, func.Owner());
-            selector =
-                ParseStaticCall(cls, func_name, primary_pos, func_type_args);
-          } else {
-            // Dynamic function call on implicit "this" parameter.
-            if (current_function().is_static()) {
-              ReportError(primary_pos,
-                          "cannot access instance method '%s' "
-                          "from static function",
-                          func_name.ToCString());
-            }
-            selector = ParseInstanceCall(LoadReceiver(primary_pos), func_name,
-                                         primary_pos, func_type_args,
-                                         false /* is_conditional */);
-          }
-        } else if (primary_node->primary().IsString()) {
-          // Primary is an unresolved name.
-          if (primary_node->IsSuper()) {
-            ReportError(primary_pos, "illegal use of super");
-          }
-          const String& name =
-              String::Cast(Object::ZoneHandle(primary_node->primary().raw()));
-          if (primary_node->is_deferred_reference()) {
-            // The static call will be converted to throwing a NSM error.
-            const Class& cls = Class::Handle(library_.toplevel_class());
-            selector = ParseStaticCall(cls, name, primary_pos, func_type_args,
-                                       primary_node->prefix());
-          } else if (current_function().is_static()) {
-            // The static call will be converted to throwing a NSM error.
-            selector = ParseStaticCall(current_class(), name, primary_pos,
-                                       func_type_args);
-          } else {
-            // Treat as call to unresolved (instance) method.
-            selector =
-                ParseInstanceCall(LoadReceiver(primary_pos), name, primary_pos,
-                                  func_type_args, false /* is_conditional */);
-          }
-        } else if (primary_node->primary().IsTypeParameter()) {
-          // The parsed type arguments (if any) are not parameterizing the type
-          // parameter (this would be a compile-time error), but are passed as
-          // the type arguments of a generic closure call with the type
-          // parameter as the closure. This will result in a NSM call, whether
-          // the call is generic or not.
-          selector = LoadTypeParameter(primary_node);
-          selector = ParseClosureCall(selector, func_type_args);
-        } else if (primary_node->primary().IsClass()) {
-          // The parsed type arguments (if any) are not parameterizing the
-          // class, but are passed as the type arguments of a generic closure
-          // call with the class as the closure. This will result in a NSM call,
-          // whether the call is generic or not.
-          const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(
-              Z, Type::New(type_class, Object::null_type_arguments(),
-                           primary_pos, Heap::kOld));
-          type ^= CanonicalizeType(type);
-          // Type may be malbounded, but not malformed.
-          ASSERT(!type.IsMalformed());
-          selector = new (Z) TypeNode(primary_pos, type,
-                                      primary_node->is_deferred_reference());
-          selector = ParseClosureCall(selector, func_type_args);
-        } else {
-          UNREACHABLE();  // Internal parser error.
-        }
-      } else {
-        // Left is not a primary node; this must be a closure call.
-        AstNode* closure = left;
-        selector = ParseClosureCall(closure, func_type_args);
-      }
-    } else {
-      // No (more) selectors to parse.
-      left = LoadFieldIfUnresolved(left);
-      if (left->IsPrimaryNode()) {
-        PrimaryNode* primary_node = left->AsPrimaryNode();
-        const TokenPosition primary_pos = primary->token_pos();
-        if (primary_node->primary().IsFunction()) {
-          // Treat as implicit closure.
-          left = LoadClosure(primary_node);
-        } else if (primary_node->primary().IsClass()) {
-          const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(
-              Z, Type::New(type_class, TypeArguments::Handle(Z), primary_pos,
-                           Heap::kOld));
-          type = CanonicalizeType(type);
-          // Type may be malbounded, but not malformed.
-          ASSERT(!type.IsMalformed());
-          left = new (Z) TypeNode(primary_pos, type,
-                                  primary_node->is_deferred_reference());
-        } else if (primary_node->primary().IsTypeParameter()) {
-          left = LoadTypeParameter(primary_node);
-        } else if (primary_node->IsSuper()) {
-          // Return "super" to handle unary super operator calls,
-          // or to report illegal use of "super" otherwise.
-          left = primary_node;
-        } else {
-          UNREACHABLE();  // Internal parser error.
-        }
-      }
-      // Done parsing selectors.
-      return left;
-    }
-    ASSERT(selector != NULL);
-    left = selector;
-  }
-}
-
-AstNode* Parser::ParsePostfixExpr() {
-  TRACE_PARSER("ParsePostfixExpr");
-  String* expr_ident =
-      Token::IsIdentifier(CurrentToken()) ? CurrentLiteral() : NULL;
-  const TokenPosition expr_pos = TokenPos();
-  AstNode* expr = ParsePrimary();
-  expr = ParseSelectors(expr, false);
-  if (IsIncrementOperator(CurrentToken())) {
-    TRACE_PARSER("IncrementOperator");
-    if (!IsLegalAssignableSyntax(expr, TokenPos())) {
-      ReportError(expr_pos, "expression is not assignable");
-    }
-    Token::Kind incr_op = CurrentToken();
-    const TokenPosition op_pos = TokenPos();
-    ConsumeToken();
-    // Not prefix.
-    LetNode* let_expr = PrepareCompoundAssignmentNodes(&expr);
-    LocalVariable* temp = let_expr->AddInitializer(expr);
-    Token::Kind binary_op =
-        (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new (Z) BinaryOpNode(
-        op_pos, binary_op, new (Z) LoadLocalNode(op_pos, temp),
-        new (Z) LiteralNode(op_pos, Smi::ZoneHandle(Z, Smi::New(1))));
-    AstNode* store =
-        CreateAssignmentNode(expr, add, expr_ident, expr_pos, true);
-    ASSERT(store != NULL);
-    // The result is a pair of the (side effects of the) store followed by
-    // the (value of the) initial value temp variable load.
-    let_expr->AddNode(store);
-    let_expr->AddNode(new (Z) LoadLocalNode(op_pos, temp));
-    return let_expr;
-  }
-  return expr;
-}
-
-// Resolve the type parameters that may appear in the given signature from the
-// signature function and current class.
-// Unresolved type classes get resolved later by the class finalizer.
-void Parser::ResolveSignatureTypeParameters(const Function& signature) {
-  const Function& saved_innermost_function =
-      Function::Handle(Z, innermost_function().raw());
-  innermost_function_ = signature.raw();
-  AbstractType& type = AbstractType::Handle();
-  // Resolve upper bounds of function type parameters.
-  const intptr_t num_type_params = signature.NumTypeParameters();
-  if (num_type_params > 0) {
-    TypeParameter& type_param = TypeParameter::Handle();
-    const TypeArguments& type_params =
-        TypeArguments::Handle(signature.type_parameters());
-    for (intptr_t i = 0; i < num_type_params; i++) {
-      type_param ^= type_params.TypeAt(i);
-      type = type_param.bound();
-      ResolveTypeParameters(&type);
-      type_param.set_bound(type);
-    }
-  }
-  // Resolve result type.
-  type = signature.result_type();
-  ResolveTypeParameters(&type);
-  signature.set_result_type(type);  // Update type without scope change.
-  // Resolve formal parameter types.
-  const intptr_t num_parameters = signature.NumParameters();
-  for (intptr_t i = 0; i < num_parameters; i++) {
-    type = signature.ParameterTypeAt(i);
-    ResolveTypeParameters(&type);
-    signature.SetParameterTypeAt(i, type);
-  }
-  innermost_function_ = saved_innermost_function.raw();
-}
-
-// Resolve the type parameters that may appear in the given type and in its type
-// arguments from the current function and current class.
-// Unresolved type classes get resolved later by the class finalizer.
-void Parser::ResolveTypeParameters(AbstractType* type) {
-  ASSERT(type != NULL);
-  if (type->IsResolved()) {
-    // Some types are resolved by definition, such as a TypeParameter.
-    return;
-  }
-  // Resolve type class.
-  if (!type->HasResolvedTypeClass()) {
-    const UnresolvedClass& unresolved_class =
-        UnresolvedClass::Handle(Z, type->unresolved_class());
-    const String& unresolved_class_name =
-        String::Handle(Z, unresolved_class.ident());
-    if (unresolved_class.library_or_library_prefix() == Object::null()) {
-      // First check if the type is a function type parameter.
-      if (InGenericFunctionScope()) {
-        intptr_t type_param_func_level = FunctionLevel();
-        TypeParameter& type_parameter = TypeParameter::ZoneHandle(
-            Z, innermost_function().LookupTypeParameter(
-                   unresolved_class_name, &type_param_func_level));
-        if (!type_parameter.IsNull()) {
-          // A type parameter cannot be parameterized, so make the type
-          // malformed if type arguments have previously been parsed.
-          if (type->arguments() != TypeArguments::null()) {
-            *type = ClassFinalizer::NewFinalizedMalformedType(
-                Error::Handle(Z),  // No previous error.
-                script_, type_parameter.token_pos(),
-                "type parameter '%s' cannot be parameterized",
-                String::Handle(Z, type_parameter.name()).ToCString());
-            return;
-          }
-          if (FLAG_reify_generic_functions) {
-            ASSERT(!type_parameter.IsMalformed());
-            *type = type_parameter.raw();
-          } else {
-            *type = Type::DynamicType();
-          }
-          return;
-        }
-      }
-      // Then check if the type is a class type parameter.
-      const TypeParameter& type_parameter = TypeParameter::Handle(
-          Z, current_class().LookupTypeParameter(unresolved_class_name));
-      if (!type_parameter.IsNull()) {
-        // A type parameter is considered to be a malformed type when
-        // referenced by a static member.
-        if (ParsingStaticMember()) {
-          *type = ClassFinalizer::NewFinalizedMalformedType(
-              Error::Handle(Z),  // No previous error.
-              script_, type->token_pos(),
-              "type parameter '%s' cannot be referenced "
-              "from static member",
-              String::Handle(Z, type_parameter.name()).ToCString());
-          return;
-        }
-        // A type parameter cannot be parameterized, so make the type
-        // malformed if type arguments have previously been parsed.
-        if (type->arguments() != TypeArguments::null()) {
-          *type = ClassFinalizer::NewFinalizedMalformedType(
-              Error::Handle(Z),  // No previous error.
-              script_, type_parameter.token_pos(),
-              "type parameter '%s' cannot be parameterized",
-              String::Handle(Z, type_parameter.name()).ToCString());
-          return;
-        }
-        *type = type_parameter.raw();
-        return;
-      }
-    }
-  }
-  // Resolve type arguments, if any.
-  if (type->arguments() != TypeArguments::null()) {
-    const TypeArguments& arguments =
-        TypeArguments::Handle(Z, type->arguments());
-    // Already resolved if canonical.
-    if (!arguments.IsCanonical()) {
-      const intptr_t num_arguments = arguments.Length();
-      AbstractType& type_argument = AbstractType::Handle(Z);
-      for (intptr_t i = 0; i < num_arguments; i++) {
-        type_argument = arguments.TypeAt(i);
-        ResolveTypeParameters(&type_argument);
-        arguments.SetTypeAt(i, type_argument);
-      }
-    }
-  }
-  if (type->IsFunctionType()) {
-    const Function& signature =
-        Function::Handle(Z, Type::Cast(*type).signature());
-    Type& signature_type = Type::Handle(Z, signature.SignatureType());
-    if (signature_type.raw() != type->raw()) {
-      ResolveTypeParameters(&signature_type);
-    } else {
-      ResolveSignatureTypeParameters(signature);
-    }
-  }
-}
-
-RawAbstractType* Parser::CanonicalizeType(const AbstractType& type) {
-  // If the current class is the result of a mixin application, we must
-  // use the class scope of the class from which the function originates.
-  if (current_class().IsMixinApplication()) {
-    return ClassFinalizer::FinalizeType(
-        Class::Handle(Z, parsed_function()->function().origin()), type);
-  }
-  return ClassFinalizer::FinalizeType(current_class(), type);
-}
-
-LocalVariable* Parser::LookupLocalScope(const String& ident) {
-  if (current_block_ == NULL) {
-    return NULL;
-  }
-  // A found name is treated as accessed and possibly marked as captured.
-  const bool kTestOnly = false;
-  return current_block_->scope->LookupVariable(ident, kTestOnly);
-}
-
-void Parser::CheckInstanceFieldAccess(TokenPosition field_pos,
-                                      const String& field_name) {
-  // Fields are not accessible from a static function, except from a
-  // constructor, which is considered as non-static by the compiler.
-  if (current_function().is_static()) {
-    ReportError(field_pos,
-                "cannot access instance field '%s' from a static function",
-                field_name.ToCString());
-  }
-}
-
-bool Parser::ParsingStaticMember() const {
-  if (is_top_level_) {
-    return (current_member_ != NULL) && current_member_->has_static &&
-           !current_member_->has_factory;
-  }
-  ASSERT(!current_function().IsNull());
-  return current_function().is_static() &&
-         !current_function().IsInFactoryScope();
-}
-
-const AbstractType* Parser::ReceiverType(const Class& cls) {
-  ASSERT(!cls.IsNull());
-  ASSERT(!cls.IsTypedefClass());
-  // Note that if cls is _Closure, the returned type will be _Closure,
-  // and not the signature type.
-  Type& type = Type::ZoneHandle(Z, cls.CanonicalType());
-  if (!type.IsNull()) {
-    return &type;
-  }
-  type = Type::New(cls, TypeArguments::Handle(Z, cls.type_parameters()),
-                   cls.token_pos(), Heap::kOld);
-  if (cls.is_type_finalized()) {
-    type ^= ClassFinalizer::FinalizeType(cls, type);
-    // Note that the receiver type may now be a malbounded type.
-    cls.SetCanonicalType(type);
-  }
-  return &type;
-}
-
-bool Parser::IsInstantiatorRequired() const {
-  ASSERT(!current_function().IsNull());
-  if (current_function().is_static() &&
-      !current_function().IsInFactoryScope()) {
-    return false;
-  }
-  return current_class().IsGeneric();
-}
-
-bool Parser::InGenericFunctionScope() const {
-  if (!innermost_function().IsNull()) {
-    // With one more free tag bit in Function, we could cache this information.
-    if (innermost_function().IsGeneric() ||
-        innermost_function().HasGenericParent()) {
-      return true;
-    }
-  }
-  return false;
-}
-
-void Parser::InsertCachedConstantValue(const Script& script,
-                                       TokenPosition token_pos,
-                                       const Instance& value) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-  const intptr_t kInitialConstMapSize = 16;
-  ASSERT(!script.InVMHeap());
-  if (script.compile_time_constants() == Array::null()) {
-    const Array& array = Array::Handle(
-        HashTables::New<ConstantsMap>(kInitialConstMapSize, Heap::kOld));
-    script.set_compile_time_constants(array);
-  }
-  ConstantsMap constants(script.compile_time_constants());
-  constants.InsertNewOrGetValue(token_pos, value);
-  script.set_compile_time_constants(constants.Release());
-}
-
-void Parser::CacheConstantValue(TokenPosition token_pos,
-                                const Instance& value) {
-  if (current_function().kind() == RawFunction::kImplicitStaticFinalGetter) {
-    // Don't cache constants in initializer expressions. They get
-    // evaluated only once.
-    return;
-  }
-  InsertCachedConstantValue(script_, token_pos, value);
-  INC_STAT(thread_, num_cached_consts, 1);
-}
-
-bool Parser::GetCachedConstant(TokenPosition token_pos, Instance* value) {
-  bool is_present = false;
-  ASSERT(!script_.InVMHeap());
-  if (script_.compile_time_constants() == Array::null()) {
-    return false;
-  }
-  ConstantsMap constants(script_.compile_time_constants());
-  *value ^= constants.GetOrNull(token_pos, &is_present);
-  // Mutator compiler thread may add constants while background compiler
-  // is running, and thus change the value of 'compile_time_constants';
-  // do not assert that 'compile_time_constants' has not changed.
-  constants.Release();
-  if (FLAG_compiler_stats && is_present) {
-    thread_->compiler_stats()->num_const_cache_hits++;
-  }
-  return is_present;
-}
-
-RawInstance* Parser::TryCanonicalize(const Instance& instance,
-                                     TokenPosition token_pos) {
-  if (instance.IsNull()) {
-    return instance.raw();
-  }
-  const char* error_str = NULL;
-  Instance& result =
-      Instance::Handle(Z, instance.CheckAndCanonicalize(thread(), &error_str));
-  if (result.IsNull()) {
-    ReportError(token_pos, "Invalid const object %s", error_str);
-  }
-  return result.raw();
-}
-
-// If the field is already initialized, return no ast (NULL).
-// Otherwise, if the field is constant, initialize the field and return no ast.
-// If the field is not initialized and not const, return the ast for the getter.
-StaticGetterNode* Parser::RunStaticFieldInitializer(
-    const Field& field,
-    TokenPosition field_ref_pos) {
-  ASSERT(field.is_static());
-  const Class& field_owner = Class::ZoneHandle(Z, field.Owner());
-  const String& field_name = String::ZoneHandle(Z, field.name());
-  const String& getter_name =
-      String::Handle(Z, Field::GetterSymbol(field_name));
-  const Function& getter =
-      Function::Handle(Z, field_owner.LookupStaticFunction(getter_name));
-  const Instance& value = Instance::Handle(Z, field.StaticValue());
-  if (value.raw() == Object::transition_sentinel().raw()) {
-    if (field.is_const()) {
-      ReportError("circular dependency while initializing static field '%s'",
-                  field_name.ToCString());
-    } else {
-      // The implicit static getter will throw the exception if necessary.
-      return new (Z) StaticGetterNode(field_ref_pos, NULL, field_owner,
-                                      field_name, StaticGetterSetter::kStatic);
-    }
-  } else if (value.raw() == Object::sentinel().raw()) {
-    // This field has not been referenced yet and thus the value has
-    // not been evaluated. If the field is const, call the static getter method
-    // to evaluate the expression and canonicalize the value.
-    if (field.is_const()) {
-      NoReloadScope no_reload_scope(isolate(), thread());
-      NoOOBMessageScope no_msg_scope(thread());
-      field.SetStaticValue(Object::transition_sentinel());
-      const int kTypeArgsLen = 0;   // No type argument vector.
-      const int kNumArguments = 0;  // No arguments.
-      const Function& func = Function::Handle(
-          Z, Resolver::ResolveStatic(field_owner, getter_name, kTypeArgsLen,
-                                     kNumArguments, Object::empty_array()));
-      ASSERT(!func.IsNull());
-      ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter);
-      Object& const_value = Object::Handle(Z);
-      const_value = DartEntry::InvokeFunction(func, Object::empty_array());
-      if (const_value.IsError()) {
-        const Error& error = Error::Cast(const_value);
-        if (error.IsUnhandledException()) {
-          // An exception may not occur in every parse attempt, i.e., the
-          // generated AST is not deterministic. Therefore mark the function as
-          // not optimizable.
-          current_function().SetIsOptimizable(false);
-          field.SetStaticValue(Object::null_instance());
-          // It is a compile-time error if evaluation of a compile-time constant
-          // would raise an exception.
-          const String& field_name = String::Handle(Z, field.name());
-          ReportErrors(error, script_, field_ref_pos,
-                       "error initializing const field '%s'",
-                       field_name.ToCString());
-        } else {
-          ReportError(error);
-        }
-        UNREACHABLE();
-      }
-      ASSERT(const_value.IsNull() || const_value.IsInstance());
-      Instance& instance = Instance::Handle(Z);
-      instance ^= const_value.raw();
-      instance = TryCanonicalize(instance, field_ref_pos);
-      field.SetStaticValue(instance);
-      return NULL;  // Constant
-    } else {
-      return new (Z) StaticGetterNode(field_ref_pos, NULL, field_owner,
-                                      field_name, StaticGetterSetter::kStatic);
-    }
-  }
-  if (getter.IsNull() ||
-      (getter.kind() == RawFunction::kImplicitStaticFinalGetter)) {
-    return NULL;
-  }
-  ASSERT(getter.kind() == RawFunction::kImplicitGetter);
-  return new (Z) StaticGetterNode(field_ref_pos, NULL, field_owner, field_name,
-                                  StaticGetterSetter::kStatic);
-}
-
-RawObject* Parser::EvaluateConstConstructorCall(
-    const Class& type_class,
-    const TypeArguments& type_arguments,
-    const Function& constructor,
-    ArgumentListNode* arguments,
-    bool obfuscate_symbol_instances /* = true */) {
-  NoReloadScope no_reload_scope(isolate(), thread());
-  NoOOBMessageScope no_msg_scope(thread());
-  // Factories and constructors are not generic functions.
-  const int kTypeArgsLen = 0;
-  // Factories have one extra argument: the type arguments.
-  // Constructors have one extra arguments: receiver.
-  const int kNumExtraArgs = 1;
-  const int num_arguments = arguments->length() + kNumExtraArgs;
-  const Array& arg_values =
-      Array::Handle(Z, Array::New(num_arguments, allocation_space_));
-  Instance& instance = Instance::Handle(Z);
-  if (!constructor.IsFactory()) {
-    instance = Instance::New(type_class, allocation_space_);
-    if (!type_arguments.IsNull()) {
-      if (!type_arguments.IsInstantiated()) {
-        ReportError("type must be constant in const constructor");
-      }
-      instance.SetTypeArguments(
-          TypeArguments::Handle(Z, type_arguments.Canonicalize()));
-    }
-    arg_values.SetAt(0, instance);
-  } else {
-    // Prepend type_arguments to list of arguments to factory.
-    ASSERT(type_arguments.IsZoneHandle());
-    arg_values.SetAt(0, type_arguments);
-  }
-  for (int i = 0; i < arguments->length(); i++) {
-    AstNode* arg = arguments->NodeAt(i);
-    // Arguments have been evaluated to a literal value already.
-    ASSERT(arg->IsLiteralNode());
-    arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal());
-  }
-  const Array& args_descriptor =
-      Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, num_arguments,
-                                                arguments->names()));
-  const Object& result = Object::Handle(
-      Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor));
-  if (result.IsError()) {
-    // An exception may not occur in every parse attempt, i.e., the
-    // generated AST is not deterministic. Therefore mark the function as
-    // not optimizable.
-    current_function().SetIsOptimizable(false);
-    if (result.IsUnhandledException()) {
-      return result.raw();
-    } else {
-      thread()->long_jump_base()->Jump(1, Error::Cast(result));
-      UNREACHABLE();
-      return Object::null();
-    }
-  } else {
-    if (constructor.IsFactory()) {
-      // The factory method returns the allocated object.
-      instance ^= result.raw();
-    }
-    if (obfuscate_symbol_instances && I->obfuscate() &&
-        (instance.clazz() == I->object_store()->symbol_class())) {
-      Obfuscator::ObfuscateSymbolInstance(T, instance);
-    }
-    return TryCanonicalize(instance, TokenPos());
-  }
-}
-
-// Do a lookup for the identifier in the block scope and the class scope
-// return true if the identifier is found, false otherwise.
-// If node is non NULL return an AST node corresponding to the identifier.
-bool Parser::ResolveIdentInLocalScope(TokenPosition ident_pos,
-                                      const String& ident,
-                                      AstNode** node,
-                                      intptr_t* function_level) {
-  TRACE_PARSER("ResolveIdentInLocalScope");
-  // First try to find the identifier in the nested local scopes.
-  LocalVariable* local = LookupLocalScope(ident);
-  if (current_block_ != NULL) {
-    current_block_->scope->AddReferencedName(ident_pos, ident);
-  }
-  if (local != NULL) {
-    if (node != NULL) {
-      *node = new (Z) LoadLocalNode(ident_pos, local);
-    }
-    if (function_level != NULL) {
-      *function_level = local->owner()->function_level();
-    }
-    return true;
-  }
-
-  // If we are compiling top-level code, we don't need to look for
-  // the identifier in the current (top-level) class. The class scope
-  // of the top-level class is part of the library scope.
-  if (current_class().IsTopLevel()) {
-    if (node != NULL) {
-      *node = NULL;
-    }
-    return false;
-  }
-
-  // Try to find the identifier in the class scope of the current class.
-  // If the current class is the result of a mixin application, we must
-  // use the class scope of the class from which the function originates.
-  Class& cls = Class::Handle(Z);
-  if (!current_class().IsMixinApplication()) {
-    cls = current_class().raw();
-  } else {
-    cls = parsed_function()->function().origin();
-  }
-  Function& func = Function::Handle(Z, Function::null());
-  Field& field = Field::Handle(Z, Field::null());
-
-  // First check if a field exists.
-  field = cls.LookupField(ident);
-  if (!field.IsNull()) {
-    if (node != NULL) {
-      if (!field.is_static()) {
-        CheckInstanceFieldAccess(ident_pos, ident);
-        *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
-      } else {
-        *node = GenerateStaticFieldLookup(field, ident_pos);
-      }
-    }
-    if (function_level != NULL) {
-      *function_level = 0;
-    }
-    return true;
-  }
-
-  // Check if an instance/static function exists.
-  func = cls.LookupFunction(ident);
-  if (!func.IsNull() && (func.IsDynamicFunction() || func.IsStaticFunction() ||
-                         func.is_abstract())) {
-    if (node != NULL) {
-      *node =
-          new (Z) PrimaryNode(ident_pos, Function::ZoneHandle(Z, func.raw()));
-    }
-    return true;
-  }
-
-  // Now check if a getter/setter method exists for it in which case
-  // it is still a field.
-  // A setter without a corresponding getter binds to the non-existing
-  // getter. (The getter could be followed by an assignment which will
-  // convert it to a setter node. If there is no assignment the non-existing
-  // getter will throw a NoSuchMethodError.)
-  func = cls.LookupGetterFunction(ident);
-  if (func.IsNull()) {
-    func = cls.LookupSetterFunction(ident);
-  }
-  if (!func.IsNull()) {
-    if (func.IsDynamicFunction() || func.is_abstract()) {
-      if (node != NULL) {
-        CheckInstanceFieldAccess(ident_pos, ident);
-        ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
-        *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
-      }
-      return true;
-    } else if (func.IsStaticFunction()) {
-      if (node != NULL) {
-        *node = new (Z)
-            StaticGetterNode(ident_pos, NULL, Class::ZoneHandle(Z, cls.raw()),
-                             ident, StaticGetterSetter::kStatic);
-      }
-      return true;
-    }
-  }
-
-  // Nothing found in scope of current class.
-  if (node != NULL) {
-    *node = NULL;
-  }
-  return false;
-}
-
-// Resolve an identifier by checking the global scope of the current
-// library. If not found in the current library, then look in the scopes
-// of all libraries that are imported without a library prefix.
-AstNode* Parser::ResolveIdentInCurrentLibraryScope(TokenPosition ident_pos,
-                                                   const String& ident) {
-  TRACE_PARSER("ResolveIdentInCurrentLibraryScope");
-  HANDLESCOPE(thread());
-  const Object& obj = Object::Handle(Z, library_.ResolveName(ident));
-  if (obj.IsClass()) {
-    const Class& cls = Class::Cast(obj);
-    return new (Z) PrimaryNode(ident_pos, Class::ZoneHandle(Z, cls.raw()));
-  } else if (obj.IsField()) {
-    const Field& field = Field::Cast(obj);
-    ASSERT(field.is_static());
-    AstNode* get_field = GenerateStaticFieldLookup(field, ident_pos);
-    if (get_field->IsStaticGetterNode()) {
-      get_field->AsStaticGetterNode()->set_owner(library_);
-    }
-    return get_field;
-  } else if (obj.IsFunction()) {
-    const Function& func = Function::Cast(obj);
-    ASSERT(func.is_static());
-    if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      StaticGetterNode* getter = new (Z) StaticGetterNode(
-          ident_pos,
-          /* receiver */ NULL, Class::ZoneHandle(Z, func.Owner()), ident,
-          StaticGetterSetter::kStatic);
-      getter->set_owner(library_);
-      return getter;
-    } else {
-      return new (Z)
-          PrimaryNode(ident_pos, Function::ZoneHandle(Z, func.raw()));
-    }
-  } else if (obj.IsLibraryPrefix()) {
-    const LibraryPrefix& prefix = LibraryPrefix::Cast(obj);
-    ReportError(ident_pos, "illegal use of library prefix '%s'",
-                String::Handle(prefix.name()).ToCString());
-  } else {
-    ASSERT(obj.IsNull());
-  }
-  // Lexically unresolved primary identifiers are referenced by their name.
-  return new (Z) PrimaryNode(ident_pos, ident);
-}
-
-// Do a lookup for the identifier in the scope of the specified
-// library prefix. This means trying to resolve it locally in all of the
-// libraries present in the library prefix.
-AstNode* Parser::ResolveIdentInPrefixScope(TokenPosition ident_pos,
-                                           const LibraryPrefix& prefix,
-                                           const String& ident) {
-  TRACE_PARSER("ResolveIdentInPrefixScope");
-  HANDLESCOPE(thread());
-  if (ident.CharAt(0) == Library::kPrivateIdentifierStart) {
-    // Private names are not exported by libraries. The name mangling
-    // of private names with a library-specific suffix usually ensures
-    // that _x in library A is not found when looked up from library B.
-    // In the pathological case where a library imports itself with
-    // a prefix, the name mangling would not help in hiding the private
-    // name, so we need to explicitly reject private names here.
-    return NULL;
-  }
-  Object& obj = Object::Handle(Z);
-  if (prefix.is_loaded() || FLAG_load_deferred_eagerly) {
-    obj = prefix.LookupObject(ident);
-  } else {
-    // Remember that this function depends on an import prefix of an
-    // unloaded deferred library. Note that parsed_function() can be
-    // NULL when parsing expressions outside the scope of a function.
-    if (parsed_function() != NULL) {
-      parsed_function()->AddDeferredPrefix(prefix);
-    }
-  }
-  const bool is_deferred = prefix.is_deferred_load();
-  if (obj.IsNull()) {
-    // Unresolved prefixed primary identifier.
-    return NULL;
-  } else if (obj.IsClass()) {
-    const Class& cls = Class::Cast(obj);
-    PrimaryNode* primary =
-        new (Z) PrimaryNode(ident_pos, Class::ZoneHandle(Z, cls.raw()));
-    if (is_deferred) {
-      primary->set_prefix(&prefix);
-    }
-    return primary;
-  } else if (obj.IsField()) {
-    const Field& field = Field::Cast(obj);
-    ASSERT(field.is_static());
-    AstNode* get_field = GenerateStaticFieldLookup(field, ident_pos);
-    ASSERT(get_field != NULL);
-    ASSERT(get_field->IsLoadStaticFieldNode() ||
-           get_field->IsStaticGetterNode());
-    if (get_field->IsLoadStaticFieldNode()) {
-      get_field->AsLoadStaticFieldNode()->set_is_deferred(is_deferred);
-    } else if (get_field->IsStaticGetterNode()) {
-      get_field->AsStaticGetterNode()->set_is_deferred(is_deferred);
-      get_field->AsStaticGetterNode()->set_owner(prefix);
-    }
-    return get_field;
-  } else if (obj.IsFunction()) {
-    const Function& func = Function::Cast(obj);
-    ASSERT(func.is_static());
-    if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      StaticGetterNode* getter = new (Z) StaticGetterNode(
-          ident_pos,
-          /* receiver */ NULL, Class::ZoneHandle(Z, func.Owner()), ident,
-          StaticGetterSetter::kStatic);
-      getter->set_is_deferred(is_deferred);
-      getter->set_owner(prefix);
-      return getter;
-    } else {
-      PrimaryNode* primary =
-          new (Z) PrimaryNode(ident_pos, Function::ZoneHandle(Z, func.raw()));
-      if (is_deferred) {
-        primary->set_prefix(&prefix);
-      }
-      return primary;
-    }
-  }
-  // All possible object types are handled above.
-  UNREACHABLE();
-  return NULL;
-}
-
-// Resolve identifier. Issue an error message if
-// the ident refers to a method and allow_closure_names is false.
-// If the name cannot be resolved, turn it into an instance field access
-// if we're compiling an instance method, or generate
-// throw NoSuchMethodError if we're compiling a static method.
-AstNode* Parser::ResolveIdent(TokenPosition ident_pos,
-                              const String& ident,
-                              bool allow_closure_names) {
-  TRACE_PARSER("ResolveIdent");
-  // First try to find the variable in the local scope (block scope or
-  // class scope).
-  AstNode* resolved = NULL;
-  intptr_t resolved_func_level = 0;
-  ResolveIdentInLocalScope(ident_pos, ident, &resolved, &resolved_func_level);
-  if (InGenericFunctionScope()) {
-    intptr_t type_param_func_level = FunctionLevel();
-    const TypeParameter& type_parameter =
-        TypeParameter::ZoneHandle(Z, innermost_function().LookupTypeParameter(
-                                         ident, &type_param_func_level));
-    if (!type_parameter.IsNull()) {
-      if ((resolved == NULL) || (resolved_func_level < type_param_func_level)) {
-        // The identifier is a function type parameter, possibly shadowing
-        // 'resolved'.
-        if (!FLAG_reify_generic_functions) {
-          Type& type = Type::ZoneHandle(Z, Type::DynamicType());
-          return new (Z) TypeNode(ident_pos, type);
-        }
-        ASSERT(type_parameter.IsFinalized());
-        ASSERT(!type_parameter.IsMalformed());
-        if ((FunctionLevel() > 0) && innermost_function().HasGenericParent()) {
-          // Make sure that the parent function type arguments are captured.
-          CaptureFunctionTypeArguments();
-        }
-        return new (Z) TypeNode(ident_pos, type_parameter);
-      }
-    }
-  }
-  if (resolved == NULL) {
-    // Check whether the identifier is a class type parameter.
-    if (!current_class().IsNull()) {
-      TypeParameter& type_parameter = TypeParameter::ZoneHandle(
-          Z, current_class().LookupTypeParameter(ident));
-      if (!type_parameter.IsNull()) {
-        if (ParsingStaticMember()) {
-          const String& name = String::Handle(Z, type_parameter.name());
-          ReportError(ident_pos,
-                      "cannot access type parameter '%s' "
-                      "from static function",
-                      name.ToCString());
-        }
-        type_parameter ^= CanonicalizeType(type_parameter);
-        ASSERT(!type_parameter.IsMalformed());
-        if (FunctionLevel() > 0) {
-          // Make sure that the class instantiator is captured.
-          CaptureInstantiator();
-        }
-        return new (Z) TypeNode(ident_pos, type_parameter);
-      }
-    }
-    // Not found in the local scope, and the name is not a type parameter.
-    // Try finding the variable in the library scope (current library
-    // and all libraries imported by it without a library prefix).
-    resolved = ResolveIdentInCurrentLibraryScope(ident_pos, ident);
-  }
-  if (resolved->IsPrimaryNode()) {
-    PrimaryNode* primary = resolved->AsPrimaryNode();
-    const TokenPosition primary_pos = primary->token_pos();
-    if (primary->primary().IsString()) {
-      // We got an unresolved name. If we are compiling a static
-      // method, evaluation of an unresolved identifier causes a
-      // NoSuchMethodError to be thrown. In an instance method, we convert
-      // the unresolved name to an instance field access, since a
-      // subclass might define a field with this name.
-      if (current_function().is_static()) {
-        resolved = ThrowNoSuchMethodError(ident_pos, current_class(), ident,
-                                          NULL,  // No arguments.
-                                          InvocationMirror::kStatic,
-                                          InvocationMirror::kField,
-                                          NULL);  // No existing function.
-      } else {
-        // Treat as call to unresolved instance field.
-        resolved = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
-      }
-    } else if (primary->primary().IsFunction()) {
-      if (allow_closure_names) {
-        resolved = LoadClosure(primary);
-      } else {
-        ReportError(ident_pos, "illegal reference to method '%s'",
-                    ident.ToCString());
-      }
-    } else if (primary->primary().IsClass()) {
-      const Class& type_class = Class::Cast(primary->primary());
-      AbstractType& type =
-          Type::ZoneHandle(Z, Type::New(type_class, TypeArguments::Handle(Z),
-                                        primary_pos, Heap::kOld));
-      type ^= CanonicalizeType(type);
-      // Type may be malbounded, but not malformed.
-      ASSERT(!type.IsMalformed());
-      resolved =
-          new (Z) TypeNode(primary_pos, type, primary->is_deferred_reference());
-    }
-  }
-  return resolved;
-}
-
-RawAbstractType* Parser::ParseType(
-    ClassFinalizer::FinalizationKind finalization,
-    bool allow_deferred_type,
-    bool consume_unresolved_prefix) {
-  LibraryPrefix& prefix = LibraryPrefix::Handle(Z);
-  return ParseType(finalization, allow_deferred_type, consume_unresolved_prefix,
-                   &prefix);
-}
-
-// Parses and returns a type or a function type.
-RawAbstractType* Parser::ParseTypeOrFunctionType(
-    bool allow_void,
-    ClassFinalizer::FinalizationKind finalization) {
-  TRACE_PARSER("ParseTypeOrFunctionType");
-  AbstractType& type = AbstractType::Handle(Z);
-  if (CurrentToken() == Token::kVOID) {
-    TokenPosition void_pos = TokenPos();
-    type = Type::VoidType();
-    ConsumeToken();
-    // 'void' is always allowed as result type of a function type.
-    if (!allow_void && !IsFunctionTypeSymbol()) {
-      ReportError(void_pos, "'void' not allowed here");
-    }
-  } else if (!IsFunctionTypeSymbol()) {
-    // Including 'Function' not followed by '(' or '<'.
-    // It is too early to resolve the type here, since it can
-    // refer to a not yet declared function type parameter.
-    type = ParseType(ClassFinalizer::kDoNotResolve);
-  }
-  while (IsFunctionTypeSymbol()) {
-    if (type.IsNull()) {
-      type = Type::DynamicType();
-    }
-    // 'type' is the result type of the function type.
-    type = ParseFunctionType(type, ClassFinalizer::kDoNotResolve);
-  }
-  // At this point, all type parameters have been parsed, resolve the type.
-  if (finalization == ClassFinalizer::kIgnore) {
-    return Type::DynamicType();
-  }
-  if (finalization >= ClassFinalizer::kResolveTypeParameters) {
-    ResolveTypeParameters(&type);
-    if (finalization >= ClassFinalizer::kCanonicalize) {
-      type ^= CanonicalizeType(type);
-    }
-  }
-  return type.raw();
-}
-
-// Parses and returns a function type.
-// If 'result_type' is not null, parsing of the result type is skipped.
-RawType* Parser::ParseFunctionType(
-    const AbstractType& result_type,
-    ClassFinalizer::FinalizationKind finalization) {
-  TRACE_PARSER("ParseFunctionType");
-  AbstractType& type = AbstractType::Handle(Z, result_type.raw());
-  if (type.IsNull()) {
-    if (CurrentToken() == Token::kVOID) {
-      ConsumeToken();
-      type = Type::VoidType();
-    } else if (IsFunctionTypeSymbol()) {
-      type = Type::DynamicType();
-    } else {
-      // Including 'Function' not followed by '(' or '<'.
-      // It is too early to resolve the type here, since it can
-      // refer to a not yet declared function type parameter.
-      type = ParseType(ClassFinalizer::kDoNotResolve);
-    }
-  }
-  if (!IsSymbol(Symbols::Function())) {
-    ReportError("'Function' expected");
-  }
-  do {
-    ConsumeToken();
-    const Function& signature_function = Function::Handle(
-        Z, Function::NewSignatureFunction(current_class(), innermost_function(),
-                                          TokenPosition::kNoSource));
-    innermost_function_ = signature_function.raw();
-    signature_function.set_result_type(type);
-    // The result type may refer to the signature function's type parameters,
-    // but was not parsed in the scope of the signature function. Adjust.
-    type.SetScopeFunction(signature_function);
-    // Parse optional type parameters.
-    if (CurrentToken() == Token::kLT) {
-      ParseTypeParameters(false);  // Not parameterizing class, but function.
-    }
-    ParamList params;
-    // We do not yet allow Function of any arity, so expect parameter list.
-    CheckToken(Token::kLPAREN, "formal parameter list expected");
-
-    // Add implicit closure object parameter. Do not specify a token position,
-    // since it would make no sense after function type canonicalization.
-    params.AddFinalParameter(TokenPosition::kNoSource,
-                             &Symbols::ClosureParameter(),
-                             &Object::dynamic_type());
-
-    const bool use_function_type_syntax = true;
-    const bool allow_explicit_default_values = false;
-    const bool evaluate_metadata = false;
-    ParseFormalParameterList(use_function_type_syntax,
-                             allow_explicit_default_values, evaluate_metadata,
-                             &params);
-    AddFormalParamsToFunction(&params, signature_function);
-    innermost_function_ = innermost_function_.parent_function();
-    if (innermost_function().IsNull() && current_class().IsTypedefClass() &&
-        !IsFunctionTypeSymbol()) {
-      // The last parsed signature function is the typedef signature function.
-      // Set it in the typedef class before building the signature type.
-      current_class().set_signature_function(signature_function);
-    }
-    type = signature_function.SignatureType();
-  } while (IsFunctionTypeSymbol());
-  // At this point, all type parameters have been parsed, resolve the type.
-  if (finalization == ClassFinalizer::kIgnore) {
-    return Type::DynamicType();
-  }
-  if (finalization >= ClassFinalizer::kResolveTypeParameters) {
-    ResolveTypeParameters(&type);
-    if (finalization >= ClassFinalizer::kCanonicalize) {
-      type ^= CanonicalizeType(type);
-    }
-  }
-  return Type::RawCast(type.raw());
-}
-
-// Parses type = [ident "."] ident ["<" type { "," type } ">"], then resolve and
-// finalize it according to the given type finalization mode.
-// Returns type and sets prefix.
-RawAbstractType* Parser::ParseType(
-    ClassFinalizer::FinalizationKind finalization,
-    bool allow_deferred_type,
-    bool consume_unresolved_prefix,
-    LibraryPrefix* prefix) {
-  TRACE_PARSER("ParseType");
-  CheckToken(Token::kIDENT, "type name expected");
-  TokenPosition ident_pos = TokenPos();
-  String& type_name = String::Handle(Z);
-
-  if (finalization == ClassFinalizer::kIgnore) {
-    if (!is_top_level_ && (current_block_ != NULL)) {
-      // Add the library prefix or type class name to the list of referenced
-      // names of this scope, even if the type is ignored.
-      current_block_->scope->AddReferencedName(TokenPos(), *CurrentLiteral());
-    }
-    SkipQualIdent();
-  } else {
-    *prefix = ParsePrefix();
-    if (!prefix->IsNull()) {
-      ExpectToken(Token::kPERIOD);
-    }
-    type_name = CurrentLiteral()->raw();
-    ConsumeToken();
-
-    // Check whether we have a malformed qualified type name if the caller
-    // requests to consume unresolved prefix names:
-    // If we didn't see a valid prefix but the identifier is followed by
-    // a period and another identifier, consume the qualified identifier
-    // and create a malformed type.
-    if (consume_unresolved_prefix && prefix->IsNull() &&
-        (CurrentToken() == Token::kPERIOD) &&
-        (Token::IsIdentifier(LookaheadToken(1)))) {
-      if (!is_top_level_ && (current_block_ != NULL)) {
-        // Add the unresolved prefix name to the list of referenced
-        // names of this scope.
-        current_block_->scope->AddReferencedName(TokenPos(), type_name);
-      }
-      ConsumeToken();  // Period token.
-      ASSERT(IsIdentifier());
-      String& qualified_name = String::Handle(Z, type_name.raw());
-      qualified_name =
-          String::Concat(qualified_name, Symbols::Dot(), allocation_space_);
-      qualified_name =
-          String::Concat(qualified_name, *CurrentLiteral(), allocation_space_);
-      ConsumeToken();
-      // The type is malformed. Skip over its type arguments.
-      ParseTypeArguments(ClassFinalizer::kIgnore);
-      return ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(Z),  // No previous error.
-          script_, ident_pos, "qualified name '%s' does not refer to a type",
-          qualified_name.ToCString());
-    }
-
-    // If parsing inside a local scope, check whether the type name
-    // is shadowed by a local declaration.
-    if (!is_top_level_ && (prefix->IsNull()) &&
-        ResolveIdentInLocalScope(ident_pos, type_name, NULL, NULL)) {
-      // The type is malformed. Skip over its type arguments.
-      ParseTypeArguments(ClassFinalizer::kIgnore);
-      return ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(Z),  // No previous error.
-          script_, ident_pos, "using '%s' in this context is invalid",
-          type_name.ToCString());
-    }
-    if ((!FLAG_load_deferred_eagerly || !allow_deferred_type) &&
-        !prefix->IsNull() && prefix->is_deferred_load()) {
-      // If deferred prefixes are allowed but it is not yet loaded,
-      // remember that this function depends on the prefix.
-      if (allow_deferred_type && !prefix->is_loaded()) {
-        if (parsed_function() != NULL) {
-          parsed_function()->AddDeferredPrefix(*prefix);
-        }
-      }
-      // If the deferred prefixes are not allowed, or if the prefix is not yet
-      // loaded when finalization is requested, return a malformed type.
-      // Otherwise, handle resolution below, as needed.
-      if (!allow_deferred_type ||
-          (!prefix->is_loaded() &&
-           (finalization > ClassFinalizer::kResolveTypeParameters))) {
-        ParseTypeArguments(ClassFinalizer::kIgnore);
-        return ClassFinalizer::NewFinalizedMalformedType(
-            Error::Handle(Z),  // No previous error.
-            script_, ident_pos,
-            !prefix->is_loaded() && allow_deferred_type
-                ? "deferred type '%s.%s' is not yet loaded"
-                : "using deferred type '%s.%s' is invalid",
-            String::Handle(Z, prefix->name()).ToCString(),
-            type_name.ToCString());
-      }
-    }
-  }
-  Object& type_class = Object::Handle(Z);
-  // Leave type_class as null if type finalization mode is kIgnore.
-  if (finalization != ClassFinalizer::kIgnore) {
-    type_class = UnresolvedClass::New(*prefix, type_name, ident_pos);
-  }
-  TypeArguments& type_arguments =
-      TypeArguments::Handle(Z, ParseTypeArguments(finalization));
-  if (finalization == ClassFinalizer::kIgnore) {
-    return Type::DynamicType();
-  }
-  AbstractType& type = AbstractType::Handle(
-      Z, Type::New(type_class, type_arguments, ident_pos, Heap::kOld));
-  if (finalization >= ClassFinalizer::kResolveTypeParameters) {
-    ResolveTypeParameters(&type);
-    if (finalization >= ClassFinalizer::kCanonicalize) {
-      type ^= CanonicalizeType(type);
-    }
-  }
-  return type.raw();
-}
-
-void Parser::CheckConstructorCallTypeArguments(
-    TokenPosition pos,
-    const Function& constructor,
-    const TypeArguments& type_arguments) {
-  if (!type_arguments.IsNull()) {
-    const Class& constructor_class = Class::Handle(Z, constructor.Owner());
-    ASSERT(!constructor_class.IsNull());
-    ASSERT(constructor_class.is_finalized());
-    ASSERT(type_arguments.IsCanonical());
-    // Do not report the expected vs. actual number of type arguments, because
-    // the type argument vector is flattened and raw types are allowed.
-    if (type_arguments.Length() != constructor_class.NumTypeArguments()) {
-      ReportError(pos, "wrong number of type arguments passed to constructor");
-    }
-  }
-}
-
-// Parse "[" [ expr { "," expr } ["," ] "]".
-// Note: if the list literal is empty and the brackets have no whitespace
-// between them, the scanner recognizes the opening and closing bracket
-// as one token of type Token::kINDEX.
-AstNode* Parser::ParseListLiteral(TokenPosition type_pos,
-                                  bool is_const,
-                                  const TypeArguments& type_arguments) {
-  TRACE_PARSER("ParseListLiteral");
-  ASSERT(type_pos.IsReal());
-  ASSERT(CurrentToken() == Token::kLBRACK || CurrentToken() == Token::kINDEX);
-  const TokenPosition literal_pos = TokenPos();
-
-  if (is_const) {
-    Instance& existing_const = Instance::ZoneHandle(Z);
-    if (GetCachedConstant(literal_pos, &existing_const)) {
-      SkipListLiteral();
-      return new (Z) LiteralNode(literal_pos, existing_const);
-    }
-  }
-
-  bool is_empty_literal = CurrentToken() == Token::kINDEX;
-  ConsumeToken();
-
-  AbstractType& element_type = Type::ZoneHandle(Z, Type::DynamicType());
-  TypeArguments& list_type_arguments =
-      TypeArguments::ZoneHandle(Z, type_arguments.raw());
-  // If no type argument vector is provided, leave it as null, which is
-  // equivalent to using dynamic as the type argument for the element type.
-  if (!list_type_arguments.IsNull()) {
-    ASSERT(list_type_arguments.Length() > 0);
-    // List literals take a single type argument.
-    if (list_type_arguments.Length() == 1) {
-      element_type = list_type_arguments.TypeAt(0);
-      ASSERT(!element_type.IsMalformed());   // Would be mapped to dynamic.
-      ASSERT(!element_type.IsMalbounded());  // No declared bound in List.
-      if (element_type.IsDynamicType()) {
-        list_type_arguments = TypeArguments::null();
-      } else if (is_const && !element_type.IsInstantiated()) {
-        ReportError(type_pos,
-                    "the type argument of a constant list literal cannot "
-                    "include a type variable");
-      }
-    } else {
-      if (I->error_on_bad_type()) {
-        ReportError(type_pos,
-                    "a list literal takes one type argument specifying "
-                    "the element type");
-      }
-      // Ignore type arguments.
-      list_type_arguments = TypeArguments::null();
-    }
-  }
-  ASSERT(list_type_arguments.IsNull() || (list_type_arguments.Length() == 1));
-  const Class& array_class = Class::Handle(Z, I->object_store()->array_class());
-  Type& type = Type::ZoneHandle(
-      Z, Type::New(array_class, list_type_arguments, type_pos, Heap::kOld));
-  type ^= CanonicalizeType(type);
-  GrowableArray<AstNode*> element_list;
-  // Parse the list elements. Note: there may be an optional extra
-  // comma after the last element.
-  if (!is_empty_literal) {
-    const bool saved_mode = SetAllowFunctionLiterals(true);
-    while (CurrentToken() != Token::kRBRACK) {
-      const TokenPosition element_pos = TokenPos();
-      AstNode* element = ParseExpr(is_const, kConsumeCascades);
-      if (I->type_checks() && !is_const && !element_type.IsDynamicType()) {
-        element = new (Z) AssignableNode(element_pos, element, element_type,
-                                         Symbols::ListLiteralElement());
-      }
-      element_list.Add(element);
-      if (CurrentToken() == Token::kCOMMA) {
-        ConsumeToken();
-      } else if (CurrentToken() != Token::kRBRACK) {
-        ReportError("comma or ']' expected");
-      }
-    }
-    ExpectToken(Token::kRBRACK);
-    SetAllowFunctionLiterals(saved_mode);
-  }
-
-  if (is_const) {
-    // Allocate and initialize the const list at compile time.
-    if ((element_list.length() == 0) && list_type_arguments.IsNull()) {
-      return new (Z) LiteralNode(literal_pos, Object::empty_array());
-    }
-    Array& const_list =
-        Array::ZoneHandle(Z, Array::New(element_list.length(), Heap::kOld));
-    const_list.SetTypeArguments(
-        TypeArguments::Handle(Z, list_type_arguments.Canonicalize()));
-    Error& bound_error = Error::Handle(Z);
-    for (int i = 0; i < element_list.length(); i++) {
-      AstNode* elem = element_list[i];
-      // Arguments have been evaluated to a literal value already.
-      ASSERT(elem->IsLiteralNode());
-      ASSERT(!is_top_level_);  // We cannot check unresolved types.
-      if (I->type_checks() && !element_type.IsDynamicType() &&
-          (!elem->AsLiteralNode()->literal().IsNull() &&
-           !elem->AsLiteralNode()->literal().IsInstanceOf(
-               element_type, Object::null_type_arguments(),
-               Object::null_type_arguments(), &bound_error))) {
-        // If the failure is due to a bound error, display it instead.
-        if (!bound_error.IsNull()) {
-          ReportError(bound_error);
-        } else {
-          ReportError(
-              elem->AsLiteralNode()->token_pos(),
-              "list literal element at index %d must be "
-              "a constant of type '%s'",
-              i, String::Handle(Z, element_type.UserVisibleName()).ToCString());
-        }
-      }
-      const_list.SetAt(i, elem->AsLiteralNode()->literal());
-    }
-    const_list.MakeImmutable();
-    const_list ^= TryCanonicalize(const_list, literal_pos);
-    CacheConstantValue(literal_pos, const_list);
-    return new (Z) LiteralNode(literal_pos, const_list);
-  } else {
-    // Factory call at runtime.
-    const Class& factory_class =
-        Class::Handle(Z, Library::LookupCoreClass(Symbols::List()));
-    ASSERT(!factory_class.IsNull());
-    const Function& factory_method = Function::ZoneHandle(
-        Z, factory_class.LookupFactory(
-               Library::PrivateCoreLibName(Symbols::ListLiteralFactory())));
-    ASSERT(!factory_method.IsNull());
-    if (!list_type_arguments.IsNull() &&
-        !list_type_arguments.IsInstantiated() && (FunctionLevel() > 0)) {
-      // Make sure that the instantiators are captured.
-      CaptureAllInstantiators();
-    }
-    TypeArguments& factory_type_args =
-        TypeArguments::ZoneHandle(Z, list_type_arguments.raw());
-    // If the factory class extends other parameterized classes, adjust the
-    // type argument vector.
-    if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 1)) {
-      ASSERT(factory_type_args.Length() == 1);
-      Type& factory_type = Type::Handle(
-          Z, Type::New(factory_class, factory_type_args, type_pos, Heap::kOld));
-      // It is not strictly necessary to canonicalize factory_type, but only its
-      // type argument vector.
-      factory_type ^= CanonicalizeType(factory_type);
-      factory_type_args = factory_type.arguments();
-      ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
-      ASSERT(factory_type_args.IsCanonical());
-    } else {
-      factory_type_args = factory_type_args.Canonicalize();
-    }
-    ArgumentListNode* factory_param = new (Z) ArgumentListNode(literal_pos);
-    if (element_list.length() == 0) {
-      LiteralNode* empty_array_literal =
-          new (Z) LiteralNode(TokenPos(), Object::empty_array());
-      factory_param->Add(empty_array_literal);
-    } else {
-      ArrayNode* list = new (Z) ArrayNode(TokenPos(), type, element_list);
-      factory_param->Add(list);
-    }
-    return CreateConstructorCallNode(literal_pos, factory_type_args,
-                                     factory_method, factory_param);
-  }
-}
-
-ConstructorCallNode* Parser::CreateConstructorCallNode(
-    TokenPosition token_pos,
-    const TypeArguments& type_arguments,
-    const Function& constructor,
-    ArgumentListNode* arguments) {
-  if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) {
-    EnsureExpressionTemp();
-  }
-  return new (Z)
-      ConstructorCallNode(token_pos, type_arguments, constructor, arguments);
-}
-
-static void AddKeyValuePair(GrowableArray<AstNode*>* pairs,
-                            bool is_const,
-                            AstNode* key,
-                            AstNode* value) {
-  if (is_const) {
-    ASSERT(key->IsLiteralNode());
-    const Instance& new_key = key->AsLiteralNode()->literal();
-    for (int i = 0; i < pairs->length(); i += 2) {
-      const Instance& key_i = (*pairs)[i]->AsLiteralNode()->literal();
-      // The keys of a compile time constant map are compile time
-      // constants, i.e. canonicalized values. Thus, we can compare
-      // raw pointers to check for equality.
-      if (new_key.raw() == key_i.raw()) {
-        // Duplicate key found. The new value replaces the previously
-        // defined value.
-        (*pairs)[i + 1] = value;
-        return;
-      }
-    }
-  }
-  pairs->Add(key);
-  pairs->Add(value);
-}
-
-AstNode* Parser::ParseMapLiteral(TokenPosition type_pos,
-                                 bool is_const,
-                                 const TypeArguments& type_arguments) {
-  TRACE_PARSER("ParseMapLiteral");
-  ASSERT(type_pos.IsReal());
-  ASSERT(CurrentToken() == Token::kLBRACE);
-  const TokenPosition literal_pos = TokenPos();
-
-  if (is_const) {
-    Instance& existing_const = Instance::ZoneHandle(Z);
-    if (GetCachedConstant(literal_pos, &existing_const)) {
-      SkipMapLiteral();
-      return new (Z) LiteralNode(literal_pos, existing_const);
-    }
-  }
-
-  ConsumeToken();  // Opening brace.
-  AbstractType& key_type = Type::ZoneHandle(Z, Type::DynamicType());
-  AbstractType& value_type = Type::ZoneHandle(Z, Type::DynamicType());
-  TypeArguments& map_type_arguments =
-      TypeArguments::ZoneHandle(Z, type_arguments.raw());
-  // If no type argument vector is provided, leave it as null, which is
-  // equivalent to using dynamic as the type argument for the both key and value
-  // types.
-  if (!map_type_arguments.IsNull()) {
-    ASSERT(map_type_arguments.Length() > 0);
-    // Map literals take two type arguments.
-    if (map_type_arguments.Length() == 2) {
-      key_type = map_type_arguments.TypeAt(0);
-      value_type = map_type_arguments.TypeAt(1);
-      // Malformed type arguments are mapped to dynamic.
-      ASSERT(!key_type.IsMalformed() && !value_type.IsMalformed());
-      // No declared bounds in Map.
-      ASSERT(!key_type.IsMalbounded() && !value_type.IsMalbounded());
-      if (key_type.IsDynamicType() && value_type.IsDynamicType()) {
-        map_type_arguments = TypeArguments::null();
-      } else if (is_const && !type_arguments.IsInstantiated()) {
-        ReportError(type_pos,
-                    "the type arguments of a constant map literal cannot "
-                    "include a type variable");
-      }
-    } else {
-      if (I->error_on_bad_type()) {
-        ReportError(type_pos,
-                    "a map literal takes two type arguments specifying "
-                    "the key type and the value type");
-      }
-      // Ignore type arguments.
-      map_type_arguments = TypeArguments::null();
-    }
-  }
-  ASSERT(map_type_arguments.IsNull() || (map_type_arguments.Length() == 2));
-  map_type_arguments ^= map_type_arguments.Canonicalize();
-
-  GrowableArray<AstNode*> kv_pairs_list;
-  // Parse the map entries. Note: there may be an optional extra
-  // comma after the last entry.
-  while (CurrentToken() != Token::kRBRACE) {
-    const bool saved_mode = SetAllowFunctionLiterals(true);
-    const TokenPosition key_pos = TokenPos();
-    AstNode* key = ParseExpr(is_const, kConsumeCascades);
-    if (I->type_checks() && !is_const && !key_type.IsDynamicType()) {
-      key = new (Z)
-          AssignableNode(key_pos, key, key_type, Symbols::ListLiteralElement());
-    }
-    if (is_const) {
-      ASSERT(key->IsLiteralNode());
-      const Instance& key_value = key->AsLiteralNode()->literal();
-      if (key_value.IsDouble()) {
-        ReportError(key_pos, "key value must not be of type double");
-      }
-      if (!key_value.IsInteger() && !key_value.IsString() &&
-          (key_value.clazz() != I->object_store()->symbol_class()) &&
-          ImplementsEqualOperator(Z, key_value)) {
-        ReportError(key_pos, "key value must not implement operator ==");
-      }
-    }
-    ExpectToken(Token::kCOLON);
-    const TokenPosition value_pos = TokenPos();
-    AstNode* value = ParseExpr(is_const, kConsumeCascades);
-    SetAllowFunctionLiterals(saved_mode);
-    if (I->type_checks() && !is_const && !value_type.IsDynamicType()) {
-      value = new (Z) AssignableNode(value_pos, value, value_type,
-                                     Symbols::ListLiteralElement());
-    }
-    AddKeyValuePair(&kv_pairs_list, is_const, key, value);
-
-    if (CurrentToken() == Token::kCOMMA) {
-      ConsumeToken();
-    } else if (CurrentToken() != Token::kRBRACE) {
-      ReportError("comma or '}' expected");
-    }
-  }
-  ASSERT(kv_pairs_list.length() % 2 == 0);
-  ExpectToken(Token::kRBRACE);
-
-  if (is_const) {
-    // Create the key-value pair array, canonicalize it and then create
-    // the immutable map object with it. This all happens at compile time.
-    // The resulting immutable map object is returned as a literal.
-
-    // First, create the canonicalized key-value pair array.
-    Array& key_value_array =
-        Array::ZoneHandle(Z, Array::New(kv_pairs_list.length(), Heap::kOld));
-    AbstractType& arg_type = Type::Handle(Z);
-    Error& bound_error = Error::Handle(Z);
-    for (int i = 0; i < kv_pairs_list.length(); i++) {
-      AstNode* arg = kv_pairs_list[i];
-      // Arguments have been evaluated to a literal value already.
-      ASSERT(arg->IsLiteralNode());
-      ASSERT(!is_top_level_);  // We cannot check unresolved types.
-      if (I->type_checks()) {
-        if ((i % 2) == 0) {
-          // Check key type.
-          arg_type = key_type.raw();
-        } else {
-          // Check value type.
-          arg_type = value_type.raw();
-        }
-        if (!arg_type.IsDynamicType() &&
-            (!arg->AsLiteralNode()->literal().IsNull() &&
-             !arg->AsLiteralNode()->literal().IsInstanceOf(
-                 arg_type, Object::null_type_arguments(),
-                 Object::null_type_arguments(), &bound_error))) {
-          // If the failure is due to a bound error, display it.
-          if (!bound_error.IsNull()) {
-            ReportError(bound_error);
-          } else {
-            ReportError(
-                arg->AsLiteralNode()->token_pos(),
-                "map literal %s at index %d must be "
-                "a constant of type '%s'",
-                ((i % 2) == 0) ? "key" : "value", i >> 1,
-                String::Handle(Z, arg_type.UserVisibleName()).ToCString());
-          }
-        }
-      }
-      key_value_array.SetAt(i, arg->AsLiteralNode()->literal());
-    }
-    key_value_array.MakeImmutable();
-    key_value_array ^= TryCanonicalize(key_value_array, TokenPos());
-
-    // Construct the map object.
-    const Class& immutable_map_class =
-        Class::Handle(Z, Library::LookupCoreClass(Symbols::ImmutableMap()));
-    ASSERT(!immutable_map_class.IsNull());
-    // If the immutable map class extends other parameterized classes, we need
-    // to adjust the type argument vector. This is currently not the case.
-    ASSERT(immutable_map_class.NumTypeArguments() == 2);
-    ArgumentListNode* constr_args = new (Z) ArgumentListNode(TokenPos());
-    constr_args->Add(new (Z) LiteralNode(literal_pos, key_value_array));
-    const Function& map_constr = Function::ZoneHandle(
-        Z, immutable_map_class.LookupConstructorAllowPrivate(
-               Symbols::ImmutableMapConstructor()));
-    ASSERT(!map_constr.IsNull());
-    const Object& constructor_result = Object::Handle(
-        Z, EvaluateConstConstructorCall(immutable_map_class, map_type_arguments,
-                                        map_constr, constr_args));
-    if (constructor_result.IsUnhandledException()) {
-      ReportErrors(Error::Cast(constructor_result), script_, literal_pos,
-                   "error executing const Map constructor");
-    } else {
-      const Instance& const_instance = Instance::Cast(constructor_result);
-      CacheConstantValue(literal_pos, const_instance);
-      return new (Z) LiteralNode(literal_pos,
-                                 Instance::ZoneHandle(Z, const_instance.raw()));
-    }
-  } else {
-    // Factory call at runtime.
-    const Class& factory_class =
-        Class::Handle(Z, Library::LookupCoreClass(Symbols::Map()));
-    ASSERT(!factory_class.IsNull());
-    const Function& factory_method = Function::ZoneHandle(
-        Z, factory_class.LookupFactory(
-               Library::PrivateCoreLibName(Symbols::MapLiteralFactory())));
-    ASSERT(!factory_method.IsNull());
-    if (!map_type_arguments.IsNull() && !map_type_arguments.IsInstantiated() &&
-        (FunctionLevel() > 0)) {
-      // Make sure that the instantiators are captured.
-      CaptureAllInstantiators();
-    }
-    TypeArguments& factory_type_args =
-        TypeArguments::ZoneHandle(Z, map_type_arguments.raw());
-    // If the factory class extends other parameterized classes, adjust the
-    // type argument vector.
-    if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 2)) {
-      ASSERT(factory_type_args.Length() == 2);
-      Type& factory_type = Type::Handle(
-          Z, Type::New(factory_class, factory_type_args, type_pos, Heap::kOld));
-      // It is not strictly necessary to canonicalize factory_type, but only its
-      // type argument vector.
-      factory_type ^= CanonicalizeType(factory_type);
-      factory_type_args = factory_type.arguments();
-      ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
-      ASSERT(factory_type_args.IsCanonical());
-    } else {
-      factory_type_args = factory_type_args.Canonicalize();
-    }
-    ArgumentListNode* factory_param = new (Z) ArgumentListNode(literal_pos);
-    // The kv_pair array is temporary and of element type dynamic. It is passed
-    // to the factory to initialize a properly typed map. Pass a pre-allocated
-    // array for the common empty map literal case.
-    if (kv_pairs_list.length() == 0) {
-      LiteralNode* empty_array_literal =
-          new (Z) LiteralNode(TokenPos(), Object::empty_array());
-      factory_param->Add(empty_array_literal);
-    } else {
-      ArrayNode* kv_pairs = new (Z) ArrayNode(
-          TokenPos(), Type::ZoneHandle(Z, Type::ArrayType()), kv_pairs_list);
-      factory_param->Add(kv_pairs);
-    }
-
-    return CreateConstructorCallNode(literal_pos, factory_type_args,
-                                     factory_method, factory_param);
-  }
-  UNREACHABLE();
-  return NULL;
-}
-
-AstNode* Parser::ParseCompoundLiteral() {
-  TRACE_PARSER("ParseCompoundLiteral");
-  bool is_const = false;
-  if (CurrentToken() == Token::kCONST) {
-    is_const = true;
-    ConsumeToken();
-  }
-  const TokenPosition type_pos = TokenPos();
-  TypeArguments& type_arguments = TypeArguments::Handle(
-      Z, ParseTypeArguments(ClassFinalizer::kCanonicalize));
-  // Malformed type arguments are mapped to dynamic, so we will not encounter
-  // them here.
-  // Map and List interfaces do not declare bounds on their type parameters, so
-  // we will not see malbounded type arguments here.
-  AstNode* primary = NULL;
-  if ((CurrentToken() == Token::kLBRACK) || (CurrentToken() == Token::kINDEX)) {
-    primary = ParseListLiteral(type_pos, is_const, type_arguments);
-  } else if (CurrentToken() == Token::kLBRACE) {
-    primary = ParseMapLiteral(type_pos, is_const, type_arguments);
-  } else {
-    UnexpectedToken();
-  }
-  return primary;
-}
-
-AstNode* Parser::ParseSymbolLiteral() {
-  ASSERT(CurrentToken() == Token::kHASH);
-  ConsumeToken();
-  TokenPosition symbol_pos = TokenPos();
-  String& symbol = String::ZoneHandle(Z);
-  if (IsIdentifier()) {
-    symbol = CurrentLiteral()->raw();
-    ConsumeToken();
-    GrowableHandlePtrArray<const String> pieces(Z, 3);
-    pieces.Add(symbol);
-    while (CurrentToken() == Token::kPERIOD) {
-      pieces.Add(Symbols::Dot());
-      ConsumeToken();
-      pieces.Add(*ExpectIdentifier("identifier expected"));
-    }
-    symbol = Symbols::FromConcatAll(T, pieces);
-  } else if (Token::CanBeOverloaded(CurrentToken())) {
-    symbol = Symbols::Token(CurrentToken()).raw();
-    ConsumeToken();
-  } else {
-    ReportError("illegal symbol literal");
-  }
-  ASSERT(symbol.IsSymbol());
-
-  Instance& symbol_instance = Instance::ZoneHandle(Z);
-  if (GetCachedConstant(symbol_pos, &symbol_instance)) {
-    return new (Z) LiteralNode(symbol_pos, symbol_instance);
-  }
-
-  // Call Symbol class constructor to create a symbol instance.
-  const Class& symbol_class = Class::Handle(I->object_store()->symbol_class());
-  ASSERT(!symbol_class.IsNull());
-  ArgumentListNode* constr_args = new (Z) ArgumentListNode(symbol_pos);
-  constr_args->Add(new (Z) LiteralNode(symbol_pos, symbol));
-  const Function& constr = Function::ZoneHandle(
-      Z, symbol_class.LookupConstructor(Symbols::SymbolCtor()));
-  ASSERT(!constr.IsNull());
-  const Object& result =
-      Object::Handle(Z, EvaluateConstConstructorCall(
-                            symbol_class, TypeArguments::Handle(Z), constr,
-                            constr_args, /*obfuscate_symbol_instances=*/false));
-  if (result.IsUnhandledException()) {
-    ReportErrors(Error::Cast(result), script_, symbol_pos,
-                 "error executing const Symbol constructor");
-  }
-  symbol_instance ^= result.raw();
-  CacheConstantValue(symbol_pos, symbol_instance);
-  return new (Z) LiteralNode(symbol_pos, symbol_instance);
-}
-
-static String& BuildConstructorName(Thread* thread,
-                                    const String& type_class_name,
-                                    const String* named_constructor) {
-  // By convention, the static function implementing a named constructor 'C'
-  // for class 'A' is labeled 'A.C', and the static function implementing the
-  // unnamed constructor for class 'A' is labeled 'A.'.
-  // This convention prevents users from explicitly calling constructors.
-  Zone* zone = thread->zone();
-  String& constructor_name =
-      String::Handle(zone, Symbols::FromDot(thread, type_class_name));
-  if (named_constructor != NULL) {
-    constructor_name =
-        Symbols::FromConcat(thread, constructor_name, *named_constructor);
-  }
-  return constructor_name;
-}
-
-AstNode* Parser::ParseNewOperator(Token::Kind op_kind) {
-  TRACE_PARSER("ParseNewOperator");
-  const TokenPosition new_pos = TokenPos();
-  ASSERT((op_kind == Token::kNEW) || (op_kind == Token::kCONST));
-  bool is_const = (op_kind == Token::kCONST);
-  if (!IsIdentifier()) {
-    ReportError("type name expected");
-  }
-  TokenPosition type_pos = TokenPos();
-  // Can't allocate const objects of a deferred type.
-  const bool allow_deferred_type = !is_const;
-  const Token::Kind la3 = LookaheadToken(3);
-  const bool consume_unresolved_prefix =
-      (la3 == Token::kLT) || (la3 == Token::kPERIOD);
-
-  LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(Z);
-  AbstractType& type = AbstractType::ZoneHandle(
-      Z, ParseType(ClassFinalizer::kCanonicalize, allow_deferred_type,
-                   consume_unresolved_prefix, &prefix));
-
-  if (FLAG_load_deferred_eagerly && !prefix.IsNull() &&
-      prefix.is_deferred_load() && !prefix.is_loaded()) {
-    // Add runtime check.
-    Type& malformed_type = Type::ZoneHandle(Z);
-    malformed_type = ClassFinalizer::NewFinalizedMalformedType(
-        Error::Handle(Z),  // No previous error.
-        script_, type_pos, "deferred type '%s.%s' is not yet loaded",
-        String::Handle(Z, prefix.name()).ToCString(),
-        String::Handle(type.Name()).ToCString());
-    // Note: Adding a statement to current block is a hack, parsing an
-    // expression should have no side-effect.
-    current_block_->statements->Add(
-        ThrowTypeError(type_pos, malformed_type, &prefix));
-  }
-  // In case the type is malformed, throw a dynamic type error after finishing
-  // parsing the instance creation expression.
-  if (!type.IsMalformed() && (type.IsTypeParameter() || type.IsDynamicType())) {
-    // Replace the type with a malformed type.
-    type = ClassFinalizer::NewFinalizedMalformedType(
-        Error::Handle(Z),  // No previous error.
-        script_, type_pos, "%s'%s' cannot be instantiated",
-        type.IsTypeParameter() ? "type parameter " : "",
-        type.IsTypeParameter()
-            ? String::Handle(Z, type.UserVisibleName()).ToCString()
-            : "dynamic");
-  }
-  // Attempting to instantiate an enum type is a compile-time error.
-  Class& type_class = Class::Handle(Z, type.type_class());
-  if (type_class.is_enum_class()) {
-    ReportError(new_pos, "enum type '%s' can not be instantiated",
-                String::Handle(Z, type_class.Name()).ToCString());
-  }
-
-  // The type can be followed by an optional named constructor identifier.
-  // Note that we tell ParseType() above not to consume it as part of
-  // a misinterpreted qualified identifier. Only a valid library
-  // prefix is accepted as qualifier.
-  String* named_constructor = NULL;
-  if (CurrentToken() == Token::kPERIOD) {
-    ConsumeToken();
-    named_constructor = ExpectIdentifier("name of constructor expected");
-  }
-
-  // Parse constructor parameters.
-  TokenPosition call_pos = TokenPos();
-  CheckToken(Token::kLPAREN);
-  ArgumentListNode* arguments =
-      ParseActualParameters(NULL, TypeArguments::ZoneHandle(Z), is_const);
-
-  // Parsing is complete, so we can return a throw in case of a malformed or
-  // malbounded type or report a compile-time error if the constructor is const.
-  if (type.IsMalformedOrMalbounded()) {
-    if (is_const) {
-      const Error& error = Error::Handle(Z, type.error());
-      ReportError(error);
-    }
-    if (arguments->length() > 0) {
-      // Evaluate arguments for side-effects and throw.
-      LetNode* error_result = new (Z) LetNode(type_pos);
-      for (intptr_t i = 0; i < arguments->length(); ++i) {
-        error_result->AddNode(arguments->NodeAt(i));
-      }
-      error_result->AddNode(ThrowTypeError(type_pos, type));
-      return error_result;
-    }
-    return ThrowTypeError(type_pos, type);
-  }
-
-  // Resolve the type and optional identifier to a constructor or factory.
-  String& type_class_name = String::Handle(Z, type_class.Name());
-  TypeArguments& type_arguments =
-      TypeArguments::ZoneHandle(Z, type.arguments());
-
-  // A constructor has an implicit 'this' parameter (instance to construct)
-  // and a factory has an implicit 'this' parameter (type_arguments).
-  intptr_t arguments_length = arguments->length() + 1;
-
-  // An additional type check of the result of a redirecting factory may be
-  // required.
-  AbstractType& type_bound = AbstractType::ZoneHandle(Z);
-
-  // Make sure that an appropriate constructor exists.
-  String& constructor_name =
-      BuildConstructorName(T, type_class_name, named_constructor);
-  Function& constructor =
-      Function::ZoneHandle(Z, type_class.LookupConstructor(constructor_name));
-  if (constructor.IsNull()) {
-    constructor = type_class.LookupFactory(constructor_name);
-    if (constructor.IsNull()) {
-      const String& external_constructor_name =
-          (named_constructor ? constructor_name : type_class_name);
-      // Replace the type with a malformed type and compile a throw or report a
-      // compile-time error if the constructor is const.
-      if (is_const) {
-        type = ClassFinalizer::NewFinalizedMalformedType(
-            Error::Handle(Z),  // No previous error.
-            script_, call_pos,
-            "class '%s' has no constructor or factory named '%s'",
-            String::Handle(Z, type_class.Name()).ToCString(),
-            external_constructor_name.ToCString());
-        ReportError(Error::Handle(Z, type.error()));
-      }
-      return ThrowNoSuchMethodError(
-          call_pos, type_class, external_constructor_name, arguments,
-          InvocationMirror::kConstructor, InvocationMirror::kMethod,
-          NULL);  // No existing function.
-    } else if (constructor.IsRedirectingFactory()) {
-      ClassFinalizer::ResolveRedirectingFactory(type_class, constructor);
-      Type& redirect_type = Type::ZoneHandle(Z, constructor.RedirectionType());
-      if (!redirect_type.IsMalformedOrMalbounded() &&
-          !redirect_type.IsInstantiated()) {
-        // No generic constructors allowed.
-        ASSERT(redirect_type.IsInstantiated(kFunctions));
-        // The type arguments of the redirection type are instantiated from the
-        // type arguments of the parsed type of the 'new' or 'const' expression.
-        Error& error = Error::Handle(Z);
-        redirect_type ^= redirect_type.InstantiateFrom(
-            type_arguments, Object::null_type_arguments(), kNoneFree, &error,
-            NULL,  // instantiation_trail
-            NULL,  // bound_trail
-            Heap::kOld);
-        if (!error.IsNull()) {
-          redirect_type = ClassFinalizer::NewFinalizedMalformedType(
-              error, script_, call_pos,
-              "redirecting factory type '%s' cannot be instantiated",
-              String::Handle(Z, redirect_type.UserVisibleName()).ToCString());
-        }
-      }
-      if (!redirect_type.HasResolvedTypeClass()) {
-        // If the redirection type is unresolved, we convert the allocation
-        // into throwing a type error.
-        const UnresolvedClass& cls =
-            UnresolvedClass::Handle(Z, redirect_type.unresolved_class());
-        const LibraryPrefix& prefix = LibraryPrefix::Cast(
-            Object::Handle(Z, cls.library_or_library_prefix()));
-        if (!prefix.IsNull() && !prefix.is_loaded() &&
-            !FLAG_load_deferred_eagerly) {
-          // If the redirection type is unresolved because it refers to
-          // an unloaded deferred prefix, mark this function as depending
-          // on the library prefix. It will then get invalidated when the
-          // prefix is loaded.
-          parsed_function()->AddDeferredPrefix(prefix);
-        }
-        redirect_type = ClassFinalizer::NewFinalizedMalformedType(
-            Error::Handle(Z), script_, call_pos,
-            "redirection type '%s' is not loaded",
-            String::Handle(Z, redirect_type.UserVisibleName()).ToCString());
-      }
-
-      if (redirect_type.IsMalformedOrMalbounded()) {
-        if (is_const) {
-          ReportError(Error::Handle(Z, redirect_type.error()));
-        }
-        return ThrowTypeError(redirect_type.token_pos(), redirect_type);
-      }
-      if (I->type_checks() &&
-          !redirect_type.IsSubtypeOf(type, NULL, NULL, Heap::kOld)) {
-        // Additional type checking of the result is necessary.
-        type_bound = type.raw();
-      }
-      type = redirect_type.raw();
-      type_class = type.type_class();
-      type_class_name = type_class.Name();
-      type_arguments = type.arguments();
-      constructor = constructor.RedirectionTarget();
-      constructor_name = constructor.name();
-      ASSERT(!constructor.IsNull());
-    }
-  }
-  ASSERT(!constructor.IsNull());
-
-  // It is a compile time error to instantiate a const instance of an
-  // abstract class. Factory methods are ok.
-  if (is_const && type_class.is_abstract() && !constructor.IsFactory()) {
-    ReportError(new_pos, "cannot instantiate abstract class");
-  }
-
-  // It is ok to call a factory method of an abstract class, but it is
-  // a dynamic error to instantiate an abstract class.
-  if (type_class.is_abstract() && !constructor.IsFactory()) {
-    // Evaluate arguments before throwing.
-    LetNode* result = new (Z) LetNode(call_pos);
-    for (intptr_t i = 0; i < arguments->length(); ++i) {
-      result->AddNode(arguments->NodeAt(i));
-    }
-    ArgumentListNode* error_arguments = new (Z) ArgumentListNode(type_pos);
-    error_arguments->Add(new (Z) LiteralNode(
-        TokenPos(),
-        Integer::ZoneHandle(Z, Integer::New(type_pos.value(), Heap::kOld))));
-    error_arguments->Add(new (Z) LiteralNode(
-        TokenPos(), String::ZoneHandle(Z, type_class_name.raw())));
-    result->AddNode(MakeStaticCall(
-        Symbols::AbstractClassInstantiationError(),
-        Library::PrivateCoreLibName(Symbols::ThrowNew()), error_arguments));
-    return result;
-  }
-
-  type_arguments ^= type_arguments.Canonicalize();
-
-  const int kTypeArgsLen = 0;
-  String& error_message = String::Handle(Z);
-  if (!constructor.AreValidArguments(kTypeArgsLen, arguments_length,
-                                     arguments->names(), &error_message)) {
-    const String& external_constructor_name =
-        (named_constructor ? constructor_name : type_class_name);
-    if (is_const) {
-      ReportError(call_pos,
-                  "invalid arguments passed to constructor '%s' "
-                  "for class '%s': %s",
-                  external_constructor_name.ToCString(),
-                  String::Handle(Z, type_class.Name()).ToCString(),
-                  error_message.ToCString());
-    }
-    return ThrowNoSuchMethodError(call_pos, type_class,
-                                  external_constructor_name, arguments,
-                                  InvocationMirror::kConstructor,
-                                  InvocationMirror::kMethod, &constructor);
-  }
-
-  // Return a throw in case of a malformed or malbounded type or report a
-  // compile-time error if the constructor is const.
-  if (type.IsMalformedOrMalbounded()) {
-    if (is_const) {
-      ReportError(Error::Handle(Z, type.error()));
-    }
-    return ThrowTypeError(type_pos, type);
-  }
-
-  // Make the constructor call.
-  AstNode* new_object = NULL;
-  if (is_const) {
-    if (!constructor.is_const()) {
-      const String& external_constructor_name =
-          (named_constructor ? constructor_name : type_class_name);
-      ReportError(
-          "non-const constructor '%s' cannot be used in "
-          "const object creation",
-          external_constructor_name.ToCString());
-    }
-
-    Instance& const_instance = Instance::ZoneHandle(Z);
-    if (GetCachedConstant(new_pos, &const_instance)) {
-      // Cache hit, nothing else to do.
-    } else {
-      Object& constructor_result = Object::Handle(
-          Z, EvaluateConstConstructorCall(type_class, type_arguments,
-                                          constructor, arguments));
-      if (constructor_result.IsUnhandledException()) {
-        // It's a compile-time error if invocation of a const constructor
-        // call fails.
-        ReportErrors(Error::Cast(constructor_result), script_, new_pos,
-                     "error while evaluating const constructor");
-      }
-      const_instance ^= constructor_result.raw();
-      CacheConstantValue(new_pos, const_instance);
-    }
-    new_object = new (Z) LiteralNode(new_pos, const_instance);
-    if (!type_bound.IsNull()) {
-      ASSERT(!type_bound.IsMalformed());
-      Error& bound_error = Error::Handle(Z);
-      ASSERT(!is_top_level_);  // We cannot check unresolved types.
-      if (!const_instance.IsInstanceOf(
-              type_bound, Object::null_type_arguments(),
-              Object::null_type_arguments(), &bound_error)) {
-        type_bound = ClassFinalizer::NewFinalizedMalformedType(
-            bound_error, script_, new_pos,
-            "const factory result is not an instance of '%s'",
-            String::Handle(Z, type_bound.UserVisibleName()).ToCString());
-        new_object = ThrowTypeError(new_pos, type_bound);
-      }
-      type_bound = AbstractType::null();
-    }
-  } else {
-    CheckConstructorCallTypeArguments(new_pos, constructor, type_arguments);
-    if (!type_arguments.IsNull() && !type_arguments.IsInstantiated() &&
-        (FunctionLevel() > 0)) {
-      // Make sure that the instantiators are captured.
-      CaptureAllInstantiators();
-    }
-    // If the type argument vector is not instantiated, we verify in checked
-    // mode at runtime that it is within its declared bounds.
-    new_object = CreateConstructorCallNode(new_pos, type_arguments, constructor,
-                                           arguments);
-  }
-  if (!type_bound.IsNull()) {
-    new_object = new (Z) AssignableNode(new_pos, new_object, type_bound,
-                                        Symbols::FactoryResult());
-  }
-  return new_object;
-}
-
-String& Parser::Interpolate(const GrowableArray<AstNode*>& values) {
-  NoReloadScope no_reload_scope(isolate(), thread());
-  NoOOBMessageScope no_msg_scope(thread());
-  const Class& cls =
-      Class::Handle(Z, Library::LookupCoreClass(Symbols::StringBase()));
-  ASSERT(!cls.IsNull());
-  const Function& func = Function::Handle(
-      Z, cls.LookupStaticFunction(
-             Library::PrivateCoreLibName(Symbols::Interpolate())));
-  ASSERT(!func.IsNull());
-
-  // Build the array of literal values to interpolate.
-  const Array& value_arr =
-      Array::Handle(Z, Array::New(values.length(), Heap::kOld));
-  for (int i = 0; i < values.length(); i++) {
-    ASSERT(values[i]->IsLiteralNode());
-    value_arr.SetAt(i, values[i]->AsLiteralNode()->literal());
-  }
-
-  // Build argument array to pass to the interpolation function.
-  const Array& interpolate_arg = Array::Handle(Z, Array::New(1, Heap::kOld));
-  interpolate_arg.SetAt(0, value_arr);
-
-  // Call interpolation function.
-  Object& result = Object::Handle(Z);
-  result = DartEntry::InvokeFunction(func, interpolate_arg);
-  if (result.IsUnhandledException()) {
-    ReportError("%s", Error::Cast(result).ToErrorCString());
-  }
-  String& concatenated = String::ZoneHandle(Z);
-  concatenated ^= result.raw();
-  concatenated = Symbols::New(T, concatenated);
-  return concatenated;
-}
-
-// A string literal consists of the concatenation of the next n tokens
-// that satisfy the EBNF grammar:
-// literal = kSTRING {{ interpol } kSTRING }
-// interpol = kINTERPOL_VAR | (kINTERPOL_START expression kINTERPOL_END)
-// In other words, the scanner breaks down interpolated strings so that
-// a string literal always begins and ends with a kSTRING token.
-AstNode* Parser::ParseStringLiteral(bool allow_interpolation) {
-  TRACE_PARSER("ParseStringLiteral");
-  AstNode* primary = NULL;
-  const TokenPosition literal_start = TokenPos();
-  ASSERT(CurrentToken() == Token::kSTRING);
-  Token::Kind l1_token = LookaheadToken(1);
-  if ((l1_token != Token::kSTRING) && (l1_token != Token::kINTERPOL_VAR) &&
-      (l1_token != Token::kINTERPOL_START)) {
-    // Common case: no interpolation.
-    primary = new (Z) LiteralNode(literal_start, *CurrentLiteral());
-    ConsumeToken();
-    return primary;
-  }
-  // String interpolation needed.
-
-  // First, check whether we've cached a compile-time constant for this
-  // string interpolation.
-  Instance& cached_string = Instance::Handle(Z);
-  if (GetCachedConstant(literal_start, &cached_string)) {
-    SkipStringLiteral();
-    return new (Z) LiteralNode(literal_start,
-                               Instance::ZoneHandle(Z, cached_string.raw()));
-  }
-
-  bool is_compiletime_const = true;
-  bool has_interpolation = false;
-  GrowableArray<AstNode*> values_list;
-  while (CurrentToken() == Token::kSTRING) {
-    if (CurrentLiteral()->Length() > 0) {
-      // Only add non-empty string sections to the values list
-      // that will be concatenated.
-      values_list.Add(new (Z) LiteralNode(TokenPos(), *CurrentLiteral()));
-    }
-    ConsumeToken();
-    while ((CurrentToken() == Token::kINTERPOL_VAR) ||
-           (CurrentToken() == Token::kINTERPOL_START)) {
-      if (!allow_interpolation) {
-        ReportError("string interpolation not allowed in this context");
-      }
-      has_interpolation = true;
-      AstNode* expr = NULL;
-      const TokenPosition expr_pos = TokenPos();
-      if (CurrentToken() == Token::kINTERPOL_VAR) {
-        expr = ResolveIdent(TokenPos(), *CurrentLiteral(), true);
-        ConsumeToken();
-      } else {
-        ASSERT(CurrentToken() == Token::kINTERPOL_START);
-        ConsumeToken();
-        const bool saved_mode = SetAllowFunctionLiterals(true);
-        expr = ParseExpr(kAllowConst, kConsumeCascades);
-        SetAllowFunctionLiterals(saved_mode);
-        ExpectToken(Token::kINTERPOL_END);
-      }
-      // Check if this interpolated string is still considered a compile time
-      // constant. If it is we need to evaluate if the current string part is
-      // a constant or not. Only strings, numbers, booleans and null values
-      // are allowed in compile time const interpolations.
-      if (is_compiletime_const) {
-        const Object* const_expr = expr->EvalConstExpr();
-        if ((const_expr != NULL) &&
-            (const_expr->IsNumber() || const_expr->IsString() ||
-             const_expr->IsBool() || const_expr->IsNull())) {
-          // Change expr into a literal.
-          expr =
-              new (Z) LiteralNode(expr_pos, EvaluateConstExpr(expr_pos, expr));
-        } else {
-          is_compiletime_const = false;
-        }
-      }
-      values_list.Add(expr);
-    }
-  }
-  if (is_compiletime_const) {
-    if (has_interpolation) {
-      const String& interpolated_string = Interpolate(values_list);
-      primary = new (Z) LiteralNode(literal_start, interpolated_string);
-      CacheConstantValue(literal_start, interpolated_string);
-    } else {
-      GrowableHandlePtrArray<const String> pieces(Z, values_list.length());
-      for (int i = 0; i < values_list.length(); i++) {
-        const Instance& part = values_list[i]->AsLiteralNode()->literal();
-        ASSERT(part.IsString());
-        pieces.Add(String::Cast(part));
-      }
-      const String& lit =
-          String::ZoneHandle(Z, Symbols::FromConcatAll(T, pieces));
-      primary = new (Z) LiteralNode(literal_start, lit);
-      // Caching of constant not necessary because the symbol lookup will
-      // find the value next time.
-    }
-  } else {
-    ArrayNode* values = new (Z) ArrayNode(
-        TokenPos(), Type::ZoneHandle(Z, Type::ArrayType()), values_list);
-    primary = new (Z) StringInterpolateNode(TokenPos(), values);
-  }
-  return primary;
-}
-
-AstNode* Parser::ParsePrimary() {
-  TRACE_PARSER("ParsePrimary");
-  ASSERT(!is_top_level_);
-  AstNode* primary = NULL;
-  const Token::Kind token = CurrentToken();
-  if (IsFunctionLiteral()) {
-    primary = ParseFunctionStatement(true);
-  } else if (IsIdentifier()) {
-    TokenPosition qual_ident_pos = TokenPos();
-    const LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(Z, ParsePrefix());
-    if (!prefix.IsNull()) {
-      ExpectToken(Token::kPERIOD);
-    }
-    String& ident = *CurrentLiteral();
-    ConsumeToken();
-    if (prefix.IsNull()) {
-      intptr_t primary_func_level = 0;
-      ResolveIdentInLocalScope(qual_ident_pos, ident, &primary,
-                               &primary_func_level);
-      // Check whether the identifier is shadowed by a function type parameter.
-      if (InGenericFunctionScope()) {
-        intptr_t type_param_func_level = FunctionLevel();
-        TypeParameter& type_param = TypeParameter::ZoneHandle(
-            Z, innermost_function().LookupTypeParameter(
-                   ident, &type_param_func_level));
-        if (!type_param.IsNull()) {
-          if ((primary == NULL) ||
-              (primary_func_level < type_param_func_level)) {
-            // The identifier is a function type parameter, possibly shadowing
-            // already resolved 'primary'.
-            return new (Z) PrimaryNode(qual_ident_pos, type_param);
-          }
-        }
-      }
-      if (primary == NULL) {
-        // Check whether the identifier is a type parameter.
-        if (!current_class().IsNull()) {
-          TypeParameter& type_param = TypeParameter::ZoneHandle(
-              Z, current_class().LookupTypeParameter(ident));
-          if (!type_param.IsNull()) {
-            return new (Z) PrimaryNode(qual_ident_pos, type_param);
-          }
-        }
-        // This is a non-local unqualified identifier so resolve the
-        // identifier locally in the main app library and all libraries
-        // imported by it.
-        primary = ResolveIdentInCurrentLibraryScope(qual_ident_pos, ident);
-      }
-    } else {
-      // This is a qualified identifier with a library prefix so resolve
-      // the identifier locally in that library (we do not include the
-      // libraries imported by that library).
-      primary = ResolveIdentInPrefixScope(qual_ident_pos, prefix, ident);
-
-      // If the identifier could not be resolved, throw a NoSuchMethodError.
-      // Note: unlike in the case of an unqualified identifier, do not
-      // interpret the unresolved identifier as an instance method or
-      // instance getter call when compiling an instance method.
-      if (primary == NULL) {
-        if (prefix.is_deferred_load() && ident.Equals(Symbols::LoadLibrary())) {
-          // Hack Alert: recognize special 'loadLibrary' call on the
-          // prefix object. The prefix is the primary. Rewind parser and
-          // let ParseSelectors() handle the loadLibrary call.
-          SetPosition(qual_ident_pos);
-          ConsumeToken();  // Prefix name.
-          primary = new (Z) LiteralNode(qual_ident_pos, prefix);
-        } else {
-          GrowableHandlePtrArray<const String> pieces(Z, 3);
-          pieces.Add(String::Handle(Z, prefix.name()));
-          pieces.Add(Symbols::Dot());
-          pieces.Add(ident);
-          const String& qualified_name =
-              String::ZoneHandle(Z, Symbols::FromConcatAll(T, pieces));
-          primary = new (Z) PrimaryNode(qual_ident_pos, qualified_name);
-          if (prefix.is_deferred_load()) {
-            primary->AsPrimaryNode()->set_prefix(&prefix);
-          }
-        }
-      } else if (FLAG_load_deferred_eagerly && prefix.is_deferred_load()) {
-        // primary != NULL.
-        GrowableHandlePtrArray<const String> pieces(Z, 3);
-        pieces.Add(String::Handle(Z, prefix.name()));
-        pieces.Add(Symbols::Dot());
-        pieces.Add(ident);
-        const String& qualified_name =
-            String::ZoneHandle(Z, Symbols::FromConcatAll(T, pieces));
-        InvocationMirror::Kind call_kind = CurrentToken() == Token::kLPAREN
-                                               ? InvocationMirror::kMethod
-                                               : InvocationMirror::kGetter;
-        // Note: Adding a statement to current block is a hack, parsing an
-        // expression should have no side-effect.
-        current_block_->statements->Add(ThrowNoSuchMethodError(
-            qual_ident_pos, current_class(), qualified_name,
-            NULL,  // No arguments.
-            InvocationMirror::kTopLevel, call_kind,
-            NULL,  // No existing function.
-            &prefix));
-      }
-    }
-    ASSERT(primary != NULL);
-  } else if (token == Token::kTHIS) {
-    LocalVariable* local = LookupLocalScope(Symbols::This());
-    if (local == NULL) {
-      ReportError("receiver 'this' is not in scope");
-    }
-    primary = new (Z) LoadLocalNode(TokenPos(), local);
-    ConsumeToken();
-  } else if (token == Token::kINTEGER) {
-    const Integer& literal = Integer::ZoneHandle(Z, CurrentIntegerLiteral());
-    primary = new (Z) LiteralNode(TokenPos(), literal);
-    ConsumeToken();
-  } else if (token == Token::kTRUE) {
-    primary = new (Z) LiteralNode(TokenPos(), Bool::True());
-    ConsumeToken();
-  } else if (token == Token::kFALSE) {
-    primary = new (Z) LiteralNode(TokenPos(), Bool::False());
-    ConsumeToken();
-  } else if (token == Token::kNULL) {
-    primary = new (Z) LiteralNode(TokenPos(), Object::null_instance());
-    ConsumeToken();
-  } else if (token == Token::kLPAREN) {
-    ConsumeToken();
-    const bool saved_mode = SetAllowFunctionLiterals(true);
-    primary = ParseExpr(kAllowConst, kConsumeCascades);
-    SetAllowFunctionLiterals(saved_mode);
-    ExpectToken(Token::kRPAREN);
-  } else if (token == Token::kDOUBLE) {
-    const Double& double_value = Double::ZoneHandle(Z, CurrentDoubleLiteral());
-    if (double_value.IsNull()) {
-      ReportError("invalid double literal");
-    }
-    primary = new (Z) LiteralNode(TokenPos(), double_value);
-    ConsumeToken();
-  } else if (token == Token::kSTRING) {
-    primary = ParseStringLiteral(true);
-  } else if (token == Token::kNEW) {
-    ConsumeToken();
-    primary = ParseNewOperator(Token::kNEW);
-  } else if (token == Token::kCONST) {
-    if ((LookaheadToken(1) == Token::kLT) ||
-        (LookaheadToken(1) == Token::kLBRACK) ||
-        (LookaheadToken(1) == Token::kINDEX) ||
-        (LookaheadToken(1) == Token::kLBRACE)) {
-      primary = ParseCompoundLiteral();
-    } else {
-      ConsumeToken();
-      primary = ParseNewOperator(Token::kCONST);
-    }
-  } else if (token == Token::kLT || token == Token::kLBRACK ||
-             token == Token::kINDEX || token == Token::kLBRACE) {
-    primary = ParseCompoundLiteral();
-  } else if (token == Token::kHASH) {
-    primary = ParseSymbolLiteral();
-  } else if (token == Token::kSUPER) {
-    if (current_function().is_static()) {
-      ReportError("cannot access superclass from static method");
-    }
-    if (current_class().SuperClass() == Class::null()) {
-      ReportError("class '%s' does not have a superclass",
-                  String::Handle(Z, current_class().Name()).ToCString());
-    }
-    const TokenPosition super_pos = TokenPos();
-    ConsumeToken();
-    if (CurrentToken() == Token::kPERIOD) {
-      ConsumeToken();
-      const TokenPosition ident_pos = TokenPos();
-      const String& ident = *ExpectIdentifier("identifier expected");
-      if (IsArgumentPart()) {
-        TypeArguments& func_type_args = TypeArguments::ZoneHandle(Z);
-        if (CurrentToken() == Token::kLT) {
-          // Type arguments.
-          func_type_args = ParseTypeArguments(ClassFinalizer::kCanonicalize);
-          if (FLAG_reify_generic_functions) {
-            if (!func_type_args.IsNull() && !func_type_args.IsInstantiated() &&
-                (FunctionLevel() > 0)) {
-              // Make sure that the instantiators are captured.
-              CaptureAllInstantiators();
-            }
-          } else {
-            func_type_args = TypeArguments::null();
-          }
-        }
-        primary = ParseSuperCall(ident, func_type_args);
-      } else {
-        primary = ParseSuperFieldAccess(ident, ident_pos);
-      }
-    } else if ((CurrentToken() == Token::kLBRACK) ||
-               Token::CanBeOverloaded(CurrentToken()) ||
-               (CurrentToken() == Token::kNE)) {
-      primary = ParseSuperOperator();
-    } else if (CurrentToken() == Token::kQM_PERIOD) {
-      ReportError("super call or super getter may not use ?.");
-    } else {
-      primary = new (Z) PrimaryNode(super_pos, Symbols::Super());
-    }
-  } else {
-    UnexpectedToken();
-  }
-  return primary;
-}
-
-// Evaluate expression in expr and return the value. The expression must
-// be a compile time constant.
-const Instance& Parser::EvaluateConstExpr(TokenPosition expr_pos,
-                                          AstNode* expr) {
-  NoReloadScope no_reload_scope(isolate(), thread());
-  NoOOBMessageScope no_msg_scope(thread());
-  if (expr->IsLiteralNode()) {
-    return expr->AsLiteralNode()->literal();
-  } else if (expr->IsLoadLocalNode() &&
-             expr->AsLoadLocalNode()->local().IsConst()) {
-    return *expr->AsLoadLocalNode()->local().ConstValue();
-  } else if (expr->IsLoadStaticFieldNode()) {
-    const Field& field = expr->AsLoadStaticFieldNode()->field();
-    // We already checked that this field is const and has been
-    // initialized.
-    ASSERT(field.is_const());
-    ASSERT(field.StaticValue() != Object::sentinel().raw());
-    ASSERT(field.StaticValue() != Object::transition_sentinel().raw());
-    return Instance::ZoneHandle(Z, field.StaticValue());
-  } else if (expr->IsTypeNode()) {
-    AbstractType& type =
-        AbstractType::ZoneHandle(Z, expr->AsTypeNode()->type().raw());
-    ASSERT(type.IsInstantiated() && !type.IsMalformedOrMalbounded());
-    return type;
-  } else if (expr->IsClosureNode()) {
-    const Function& func = expr->AsClosureNode()->function();
-    ASSERT((func.IsImplicitStaticClosureFunction()));
-    Instance& closure = Instance::ZoneHandle(Z, func.ImplicitStaticClosure());
-    closure = TryCanonicalize(closure, expr_pos);
-    return closure;
-  } else {
-    ASSERT(expr->EvalConstExpr() != NULL);
-    Instance& value = Instance::ZoneHandle(Z);
-    if (GetCachedConstant(expr_pos, &value)) {
-      return value;
-    }
-    ReturnNode* ret = new (Z) ReturnNode(expr_pos, expr);
-    // Compile time constant expressions cannot reference anything from a
-    // local scope.
-    LocalScope* empty_scope = new (Z) LocalScope(NULL, 0, 0);
-    SequenceNode* seq = new (Z) SequenceNode(expr_pos, empty_scope);
-    seq->Add(ret);
-
-    INC_STAT(thread_, num_execute_const, 1);
-    Object& result = Object::Handle(Z, Compiler::ExecuteOnce(seq));
-    if (result.IsError()) {
-      ReportErrors(Error::Cast(result), script_, expr_pos,
-                   "error evaluating constant expression");
-    }
-    ASSERT(result.IsInstance() || result.IsNull());
-    value ^= result.raw();
-    value = TryCanonicalize(value, expr_pos);
-    CacheConstantValue(expr_pos, value);
-    return value;
-  }
-}
-
-void Parser::SkipFunctionLiteral() {
-  if (IsIdentifier()) {
-    if (LookaheadToken(1) != Token::kLPAREN) {
-      SkipTypeOrFunctionType(true);
-    }
-    ExpectIdentifier("function name expected");
-  }
-  if (CurrentToken() == Token::kLPAREN) {
-    SkipToMatchingParenthesis();
-  }
-  RawFunction::AsyncModifier async_modifier = ParseFunctionModifier();
-  BoolScope allow_await(&this->await_is_keyword_,
-                        async_modifier != RawFunction::kNoModifier);
-  if (CurrentToken() == Token::kLBRACE) {
-    SkipBlock();
-    ExpectToken(Token::kRBRACE);
-  } else if (CurrentToken() == Token::kARROW) {
-    ConsumeToken();
-    SkipExpr();
-  }
-}
-
-// Skips function/method/constructor/getter/setter preambles until the formal
-// parameter list. It is enough to skip the tokens, since we have already
-// previously parsed the function.
-void Parser::SkipFunctionPreamble() {
-  while (true) {
-    if (IsFunctionTypeSymbol()) {
-      ConsumeToken();
-      SkipTypeParameters();
-      SkipToMatchingParenthesis();
-      continue;
-    }
-    const Token::Kind token = CurrentToken();
-    if (token == Token::kLPAREN) {
-      return;
-    }
-    if (token == Token::kGET) {
-      if (LookaheadToken(1) == Token::kLT) {
-        // Case: Generic Function/method named get.
-        ConsumeToken();  // Parse away 'get' (the function's name).
-        SkipTypeParameters();
-        continue;
-      }
-      if (LookaheadToken(1) == Token::kLPAREN) {
-        // Case: Function/method named get.
-        ConsumeToken();  // Parse away 'get' (the function's name).
-        return;
-      }
-      // Case: Getter.
-      ConsumeToken();  // Parse away 'get'.
-      ConsumeToken();  // Parse away the getter name.
-      return;
-    }
-    ConsumeToken();  // Can be static, factory, operator, void, ident, etc...
-  }
-}
-
-void Parser::SkipListLiteral() {
-  if (CurrentToken() == Token::kINDEX) {
-    // Empty list literal.
-    ConsumeToken();
-    return;
-  }
-  ExpectToken(Token::kLBRACK);
-  while (CurrentToken() != Token::kRBRACK) {
-    SkipNestedExpr();
-    if (CurrentToken() == Token::kCOMMA) {
-      ConsumeToken();
-    } else {
-      break;
-    }
-  }
-  ExpectToken(Token::kRBRACK);
-}
-
-void Parser::SkipMapLiteral() {
-  ExpectToken(Token::kLBRACE);
-  while (CurrentToken() != Token::kRBRACE) {
-    SkipNestedExpr();
-    ExpectToken(Token::kCOLON);
-    SkipNestedExpr();
-    if (CurrentToken() == Token::kCOMMA) {
-      ConsumeToken();
-    } else {
-      break;
-    }
-  }
-  ExpectToken(Token::kRBRACE);
-}
-
-void Parser::SkipActualParameters() {
-  if (CurrentToken() == Token::kLT) {
-    SkipTypeArguments();
-  }
-  ExpectToken(Token::kLPAREN);
-  while (CurrentToken() != Token::kRPAREN) {
-    if (IsIdentifier() && (LookaheadToken(1) == Token::kCOLON)) {
-      // Named actual parameter.
-      ConsumeToken();
-      ConsumeToken();
-    }
-    SkipNestedExpr();
-    if (CurrentToken() == Token::kCOMMA) {
-      ConsumeToken();
-    }
-  }
-  ExpectToken(Token::kRPAREN);
-}
-
-void Parser::SkipCompoundLiteral() {
-  if (CurrentToken() == Token::kLT) {
-    SkipTypeArguments();
-  }
-  if ((CurrentToken() == Token::kLBRACK) || (CurrentToken() == Token::kINDEX)) {
-    SkipListLiteral();
-  } else if (CurrentToken() == Token::kLBRACE) {
-    SkipMapLiteral();
-  }
-}
-
-void Parser::SkipSymbolLiteral() {
-  ConsumeToken();  // Hash sign.
-  if (IsIdentifier()) {
-    ConsumeToken();
-    while (CurrentToken() == Token::kPERIOD) {
-      ConsumeToken();
-      ExpectIdentifier("identifier expected");
-    }
-  } else if (Token::CanBeOverloaded(CurrentToken())) {
-    ConsumeToken();
-  } else {
-    UnexpectedToken();
-  }
-}
-
-void Parser::SkipNewOperator() {
-  ConsumeToken();  // Skip new or const keyword.
-  if (IsIdentifier()) {
-    SkipType(false);
-    if (CurrentToken() == Token::kPERIOD) {
-      ConsumeToken();
-      ExpectIdentifier("identifier expected");
-    }
-    if (CurrentToken() == Token::kLPAREN) {
-      SkipActualParameters();
-      return;
-    }
-  }
-}
-
-void Parser::SkipStringLiteral() {
-  ASSERT(CurrentToken() == Token::kSTRING);
-  while (CurrentToken() == Token::kSTRING) {
-    ConsumeToken();
-    while (true) {
-      if (CurrentToken() == Token::kINTERPOL_VAR) {
-        ConsumeToken();
-      } else if (CurrentToken() == Token::kINTERPOL_START) {
-        ConsumeToken();
-        const bool saved_mode = SetAllowFunctionLiterals(true);
-        SkipExpr();
-        SetAllowFunctionLiterals(saved_mode);
-        ExpectToken(Token::kINTERPOL_END);
-      } else {
-        break;
-      }
-    }
-  }
-}
-
-void Parser::SkipPrimary() {
-  if (IsFunctionLiteral()) {
-    SkipFunctionLiteral();
-    return;
-  }
-  switch (CurrentToken()) {
-    case Token::kTHIS:
-    case Token::kSUPER:
-    case Token::kNULL:
-    case Token::kTRUE:
-    case Token::kFALSE:
-    case Token::kINTEGER:
-    case Token::kDOUBLE:
-      ConsumeToken();
-      break;
-    case Token::kIDENT:
-      ConsumeToken();
-      break;
-    case Token::kSTRING:
-      SkipStringLiteral();
-      break;
-    case Token::kLPAREN:
-      ConsumeToken();
-      SkipNestedExpr();
-      ExpectToken(Token::kRPAREN);
-      break;
-    case Token::kNEW:
-      SkipNewOperator();
-      break;
-    case Token::kCONST:
-      if ((LookaheadToken(1) == Token::kLT) ||
-          (LookaheadToken(1) == Token::kLBRACE) ||
-          (LookaheadToken(1) == Token::kLBRACK) ||
-          (LookaheadToken(1) == Token::kINDEX)) {
-        ConsumeToken();
-        SkipCompoundLiteral();
-      } else {
-        SkipNewOperator();
-      }
-      break;
-    case Token::kLT:
-    case Token::kLBRACE:
-    case Token::kLBRACK:
-    case Token::kINDEX:
-      SkipCompoundLiteral();
-      break;
-    case Token::kHASH:
-      SkipSymbolLiteral();
-      break;
-    default:
-      if (IsIdentifier()) {
-        ConsumeToken();  // Handle pseudo-keyword identifiers.
-      } else {
-        UnexpectedToken();
-        UNREACHABLE();
-      }
-      break;
-  }
-}
-
-void Parser::SkipSelectors() {
-  while (true) {
-    const Token::Kind current_token = CurrentToken();
-    if (current_token == Token::kCASCADE) {
-      ConsumeToken();
-      if (CurrentToken() == Token::kLBRACK) {
-        continue;  // Consume [ in next loop iteration.
-      } else {
-        ExpectIdentifier("identifier or [ expected after ..");
-      }
-    } else if ((current_token == Token::kPERIOD) ||
-               (current_token == Token::kQM_PERIOD)) {
-      ConsumeToken();
-      ExpectIdentifier("identifier expected");
-    } else if (current_token == Token::kLBRACK) {
-      ConsumeToken();
-      SkipNestedExpr();
-      ExpectToken(Token::kRBRACK);
-    } else if (IsArgumentPart()) {
-      SkipActualParameters();
-    } else {
-      break;
-    }
-  }
-}
-
-void Parser::SkipPostfixExpr() {
-  SkipPrimary();
-  SkipSelectors();
-  if (IsIncrementOperator(CurrentToken())) {
-    ConsumeToken();
-  }
-}
-
-void Parser::SkipUnaryExpr() {
-  if (IsPrefixOperator(CurrentToken()) || IsIncrementOperator(CurrentToken()) ||
-      IsAwaitKeyword()) {
-    ConsumeToken();
-    SkipUnaryExpr();
-  } else {
-    SkipPostfixExpr();
-  }
-}
-
-void Parser::SkipBinaryExpr() {
-  SkipUnaryExpr();
-  const int min_prec = Token::Precedence(Token::kIFNULL);
-  const int max_prec = Token::Precedence(Token::kMUL);
-  while (((min_prec <= Token::Precedence(CurrentToken())) &&
-          (Token::Precedence(CurrentToken()) <= max_prec))) {
-    if (CurrentToken() == Token::kIS) {
-      ConsumeToken();
-      if (CurrentToken() == Token::kNOT) {
-        ConsumeToken();
-      }
-      SkipTypeOrFunctionType(false);
-    } else if (CurrentToken() == Token::kAS) {
-      ConsumeToken();
-      SkipTypeOrFunctionType(false);
-    } else {
-      ConsumeToken();
-      SkipUnaryExpr();
-    }
-  }
-}
-
-void Parser::SkipConditionalExpr() {
-  SkipBinaryExpr();
-  if (CurrentToken() == Token::kCONDITIONAL) {
-    ConsumeToken();
-    SkipExpr();
-    ExpectToken(Token::kCOLON);
-    SkipExpr();
-  }
-}
-
-void Parser::SkipExpr() {
-  while (CurrentToken() == Token::kTHROW) {
-    ConsumeToken();
-  }
-  SkipConditionalExpr();
-  if (CurrentToken() == Token::kCASCADE) {
-    SkipSelectors();
-  }
-  if (Token::IsAssignmentOperator(CurrentToken())) {
-    ConsumeToken();
-    SkipExpr();
-  }
-}
-
-void Parser::SkipNestedExpr() {
-  const bool saved_mode = SetAllowFunctionLiterals(true);
-  SkipExpr();
-  SetAllowFunctionLiterals(saved_mode);
-}
-
-void Parser::SkipQualIdent() {
-  ASSERT(IsIdentifier());
-  ConsumeToken();
-  if (CurrentToken() == Token::kPERIOD) {
-    ConsumeToken();  // Consume the kPERIOD token.
-    ExpectIdentifier("identifier expected after '.'");
-  }
-}
-
-}  // namespace dart
-
-#else  // DART_PRECOMPILED_RUNTIME
-
-namespace dart {
-
-void ParsedFunction::AddToGuardedFields(const Field* field) const {
-  UNREACHABLE();
-}
-
-kernel::ScopeBuildingResult* ParsedFunction::EnsureKernelScopes() {
-  UNREACHABLE();
-  return NULL;
-}
-
-LocalVariable* ParsedFunction::EnsureExpressionTemp() {
-  UNREACHABLE();
-  return NULL;
-}
-
-void ParsedFunction::SetNodeSequence(SequenceNode* node_sequence) {
-  UNREACHABLE();
-}
-
-void ParsedFunction::SetRegExpCompileData(
-    RegExpCompileData* regexp_compile_data) {
-  UNREACHABLE();
-}
-
-void ParsedFunction::AllocateVariables() {
-  UNREACHABLE();
-}
-
-void ParsedFunction::AllocateIrregexpVariables(intptr_t num_stack_locals) {
-  UNREACHABLE();
-}
-
-void ParsedFunction::Bailout(const char* origin, const char* reason) const {
-  UNREACHABLE();
-}
-
 void Parser::ParseCompilationUnit(const Library& library,
                                   const Script& script) {
   UNREACHABLE();
@@ -14911,12 +370,6 @@
   return NULL;
 }
 
-void Parser::InsertCachedConstantValue(const Script& script,
-                                       TokenPosition token_pos,
-                                       const Instance& value) {
-  UNREACHABLE();
-}
-
 ArgumentListNode* Parser::BuildNoSuchMethodArguments(
     TokenPosition call_pos,
     const String& function_name,
@@ -14927,12 +380,6 @@
   return NULL;
 }
 
-bool Parser::FieldHasFunctionLiteralInitializer(const Field& field,
-                                                TokenPosition* start,
-                                                TokenPosition* end) {
-  UNREACHABLE();
-  return false;
-}
 
 }  // namespace dart
 
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 712e5c3..d419238 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -286,13 +286,6 @@
 
   static void ParseFunction(ParsedFunction* parsed_function);
 
-  // Return true if |field| has a function literal initializer.
-  // When true is returned, |start| and |end| will hold the token
-  // range of the function literal.
-  static bool FieldHasFunctionLiteralInitializer(const Field& field,
-                                                 TokenPosition* start,
-                                                 TokenPosition* end);
-
   // Parse and evaluate the metadata expressions at token_pos in the
   // class namespace of class cls (which can be the implicit toplevel
   // class if the metadata is at the top-level).
@@ -323,308 +316,6 @@
  private:
   friend class EffectGraphVisitor;  // For BuildNoSuchMethodArguments.
 
-  struct Block;
-  class TryStack;
-  class TokenPosScope;
-
-  Parser(const Script& script, const Library& library, TokenPosition token_pos);
-  Parser(const Script& script,
-         ParsedFunction* function,
-         TokenPosition token_pos);
-  ~Parser();
-
-  // The function for which we will generate code.
-  const Function& current_function() const;
-
-  // The innermost function being parsed.
-  const Function& innermost_function() const;
-
-  // Note that a local function may be parsed multiple times. It is first parsed
-  // when its outermost enclosing function is being parsed. It is then parsed
-  // again when an enclosing function calls this local function or calls
-  // another local function enclosing it. Code for the local function will only
-  // be generated the last time the local function is parsed, i.e. when it is
-  // invoked. For example, a local function nested in another local function,
-  // itself nested in a static function, is parsed 3 times (unless it does not
-  // end up being invoked).
-  // Now, current_function() always points to the outermost function being
-  // compiled (i.e. the function that is being invoked), and is not updated
-  // while parsing a nested function of that outermost function.
-  // Therefore, the statements being parsed may or may not belong to the body
-  // of the current_function(); they may belong to nested functions.
-  // innermost_function() is the function that is currently being parsed.
-  // It is either the same as current_function(), or a lexically nested
-  // function.
-  // The function level of the current parsing scope reflects the function
-  // nesting. The function level is zero while parsing the body of the
-  // current_function(), but is greater than zero while parsing the body of
-  // local functions nested in current_function().
-
-  // FunctionLevel is 0 when parsing code of current_function(), and denotes
-  // the relative nesting level when parsing a nested function.
-  int FunctionLevel() const;
-
-  // The class being parsed.
-  const Class& current_class() const;
-  void set_current_class(const Class& value);
-
-  // ParsedFunction accessor.
-  ParsedFunction* parsed_function() const { return parsed_function_; }
-
-  const Script& script() const { return script_; }
-  void SetScript(const Script& script, TokenPosition token_pos);
-
-  const Library& library() const { return library_; }
-  void set_library(const Library& value) const { library_ = value.raw(); }
-
-  // Parsing a library or a regular source script.
-  bool is_library_source() const {
-    return (script_.kind() == RawScript::kScriptTag) ||
-           (script_.kind() == RawScript::kLibraryTag);
-  }
-
-  bool is_part_source() const {
-    return script_.kind() == RawScript::kSourceTag;
-  }
-
-  // Parsing library patch script.
-  bool is_patch_source() const {
-    return script_.kind() == RawScript::kPatchTag;
-  }
-
-  TokenPosition TokenPos() const { return tokens_iterator_.CurrentPosition(); }
-  TokenPosition PrevTokenPos() const { return prev_token_pos_; }
-
-  Token::Kind CurrentToken() {
-    if (token_kind_ == Token::kILLEGAL) {
-      ComputeCurrentToken();
-    }
-    return token_kind_;
-  }
-
-  void ComputeCurrentToken();
-
-  RawLibraryPrefix* ParsePrefix();
-
-  Token::Kind LookaheadToken(int num_tokens);
-  String* CurrentLiteral() const;
-  RawDouble* CurrentDoubleLiteral() const;
-  RawInteger* CurrentIntegerLiteral() const;
-
-  // Sets parser to given token position in the stream.
-  void SetPosition(TokenPosition position);
-
-  void ConsumeToken() {
-    // Reset cache and advance the token.
-    prev_token_pos_ = tokens_iterator_.CurrentPosition();
-    token_kind_ = Token::kILLEGAL;
-    tokens_iterator_.Advance();
-    INC_STAT(thread(), num_tokens_consumed, 1);
-  }
-  void ConsumeRightAngleBracket();
-  void CheckToken(Token::Kind token_expected, const char* msg = NULL);
-  void ExpectToken(Token::Kind token_expected);
-  void ExpectSemicolon();
-  void UnexpectedToken();
-  String* ExpectUserDefinedTypeIdentifier(const char* msg);
-  String* ExpectIdentifier(const char* msg);
-  bool IsAwaitKeyword();
-  bool IsYieldKeyword();
-
-  void SkipIf(Token::Kind);
-  void SkipToMatching();
-  void SkipToMatchingParenthesis();
-  void SkipBlock();
-  void SkipOneMetadata();
-  TokenPosition SkipMetadata();
-  bool IsPatchAnnotation(TokenPosition pos);
-  bool IsPragmaAnnotation(TokenPosition pos);
-  void SkipTypeArguments();
-  void SkipTypeParameters();
-  void SkipType(bool allow_void);
-  void SkipTypeOrFunctionType(bool allow_void);
-  void SkipInitializers();
-  void SkipExpr();
-  void SkipNestedExpr();
-  void SkipConditionalExpr();
-  void SkipBinaryExpr();
-  void SkipUnaryExpr();
-  void SkipPostfixExpr();
-  void SkipSelectors();
-  void SkipPrimary();
-  void SkipCompoundLiteral();
-  void SkipSymbolLiteral();
-  void SkipNewOperator();
-  void SkipActualParameters();
-  void SkipMapLiteral();
-  void SkipListLiteral();
-  void SkipFunctionLiteral();
-  void SkipStringLiteral();
-  void SkipQualIdent();
-  void SkipFunctionPreamble();
-
-  AstNode* DartPrint(const char* str);
-
-  void CheckConstructorCallTypeArguments(TokenPosition pos,
-                                         const Function& constructor,
-                                         const TypeArguments& type_arguments);
-
-  // Report already formatted error.
-  static void ReportError(const Error& error);
-
-  // Concatenate and report an already formatted error and a new error message.
-  static void ReportErrors(const Error& prev_error,
-                           const Script& script,
-                           TokenPosition token_pos,
-                           const char* format,
-                           ...) PRINTF_ATTRIBUTE(4, 5);
-
-  // Report error message at location of current token in current script.
-  void ReportError(const char* msg, ...) const PRINTF_ATTRIBUTE(2, 3);
-
-  void ReportErrorBefore(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
-
-  // Report error message at given location in current script.
-  void ReportError(TokenPosition token_pos, const char* msg, ...) const
-      PRINTF_ATTRIBUTE(3, 4);
-
-  // Report warning message at location of current token in current script.
-  void ReportWarning(const char* msg, ...) const PRINTF_ATTRIBUTE(2, 3);
-
-  // Report warning message at given location in current script.
-  void ReportWarning(TokenPosition token_pos, const char* msg, ...) const
-      PRINTF_ATTRIBUTE(3, 4);
-
-  void CheckRecursiveInvocation();
-
-  const Instance& EvaluateConstExpr(TokenPosition expr_pos, AstNode* expr);
-  StaticGetterNode* RunStaticFieldInitializer(const Field& field,
-                                              TokenPosition field_ref_pos);
-  RawObject* EvaluateConstConstructorCall(
-      const Class& type_class,
-      const TypeArguments& type_arguments,
-      const Function& constructor,
-      ArgumentListNode* arguments,
-      bool obfuscate_symbol_instances = true);
-  LiteralNode* FoldConstExpr(TokenPosition expr_pos, AstNode* expr);
-
-  // Support for parsing of scripts.
-  void ParseTopLevel();
-  void ParseEnumDeclaration(const GrowableObjectArray& pending_classes,
-                            const Object& tl_owner,
-                            TokenPosition metadata_pos);
-  void ParseEnumDefinition(const Class& cls);
-  void ParseClassDeclaration(const GrowableObjectArray& pending_classes,
-                             const Object& tl_owner,
-                             TokenPosition metadata_pos);
-  void ParseClassDefinition(const Class& cls);
-  void ParseMixinAppAlias(const GrowableObjectArray& pending_classes,
-                          const Object& tl_owner,
-                          TokenPosition metadata_pos);
-  void ParseTypedef(const GrowableObjectArray& pending_classes,
-                    const Object& tl_owner,
-                    TokenPosition metadata_pos);
-  void ParseTopLevelVariable(TopLevel* top_level,
-                             const Object& owner,
-                             TokenPosition metadata_pos);
-  void ParseTopLevelFunction(TopLevel* top_level,
-                             const Object& owner,
-                             TokenPosition metadata_pos);
-  void ParseTopLevelAccessor(TopLevel* top_level,
-                             const Object& owner,
-                             TokenPosition metadata_pos);
-  RawArray* EvaluateMetadata();
-
-  RawFunction::AsyncModifier ParseFunctionModifier();
-
-  // Support for parsing libraries.
-  RawObject* CallLibraryTagHandler(Dart_LibraryTag tag,
-                                   TokenPosition token_pos,
-                                   const String& url);
-  void ParseIdentList(GrowableObjectArray* names);
-  void ParseLibraryDefinition(const Object& tl_owner);
-  void ParseLibraryName();
-  void ParseLibraryImportExport(const Object& tl_owner,
-                                TokenPosition metadata_pos);
-  void ParseLibraryPart();
-  void ParsePartHeader();
-  void ParseLibraryNameObsoleteSyntax();
-  void ParseLibraryImportObsoleteSyntax();
-  void ParseLibraryIncludeObsoleteSyntax();
-
-  void ResolveSignatureTypeParameters(const Function& signature);
-  void ResolveTypeParameters(AbstractType* type);
-  RawAbstractType* CanonicalizeType(const AbstractType& type);
-  RawAbstractType* ParseType(ClassFinalizer::FinalizationKind finalization,
-                             bool allow_deferred_type = false,
-                             bool consume_unresolved_prefix = true);
-  RawAbstractType* ParseType(ClassFinalizer::FinalizationKind finalization,
-                             bool allow_deferred_type,
-                             bool consume_unresolved_prefix,
-                             LibraryPrefix* prefix);
-  RawType* ParseFunctionType(const AbstractType& result_type,
-                             ClassFinalizer::FinalizationKind finalization);
-  RawAbstractType* ParseTypeOrFunctionType(
-      bool allow_void,
-      ClassFinalizer::FinalizationKind finalization);
-  void ParseTypeParameters(bool parameterizing_class);
-  RawTypeArguments* ParseTypeArguments(
-      ClassFinalizer::FinalizationKind finalization);
-  void ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method);
-  void ParseFieldDefinition(ClassDesc* members, MemberDesc* field);
-  void CheckMemberNameConflict(ClassDesc* members, MemberDesc* member);
-  void ParseClassMemberDefinition(ClassDesc* members,
-                                  TokenPosition metadata_pos);
-  void CheckFinalInitializationConflicts(const ClassDesc* class_desc,
-                                         const MemberDesc* member);
-  void ParseParameterType(ParamList* params);
-  void ParseFormalParameter(bool allow_explicit_default_value,
-                            bool evaluate_metadata,
-                            ParamList* params);
-  void ParseFormalParameters(bool use_function_type_syntax,
-                             bool allow_explicit_default_values,
-                             bool evaluate_metadata,
-                             ParamList* params);
-  void ParseFormalParameterList(bool use_function_type_syntax,
-                                bool allow_explicit_default_values,
-                                bool evaluate_metadata,
-                                ParamList* params);
-  void CheckFieldsInitialized(const Class& cls);
-  void AddImplicitConstructor(const Class& cls);
-  void CheckConstructors(ClassDesc* members);
-  AstNode* ParseExternalInitializedField(const Field& field);
-  void ParseInitializedInstanceFields(
-      const Class& cls,
-      LocalVariable* receiver,
-      GrowableArray<Field*>* initialized_fields);
-  AstNode* CheckDuplicateFieldInit(TokenPosition init_pos,
-                                   GrowableArray<Field*>* initialized_fields,
-                                   AstNode* instance,
-                                   Field* field,
-                                   AstNode* init_value);
-  StaticCallNode* GenerateSuperConstructorCall(
-      const Class& cls,
-      TokenPosition supercall_pos,
-      LocalVariable* receiver,
-      ArgumentListNode* forwarding_args);
-  StaticCallNode* ParseSuperInitializer(const Class& cls,
-                                        LocalVariable* receiver);
-  AstNode* ParseInitializer(const Class& cls,
-                            LocalVariable* receiver,
-                            GrowableArray<Field*>* initialized_fields);
-  void ParseConstructorRedirection(const Class& cls, LocalVariable* receiver);
-  void ParseInitializers(const Class& cls,
-                         LocalVariable* receiver,
-                         GrowableArray<Field*>* initialized_fields);
-  String& ParseNativeDeclaration();
-  void ParseInterfaceList(const Class& cls);
-  RawAbstractType* ParseMixins(const AbstractType& super_type);
-  static StaticCallNode* BuildInvocationMirrorAllocation(
-      TokenPosition call_pos,
-      const String& function_name,
-      const ArgumentListNode& function_args,
-      const LocalVariable* temp,
-      bool is_super_invocation);
   // Build arguments for a NoSuchMethodCall. If LocalVariable temp is not NULL,
   // the last argument is stored in temp.
   static ArgumentListNode* BuildNoSuchMethodArguments(
@@ -633,409 +324,6 @@
       const ArgumentListNode& function_args,
       const LocalVariable* temp,
       bool is_super_invocation);
-  RawFunction* GetSuperFunction(TokenPosition token_pos,
-                                const String& name,
-                                ArgumentListNode* arguments,
-                                bool resolve_getter,
-                                bool* is_no_such_method);
-  AstNode* ParseSuperCall(const String& function_name,
-                          const TypeArguments& func_type_args);
-  AstNode* ParseSuperFieldAccess(const String& field_name,
-                                 TokenPosition field_pos);
-  AstNode* ParseSuperOperator();
-  AstNode* BuildUnarySuperOperator(Token::Kind op, PrimaryNode* super);
-
-  static bool ParseFormalParameters(const Function& func, ParamList* params);
-
-  void SetupDefaultsForOptionalParams(const ParamList& params);
-  ClosureNode* CreateImplicitClosureNode(const Function& func,
-                                         TokenPosition token_pos,
-                                         AstNode* receiver);
-  void FinalizeFormalParameterTypes(const ParamList* params);
-  void AddFormalParamsToFunction(const ParamList* params, const Function& func);
-  void AddFormalParamsToScope(const ParamList* params, LocalScope* scope);
-
-  SequenceNode* ParseConstructor(const Function& func);
-  SequenceNode* ParseFunc(const Function& func, bool check_semicolon);
-
-  void ParseNativeFunctionBlock(const ParamList* params, const Function& func);
-
-  SequenceNode* ParseInstanceGetter(const Function& func);
-  SequenceNode* ParseInstanceSetter(const Function& func);
-  SequenceNode* ParseStaticFinalGetter(const Function& func);
-  SequenceNode* ParseStaticInitializer();
-  SequenceNode* ParseMethodExtractor(const Function& func);
-  SequenceNode* ParseNoSuchMethodDispatcher(const Function& func);
-  SequenceNode* ParseInvokeFieldDispatcher(const Function& func);
-  SequenceNode* ParseImplicitClosure(const Function& func);
-
-  void BuildDispatcherScope(const Function& func,
-                            const ArgumentsDescriptor& desc);
-
-  void EnsureHasReturnStatement(SequenceNode* seq, TokenPosition return_pos);
-  void ChainNewBlock(LocalScope* outer_scope);
-  void OpenBlock();
-  void OpenLoopBlock();
-  void OpenFunctionBlock(const Function& func);
-  void OpenAsyncClosure();
-  RawFunction* OpenAsyncFunction(TokenPosition formal_param_pos);
-  RawFunction* OpenSyncGeneratorFunction(TokenPosition func_pos);
-  SequenceNode* CloseSyncGenFunction(const Function& closure,
-                                     SequenceNode* closure_node);
-  void AddSyncGenClosureParameters(ParamList* params);
-  void AddAsyncGenClosureParameters(ParamList* params);
-
-  // Support for async* functions.
-  RawFunction* OpenAsyncGeneratorFunction(TokenPosition func_pos);
-  SequenceNode* CloseAsyncGeneratorFunction(const Function& closure,
-                                            SequenceNode* closure_node);
-  void OpenAsyncGeneratorClosure();
-  SequenceNode* CloseAsyncGeneratorClosure(SequenceNode* body);
-
-  void OpenAsyncTryBlock();
-  SequenceNode* CloseBlock();
-  SequenceNode* CloseAsyncFunction(const Function& closure,
-                                   SequenceNode* closure_node);
-
-  SequenceNode* CloseAsyncClosure(SequenceNode* body,
-                                  TokenPosition func_end_pos);
-  SequenceNode* CloseAsyncTryBlock(SequenceNode* try_block,
-                                   TokenPosition func_end_pos);
-  SequenceNode* CloseAsyncGeneratorTryBlock(SequenceNode* body);
-
-  void AddAsyncClosureParameters(ParamList* params);
-  void AddContinuationVariables();
-  void AddAsyncClosureVariables();
-  void AddAsyncGeneratorVariables();
-
-  LocalVariable* LookupReceiver(LocalScope* from_scope, bool test_only);
-  LocalVariable* LookupTypeArgumentsParameter(LocalScope* from_scope,
-                                              bool test_only);
-  void CaptureInstantiator();
-  void CaptureFunctionTypeArguments();
-  void CaptureAllInstantiators();
-  AstNode* LoadReceiver(TokenPosition token_pos);
-  AstNode* LoadFieldIfUnresolved(AstNode* node);
-  AstNode* LoadClosure(PrimaryNode* primary);
-  AstNode* LoadTypeParameter(PrimaryNode* primary);
-  InstanceGetterNode* CallGetter(TokenPosition token_pos,
-                                 AstNode* object,
-                                 const String& name);
-
-  AstNode* ParseAssertStatement(bool is_const = false);
-  AstNode* ParseJump(String* label_name);
-  AstNode* ParseIfStatement(String* label_name);
-  AstNode* ParseWhileStatement(String* label_name);
-  AstNode* ParseDoWhileStatement(String* label_name);
-  AstNode* ParseForStatement(String* label_name);
-  AstNode* ParseAwaitForStatement(String* label_name);
-  AstNode* ParseForInStatement(TokenPosition forin_pos, SourceLabel* label);
-  RawClass* CheckCaseExpressions(const GrowableArray<LiteralNode*>& values);
-  CaseNode* ParseCaseClause(LocalVariable* switch_expr_value,
-                            GrowableArray<LiteralNode*>* case_expr_values,
-                            SourceLabel* case_label);
-  AstNode* ParseSwitchStatement(String* label_name);
-
-  // try/catch/finally parsing.
-  void AddCatchParamsToScope(CatchParamDesc* exception_param,
-                             CatchParamDesc* stack_trace_param,
-                             LocalScope* scope);
-  void SetupExceptionVariables(LocalScope* try_scope,
-                               bool is_async,
-                               LocalVariable** context_var,
-                               LocalVariable** exception_var,
-                               LocalVariable** stack_trace_var,
-                               LocalVariable** saved_exception_var,
-                               LocalVariable** saved_stack_trace_var);
-  void SaveExceptionAndStackTrace(SequenceNode* statements,
-                                  LocalVariable* exception_var,
-                                  LocalVariable* stack_trace_var,
-                                  LocalVariable* saved_exception_var,
-                                  LocalVariable* saved_stack_trace_var);
-  // Parse all the catch clause of a try.
-  SequenceNode* ParseCatchClauses(TokenPosition handler_pos,
-                                  bool is_async,
-                                  LocalVariable* exception_var,
-                                  LocalVariable* stack_trace_var,
-                                  LocalVariable* rethrow_exception_var,
-                                  LocalVariable* rethrow_stack_trace_var,
-                                  const GrowableObjectArray& handler_types,
-                                  bool* needs_stack_trace);
-  // Parse or generate a finally clause.
-  SequenceNode* EnsureFinallyClause(bool parse,
-                                    bool is_async,
-                                    LocalVariable* exception_var,
-                                    LocalVariable* stack_trace_var,
-                                    LocalVariable* rethrow_exception_var,
-                                    LocalVariable* rethrow_stack_trace_var);
-  // Push try block onto the stack of try blocks in scope.
-  void PushTry(Block* try_block);
-  // Pop the inner most try block from the stack.
-  TryStack* PopTry();
-  // Collect saved try context variables if await or yield is in try block.
-  void CheckAsyncOpInTryBlock(LocalVariable** saved_try_ctx,
-                              LocalVariable** async_saved_try_ctx,
-                              LocalVariable** outer_saved_try_ctx,
-                              LocalVariable** outer_async_saved_try_ctx) const;
-  // Add specified node to try block list so that it can be patched with
-  // inlined finally code if needed.
-  void AddNodeForFinallyInlining(AstNode* node);
-  void RemoveNodesForFinallyInlining(SourceLabel* label);
-  // Add the inlined finally clause to the specified node.
-  void AddFinallyClauseToNode(bool is_async,
-                              AstNode* node,
-                              InlinedFinallyNode* finally_clause);
-  AstNode* ParseTryStatement(String* label_name);
-  RawAbstractType* ParseConstFinalVarOrType(
-      ClassFinalizer::FinalizationKind finalization);
-  AstNode* ParseVariableDeclaration(const AbstractType& type,
-                                    bool is_final,
-                                    bool is_const,
-                                    SequenceNode** await_preamble);
-  AstNode* ParseVariableDeclarationList();
-  AstNode* ParseFunctionStatement(bool is_literal);
-  AstNode* ParseYieldStatement();
-  AstNode* ParseStatement();
-  SequenceNode* ParseNestedStatement(bool parsing_loop_body,
-                                     SourceLabel* label);
-  void ParseStatementSequence();
-  bool IsIdentifier();
-  bool IsSymbol(const String& symbol);
-  bool IsSimpleLiteral(const AbstractType& type, Instance* value);
-  bool IsFunctionTypeSymbol();
-  bool IsFunctionTypeAliasName(bool* use_function_type_syntax);
-  bool TryParseQualIdent();
-  bool TryParseTypeParameters();
-  bool TryParseTypeArguments();
-  bool IsTypeParameters();
-  bool IsArgumentPart();
-  bool IsParameterPart();
-  bool TryParseType(bool allow_void);
-  bool IsVariableDeclaration();
-  bool IsFunctionReturnType();
-  bool IsFunctionDeclaration();
-  bool IsFunctionLiteral();
-  bool IsForInStatement();
-  bool IsTopLevelAccessor();
-
-  AstNode* ParseBinaryExpr(int min_preced);
-  LiteralNode* ParseConstExpr();
-  static const bool kRequireConst = true;
-  static const bool kAllowConst = false;
-  static const bool kConsumeCascades = true;
-  static const bool kNoCascades = false;
-  AstNode* ParseAwaitableExpr(bool require_compiletime_const,
-                              bool consume_cascades,
-                              SequenceNode** await_preamble);
-  AstNode* ParseExpr(bool require_compiletime_const, bool consume_cascades);
-  AstNode* ParseAwaitableExprList();
-  AstNode* ParseConditionalExpr();
-  AstNode* ParseUnaryExpr();
-  AstNode* ParsePostfixExpr();
-  AstNode* ParseSelectors(AstNode* primary, bool is_cascade);
-  AstNode* ParseCascades(AstNode* expr);
-  AstNode* ParsePrimary();
-  AstNode* ParseStringLiteral(bool allow_interpolation);
-  String* ParseImportStringLiteral();
-  AstNode* ParseCompoundLiteral();
-  AstNode* ParseSymbolLiteral();
-  AstNode* ParseListLiteral(TokenPosition type_pos,
-                            bool is_const,
-                            const TypeArguments& type_arguments);
-  AstNode* ParseMapLiteral(TokenPosition type_pos,
-                           bool is_const,
-                           const TypeArguments& type_arguments);
-
-  AstNode* ParseNewOperator(Token::Kind op_kind);
-
-  // An implicit argument, if non-null, is prepended to the returned list.
-  ArgumentListNode* ParseActualParameters(ArgumentListNode* implicit_arguments,
-                                          const TypeArguments& func_type_args,
-                                          bool require_const);
-  AstNode* ParseStaticCall(const Class& cls,
-                           const String& method_name,
-                           TokenPosition ident_pos,
-                           const TypeArguments& func_type_args,
-                           const LibraryPrefix* prefix = NULL);
-  AstNode* ParseInstanceCall(AstNode* receiver,
-                             const String& method_name,
-                             TokenPosition ident_pos,
-                             const TypeArguments& func_type_args,
-                             bool is_conditional);
-  AstNode* ParseClosureCall(AstNode* closure,
-                            const TypeArguments& func_type_args);
-  AstNode* GenerateStaticFieldLookup(const Field& field,
-                                     TokenPosition ident_pos);
-  AstNode* GenerateStaticFieldAccess(const Class& cls,
-                                     const String& field_name,
-                                     TokenPosition ident_pos);
-
-  LocalVariable* LookupLocalScope(const String& ident);
-  void CheckInstanceFieldAccess(TokenPosition field_pos,
-                                const String& field_name);
-  bool ParsingStaticMember() const;
-  bool GetFunctionLiteralInitializerRange(const Field& field,
-                                          TokenPosition* start,
-                                          TokenPosition* end);
-  const AbstractType* ReceiverType(const Class& cls);
-  bool IsInstantiatorRequired() const;
-  bool InGenericFunctionScope() const;
-  bool ResolveIdentInLocalScope(TokenPosition ident_pos,
-                                const String& ident,
-                                AstNode** node,
-                                intptr_t* function_level);
-  static const bool kResolveLocally = true;
-  static const bool kResolveIncludingImports = false;
-
-  // Resolve a primary identifier in the library or prefix scope and
-  // generate the corresponding AstNode.
-  AstNode* ResolveIdentInCurrentLibraryScope(TokenPosition ident_pos,
-                                             const String& ident);
-  AstNode* ResolveIdentInPrefixScope(TokenPosition ident_pos,
-                                     const LibraryPrefix& prefix,
-                                     const String& ident);
-
-  AstNode* ResolveIdent(TokenPosition ident_pos,
-                        const String& ident,
-                        bool allow_closure_names);
-  RawString* ResolveImportVar(TokenPosition ident_pos, const String& ident);
-  AstNode* OptimizeBinaryOpNode(TokenPosition op_pos,
-                                Token::Kind binary_op,
-                                AstNode* lhs,
-                                AstNode* rhs);
-  AstNode* ExpandAssignableOp(TokenPosition op_pos,
-                              Token::Kind assignment_op,
-                              AstNode* lhs,
-                              AstNode* rhs);
-  LetNode* PrepareCompoundAssignmentNodes(AstNode** expr);
-  LocalVariable* CreateTempConstVariable(TokenPosition token_pos,
-                                         const char* s);
-
-  static SequenceNode* NodeAsSequenceNode(TokenPosition sequence_pos,
-                                          AstNode* node,
-                                          LocalScope* scope);
-
-  SequenceNode* MakeImplicitConstructor(const Function& func);
-  AstNode* MakeStaticCall(const String& cls_name,
-                          const String& func_name,
-                          ArgumentListNode* arguments);
-  String& Interpolate(const GrowableArray<AstNode*>& values);
-  AstNode* ThrowTypeError(TokenPosition type_pos,
-                          const AbstractType& type,
-                          LibraryPrefix* prefix = NULL);
-  AstNode* ThrowNoSuchMethodError(TokenPosition call_pos,
-                                  const Class& cls,
-                                  const String& function_name,
-                                  ArgumentListNode* function_arguments,
-                                  InvocationMirror::Level level,
-                                  InvocationMirror::Kind kind,
-                                  const Function* func,
-                                  const LibraryPrefix* prefix = NULL);
-
-  void SetupSavedTryContext(LocalVariable* saved_try_context);
-
-  void CheckOperatorArity(const MemberDesc& member);
-
-  void EnsureExpressionTemp();
-  bool IsLegalAssignableSyntax(AstNode* expr, TokenPosition end_pos);
-  AstNode* CreateAssignmentNode(AstNode* original,
-                                AstNode* rhs,
-                                const String* left_ident,
-                                TokenPosition left_pos,
-                                bool is_compound = false);
-
-  ConstructorCallNode* CreateConstructorCallNode(
-      TokenPosition token_pos,
-      const TypeArguments& type_arguments,
-      const Function& constructor,
-      ArgumentListNode* arguments);
-
-  void AddEqualityNullCheck();
-
-  AstNode* AddAsyncResultTypeCheck(TokenPosition expr_pos, AstNode* expr);
-
-  AstNode* BuildClosureCall(TokenPosition token_pos,
-                            AstNode* closure,
-                            ArgumentListNode* arguments);
-
-  RawInstance* TryCanonicalize(const Instance& instance,
-                               TokenPosition token_pos);
-  void CacheConstantValue(TokenPosition token_pos, const Instance& value);
-  bool GetCachedConstant(TokenPosition token_pos, Instance* value);
-
-  Thread* thread() const { return thread_; }
-  Isolate* isolate() const { return isolate_; }
-  Zone* zone() const { return thread_->zone(); }
-
-  Thread* thread_;    // Cached current thread.
-  Isolate* isolate_;  // Cached current isolate.
-
-  // It is Heap::kNew for mutator thread and Heap::kOld for other threads (e.g.
-  // background compiler).
-  Heap::Space allocation_space_;
-
-  Script& script_;
-  TokenStream::Iterator tokens_iterator_;
-  Token::Kind token_kind_;  // Cached token kind for current token.
-  TokenPosition prev_token_pos_;
-  Block* current_block_;
-
-  // is_top_level_ is true if parsing the "top level" of a compilation unit,
-  // that is class definitions, function type aliases, global functions,
-  // global variables.
-  bool is_top_level_;
-
-  // await_is_keyword_ is true if we are parsing an async or generator
-  // function. In this context the identifiers await, async and yield
-  // are treated as keywords.
-  bool await_is_keyword_;
-
-  // The member currently being parsed during "top level" parsing.
-  MemberDesc* current_member_;
-
-  // Parser mode to allow/disallow function literals. This is used in
-  // constructor initializer expressions to handle ambiguous grammar.
-  bool SetAllowFunctionLiterals(bool value);
-  bool allow_function_literals_;
-
-  // The function currently being compiled.
-  ParsedFunction* parsed_function_;
-
-  // The function currently being parsed.
-  Function& innermost_function_;
-
-  // Current literal token.
-  LiteralToken& literal_token_;
-
-  // The class currently being parsed, or the owner class of the
-  // function currently being parsed. It is used for primary identifier lookups.
-  Class& current_class_;
-
-  // The current library (and thus class dictionary) used to resolve names.
-  // When parsing a function, this is the library in which the function
-  // is defined. This can be the library in which the current_class_ is
-  // defined, or the library of a mixin class where the function originates.
-  Library& library_;
-
-  // Stack of try blocks in scope, this is used to generate inlined finally
-  // code at all points in the try block where an exit from the block is
-  // done using 'return', 'break' or 'continue' statements.
-  TryStack* try_stack_;
-
-  // Each try in this function gets its own try index.
-  int16_t AllocateTryIndex();
-
-  int16_t last_used_try_index_;
-
-  bool unregister_pending_function_;
-
-  LocalScope* async_temp_scope_;
-
-  // Indentation of parser trace.
-  intptr_t trace_indent_;
-
-  intptr_t recursion_counter_;
-  friend class RecursionChecker;
 
   DISALLOW_COPY_AND_ASSIGN(Parser);
 };
diff --git a/runtime/vm/port.cc b/runtime/vm/port.cc
index 27ee26d..a057379 100644
--- a/runtime/vm/port.cc
+++ b/runtime/vm/port.cc
@@ -276,20 +276,43 @@
   return handler->isolate();
 }
 
-void PortMap::InitOnce() {
-  mutex_ = new Mutex();
+void PortMap::Init() {
+  if (mutex_ == NULL) {
+    mutex_ = new Mutex();
+  }
+  ASSERT(mutex_ != NULL);
   prng_ = new Random();
 
   static const intptr_t kInitialCapacity = 8;
   // TODO(iposva): Verify whether we want to keep exponentially growing.
   ASSERT(Utils::IsPowerOfTwo(kInitialCapacity));
-  map_ = new Entry[kInitialCapacity];
-  memset(map_, 0, kInitialCapacity * sizeof(Entry));
-  capacity_ = kInitialCapacity;
+  if (map_ == NULL) {
+    // TODO(bkonyi): don't keep map_ after Dart_Cleanup.
+    map_ = new Entry[kInitialCapacity];
+    capacity_ = kInitialCapacity;
+  }
+  memset(map_, 0, capacity_ * sizeof(Entry));
   used_ = 0;
   deleted_ = 0;
 }
 
+void PortMap::Cleanup() {
+  ASSERT(map_ != NULL);
+  ASSERT(prng_ != NULL);
+  for (intptr_t i = 0; i < capacity_; ++i) {
+    auto handler = map_[i].handler;
+    if (handler != NULL && handler != deleted_entry_) {
+      ClosePorts(handler);
+      delete handler;
+    }
+  }
+  delete prng_;
+  prng_ = NULL;
+  // TODO(bkonyi): find out why deleting map_ sometimes causes crashes.
+  // delete[] map_;
+  // map_ = NULL;
+}
+
 void PortMap::PrintPortsForMessageHandler(MessageHandler* handler,
                                           JSONStream* stream) {
 #ifndef PRODUCT
diff --git a/runtime/vm/port.h b/runtime/vm/port.h
index 113562e..d307e43 100644
--- a/runtime/vm/port.h
+++ b/runtime/vm/port.h
@@ -54,7 +54,8 @@
   // Returns the owning Isolate for port 'id'.
   static Isolate* GetIsolate(Dart_Port id);
 
-  static void InitOnce();
+  static void Init();
+  static void Cleanup();
 
   static void PrintPortsForMessageHandler(MessageHandler* handler,
                                           JSONStream* stream);
diff --git a/runtime/vm/proccpuinfo.cc b/runtime/vm/proccpuinfo.cc
index e74175e..3dfb2cb 100644
--- a/runtime/vm/proccpuinfo.cc
+++ b/runtime/vm/proccpuinfo.cc
@@ -17,7 +17,7 @@
 char* ProcCpuInfo::data_ = NULL;
 intptr_t ProcCpuInfo::datalen_ = 0;
 
-void ProcCpuInfo::InitOnce() {
+void ProcCpuInfo::Init() {
   // Get the size of the cpuinfo file by reading it until the end. This is
   // required because files under /proc do not always return a valid size
   // when using fseek(0, SEEK_END) + ftell(). Nor can they be mmap()-ed.
diff --git a/runtime/vm/proccpuinfo.h b/runtime/vm/proccpuinfo.h
index ee57e2c..02ee2bf 100644
--- a/runtime/vm/proccpuinfo.h
+++ b/runtime/vm/proccpuinfo.h
@@ -14,7 +14,7 @@
 
 class ProcCpuInfo : public AllStatic {
  public:
-  static void InitOnce();
+  static void Init();
   static void Cleanup();
   static bool FieldContains(const char* field, const char* search_string);
   static const char* ExtractField(const char* field);
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 7f424f3..3754ac1 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -63,11 +63,11 @@
 AllocationSampleBuffer* Profiler::allocation_sample_buffer_ = NULL;
 ProfilerCounters Profiler::counters_;
 
-void Profiler::InitOnce() {
+void Profiler::Init() {
   // Place some sane restrictions on user controlled flags.
   SetSamplePeriod(FLAG_profile_period);
   SetSampleDepth(FLAG_max_profile_depth);
-  Sample::InitOnce();
+  Sample::Init();
   if (!FLAG_profiler) {
     return;
   }
@@ -76,7 +76,7 @@
   Profiler::InitAllocationSampleBuffer();
   // Zero counters.
   memset(&counters_, 0, sizeof(counters_));
-  ThreadInterrupter::InitOnce();
+  ThreadInterrupter::Init();
   ThreadInterrupter::SetInterruptPeriod(FLAG_profile_period);
   ThreadInterrupter::Startup();
   initialized_ = true;
@@ -89,12 +89,12 @@
   }
 }
 
-void Profiler::Shutdown() {
+void Profiler::Cleanup() {
   if (!FLAG_profiler) {
     return;
   }
   ASSERT(initialized_);
-  ThreadInterrupter::Shutdown();
+  ThreadInterrupter::Cleanup();
 #if defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS) || defined(HOST_OS_ANDROID)
   // TODO(30309): Free the sample buffer on platforms that use a signal-based
   // thread interrupter.
@@ -128,7 +128,7 @@
 intptr_t Sample::pcs_length_ = 0;
 intptr_t Sample::instance_size_ = 0;
 
-void Sample::InitOnce() {
+void Sample::Init() {
   pcs_length_ = kSampleSize;
   instance_size_ = sizeof(Sample) + (sizeof(uword) * pcs_length_);  // NOLINT.
 }
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index b657c8d..951abed 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -50,9 +50,9 @@
 
 class Profiler : public AllStatic {
  public:
-  static void InitOnce();
+  static void Init();
   static void InitAllocationSampleBuffer();
-  static void Shutdown();
+  static void Cleanup();
 
   static void SetSampleDepth(intptr_t depth);
   static void SetSamplePeriod(intptr_t period);
@@ -353,7 +353,7 @@
     set_metadata(cid);
   }
 
-  static void InitOnce();
+  static void Init();
 
   static intptr_t instance_size() { return instance_size_; }
 
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index 881cc0d..af1a18a 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -196,7 +196,7 @@
 static void EnableProfiler() {
   if (!FLAG_profiler) {
     FLAG_profiler = true;
-    Profiler::InitOnce();
+    Profiler::Init();
   }
 }
 
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 41d4e2c..2dea940 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -488,6 +488,9 @@
 #else
   visitor->VisitPointers(raw_obj->from(), raw_obj->to_no_code());
 
+  visitor->VisitPointer(
+      reinterpret_cast<RawObject**>(&raw_obj->ptr()->bytecode_));
+
   if (ShouldVisitCode(raw_obj->ptr()->code_)) {
     visitor->VisitPointer(
         reinterpret_cast<RawObject**>(&raw_obj->ptr()->code_));
@@ -550,7 +553,8 @@
   for (intptr_t i = 0; i < length; ++i) {
     ObjectPool::EntryType entry_type =
         ObjectPool::TypeBits::decode(entry_bits[i]);
-    if (entry_type == ObjectPool::kTaggedObject) {
+    if ((entry_type == ObjectPool::kTaggedObject) ||
+        (entry_type == ObjectPool::kNativeEntryData)) {
       visitor->VisitPointer(&entries[i].raw_obj_);
     }
   }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index adc81d8..b8a4d7c 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -844,7 +844,6 @@
       case Snapshot::kFullAOT:
         return reinterpret_cast<RawObject**>(&ptr()->allocation_stub_);
       case Snapshot::kFull:
-      case Snapshot::kScript:
         return reinterpret_cast<RawObject**>(&ptr()->direct_subclasses_);
       case Snapshot::kFullJIT:
         return reinterpret_cast<RawObject**>(&ptr()->dependent_code_);
@@ -912,7 +911,6 @@
         return reinterpret_cast<RawObject**>(&ptr()->script_);
       case Snapshot::kFull:
       case Snapshot::kFullJIT:
-      case Snapshot::kScript:
         return reinterpret_cast<RawObject**>(&ptr()->library_kernel_data_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
@@ -990,7 +988,6 @@
       case Snapshot::kFullAOT:
       case Snapshot::kFull:
       case Snapshot::kFullJIT:
-      case Snapshot::kScript:
         return reinterpret_cast<RawObject**>(&ptr()->data_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
@@ -1121,7 +1118,6 @@
   RawObject** to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFull:
-      case Snapshot::kScript:
         return reinterpret_cast<RawObject**>(&ptr()->guarded_list_length_);
       case Snapshot::kFullJIT:
         return reinterpret_cast<RawObject**>(&ptr()->dependent_code_);
@@ -1217,7 +1213,6 @@
         return reinterpret_cast<RawObject**>(&ptr()->url_);
       case Snapshot::kFull:
       case Snapshot::kFullJIT:
-      case Snapshot::kScript:
         return reinterpret_cast<RawObject**>(&ptr()->tokens_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
@@ -1264,7 +1259,6 @@
         return reinterpret_cast<RawObject**>(&ptr()->load_error_);
       case Snapshot::kFull:
       case Snapshot::kFullJIT:
-      case Snapshot::kScript:
         return reinterpret_cast<RawObject**>(&ptr()->kernel_data_);
       case Snapshot::kMessage:
       case Snapshot::kNone:
@@ -1783,7 +1777,6 @@
       case Snapshot::kFullAOT:
         return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_);
       case Snapshot::kFull:
-      case Snapshot::kScript:
       case Snapshot::kFullJIT:
         return to();
       case Snapshot::kMessage:
@@ -1885,7 +1878,6 @@
   RawObject** to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFull:
-      case Snapshot::kScript:
       case Snapshot::kFullJIT:
         return reinterpret_cast<RawObject**>(&ptr()->imports_);
       case Snapshot::kFullAOT:
@@ -2094,6 +2086,7 @@
   ALIGN8 int64_t value_;
 
   friend class Api;
+  friend class Integer;
   friend class SnapshotReader;
 };
 COMPILE_ASSERT(sizeof(RawMint) == 16);
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 279d28e..24a6cd4 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -36,47 +36,7 @@
   ASSERT(reader != NULL);
 
   Class& cls = Class::ZoneHandle(reader->zone(), Class::null());
-  bool is_in_fullsnapshot = reader->Read<bool>();
-  if ((kind == Snapshot::kScript) && !is_in_fullsnapshot) {
-    // Read in the base information.
-    classid_t class_id = reader->ReadClassIDValue();
-
-    // Allocate class object of specified kind.
-    if (class_id < kNumPredefinedCids) {
-      ASSERT((class_id >= kInstanceCid) && (class_id <= kMirrorReferenceCid));
-      cls = reader->isolate()->class_table()->At(class_id);
-    } else {
-      cls = Class::NewInstanceClass();
-    }
-    reader->AddBackRef(object_id, &cls, kIsDeserialized);
-
-    // Set all non object fields.
-    if (!RawObject::IsInternalVMdefinedClassId(class_id)) {
-      // Instance size of a VM defined class is already set up.
-      cls.set_instance_size_in_words(reader->Read<int32_t>());
-      cls.set_next_field_offset_in_words(reader->Read<int32_t>());
-    }
-    cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>());
-    cls.set_num_type_arguments(reader->Read<int16_t>());
-    cls.set_has_pragma_and_num_own_type_arguments(reader->Read<int16_t>());
-    cls.set_num_native_fields(reader->Read<uint16_t>());
-    cls.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
-    cls.set_state_bits(reader->Read<uint16_t>());
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    cls.set_kernel_offset(reader->Read<int32_t>());
-#endif
-
-    // Set all the object fields.
-    READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to_snapshot(kind),
-                       kAsReference);
-    cls.StorePointer(&cls.raw_ptr()->dependent_code_, Array::null());
-    ASSERT(!cls.IsInFullSnapshot());
-    // Also sets instance size in class table.
-    reader->isolate()->class_table()->SetAt(cls.id(), cls.raw());
-  } else {
-    cls ^= reader->ReadClassId(object_id);
-    ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot());
-  }
+  cls ^= reader->ReadClassId(object_id);
   return cls.raw();
 }
 
@@ -85,7 +45,6 @@
                        Snapshot::Kind kind,
                        bool as_reference) {
   ASSERT(writer != NULL);
-  bool is_in_fullsnapshot = Class::IsInFullSnapshot(this);
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -94,47 +53,14 @@
   writer->WriteVMIsolateObject(kClassCid);
   writer->WriteTags(writer->GetObjectTags(this));
 
-  // Write out the boolean is_in_fullsnapshot first as this will
-  // help the reader decide how the rest of the information needs
-  // to be interpreted.
-  writer->Write<bool>(is_in_fullsnapshot);
-
-  if ((kind == Snapshot::kScript) && !is_in_fullsnapshot) {
-    // Write out all the non object pointer fields.
-    // NOTE: cpp_vtable_ is not written.
-    classid_t class_id = ptr()->id_;
-    ASSERT(class_id != kIllegalCid);
-    writer->Write<classid_t>(class_id);
-    if (!RawObject::IsInternalVMdefinedClassId(class_id)) {
-      // We don't write the instance size of VM defined classes as they
-      // are already setup during initialization as part of pre populating
-      // the class table.
-      writer->Write<int32_t>(ptr()->instance_size_in_words_);
-      writer->Write<int32_t>(ptr()->next_field_offset_in_words_);
-    }
-    writer->Write<int32_t>(ptr()->type_arguments_field_offset_in_words_);
-    writer->Write<uint16_t>(ptr()->num_type_arguments_);
-    writer->Write<uint16_t>(ptr()->has_pragma_and_num_own_type_arguments_);
-    writer->Write<uint16_t>(ptr()->num_native_fields_);
-    writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode());
-    writer->Write<uint16_t>(ptr()->state_bits_);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    writer->Write<int32_t>(ptr()->kernel_offset_);
-#endif
-
-    // Write out all the object pointer fields.
-    SnapshotWriterVisitor visitor(writer, kAsReference);
-    visitor.VisitPointers(from(), to_snapshot(kind));
+  if (writer->can_send_any_object() ||
+      writer->AllowObjectsInDartLibrary(ptr()->library_)) {
+    writer->WriteClassId(this);
   } else {
-    if (writer->can_send_any_object() ||
-        writer->AllowObjectsInDartLibrary(ptr()->library_)) {
-      writer->WriteClassId(this);
-    } else {
-      // We do not allow regular dart instances in isolate messages.
-      writer->SetWriteException(Exceptions::kArgument,
-                                "Illegal argument in isolate message"
-                                " : (object is a regular Dart Instance)");
-    }
+    // We do not allow regular dart instances in isolate messages.
+    writer->SetWriteException(Exceptions::kArgument,
+                              "Illegal argument in isolate message"
+                              " : (object is a regular Dart Instance)");
   }
 }
 
@@ -473,8 +399,8 @@
   // Read the length so that we can determine instance size to allocate.
   intptr_t len = reader->ReadSmiValue();
 
-  TypeArguments& type_arguments = TypeArguments::ZoneHandle(
-      reader->zone(), TypeArguments::New(len, HEAP_SPACE(kind)));
+  TypeArguments& type_arguments =
+      TypeArguments::ZoneHandle(reader->zone(), TypeArguments::New(len));
   bool is_canonical = RawObject::IsCanonical(tags);
   bool defer_canonicalization = is_canonical && (!Snapshot::IsFull(kind));
   reader->AddBackRef(object_id, &type_arguments, kIsDeserialized,
@@ -547,45 +473,15 @@
                                     intptr_t tags,
                                     Snapshot::Kind kind,
                                     bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Allocate function object.
-  PatchClass& cls = PatchClass::ZoneHandle(reader->zone(), PatchClass::New());
-  reader->AddBackRef(object_id, &cls, kIsDeserialized);
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  cls.set_library_kernel_offset(reader->Read<int32_t>());
-#endif
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to_snapshot(kind),
-                     kAsReference);
-
-  return cls.raw();
+  UNREACHABLE();
+  return PatchClass::null();
 }
 
 void RawPatchClass::WriteTo(SnapshotWriter* writer,
                             intptr_t object_id,
                             Snapshot::Kind kind,
                             bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kPatchClassCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  writer->Write<int32_t>(ptr()->library_kernel_offset_);
-#endif
-
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to_snapshot(kind));
+  UNREACHABLE();
 }
 
 RawClosure* Closure::ReadFrom(SnapshotReader* reader,
@@ -602,7 +498,7 @@
                          Snapshot::Kind kind,
                          bool as_reference) {
   ASSERT(writer != NULL);
-  ASSERT((kind == Snapshot::kMessage) || (kind == Snapshot::kScript));
+  ASSERT(kind == Snapshot::kMessage);
 
   // Check if closure is serializable, throw an exception otherwise.
   RawFunction* func = writer->IsSerializableClosure(this);
@@ -620,53 +516,15 @@
                                       intptr_t tags,
                                       Snapshot::Kind kind,
                                       bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Allocate closure data object.
-  ClosureData& data =
-      ClosureData::ZoneHandle(reader->zone(), ClosureData::New());
-  reader->AddBackRef(object_id, &data, kIsDeserialized);
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(),
-                     kAsInlinedObject);
-
-  return data.raw();
+  UNREACHABLE();
+  return ClosureData::null();
 }
 
 void RawClosureData::WriteTo(SnapshotWriter* writer,
                              intptr_t object_id,
                              Snapshot::Kind kind,
                              bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kClosureDataCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Context scope.
-  if (ptr()->context_scope_ == Object::empty_context_scope().raw()) {
-    writer->WriteVMIsolateObject(kEmptyContextScopeObject);
-  } else if (ptr()->context_scope_->ptr()->is_implicit_) {
-    writer->WriteObjectImpl(ptr()->context_scope_, kAsInlinedObject);
-  } else {
-    // We don't write non implicit context scopes in the snapshot.
-    writer->WriteVMIsolateObject(kNullObject);
-  }
-
-  // Parent function.
-  writer->WriteObjectImpl(ptr()->parent_function_, kAsInlinedObject);
-
-  // Signature type.
-  writer->WriteObjectImpl(ptr()->signature_type_, kAsInlinedObject);
-
-  // Canonical static closure.
-  writer->WriteObjectImpl(ptr()->closure_, kAsInlinedObject);
+  UNREACHABLE();
 }
 
 RawSignatureData* SignatureData::ReadFrom(SnapshotReader* reader,
@@ -674,38 +532,15 @@
                                           intptr_t tags,
                                           Snapshot::Kind kind,
                                           bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Allocate signature data object.
-  SignatureData& data =
-      SignatureData::ZoneHandle(reader->zone(), SignatureData::New());
-  reader->AddBackRef(object_id, &data, kIsDeserialized);
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(),
-                     kAsInlinedObject);
-
-  return data.raw();
+  UNREACHABLE();
+  return SignatureData::null();
 }
 
 void RawSignatureData::WriteTo(SnapshotWriter* writer,
                                intptr_t object_id,
                                Snapshot::Kind kind,
                                bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kSignatureDataCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsInlinedObject);
-  visitor.VisitPointers(from(), to());
+  UNREACHABLE();
 }
 
 RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader,
@@ -713,37 +548,15 @@
                                               intptr_t tags,
                                               Snapshot::Kind kind,
                                               bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Allocate redirection data object.
-  RedirectionData& data =
-      RedirectionData::ZoneHandle(reader->zone(), RedirectionData::New());
-  reader->AddBackRef(object_id, &data, kIsDeserialized);
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(), kAsReference);
-
-  return data.raw();
+  UNREACHABLE();
+  return RedirectionData::null();
 }
 
 void RawRedirectionData::WriteTo(SnapshotWriter* writer,
                                  intptr_t object_id,
                                  Snapshot::Kind kind,
                                  bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kRedirectionDataCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to());
+  UNREACHABLE();
 }
 
 RawFunction* Function::ReadFrom(SnapshotReader* reader,
@@ -751,116 +564,15 @@
                                 intptr_t tags,
                                 Snapshot::Kind kind,
                                 bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  bool is_in_fullsnapshot = reader->Read<bool>();
-  if (!is_in_fullsnapshot) {
-    // Allocate function object.
-    Function& func = Function::ZoneHandle(reader->zone(), Function::New());
-    reader->AddBackRef(object_id, &func, kIsDeserialized);
-
-    // Set all the non object fields. Read the token positions now but
-    // don't set them until after setting the kind.
-    const int32_t token_pos = reader->Read<int32_t>();
-    const int32_t end_token_pos = reader->Read<uint32_t>();
-    int32_t kernel_offset = 0;
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    kernel_offset = reader->Read<int32_t>();
-#endif
-    func.set_packed_fields(reader->Read<uint32_t>());
-    func.set_kind_tag(reader->Read<uint32_t>());
-    func.set_token_pos(TokenPosition::SnapshotDecode(token_pos));
-    func.set_end_token_pos(TokenPosition::SnapshotDecode(end_token_pos));
-    func.set_kernel_offset(kernel_offset);
-    func.set_usage_counter(reader->Read<int32_t>());
-    func.set_deoptimization_counter(reader->Read<int8_t>());
-    func.set_optimized_instruction_count(reader->Read<uint16_t>());
-    func.set_optimized_call_site_count(reader->Read<uint16_t>());
-    func.set_state_bits(0);
-
-    // Set all the object fields.
-    READ_OBJECT_FIELDS(func, func.raw()->from(), func.raw()->to_snapshot(kind),
-                       kAsReference);
-    // Initialize all fields that are not part of the snapshot.
-    bool is_optimized = func.usage_counter() != 0;
-    if (is_optimized) {
-      // Read the ic data array as the function is an optimized one.
-      (*reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsReference);
-      func.set_ic_data_array(*reader->ArrayHandle());
-    } else {
-      func.ClearICDataArray();
-    }
-    func.ClearCode();
-    return func.raw();
-  } else {
-    return reader->ReadFunctionId(object_id);
-  }
+  UNREACHABLE();
+  return Function::null();
 }
 
 void RawFunction::WriteTo(SnapshotWriter* writer,
                           intptr_t object_id,
                           Snapshot::Kind kind,
                           bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind == Snapshot::kScript);
-  bool is_in_fullsnapshot = false;
-  bool owner_is_class = false;
-  if ((kind == Snapshot::kScript) && !Function::IsSignatureFunction(this)) {
-    intptr_t tags = writer->GetObjectTags(ptr()->owner_);
-    intptr_t cid = ClassIdTag::decode(tags);
-    owner_is_class = (cid == kClassCid);
-    is_in_fullsnapshot =
-        owner_is_class ? Class::IsInFullSnapshot(
-                             reinterpret_cast<RawClass*>(ptr()->owner_))
-                       : PatchClass::IsInFullSnapshot(
-                             reinterpret_cast<RawPatchClass*>(ptr()->owner_));
-  }
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kFunctionCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out the boolean is_in_fullsnapshot first as this will
-  // help the reader decide how the rest of the information needs
-  // to be interpreted.
-  writer->Write<bool>(is_in_fullsnapshot);
-
-  if (!is_in_fullsnapshot) {
-    bool is_optimized = Code::IsOptimized(ptr()->code_);
-
-// Write out all the non object fields.
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode());
-    writer->Write<int32_t>(ptr()->end_token_pos_.SnapshotEncode());
-    writer->Write<int32_t>(ptr()->kernel_offset_);
-#endif
-    writer->Write<uint32_t>(ptr()->packed_fields_);
-    writer->Write<uint32_t>(ptr()->kind_tag_);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    if (is_optimized) {
-      writer->Write<int32_t>(FLAG_optimization_counter_threshold);
-    } else {
-      writer->Write<int32_t>(0);
-    }
-    writer->Write<int8_t>(ptr()->deoptimization_counter_);
-    writer->Write<uint16_t>(ptr()->optimized_instruction_count_);
-    writer->Write<uint16_t>(ptr()->optimized_call_site_count_);
-#endif
-
-    // Write out all the object pointer fields.
-    SnapshotWriterVisitor visitor(writer, kAsReference);
-    visitor.VisitPointers(from(), to_snapshot(kind));
-    if (is_optimized) {
-      // Write out the ic data array as the function is optimized.
-      writer->WriteObjectImpl(ptr()->ic_data_array_, kAsReference);
-    }
-  } else {
-    writer->WriteFunctionId(this, owner_is_class);
-  }
+  UNREACHABLE();
 }
 
 RawField* Field::ReadFrom(SnapshotReader* reader,
@@ -868,92 +580,15 @@
                           intptr_t tags,
                           Snapshot::Kind kind,
                           bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Allocate field object.
-  Field& field = Field::ZoneHandle(reader->zone(), Field::New());
-  reader->AddBackRef(object_id, &field, kIsDeserialized);
-
-  // Set all non object fields.
-  field.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
-  field.set_end_token_pos(
-      TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
-  field.set_guarded_cid(reader->Read<int32_t>());
-  field.set_is_nullable(reader->Read<int32_t>());
-  field.set_static_type_exactness_state(
-      StaticTypeExactnessState::Decode(reader->Read<int8_t>()));
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  field.set_kernel_offset(reader->Read<int32_t>());
-#endif
-  field.set_kind_bits(reader->Read<uint8_t>());
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(field, field.raw()->from(), field.raw()->to_snapshot(kind),
-                     kAsReference);
-  field.StorePointer(&field.raw_ptr()->dependent_code_, Array::null());
-
-  if (!reader->isolate()->use_field_guards()) {
-    field.set_guarded_cid(kDynamicCid);
-    field.set_is_nullable(true);
-    field.set_guarded_list_length(Field::kNoFixedLength);
-    field.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset);
-    field.set_static_type_exactness_state(
-        StaticTypeExactnessState::NotTracking());
-  } else {
-    field.InitializeGuardedListLengthInObjectOffset();
-  }
-
-  return field.raw();
+  UNREACHABLE();
+  return Field::null();
 }
 
 void RawField::WriteTo(SnapshotWriter* writer,
                        intptr_t object_id,
                        Snapshot::Kind kind,
                        bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kFieldCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out all the non object fields.
-  writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode());
-  writer->Write<int32_t>(ptr()->end_token_pos_.SnapshotEncode());
-  writer->Write<int32_t>(ptr()->guarded_cid_);
-  writer->Write<int32_t>(ptr()->is_nullable_);
-  writer->Write<int32_t>(ptr()->static_type_exactness_state_);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  writer->Write<int32_t>(ptr()->kernel_offset_);
-#endif
-  writer->Write<uint8_t>(ptr()->kind_bits_);
-
-  // Write out the name.
-  writer->WriteObjectImpl(ptr()->name_, kAsReference);
-  // Write out the owner.
-  writer->WriteObjectImpl(ptr()->owner_, kAsReference);
-  // Write out the type.
-  writer->WriteObjectImpl(ptr()->type_, kAsReference);
-  // Write out the initial static value or field offset.
-  if (Field::StaticBit::decode(ptr()->kind_bits_)) {
-    if (Field::ConstBit::decode(ptr()->kind_bits_)) {
-      // Do not reset const fields.
-      writer->WriteObjectImpl(ptr()->value_.static_value_, kAsReference);
-    } else {
-      // Otherwise, for static fields we write out the initial static value.
-      writer->WriteObjectImpl(ptr()->initializer_.saved_value_, kAsReference);
-    }
-  } else {
-    writer->WriteObjectImpl(ptr()->value_.offset_, kAsReference);
-  }
-  // Write out the initializer function or saved initial value.
-  writer->WriteObjectImpl(ptr()->initializer_.saved_value_, kAsReference);
-  // Write out the guarded list length.
-  writer->WriteObjectImpl(ptr()->guarded_list_length_, kAsReference);
+  UNREACHABLE();
 }
 
 RawLiteralToken* LiteralToken::ReadFrom(SnapshotReader* reader,
@@ -961,45 +596,15 @@
                                         intptr_t tags,
                                         Snapshot::Kind kind,
                                         bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind != Snapshot::kMessage);
-
-  // Create the literal token object.
-  LiteralToken& literal_token =
-      LiteralToken::ZoneHandle(reader->zone(), LiteralToken::New());
-  reader->AddBackRef(object_id, &literal_token, kIsDeserialized);
-
-  // Read the token attributes.
-  Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>());
-  literal_token.set_kind(token_kind);
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(literal_token, literal_token.raw()->from(),
-                     literal_token.raw()->to(), kAsReference);
-
-  return literal_token.raw();
+  UNREACHABLE();
+  return LiteralToken::null();
 }
 
 void RawLiteralToken::WriteTo(SnapshotWriter* writer,
                               intptr_t object_id,
                               Snapshot::Kind kind,
                               bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind != Snapshot::kMessage);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kLiteralTokenCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out the kind field.
-  writer->Write<int32_t>(ptr()->kind_);
-
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to());
+  UNREACHABLE();
 }
 
 RawTokenStream* TokenStream::ReadFrom(SnapshotReader* reader,
@@ -1007,59 +612,15 @@
                                       intptr_t tags,
                                       Snapshot::Kind kind,
                                       bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Read the length so that we can determine number of tokens to read.
-  intptr_t len = reader->ReadSmiValue();
-
-  // Create the token stream object.
-  TokenStream& token_stream =
-      TokenStream::ZoneHandle(reader->zone(), TokenStream::New(len));
-  reader->AddBackRef(object_id, &token_stream, kIsDeserialized);
-
-  // Read the stream of tokens into the TokenStream object for script
-  // snapshots as we made a copy of token stream.
-  if (kind == Snapshot::kScript) {
-    NoSafepointScope no_safepoint;
-    RawExternalTypedData* stream = token_stream.GetStream();
-    reader->ReadBytes(stream->ptr()->data_, len);
-  }
-
-  // Read in the literal/identifier token array.
-  *(reader->TokensHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject);
-  token_stream.SetTokenObjects(*(reader->TokensHandle()));
-  // Read in the private key in use by the token stream.
-  *(reader->StringHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject);
-  token_stream.SetPrivateKey(*(reader->StringHandle()));
-
-  return token_stream.raw();
+  UNREACHABLE();
+  return TokenStream::null();
 }
 
 void RawTokenStream::WriteTo(SnapshotWriter* writer,
                              intptr_t object_id,
                              Snapshot::Kind kind,
                              bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kTokenStreamCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out the length field and the token stream.
-  RawExternalTypedData* stream = ptr()->stream_;
-  intptr_t len = Smi::Value(stream->ptr()->length_);
-  writer->Write<RawObject*>(stream->ptr()->length_);
-  writer->WriteBytes(stream->ptr()->data_, len);
-
-  // Write out the literal/identifier token array.
-  writer->WriteObjectImpl(ptr()->token_objects_, kAsInlinedObject);
-  // Write out the private key in use by the token stream.
-  writer->WriteObjectImpl(ptr()->private_key_, kAsInlinedObject);
+  UNREACHABLE();
 }
 
 RawScript* Script::ReadFrom(SnapshotReader* reader,
@@ -1067,64 +628,15 @@
                             intptr_t tags,
                             Snapshot::Kind kind,
                             bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Allocate script object.
-  Script& script = Script::ZoneHandle(reader->zone(), Script::New());
-  reader->AddBackRef(object_id, &script, kIsDeserialized);
-
-  script.StoreNonPointer(&script.raw_ptr()->line_offset_,
-                         reader->Read<int32_t>());
-  script.StoreNonPointer(&script.raw_ptr()->col_offset_,
-                         reader->Read<int32_t>());
-  script.StoreNonPointer(&script.raw_ptr()->kind_, reader->Read<int8_t>());
-  script.StoreNonPointer(&script.raw_ptr()->kernel_script_index_,
-                         reader->Read<int32_t>());
-  script.StoreNonPointer(&script.raw_ptr()->load_timestamp_, 0);
-
-  *reader->StringHandle() ^= String::null();
-  script.set_source(*reader->StringHandle());
-  *reader->StreamHandle() ^= TokenStream::null();
-  script.set_tokens(*reader->StreamHandle());
-
-  // Set all the object fields.
-  // TODO(5411462): Need to assert No GC can happen here, even though
-  // allocations may happen.
-  intptr_t num_flds = (script.raw()->to_snapshot(kind) - script.raw()->from());
-  for (intptr_t i = 0; i <= num_flds; i++) {
-    (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
-    script.StorePointer((script.raw()->from() + i),
-                        reader->PassiveObjectHandle()->raw());
-  }
-
-  return script.raw();
+  UNREACHABLE();
+  return Script::null();
 }
 
 void RawScript::WriteTo(SnapshotWriter* writer,
                         intptr_t object_id,
                         Snapshot::Kind kind,
                         bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(tokens_ != TokenStream::null());
-  ASSERT(kind == Snapshot::kScript);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kScriptCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out all the non object fields.
-  writer->Write<int32_t>(ptr()->line_offset_);
-  writer->Write<int32_t>(ptr()->col_offset_);
-  writer->Write<int8_t>(ptr()->kind_);
-  writer->Write<int32_t>(ptr()->kernel_script_index_);
-
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to_snapshot(kind));
+  UNREACHABLE();
 }
 
 RawLibrary* Library::ReadFrom(SnapshotReader* reader,
@@ -1132,109 +644,15 @@
                               intptr_t tags,
                               Snapshot::Kind kind,
                               bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind != Snapshot::kMessage);
-
-  Library& library = Library::ZoneHandle(reader->zone(), Library::null());
-  reader->AddBackRef(object_id, &library, kIsDeserialized);
-
-  bool is_in_fullsnapshot = reader->Read<bool>();
-  if ((kind == Snapshot::kScript) && is_in_fullsnapshot) {
-    // Lookup the object as it should already exist in the heap.
-    *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject);
-    library = Library::LookupLibrary(reader->thread(), *reader->StringHandle());
-    ASSERT(library.is_in_fullsnapshot());
-  } else {
-    // Allocate library object.
-    library = Library::New();
-
-    // Set all non object fields.
-    library.StoreNonPointer(&library.raw_ptr()->index_,
-                            reader->ReadClassIDValue());
-    library.StoreNonPointer(&library.raw_ptr()->num_imports_,
-                            reader->Read<uint16_t>());
-    library.StoreNonPointer(&library.raw_ptr()->load_state_,
-                            reader->Read<int8_t>());
-    library.StoreNonPointer(&library.raw_ptr()->corelib_imported_,
-                            reader->Read<bool>());
-    library.StoreNonPointer(&library.raw_ptr()->is_dart_scheme_,
-                            reader->Read<bool>());
-    library.StoreNonPointer(&library.raw_ptr()->debuggable_,
-                            reader->Read<bool>());
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    library.StoreNonPointer(&library.raw_ptr()->kernel_offset_,
-                            reader->Read<int32_t>());
-#endif
-    library.StoreNonPointer(&library.raw_ptr()->is_in_fullsnapshot_,
-                            is_in_fullsnapshot);
-    // The native resolver and symbolizer are not serialized.
-    library.set_native_entry_resolver(NULL);
-    library.set_native_entry_symbol_resolver(NULL);
-
-    // Set all the object fields.
-    // TODO(5411462): Need to assert No GC can happen here, even though
-    // allocations may happen.
-    intptr_t num_flds =
-        library.raw()->to_snapshot(kind) - library.raw()->from();
-    for (intptr_t i = 0; i <= num_flds; i++) {
-      (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
-      library.StorePointer((library.raw()->from() + i),
-                           reader->PassiveObjectHandle()->raw());
-    }
-    // Initialize caches that are not serialized.
-    library.StorePointer(&library.raw_ptr()->resolved_names_, Array::null());
-    library.StorePointer(&library.raw_ptr()->exported_names_, Array::null());
-    library.StorePointer(&library.raw_ptr()->loaded_scripts_, Array::null());
-    library.Register(reader->thread());
-  }
-  return library.raw();
+  UNREACHABLE();
+  return Library::null();
 }
 
 void RawLibrary::WriteTo(SnapshotWriter* writer,
                          intptr_t object_id,
                          Snapshot::Kind kind,
                          bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind != Snapshot::kMessage);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kLibraryCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out the boolean is_in_fullsnapshot_ first as this will
-  // help the reader decide how the rest of the information needs
-  // to be interpreted.
-  writer->Write<bool>(ptr()->is_in_fullsnapshot_);
-
-  if ((kind == Snapshot::kScript) && ptr()->is_in_fullsnapshot_) {
-    // Write out library URL so that it can be looked up when reading.
-    writer->WriteObjectImpl(ptr()->url_, kAsInlinedObject);
-  } else {
-    ASSERT(!ptr()->is_in_fullsnapshot_);
-    // Write out all non object fields.
-    ASSERT(ptr()->index_ != static_cast<classid_t>(-1));
-    writer->WriteClassIDValue(ptr()->index_);
-    writer->Write<uint16_t>(ptr()->num_imports_);
-    writer->Write<int8_t>(ptr()->load_state_);
-    writer->Write<bool>(ptr()->corelib_imported_);
-    writer->Write<bool>(ptr()->is_dart_scheme_);
-    writer->Write<bool>(ptr()->debuggable_);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    writer->Write<int32_t>(ptr()->kernel_offset_);
-#endif
-    // We do not serialize the native resolver or symbolizer. These need to be
-    // explicitly set after deserialization.
-
-    // We do not write the loaded_scripts_ and resolved_names_ caches to the
-    // snapshot. They get initialized when reading the library from the
-    // snapshot and will be rebuilt lazily.
-    // Write out all the object pointer fields.
-    SnapshotWriterVisitor visitor(writer, kAsReference);
-    visitor.VisitPointers(from(), to_snapshot(kind));
-  }
+  UNREACHABLE();
 }
 
 RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader,
@@ -1242,51 +660,15 @@
                                           intptr_t tags,
                                           Snapshot::Kind kind,
                                           bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Allocate library prefix object.
-  LibraryPrefix& prefix =
-      LibraryPrefix::ZoneHandle(reader->zone(), LibraryPrefix::New());
-  reader->AddBackRef(object_id, &prefix, kIsDeserialized);
-
-  // Set all non object fields.
-  prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_,
-                         reader->Read<int16_t>());
-  prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_,
-                         reader->Read<bool>());
-  prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_,
-                         !prefix.raw_ptr()->is_deferred_load_);
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(prefix, prefix.raw()->from(),
-                     prefix.raw()->to_snapshot(kind), kAsReference);
-  prefix.StorePointer(&prefix.raw_ptr()->dependent_code_, Array::null());
-
-  return prefix.raw();
+  UNREACHABLE();
+  return LibraryPrefix::null();
 }
 
 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer,
                                intptr_t object_id,
                                Snapshot::Kind kind,
                                bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteIndexedObject(kLibraryPrefixCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out all non object fields.
-  writer->Write<int16_t>(ptr()->num_imports_);
-  writer->Write<bool>(ptr()->is_deferred_load_);
-
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to_snapshot(kind));
+  UNREACHABLE();
 }
 
 RawNamespace* Namespace::ReadFrom(SnapshotReader* reader,
@@ -1294,36 +676,15 @@
                                   intptr_t tags,
                                   Snapshot::Kind kind,
                                   bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Allocate Namespace object.
-  Namespace& ns = Namespace::ZoneHandle(reader->zone(), Namespace::New());
-  reader->AddBackRef(object_id, &ns, kIsDeserialized);
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(ns, ns.raw()->from(), ns.raw()->to(), kAsReference);
-
-  return ns.raw();
+  UNREACHABLE();
+  return Namespace::null();
 }
 
 void RawNamespace::WriteTo(SnapshotWriter* writer,
                            intptr_t object_id,
                            Snapshot::Kind kind,
                            bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kNamespaceCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to());
+  UNREACHABLE();
 }
 
 RawKernelProgramInfo* KernelProgramInfo::ReadFrom(SnapshotReader* reader,
@@ -1331,36 +692,15 @@
                                                   intptr_t tags,
                                                   Snapshot::Kind kind,
                                                   bool as_reference) {
-  ASSERT(reader != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  KernelProgramInfo& info =
-      KernelProgramInfo::ZoneHandle(reader->zone(), KernelProgramInfo::New());
-  reader->AddBackRef(object_id, &info, kIsDeserialized);
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(info, info.raw()->from(), info.raw()->to_snapshot(kind),
-                     kAsReference);
-  return info.raw();
+  UNREACHABLE();
+  return KernelProgramInfo::null();
 }
 
 void RawKernelProgramInfo::WriteTo(SnapshotWriter* writer,
                                    intptr_t object_id,
                                    Snapshot::Kind kind,
                                    bool as_reference) {
-  ASSERT(writer != NULL);
-  ASSERT(kind == Snapshot::kScript);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kKernelProgramInfoCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to_snapshot(kind));
+  UNREACHABLE();
 }
 
 RawCode* Code::ReadFrom(SnapshotReader* reader,
@@ -1637,49 +977,15 @@
                             intptr_t tags,
                             Snapshot::Kind kind,
                             bool as_reference) {
-  ASSERT(kind == Snapshot::kScript);
-
-  ICData& result = ICData::ZoneHandle(reader->zone(), ICData::New());
-  reader->AddBackRef(object_id, &result, kIsDeserialized);
-
-  NOT_IN_PRECOMPILED(result.set_deopt_id(reader->Read<int32_t>()));
-  result.set_state_bits(reader->Read<uint32_t>());
-#if defined(TAG_IC_DATA)
-  result.set_tag(static_cast<ICData::Tag>(reader->Read<int16_t>()));
-#endif
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(result, result.raw()->from(),
-                     result.raw()->to_snapshot(kind), kAsReference);
-
-  return result.raw();
+  UNREACHABLE();
+  return ICData::null();
 }
 
 void RawICData::WriteTo(SnapshotWriter* writer,
                         intptr_t object_id,
                         Snapshot::Kind kind,
                         bool as_reference) {
-  ASSERT(kind == Snapshot::kScript);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kICDataCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out all the non object fields.
-  NOT_IN_PRECOMPILED(writer->Write<int32_t>(ptr()->deopt_id_));
-  writer->Write<uint32_t>(ptr()->state_bits_);
-#if defined(TAG_IC_DATA)
-  writer->Write<int16_t>(static_cast<int64_t>(ptr()->tag_));
-#endif
-
-  // Write out all the object pointer fields.
-  // In precompiled snapshots, omit the owner field. The owner field may
-  // refer to a function which was always inlined and no longer needed.
-  SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to_snapshot(kind));
+  UNREACHABLE();
 }
 
 RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader,
@@ -1871,8 +1177,7 @@
   // Create an Instance object or get canonical one if it is a canonical
   // constant.
   Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null());
-  obj ^= Object::Allocate(kInstanceCid, Instance::InstanceSize(),
-                          HEAP_SPACE(kind));
+  obj ^= Object::Allocate(kInstanceCid, Instance::InstanceSize(), Heap::kNew);
   if (RawObject::IsCanonical(tags)) {
     const char* error_str = NULL;
     obj = obj.CheckAndCanonicalize(reader->thread(), &error_str);
@@ -1929,7 +1234,7 @@
     mint = Mint::NewCanonical(value);
     ASSERT(mint.IsCanonical());
   } else {
-    mint = Mint::New(value, HEAP_SPACE(kind));
+    mint = Mint::New(value);
   }
   reader->AddBackRef(object_id, &mint, kIsDeserialized);
   return mint.raw();
@@ -1972,7 +1277,7 @@
     dbl = Double::NewCanonical(value);
     ASSERT(dbl.IsCanonical());
   } else {
-    dbl = Double::New(value, HEAP_SPACE(kind));
+    dbl = Double::New(value);
   }
   reader->AddBackRef(object_id, &dbl, kIsDeserialized);
   return dbl.raw();
@@ -2029,7 +1334,7 @@
     *str_obj ^= (*new_symbol)(reader->thread(), ptr, len);
   } else {
     // Set up the string object.
-    *str_obj = StringType::New(len, HEAP_SPACE(kind));
+    *str_obj = StringType::New(len, Heap::kNew);
     str_obj->SetHash(0);  // Will get computed when needed.
     if (len == 0) {
       return;
@@ -2198,8 +1503,7 @@
     state = kIsNotDeserialized;
   }
   if (array == NULL) {
-    array =
-        &(Array::ZoneHandle(reader->zone(), Array::New(len, HEAP_SPACE(kind))));
+    array = &(Array::ZoneHandle(reader->zone(), Array::New(len)));
     reader->AddBackRef(object_id, array, state);
   }
   if (!as_reference) {
@@ -2228,8 +1532,7 @@
     state = kIsNotDeserialized;
   }
   if (array == NULL) {
-    array = &(Array::ZoneHandle(reader->zone(),
-                                ImmutableArray::New(len, HEAP_SPACE(kind))));
+    array = &(Array::ZoneHandle(reader->zone(), ImmutableArray::New(len)));
     reader->AddBackRef(object_id, array, state);
   }
   if (!as_reference) {
@@ -2275,7 +1578,7 @@
   // Read the length so that we can determine instance size to allocate.
   GrowableObjectArray& array = GrowableObjectArray::ZoneHandle(
       reader->zone(), GrowableObjectArray::null());
-  array = GrowableObjectArray::New(0, HEAP_SPACE(kind));
+  array = GrowableObjectArray::New(0);
   reader->AddBackRef(object_id, &array, kIsDeserialized);
 
   // Read type arguments of growable array object.
@@ -2328,14 +1631,8 @@
 
   LinkedHashMap& map =
       LinkedHashMap::ZoneHandle(reader->zone(), LinkedHashMap::null());
-  if (kind == Snapshot::kScript) {
-    // The immutable maps that seed map literals are not yet VM-internal, so
-    // we don't reach this.
-    UNREACHABLE();
-  } else {
-    // Since the map might contain itself as a key or value, allocate first.
-    map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind));
-  }
+  // Since the map might contain itself as a key or value, allocate first.
+  map = LinkedHashMap::NewUninitialized();
   reader->AddBackRef(object_id, &map, kIsDeserialized);
 
   // Read the type arguments.
@@ -2354,8 +1651,7 @@
   intptr_t data_size =
       Utils::Maximum(Utils::RoundUpToPowerOfTwo(used_data),
                      static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize));
-  Array& data = Array::ZoneHandle(reader->zone(),
-                                  Array::New(data_size, HEAP_SPACE(kind)));
+  Array& data = Array::ZoneHandle(reader->zone(), Array::New(data_size));
   map.SetData(data);
   map.SetDeletedKeys(0);
 
@@ -2381,10 +1677,6 @@
                                intptr_t object_id,
                                Snapshot::Kind kind,
                                bool as_reference) {
-  if (kind == Snapshot::kScript) {
-    // The immutable maps that seed map literals are not yet VM-internal, so
-    // we don't reach this.
-  }
   ASSERT(writer != NULL);
 
   // Write out the serialization header value for this object.
@@ -2441,7 +1733,7 @@
 
   // Create a Float32x4 object.
   Float32x4& simd = Float32x4::ZoneHandle(reader->zone(), Float32x4::null());
-  simd = Float32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind));
+  simd = Float32x4::New(value0, value1, value2, value3);
   reader->AddBackRef(object_id, &simd, kIsDeserialized);
   return simd.raw();
 }
@@ -2480,7 +1772,7 @@
 
   // Create a Float32x4 object.
   Int32x4& simd = Int32x4::ZoneHandle(reader->zone(), Int32x4::null());
-  simd = Int32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind));
+  simd = Int32x4::New(value0, value1, value2, value3);
   reader->AddBackRef(object_id, &simd, kIsDeserialized);
   return simd.raw();
 }
@@ -2517,7 +1809,7 @@
 
   // Create a Float64x2 object.
   Float64x2& simd = Float64x2::ZoneHandle(reader->zone(), Float64x2::null());
-  simd = Float64x2::New(value0, value1, HEAP_SPACE(kind));
+  simd = Float64x2::New(value0, value1);
   reader->AddBackRef(object_id, &simd, kIsDeserialized);
   return simd.raw();
 }
@@ -2549,8 +1841,8 @@
 
   intptr_t cid = RawObject::ClassIdTag::decode(tags);
   intptr_t len = reader->ReadSmiValue();
-  TypedData& result = TypedData::ZoneHandle(
-      reader->zone(), TypedData::New(cid, len, HEAP_SPACE(kind)));
+  TypedData& result =
+      TypedData::ZoneHandle(reader->zone(), TypedData::New(cid, len));
   reader->AddBackRef(object_id, &result, kIsDeserialized);
 
   // Setup the array elements.
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index e5db6fa..5c73ecb 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -174,6 +174,28 @@
   Exceptions::ThrowByType(Exceptions::kRange, args);
 }
 
+static void NullErrorHelper(Zone* zone, const String& selector) {
+  InvocationMirror::Kind kind = InvocationMirror::kMethod;
+  if (Field::IsGetterName(selector)) {
+    kind = InvocationMirror::kGetter;
+  } else if (Field::IsSetterName(selector)) {
+    kind = InvocationMirror::kSetter;
+  }
+
+  const Smi& invocation_type = Smi::Handle(
+      zone,
+      Smi::New(InvocationMirror::EncodeType(InvocationMirror::kDynamic, kind)));
+
+  const Array& args = Array::Handle(zone, Array::New(6));
+  args.SetAt(0, /* instance */ Object::null_object());
+  args.SetAt(1, selector);
+  args.SetAt(2, invocation_type);
+  args.SetAt(3, /* func_type_args */ Object::null_object());
+  args.SetAt(4, /* func_args */ Object::null_object());
+  args.SetAt(5, /* func_arg_names */ Object::null_object());
+  Exceptions::ThrowByType(Exceptions::kNoSuchMethod, args);
+}
+
 DEFINE_RUNTIME_ENTRY(NullError, 0) {
   DartFrameIterator iterator(thread,
                              StackFrameIterator::kNoCrossThreadIteration);
@@ -199,25 +221,17 @@
   const String& member_name =
       String::CheckedHandle(zone, pool.ObjectAt(name_index));
 
-  InvocationMirror::Kind kind = InvocationMirror::kMethod;
-  if (Field::IsGetterName(member_name)) {
-    kind = InvocationMirror::kGetter;
-  } else if (Field::IsSetterName(member_name)) {
-    kind = InvocationMirror::kSetter;
-  }
+  NullErrorHelper(zone, member_name);
+}
 
-  const Smi& invocation_type = Smi::Handle(
-      zone,
-      Smi::New(InvocationMirror::EncodeType(InvocationMirror::kDynamic, kind)));
+DEFINE_RUNTIME_ENTRY(NullErrorWithSelector, 1) {
+  const String& selector = String::CheckedHandle(arguments.ArgAt(0));
+  NullErrorHelper(zone, selector);
+}
 
-  const Array& args = Array::Handle(zone, Array::New(6));
-  args.SetAt(0, /* instance */ Object::null_object());
-  args.SetAt(1, member_name);
-  args.SetAt(2, invocation_type);
-  args.SetAt(3, /* func_type_args */ Object::null_object());
-  args.SetAt(4, /* func_args */ Object::null_object());
-  args.SetAt(5, /* func_arg_names */ Object::null_object());
-  Exceptions::ThrowByType(Exceptions::kNoSuchMethod, args);
+DEFINE_RUNTIME_ENTRY(ArgumentError, 1) {
+  const Instance& value = Instance::CheckedHandle(arguments.ArgAt(0));
+  Exceptions::ThrowArgumentError(value);
 }
 
 DEFINE_RUNTIME_ENTRY(ArgumentErrorUnboxedInt64, 0) {
@@ -637,24 +651,18 @@
     }
     return;
   }
-  Class& instance_class = Class::Handle(zone);
   if (instance.IsSmi()) {
-    if (FLAG_enable_interpreter) {
-      instance_class = Smi::Class();
-    } else {
-      if (FLAG_trace_type_checks) {
-        OS::PrintErr("UpdateTypeTestCache: instance is Smi, not updating\n");
-      }
-      return;
+    if (FLAG_trace_type_checks) {
+      OS::PrintErr("UpdateTypeTestCache: instance is Smi\n");
     }
-  } else {
-    instance_class = instance.clazz();
+    return;
   }
   // If the type is uninstantiated and refers to parent function type
   // parameters, the function_type_arguments have been canonicalized
   // when concatenated.
   ASSERT(function_type_arguments.IsNull() ||
          function_type_arguments.IsCanonical());
+  const Class& instance_class = Class::Handle(zone, instance.clazz());
   auto& instance_class_id_or_function = Object::Handle(zone);
   auto& instance_type_arguments = TypeArguments::Handle(zone);
   auto& instance_parent_function_type_arguments = TypeArguments::Handle(zone);
@@ -910,15 +918,6 @@
 
   if (should_update_cache) {
     if (cache.IsNull()) {
-      if (FLAG_enable_interpreter) {
-        // TODO(regis): Remove this workaround once the interpreter can provide
-        // a non-null cache for the type test in an implicit setter.
-        if (mode == kTypeCheckFromInline) {
-          arguments.SetReturn(src_instance);
-          return;
-        }
-      }
-
 #if !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32)
       ASSERT(mode == kTypeCheckFromSlowStub);
       // We lazily create [SubtypeTestCache] for those call sites which actually
@@ -1205,6 +1204,7 @@
   ObjectStore* store = Isolate::Current()->object_store();
   if (target_function.raw() == store->simple_instance_of_function()) {
     // Replace the target function with constant function.
+    ASSERT(args.length() == 2);
     const AbstractType& type = AbstractType::Cast(*args[1]);
     target_function =
         ComputeTypeCheckTarget(receiver, type, arguments_descriptor);
@@ -1813,10 +1813,10 @@
 
     const String& getter_name =
         String::Handle(zone, Field::GetterName(target_name));
+    ArgumentsDescriptor args_desc(orig_arguments_desc);
     while (!cls.IsNull()) {
       function ^= cls.LookupDynamicFunction(target_name);
       if (!function.IsNull()) {
-        ArgumentsDescriptor args_desc(orig_arguments_desc);
         ASSERT(!function.AreValidArguments(args_desc, NULL));
         break;  // mismatch, invoke noSuchMethod
       }
@@ -1829,7 +1829,7 @@
         CheckResultError(getter_result);
         ASSERT(getter_result.IsNull() || getter_result.IsInstance());
 
-        orig_arguments.SetAt(0, getter_result);
+        orig_arguments.SetAt(args_desc.FirstArgIndex(), getter_result);
         const Object& call_result = Object::Handle(
             zone,
             DartEntry::InvokeClosure(orig_arguments, orig_arguments_desc));
@@ -2156,7 +2156,8 @@
 
   // If running with interpreter, do the unoptimized compilation first.
   const bool unoptimized_compilation =
-      FLAG_enable_interpreter && !function.WasCompiled();
+      FLAG_enable_interpreter &&
+      (function.unoptimized_code() == Object::null());
 
   ASSERT(unoptimized_compilation || function.HasCode());
 
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index a75bcbb..1ddd02b 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -39,6 +39,8 @@
   V(PatchStaticCall)                                                           \
   V(RangeError)                                                                \
   V(NullError)                                                                 \
+  V(NullErrorWithSelector)                                                     \
+  V(ArgumentError)                                                             \
   V(ArgumentErrorUnboxedInt64)                                                 \
   V(IntegerDivisionByZeroException)                                            \
   V(ReThrow)                                                                   \
diff --git a/runtime/vm/runtime_entry_x64.cc b/runtime/vm/runtime_entry_x64.cc
index f5cb379..105d71c 100644
--- a/runtime/vm/runtime_entry_x64.cc
+++ b/runtime/vm/runtime_entry_x64.cc
@@ -34,7 +34,7 @@
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
     __ movq(RBX, Address(THR, Thread::OffsetFromThread(this)));
-    __ movq(R10, Immediate(argument_count));
+    __ LoadImmediate(R10, Immediate(argument_count));
     __ CallToRuntime();
   }
 }
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index 80d6add..765c869 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -896,7 +896,7 @@
   } while ((token_index >= index) && (current_token_.kind != Token::kEOS));
 }
 
-void Scanner::InitOnce() {
+void Scanner::Init() {
   ASSERT(Isolate::Current() == Dart::vm_isolate());
   for (int i = 0; i < kNumLowercaseChars; i++) {
     keywords_char_offset_[i] = Token::kNumKeywords;
diff --git a/runtime/vm/scanner.h b/runtime/vm/scanner.h
index 2f86c69..69ce33e 100644
--- a/runtime/vm/scanner.h
+++ b/runtime/vm/scanner.h
@@ -79,7 +79,7 @@
     return current_token_.position;
   }
 
-  static void InitOnce();
+  static void Init();
 
   // Return true if str is an identifier.
   bool IsIdent(const String& str);
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 18f2751..5982922 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -2259,9 +2259,9 @@
     return true;
   }
 
-  const char* receiver_id = js->LookupParam("receiverId");
+  const char* receiver_id = js->LookupParam("targetId");
   if (receiver_id == NULL) {
-    PrintMissingParamError(js, "receiverId");
+    PrintMissingParamError(js, "targetId");
     return true;
   }
   const char* selector_cstr = js->LookupParam("selector");
@@ -2285,7 +2285,7 @@
     } else if (lookup_result == ObjectIdRing::kExpired) {
       PrintSentinel(js, kExpiredSentinel);
     } else {
-      PrintInvalidParamError(js, "receiverId");
+      PrintInvalidParamError(js, "targetId");
     }
     return true;
   }
@@ -2369,7 +2369,7 @@
     return true;
   }
   js->PrintError(kInvalidParams,
-                 "%s: invalid 'receiverId' parameter: "
+                 "%s: invalid 'targetId' parameter: "
                  "Cannot invoke against a VM-internal object",
                  js->method());
   return true;
@@ -2382,9 +2382,15 @@
 static bool IsAlpha(char c) {
   return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
 }
+static bool IsAlphaOrDollar(char c) {
+  return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c == '$');
+}
 static bool IsAlphaNum(char c) {
   return (c >= '0' && c <= '9') || IsAlpha(c);
 }
+static bool IsAlphaNumOrDollar(char c) {
+  return (c >= '0' && c <= '9') || IsAlphaOrDollar(c);
+}
 static bool IsWhitespace(char c) {
   return c <= ' ';
 }
@@ -2409,8 +2415,8 @@
     if (*c == '}') return true;
 
     const char* name = c;
-    if (!IsAlpha(*c)) return false;
-    while (IsAlphaNum(*c)) {
+    if (!IsAlphaOrDollar(*c)) return false;
+    while (IsAlphaNumOrDollar(*c)) {
       c++;
     }
     names->Add(zone->MakeCopyOfStringN(name, c - name));
@@ -3755,7 +3761,7 @@
 static bool EnableProfiler(Thread* thread, JSONStream* js) {
   if (!FLAG_profiler) {
     FLAG_profiler = true;
-    Profiler::InitOnce();
+    Profiler::Init();
   }
   PrintSuccess(js);
   return true;
@@ -3931,19 +3937,12 @@
     RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
 
-#if defined(DEBUG)
 static bool CollectAllGarbage(Thread* thread, JSONStream* js) {
   Isolate* isolate = thread->isolate();
-  isolate->heap()->CollectAllGarbage();
+  isolate->heap()->CollectAllGarbage(Heap::kDebugging);
   PrintSuccess(js);
   return true;
 }
-#else
-static bool CollectAllGarbage(Thread* thread, JSONStream* js) {
-  PrintSuccess(js);
-  return true;
-}
-#endif  // defined(DEBUG)
 
 static const MethodParameter* get_heap_map_params[] = {
     RUNNABLE_ISOLATE_PARAMETER, NULL,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 46e03de..cdf1812 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 10
+#define SERVICE_PROTOCOL_MINOR_VERSION 11
 
 class Array;
 class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 8222047..b65f60f 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -2,7 +2,7 @@
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.9_ of the Dart VM Service Protocol. This
+This document describes of _version 3.11_ 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.
@@ -36,6 +36,7 @@
   - [getStack](#getstack)
   - [getVersion](#getversion)
   - [getVM](#getvm)
+  - [invoke](#invoke)
   - [pause](#pause)
   - [kill](#kill)
   - [reloadSources](#reloadsources)
@@ -2371,9 +2372,9 @@
   // The library which owns this script.
   @Library library;
 
-  // The source code for this script. For certain built-in scripts,
-  // this may be reconstructed without source comments.
-  string source;
+  // The source code for this script. This can be null for certain built-in
+  // scripts.
+  string source [optional];
 
   // A table encoding a mapping from token position to line and column.
   int[][] tokenPosTable;
@@ -2707,5 +2708,6 @@
 3.8 | Add 'kill'.
 3.9 | Changed numbers for errors related to service extensions.
 3.10 | Add 'invoke'.
+3.11 | Rename 'invoke' parameter 'receiverId' to 'targetId.
 
 [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 2c4909e..39d695a 100644
--- a/runtime/vm/service/service_dev.md
+++ b/runtime/vm/service/service_dev.md
@@ -2,7 +2,7 @@
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.10-dev_ of the Dart VM Service Protocol. This
+This document describes of _version 3.12-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.
@@ -36,6 +36,7 @@
   - [getStack](#getstack)
   - [getVersion](#getversion)
   - [getVM](#getvm)
+  - [invoke](#invoke)
   - [pause](#pause)
   - [kill](#kill)
   - [reloadSources](#reloadsources)
@@ -2371,9 +2372,9 @@
   // The library which owns this script.
   @Library library;
 
-  // The source code for this script. For certain built-in scripts,
-  // this may be reconstructed without source comments.
-  string source;
+  // The source code for this script. This can be null for certain built-in
+  // scripts.
+  string source [optional];
 
   // A table encoding a mapping from token position to line and column.
   int[][] tokenPosTable;
@@ -2707,5 +2708,6 @@
 3.8 | Add 'kill'.
 3.9 | Changed numbers for errors related to service extensions.
 3.10 | Add 'invoke'.
+3.11 | Rename 'invoke' parameter 'receiverId' to 'targetId.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index d132892..6c2ebb2 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -30,7 +30,10 @@
  public:
   ServiceTestMessageHandler() : _msg(NULL) {}
 
-  ~ServiceTestMessageHandler() { free(_msg); }
+  ~ServiceTestMessageHandler() {
+    PortMap::ClosePorts(this);
+    free(_msg);
+  }
 
   MessageStatus HandleMessage(Message* message) {
     if (_msg != NULL) {
@@ -792,7 +795,7 @@
 static void EnableProfiler() {
   if (!FLAG_profiler) {
     FLAG_profiler = true;
-    Profiler::InitOnce();
+    Profiler::Init();
   }
 }
 
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index db660f8..72e7ed8 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -659,8 +659,7 @@
   return result;
 }
 
-void Simulator::InitOnce() {
-}
+void Simulator::Init() {}
 
 Simulator::Simulator() : exclusive_access_addr_(0), exclusive_access_value_(0) {
   // Setup simulator support first. Some of this information is needed to
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 7064ebb..0365f80 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -86,7 +86,7 @@
   uint64_t get_icount() const { return icount_; }
 
   // Call on program start.
-  static void InitOnce();
+  static void Init();
 
   // Dart generally calls into generated code with 4 parameters. This is a
   // convenience function, which sets up the simulator state and grabs the
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index e38c939..9ae3d30 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -709,8 +709,7 @@
   return result;
 }
 
-void Simulator::InitOnce() {
-}
+void Simulator::Init() {}
 
 Simulator::Simulator() : exclusive_access_addr_(0), exclusive_access_value_(0) {
   // Setup simulator support first. Some of this information is needed to
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index 2b6ba4b..f85ebf3 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -82,7 +82,7 @@
   uint64_t get_icount() const { return icount_; }
 
   // Call on program start.
-  static void InitOnce();
+  static void Init();
 
   // Dart generally calls into generated code with 4 parameters. This is a
   // convenience function, which sets up the simulator state and grabs the
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index c9bb744..2d754e6 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -507,7 +507,7 @@
 IntrinsicHandler Simulator::intrinsics_[Simulator::kIntrinsicCount];
 
 // Synchronization primitives support.
-void Simulator::InitOnce() {
+void Simulator::Init() {
   for (intptr_t i = 0; i < kIntrinsicCount; i++) {
     intrinsics_[i] = 0;
   }
diff --git a/runtime/vm/simulator_dbc.h b/runtime/vm/simulator_dbc.h
index 85493c74..95a0a35 100644
--- a/runtime/vm/simulator_dbc.h
+++ b/runtime/vm/simulator_dbc.h
@@ -53,7 +53,7 @@
   uword stack_limit() const { return stack_limit_; }
 
   // Call on program start.
-  static void InitOnce();
+  static void Init();
 
   RawObject* Call(const Code& code,
                   const Array& arguments_descriptor,
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 5e1709c..c35af9c 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -157,14 +157,12 @@
   switch (kind) {
     case kFull:
       return "full";
-    case kScript:
-      return "script";
-    case kMessage:
-      return "message";
     case kFullJIT:
       return "full-jit";
     case kFullAOT:
       return "full-aot";
+    case kMessage:
+      return "message";
     case kNone:
       return "none";
     case kInvalid:
@@ -238,8 +236,8 @@
   // Setup for long jump in case there is an exception while reading.
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
-    objects_to_rehash_ = GrowableObjectArray::New(HEAP_SPACE(kind_));
-    types_to_postprocess_ = GrowableObjectArray::New(HEAP_SPACE(kind_));
+    objects_to_rehash_ = GrowableObjectArray::New();
+    types_to_postprocess_ = GrowableObjectArray::New();
 
     PassiveObject& obj =
         PassiveObject::Handle(zone(), ReadObjectImpl(kAsInlinedObject));
@@ -252,9 +250,6 @@
     Object& result = Object::Handle(zone_);
     if (backward_references_->length() > 0) {
       ProcessDeferredCanonicalizations();
-      if (kind() == Snapshot::kScript) {
-        FixSubclassesAndImplementors();
-      }
       result = (*backward_references_)[0].reference()->raw();
     } else {
       result = obj.raw();
@@ -275,7 +270,7 @@
 }
 
 void SnapshotReader::EnqueueTypePostprocessing(const AbstractType& type) {
-  types_to_postprocess_.Add(type, HEAP_SPACE(kind_));
+  types_to_postprocess_.Add(type);
 }
 
 void SnapshotReader::RunDelayedTypePostprocessing() {
@@ -291,7 +286,7 @@
 }
 
 void SnapshotReader::EnqueueRehashingOfMap(const LinkedHashMap& map) {
-  objects_to_rehash_.Add(map, HEAP_SPACE(kind_));
+  objects_to_rehash_.Add(map);
 }
 
 RawObject* SnapshotReader::RunDelayedRehashingOfMaps() {
@@ -303,8 +298,7 @@
         collections_lib.LookupFunctionAllowPrivate(Symbols::_rehashObjects()));
     ASSERT(!rehashing_function.IsNull());
 
-    const Array& arguments =
-        Array::Handle(zone_, Array::New(1, HEAP_SPACE(kind_)));
+    const Array& arguments = Array::Handle(zone_, Array::New(1));
     arguments.SetAt(0, objects_to_rehash_);
 
     return DartEntry::InvokeFunction(rehashing_function, arguments);
@@ -344,42 +338,6 @@
   return cls.raw();
 }
 
-RawFunction* SnapshotReader::ReadFunctionId(intptr_t object_id) {
-  ASSERT(kind_ == Snapshot::kScript);
-  // Read the function header information and lookup the function.
-  intptr_t func_header = Read<int32_t>();
-  ASSERT((func_header & kSmiTagMask) != kSmiTag);
-  ASSERT(!IsVMIsolateObject(func_header) ||
-         !IsSingletonClassId(GetVMIsolateObjectId(func_header)));
-  ASSERT((SerializedHeaderTag::decode(func_header) != kObjectId) ||
-         !IsObjectStoreClassId(SerializedHeaderData::decode(func_header)));
-  Function& func = Function::ZoneHandle(zone(), Function::null());
-  AddBackRef(object_id, &func, kIsDeserialized);
-  // Read the library/class/function information and lookup the function.
-  str_ ^= ReadObjectImpl(func_header, kAsInlinedObject, kInvalidPatchIndex, 0);
-  library_ = Library::LookupLibrary(thread(), str_);
-  if (library_.IsNull() || !library_.Loaded()) {
-    SetReadException("Expected a library name, but found an invalid name.");
-  }
-  str_ ^= ReadObjectImpl(kAsInlinedObject);
-  if (str_.Equals(Symbols::TopLevel(), 0, Symbols::TopLevel().Length())) {
-    str_ ^= ReadObjectImpl(kAsInlinedObject);
-    func ^= library_.LookupLocalFunction(str_);
-  } else {
-    cls_ = library_.LookupClassAllowPrivate(str_);
-    if (cls_.IsNull()) {
-      SetReadException("Expected a class name, but found an invalid name.");
-    }
-    cls_.EnsureIsFinalized(thread());
-    str_ ^= ReadObjectImpl(kAsInlinedObject);
-    func ^= cls_.LookupFunctionAllowPrivate(str_);
-  }
-  if (func.IsNull()) {
-    SetReadException("Expected a function name, but found an invalid name.");
-  }
-  return func.raw();
-}
-
 RawObject* SnapshotReader::ReadStaticImplicitClosure(intptr_t object_id,
                                                      intptr_t class_header) {
   ASSERT(!Snapshot::IsFull(kind_));
@@ -559,7 +517,7 @@
     instance_size = cls_.instance_size();
     ASSERT(instance_size > 0);
     // Allocate the instance and read in all the fields for the object.
-    *result ^= Object::Allocate(cls_.id(), instance_size, HEAP_SPACE(kind_));
+    *result ^= Object::Allocate(cls_.id(), instance_size, Heap::kNew);
   } else {
     cls_ ^= ReadObjectImpl(kAsInlinedObject);
     ASSERT(!cls_.IsNull());
@@ -644,31 +602,6 @@
   PageSpace* page_space_;
 };
 
-RawObject* SnapshotReader::ReadScriptSnapshot() {
-  ASSERT(kind_ == Snapshot::kScript);
-
-  // First read the version string, and check that it matches.
-  RawApiError* error = VerifyVersionAndFeatures(Isolate::Current());
-  if (error != ApiError::null()) {
-    return error;
-  }
-
-  // The version string matches. Read the rest of the snapshot.
-  obj_ = ReadObject();
-  if (!obj_.IsLibrary()) {
-    if (!obj_.IsError()) {
-      const intptr_t kMessageBufferSize = 128;
-      char message_buffer[kMessageBufferSize];
-      Utils::SNPrint(message_buffer, kMessageBufferSize,
-                     "Invalid object %s found in script snapshot",
-                     obj_.ToCString());
-      const String& msg = String::Handle(String::New(message_buffer));
-      obj_ = ApiError::New(msg);
-    }
-  }
-  return obj_.raw();
-}
-
 RawApiError* SnapshotReader::VerifyVersionAndFeatures(Isolate* isolate) {
   // If the version string doesn't match, return an error.
   // Note: New things are allocated only if we're going to return an error.
@@ -899,43 +832,6 @@
   }
 }
 
-void SnapshotReader::FixSubclassesAndImplementors() {
-  Class& cls = Class::Handle(zone());
-  Class& supercls = Class::Handle(zone());
-  Array& interfaces = Array::Handle(zone());
-  AbstractType& interface = AbstractType::Handle(zone());
-  Class& interface_cls = Class::Handle(zone());
-  for (intptr_t i = 0; i < backward_references_->length(); i++) {
-    BackRefNode& backref = (*backward_references_)[i];
-    Object* objref = backref.reference();
-    if (objref->IsClass()) {
-      cls ^= objref->raw();
-      if (!cls.IsInFullSnapshot()) {
-        supercls = cls.SuperClass();
-        if (!supercls.IsNull() && !supercls.IsObjectClass() &&
-            supercls.IsInFullSnapshot()) {
-          supercls.AddDirectSubclass(cls);
-          supercls.DisableCHAOptimizedCode(cls);
-        }
-        interfaces = cls.interfaces();
-        for (intptr_t i = 0; i < interfaces.Length(); i++) {
-          interface ^= interfaces.At(i);
-          interface_cls = interface.type_class();
-
-          interface_cls.set_is_implemented();
-          interface_cls.DisableCHAOptimizedCode(cls);
-
-          if (!interface_cls.IsObjectClass() &&
-              interface_cls.IsInFullSnapshot()) {
-            interface_cls.AddDirectImplementor(cls);
-            interface_cls.DisableCHAImplementorUsers();
-          }
-        }
-      }
-    }
-  }
-}
-
 void SnapshotReader::ArrayReadFrom(intptr_t object_id,
                                    const Array& result,
                                    intptr_t len,
@@ -957,19 +853,6 @@
   }
 }
 
-ScriptSnapshotReader::ScriptSnapshotReader(const uint8_t* buffer,
-                                           intptr_t size,
-                                           Thread* thread)
-    : SnapshotReader(buffer,
-                     size,
-                     Snapshot::kScript,
-                     new ZoneGrowableArray<BackRefNode>(kNumInitialReferences),
-                     thread) {}
-
-ScriptSnapshotReader::~ScriptSnapshotReader() {
-  ResetBackwardReferenceTable();
-}
-
 MessageSnapshotReader::MessageSnapshotReader(Message* message, Thread* thread)
     : SnapshotReader(message->snapshot(),
                      message->snapshot_length(),
@@ -1359,22 +1242,6 @@
   WriteObjectImpl(cls->ptr()->name_, kAsInlinedObject);
 }
 
-void SnapshotWriter::WriteFunctionId(RawFunction* func, bool owner_is_class) {
-  ASSERT(kind_ == Snapshot::kScript);
-  RawClass* cls = (owner_is_class)
-                      ? reinterpret_cast<RawClass*>(func->ptr()->owner_)
-                      : reinterpret_cast<RawPatchClass*>(func->ptr()->owner_)
-                            ->ptr()
-                            ->patched_class_;
-
-  // Write out the library url and class name.
-  RawLibrary* library = cls->ptr()->library_;
-  ASSERT(library != Library::null());
-  WriteObjectImpl(library->ptr()->url_, kAsInlinedObject);
-  WriteObjectImpl(cls->ptr()->name_, kAsInlinedObject);
-  WriteObjectImpl(func->ptr()->name_, kAsInlinedObject);
-}
-
 void SnapshotWriter::WriteStaticImplicitClosure(intptr_t object_id,
                                                 RawFunction* func,
                                                 intptr_t tags) {
@@ -1595,47 +1462,6 @@
   free(const_cast<char*>(expected_features));
 }
 
-ScriptSnapshotWriter::ScriptSnapshotWriter(ReAlloc alloc)
-    : SnapshotWriter(Thread::Current(),
-                     Snapshot::kScript,
-                     alloc,
-                     NULL,
-                     kInitialSize,
-                     &forward_list_,
-                     true /* can_send_any_object */),
-      forward_list_(thread(), kMaxPredefinedObjectIds) {
-  ASSERT(alloc != NULL);
-}
-
-void ScriptSnapshotWriter::WriteScriptSnapshot(const Library& lib) {
-  ASSERT(kind() == Snapshot::kScript);
-  ASSERT(isolate() != NULL);
-  ASSERT(ClassFinalizer::AllClassesFinalized());
-
-  // Setup for long jump in case there is an exception while writing
-  // the snapshot.
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    // Reserve space in the output buffer for a snapshot header.
-    ReserveHeader();
-
-    // Write out the version string.
-    WriteVersionAndFeatures();
-
-    // Write out the library object.
-    {
-      NoSafepointScope no_safepoint;
-
-      // Write out the library object.
-      WriteObject(lib.raw());
-
-      FillHeader(kind());
-    }
-  } else {
-    ThrowException(exception_type(), exception_msg());
-  }
-}
-
 void SnapshotWriterVisitor::VisitPointers(RawObject** first, RawObject** last) {
   ASSERT(Utils::IsAligned(first, sizeof(*first)));
   ASSERT(Utils::IsAligned(last, sizeof(*last)));
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 1a7db52..ddd6057 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -138,24 +138,16 @@
   kIsNotSerialized = 1,
 };
 
-#define HEAP_SPACE(kind) (kind == Snapshot::kMessage) ? Heap::kNew : Heap::kOld
-
 // Structure capturing the raw snapshot.
 //
-// TODO(turnidge): Remove this class once the snapshot does not have a
-// header anymore.  This is pending on making the embedder pass in the
-// length of their snapshot.
 class Snapshot {
  public:
   enum Kind {
-    // N.B. The order of these values must be preserved to give proper error
-    // messages for old snapshots.
-    kFull = 0,  // Full snapshot of core libraries or an application.
-    kScript,    // A partial snapshot of only the application script.
-    kMessage,   // A partial snapshot used only for isolate messaging.
-    kFullJIT,   // Full + JIT code
-    kFullAOT,   // Full + AOT code
-    kNone,      // dart_bootstrap/gen_snapshot
+    kFull,     // Full snapshot of core libraries or an application.
+    kFullJIT,  // Full + JIT code
+    kFullAOT,  // Full + AOT code
+    kMessage,  // A partial snapshot used only for isolate messaging.
+    kNone,     // gen_snapshot
     kInvalid
   };
   static const char* KindToCString(Kind kind);
@@ -387,7 +379,6 @@
   RawObject* RunDelayedRehashingOfMaps();
 
   RawClass* ReadClassId(intptr_t object_id);
-  RawFunction* ReadFunctionId(intptr_t object_id);
   RawObject* ReadStaticImplicitClosure(intptr_t object_id, intptr_t cls_header);
 
   // Implementation to read an object.
@@ -420,10 +411,6 @@
   // Process all the deferred canonicalization entries and patch all references.
   void ProcessDeferredCanonicalizations();
 
-  // Update subclasses array and is implemented bit for interfaces/superclass in
-  // the core snapshot.
-  void FixSubclassesAndImplementors();
-
   // Decode class id from the header field.
   intptr_t LookupInternalClass(intptr_t class_header);
 
@@ -507,15 +494,6 @@
   DISALLOW_COPY_AND_ASSIGN(SnapshotReader);
 };
 
-class ScriptSnapshotReader : public SnapshotReader {
- public:
-  ScriptSnapshotReader(const uint8_t* buffer, intptr_t size, Thread* thread);
-  ~ScriptSnapshotReader();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ScriptSnapshotReader);
-};
-
 class MessageSnapshotReader : public SnapshotReader {
  public:
   MessageSnapshotReader(Message* message, Thread* thread);
@@ -711,8 +689,6 @@
   // Write a version string for the snapshot.
   void WriteVersionAndFeatures();
 
-  void WriteFunctionId(RawFunction* func, bool owner_is_class);
-
   RawFunction* IsSerializableClosure(RawClosure* closure);
 
   void WriteStaticImplicitClosure(intptr_t object_id,
@@ -794,21 +770,6 @@
   DISALLOW_COPY_AND_ASSIGN(SnapshotWriter);
 };
 
-class ScriptSnapshotWriter : public SnapshotWriter {
- public:
-  static const intptr_t kInitialSize = 64 * KB;
-  explicit ScriptSnapshotWriter(ReAlloc alloc);
-  ~ScriptSnapshotWriter() {}
-
-  // Writes a partial snapshot of the script.
-  void WriteScriptSnapshot(const Library& lib);
-
- private:
-  ForwardList forward_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScriptSnapshotWriter);
-};
-
 class SerializedObjectBuffer : public StackResource {
  public:
   SerializedObjectBuffer() : StackResource(Thread::Current()), message_(NULL) {}
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 10b4715..0da0506 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -726,31 +726,6 @@
   delete message;
 }
 
-class TestSnapshotWriter : public SnapshotWriter {
- public:
-  static const intptr_t kInitialSize = 64 * KB;
-  explicit TestSnapshotWriter(ReAlloc alloc)
-      : SnapshotWriter(Thread::Current(),
-                       Snapshot::kScript,
-                       alloc,
-                       NULL,
-                       kInitialSize,
-                       &forward_list_,
-                       true /* can_send_any_object */),
-        forward_list_(thread(), kMaxPredefinedObjectIds) {
-    ASSERT(alloc != NULL);
-  }
-  ~TestSnapshotWriter() {}
-
-  // Writes just a script object
-  void WriteScript(const Script& script) { WriteObject(script.raw()); }
-
- private:
-  ForwardList forward_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSnapshotWriter);
-};
-
 static void GenerateSourceAndCheck(const Script& script) {
   // Check if we are able to generate the source from the token stream.
   // Rescan this source and compare the token stream to see if they are
@@ -786,333 +761,6 @@
   }
 }
 
-ISOLATE_UNIT_TEST_CASE(SerializeScript) {
-  const char* kScriptChars =
-      "class A {\n"
-      "  static bar() { return 42; }\n"
-      "  static fly() { return 5; }\n"
-      "  static s1() { return 'this is a string in the source'; }\n"
-      "  static s2() { return 'this is a \"string\" in the source'; }\n"
-      "  static s3() { return 'this is a \\\'string\\\' in \"the\" source'; }\n"
-      "  static s4() { return 'this \"is\" a \"string\" in \"the\" source'; }\n"
-      "  static ms1() {\n"
-      "    return '''\n"
-      "abc\n"
-      "def\n"
-      "ghi''';\n"
-      "  }\n"
-      "  static ms2() {\n"
-      "    return '''\n"
-      "abc\n"
-      "$def\n"
-      "ghi''';\n"
-      "  }\n"
-      "  static ms3() {\n"
-      "    return '''\n"
-      "a b c\n"
-      "d $d e\n"
-      "g h i''';\n"
-      "  }\n"
-      "  static ms4() {\n"
-      "    return '''\n"
-      "abc\n"
-      "${def}\n"
-      "ghi''';\n"
-      "  }\n"
-      "  static ms5() {\n"
-      "    return '''\n"
-      "a b c\n"
-      "d ${d} e\n"
-      "g h i''';\n"
-      "  }\n"
-      "  static ms6() {\n"
-      "    return '\\t \\n \\x00 \\xFF';\n"
-      "  }\n"
-      "}\n";
-
-  Zone* zone = thread->zone();
-  String& url = String::Handle(zone, String::New("dart-test:SerializeScript"));
-  String& source = String::Handle(zone, String::New(kScriptChars));
-  Script& script =
-      Script::Handle(zone, Script::New(url, source, RawScript::kScriptTag));
-  const String& lib_url = String::Handle(zone, Symbols::New(thread, "TestLib"));
-  Library& lib = Library::Handle(zone, Library::New(lib_url));
-  lib.Register(thread);
-  EXPECT(CompilerTest::TestCompileScript(lib, script));
-
-  // Write snapshot with script content.
-  TestSnapshotWriter writer(&malloc_allocator);
-  writer.WriteScript(script);
-
-  // Read object back from the snapshot.
-  ScriptSnapshotReader reader(writer.buffer(), writer.BytesWritten(), thread);
-  Script& serialized_script = Script::Handle(zone);
-  serialized_script ^= reader.ReadObject();
-
-  // Check if the serialized script object matches the original script.
-  String& expected_literal = String::Handle(zone);
-  String& actual_literal = String::Handle(zone);
-  String& str = String::Handle(zone);
-  str ^= serialized_script.url();
-  EXPECT(url.Equals(str));
-
-  const TokenStream& expected_tokens =
-      TokenStream::Handle(zone, script.tokens());
-  const TokenStream& serialized_tokens =
-      TokenStream::Handle(zone, serialized_script.tokens());
-  const ExternalTypedData& expected_data =
-      ExternalTypedData::Handle(zone, expected_tokens.GetStream());
-  const ExternalTypedData& serialized_data =
-      ExternalTypedData::Handle(zone, serialized_tokens.GetStream());
-  EXPECT_EQ(expected_data.Length(), serialized_data.Length());
-  TokenStream::Iterator expected_iterator(zone, expected_tokens,
-                                          TokenPosition::kMinSource);
-  TokenStream::Iterator serialized_iterator(zone, serialized_tokens,
-                                            TokenPosition::kMinSource);
-  Token::Kind expected_kind = expected_iterator.CurrentTokenKind();
-  Token::Kind serialized_kind = serialized_iterator.CurrentTokenKind();
-  while (expected_kind != Token::kEOS && serialized_kind != Token::kEOS) {
-    EXPECT_EQ(expected_kind, serialized_kind);
-    expected_literal ^= expected_iterator.CurrentLiteral();
-    actual_literal ^= serialized_iterator.CurrentLiteral();
-    EXPECT(expected_literal.Equals(actual_literal));
-    expected_iterator.Advance();
-    serialized_iterator.Advance();
-    expected_kind = expected_iterator.CurrentTokenKind();
-    serialized_kind = serialized_iterator.CurrentTokenKind();
-  }
-
-  // Check if we are able to generate the source from the token stream.
-  // Rescan this source and compare the token stream to see if they are
-  // the same.
-  GenerateSourceAndCheck(serialized_script);
-
-  free(writer.buffer());
-}
-
-#if !defined(PRODUCT)  // Uses mirrors.
-VM_UNIT_TEST_CASE(CanonicalizationInScriptSnapshots) {
-  const char* kScriptChars =
-      "\n"
-      "import 'dart:mirrors';"
-      "import 'dart:isolate';"
-      "void main() {"
-      "  if (reflectClass(MyException).superclass.reflectedType != "
-      "      IsolateSpawnException) {"
-      "    throw new Exception('Canonicalization failure');"
-      "  }"
-      "  if (reflectClass(IsolateSpawnException).reflectedType != "
-      "      IsolateSpawnException) {"
-      "    throw new Exception('Canonicalization failure');"
-      "  }"
-      "}\n"
-      "class MyException extends IsolateSpawnException {}"
-      "\n";
-
-  Dart_Handle result;
-
-  uint8_t* buffer;
-  intptr_t size;
-  intptr_t vm_isolate_snapshot_size;
-  uint8_t* isolate_snapshot = NULL;
-  intptr_t isolate_snapshot_size;
-  uint8_t* full_snapshot = NULL;
-  uint8_t* script_snapshot = NULL;
-
-  bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
-  FLAG_load_deferred_eagerly = true;
-  {
-    // Start an Isolate, and create a full snapshot of it.
-    TestIsolateScope __test_isolate__;
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Write out the script snapshot.
-    result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
-                                 &isolate_snapshot, &isolate_snapshot_size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
-    full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
-    memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
-    Dart_ExitScope();
-  }
-  FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
-
-  {
-    // Now Create an Isolate using the full snapshot and load the
-    // script  and execute it.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Create a test library and Load up a test script in it.
-    Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-
-    EXPECT_VALID(lib);
-
-    // Invoke a function which returns an object.
-    result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-    EXPECT_VALID(result);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-  }
-
-  {
-    // Create an Isolate using the full snapshot, load a script and create
-    // a script snapshot of the script.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Create a test library and Load up a test script in it.
-    TestCase::LoadTestScript(kScriptChars, NULL);
-
-    EXPECT_VALID(Api::CheckAndFinalizePendingClasses(Thread::Current()));
-
-    // Write out the script snapshot.
-    result = Dart_CreateScriptSnapshot(&buffer, &size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(buffer, size));
-    script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
-    memmove(script_snapshot, buffer, size);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-  }
-
-  {
-    // Now Create an Isolate using the full snapshot and load the
-    // script snapshot created above and execute it.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Load the test library from the snapshot.
-    EXPECT(script_snapshot != NULL);
-    result = Dart_LoadScriptFromSnapshot(script_snapshot, size);
-    EXPECT_VALID(result);
-
-    // Invoke a function which returns an object.
-    result = Dart_Invoke(result, NewString("main"), 0, NULL);
-    EXPECT_VALID(result);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-  }
-  free(script_snapshot);
-  free(full_snapshot);
-}
-#endif
-
-VM_UNIT_TEST_CASE(ScriptSnapshotsUpdateSubclasses) {
-  const char* kScriptChars =
-      "class _DebugDuration extends Duration {\n"
-      "  const _DebugDuration() : super(milliseconds: 42);\n"
-      "}\n"
-      "foo(x, y) {\n"
-      "  for (var i = 0; i < 1000000; i++) {\n"
-      "    if (x != y) {\n"
-      "      throw 'Boom!';\n"
-      "    }\n"
-      "  }\n"
-      "}\n"
-      "main() {\n"
-      "  final v = const Duration(milliseconds: 42);\n"
-      "  foo(v, new _DebugDuration());\n"
-      "}\n"
-      "\n";
-
-  Dart_Handle result;
-
-  uint8_t* buffer;
-  intptr_t size;
-  intptr_t vm_isolate_snapshot_size;
-  uint8_t* isolate_snapshot = NULL;
-  intptr_t isolate_snapshot_size;
-  uint8_t* full_snapshot = NULL;
-  uint8_t* script_snapshot = NULL;
-
-#if !defined(PRODUCT)
-  bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
-  FLAG_load_deferred_eagerly = true;
-#endif
-  intptr_t saved_max_polymorphic_checks = FLAG_max_polymorphic_checks;
-  FLAG_max_polymorphic_checks = 0;
-
-  {
-    // Start an Isolate, and create a full snapshot of it.
-    TestIsolateScope __test_isolate__;
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Write out the script snapshot.
-    result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
-                                 &isolate_snapshot, &isolate_snapshot_size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
-    full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
-    memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
-    Dart_ExitScope();
-  }
-
-  {
-    // Now Create an Isolate using the full snapshot and load the
-    // script  and execute it.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Create a test library and Load up a test script in it.
-    Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-
-    EXPECT_VALID(lib);
-
-    // Invoke a function which returns an object.
-    result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-    EXPECT_VALID(result);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-  }
-
-  {
-    // Create an Isolate using the full snapshot, load a script and create
-    // a script snapshot of the script.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Create a test library and Load up a test script in it.
-    TestCase::LoadTestScript(kScriptChars, NULL);
-
-    EXPECT_VALID(Api::CheckAndFinalizePendingClasses(Thread::Current()));
-
-    // Write out the script snapshot.
-    result = Dart_CreateScriptSnapshot(&buffer, &size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(buffer, size));
-    script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
-    memmove(script_snapshot, buffer, size);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-  }
-
-  {
-    // Now Create an Isolate using the full snapshot and load the
-    // script snapshot created above and execute it.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Load the test library from the snapshot.
-    EXPECT(script_snapshot != NULL);
-    result = Dart_LoadScriptFromSnapshot(script_snapshot, size);
-    EXPECT_VALID(result);
-
-    // Invoke a function which returns an object.
-    result = Dart_Invoke(result, NewString("main"), 0, NULL);
-    EXPECT_VALID(result);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-  }
-  free(script_snapshot);
-  free(full_snapshot);
-
-  FLAG_max_polymorphic_checks = saved_max_polymorphic_checks;
-#if !defined(PRODUCT)
-  FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
-#endif
-}
-
 static void IterateScripts(const Library& lib) {
   const Array& lib_scripts = Array::Handle(lib.LoadedScripts());
   Script& script = Script::Handle();
@@ -1290,450 +938,6 @@
   free(isolate_snapshot_data_buffer);
 }
 
-#ifndef PRODUCT
-
-VM_UNIT_TEST_CASE(ScriptSnapshot) {
-  const char* kLibScriptChars =
-      "library dart_import_lib;"
-      "class LibFields  {"
-      "  LibFields(int i, int j) : fld1 = i, fld2 = j {}"
-      "  int fld1;"
-      "  final int fld2;"
-      "}";
-  const char* kScriptChars =
-      "class TestTrace implements StackTrace {"
-      "  TestTrace();"
-      "  String toString() { return 'my trace'; }"
-      "}"
-      "class Fields  {"
-      "  Fields(int i, int j) : fld1 = i, fld2 = j {}"
-      "  int fld1;"
-      "  final int fld2;"
-      "  static int fld3;"
-      "  static const int fld4 = 10;"
-      "}"
-      "class FieldsTest {"
-      "  static Fields testMain() {"
-      "    Fields obj = new Fields(10, 20);"
-      "    Fields.fld3 = 100;"
-      "    if (obj == null) {"
-      "      throw new Exception('Allocation failure');"
-      "    }"
-      "    if (obj.fld1 != 10) {"
-      "      throw new Exception('fld1 needs to be 10');"
-      "    }"
-      "    if (obj.fld2 != 20) {"
-      "      throw new Exception('fld2 needs to be 20');"
-      "    }"
-      "    if (Fields.fld3 != 100) {"
-      "      throw new Exception('Fields.fld3 needs to be 100');"
-      "    }"
-      "    if (Fields.fld4 != 10) {"
-      "      throw new Exception('Fields.fld4 needs to be 10');"
-      "    }"
-      "    return obj;"
-      "  }"
-      "}";
-  Dart_Handle result;
-
-  uint8_t* buffer;
-  intptr_t size;
-  intptr_t vm_isolate_snapshot_size;
-  uint8_t* isolate_snapshot = NULL;
-  intptr_t isolate_snapshot_size;
-  uint8_t* full_snapshot = NULL;
-  uint8_t* script_snapshot = NULL;
-  intptr_t expected_num_libs;
-  intptr_t actual_num_libs;
-
-  bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
-  FLAG_load_deferred_eagerly = true;
-  {
-    // Start an Isolate, and create a full snapshot of it.
-    TestIsolateScope __test_isolate__;
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Write out the script snapshot.
-    result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
-                                 &isolate_snapshot, &isolate_snapshot_size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
-    full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
-    memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
-    Dart_ExitScope();
-  }
-  FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
-
-  // Test for Dart_CreateScriptSnapshot.
-  {
-    // Create an Isolate using the full snapshot, load a script and create
-    // a script snapshot of the script.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Load the library.
-    Dart_Handle import_lib =
-        Dart_LoadLibrary(NewString("dart_import_lib"), Dart_Null(),
-                         NewString(kLibScriptChars), 0, 0);
-    EXPECT_VALID(import_lib);
-
-    // Create a test library and Load up a test script in it.
-    TestCase::LoadTestScript(kScriptChars, NULL);
-
-    EXPECT_VALID(
-        Dart_LibraryImportLibrary(TestCase::lib(), import_lib, Dart_Null()));
-    EXPECT_VALID(Api::CheckAndFinalizePendingClasses(Thread::Current()));
-
-    // Get list of library URLs loaded and save the count.
-    Dart_Handle libs = Dart_GetLibraryIds();
-    EXPECT(Dart_IsList(libs));
-    Dart_ListLength(libs, &expected_num_libs);
-
-    // Write out the script snapshot.
-    result = Dart_CreateScriptSnapshot(&buffer, &size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(buffer, size));
-    script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
-    memmove(script_snapshot, buffer, size);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-  }
-
-  {
-    // Now Create an Isolate using the full snapshot and load the
-    // script snapshot created above and execute it.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Load the test library from the snapshot.
-    EXPECT(script_snapshot != NULL);
-    result = Dart_LoadScriptFromSnapshot(script_snapshot, size);
-    EXPECT_VALID(result);
-
-    // Get list of library URLs loaded and compare with expected count.
-    Dart_Handle libs = Dart_GetLibraryIds();
-    EXPECT(Dart_IsList(libs));
-    Dart_ListLength(libs, &actual_num_libs);
-
-    EXPECT_EQ(expected_num_libs, actual_num_libs);
-
-    // Invoke a function which returns an object.
-    Dart_Handle cls = Dart_GetClass(result, NewString("FieldsTest"));
-    result = Dart_Invoke(cls, NewString("testMain"), 0, NULL);
-    EXPECT_VALID(result);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-  }
-  free(full_snapshot);
-  free(script_snapshot);
-}
-
-VM_UNIT_TEST_CASE(ScriptSnapshot1) {
-  const char* kScriptChars =
-      "class _SimpleNumEnumerable<T extends num> {"
-      "final Iterable<T> _source;"
-      "const _SimpleNumEnumerable(this._source) : super();"
-      "}";
-
-  Dart_Handle result;
-  uint8_t* buffer;
-  intptr_t size;
-  intptr_t vm_isolate_snapshot_size;
-  uint8_t* isolate_snapshot = NULL;
-  intptr_t isolate_snapshot_size;
-  uint8_t* full_snapshot = NULL;
-  uint8_t* script_snapshot = NULL;
-
-  bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
-  FLAG_load_deferred_eagerly = true;
-  bool saved_concurrent_sweep_mode = FLAG_concurrent_sweep;
-  FLAG_concurrent_sweep = false;
-  {
-    // Start an Isolate, and create a full snapshot of it.
-    TestIsolateScope __test_isolate__;
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Write out the script snapshot.
-    result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
-                                 &isolate_snapshot, &isolate_snapshot_size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
-    full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
-    memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
-    Dart_ExitScope();
-  }
-  FLAG_concurrent_sweep = saved_concurrent_sweep_mode;
-
-  {
-    // Create an Isolate using the full snapshot, load a script and create
-    // a script snapshot of the script.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Create a test library and Load up a test script in it.
-    TestCase::LoadTestScript(kScriptChars, NULL);
-
-    // Write out the script snapshot.
-    result = Dart_CreateScriptSnapshot(&buffer, &size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(buffer, size));
-    script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
-    memmove(script_snapshot, buffer, size);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-  }
-
-  {
-    // Now Create an Isolate using the full snapshot and load the
-    // script snapshot created above and execute it.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Load the test library from the snapshot.
-    EXPECT(script_snapshot != NULL);
-    result = Dart_LoadScriptFromSnapshot(script_snapshot, size);
-    EXPECT_VALID(result);
-    Dart_ExitScope();
-  }
-
-  FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
-  Dart_ShutdownIsolate();
-  free(full_snapshot);
-  free(script_snapshot);
-}
-
-VM_UNIT_TEST_CASE(ScriptSnapshot2) {
-  // The snapshot of this library is always created in production mode, but
-  // loaded and executed in both production and checked modes.
-  // This test verifies that type information is still contained in the snapshot
-  // although it was created in production mode and that type errors and
-  // compilation errors (for const fields) are correctly reported according to
-  // the execution mode.
-  const char* kLibScriptChars =
-      "library dart_import_lib;"
-      "const String s = 1.0;"
-      "final int i = true;"
-      "bool b;";
-  const char* kScriptChars =
-      "test_s() {"
-      "  s;"
-      "}"
-      "test_i() {"
-      "  i;"
-      "}"
-      "test_b() {"
-      "  b = 0;"
-      "}";
-  Dart_Handle result;
-
-  uint8_t* buffer;
-  intptr_t size;
-  intptr_t vm_isolate_snapshot_size;
-  uint8_t* isolate_snapshot = NULL;
-  intptr_t isolate_snapshot_size;
-  uint8_t* full_snapshot = NULL;
-  uint8_t* script_snapshot = NULL;
-
-  // Force creation of snapshot in production mode.
-  bool saved_enable_type_checks_mode = FLAG_enable_type_checks;
-  NOT_IN_PRODUCT(FLAG_enable_type_checks = false);
-  bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
-  FLAG_load_deferred_eagerly = true;
-  bool saved_concurrent_sweep_mode = FLAG_concurrent_sweep;
-  FLAG_concurrent_sweep = false;
-  {
-    // Start an Isolate, and create a full snapshot of it.
-    TestIsolateScope __test_isolate__;
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Write out the script snapshot.
-    result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
-                                 &isolate_snapshot, &isolate_snapshot_size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
-    full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
-    memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
-    Dart_ExitScope();
-  }
-  FLAG_concurrent_sweep = saved_concurrent_sweep_mode;
-
-  {
-    // Create an Isolate using the full snapshot, load a script and create
-    // a script snapshot of the script.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Load the library.
-    Dart_Handle import_lib =
-        Dart_LoadLibrary(NewString("dart_import_lib"), Dart_Null(),
-                         NewString(kLibScriptChars), 0, 0);
-    EXPECT_VALID(import_lib);
-
-    // Create a test library and Load up a test script in it.
-    TestCase::LoadTestScript(kScriptChars, NULL);
-
-    EXPECT_VALID(
-        Dart_LibraryImportLibrary(TestCase::lib(), import_lib, Dart_Null()));
-    EXPECT_VALID(Api::CheckAndFinalizePendingClasses(Thread::Current()));
-
-    // Write out the script snapshot.
-    result = Dart_CreateScriptSnapshot(&buffer, &size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(buffer, size));
-    script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
-    memmove(script_snapshot, buffer, size);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-  }
-
-  // Continue in originally saved mode.
-  NOT_IN_PRODUCT(FLAG_enable_type_checks = saved_enable_type_checks_mode);
-  FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
-
-  {
-    // Now Create an Isolate using the full snapshot and load the
-    // script snapshot created above and execute it.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Load the test library from the snapshot.
-    EXPECT(script_snapshot != NULL);
-    Dart_Handle lib = Dart_LoadScriptFromSnapshot(script_snapshot, size);
-    EXPECT_VALID(lib);
-
-    // Invoke the test_s function.
-    result = Dart_Invoke(lib, NewString("test_s"), 0, NULL);
-    EXPECT(Dart_IsError(result) == saved_enable_type_checks_mode);
-
-    // Invoke the test_i function.
-    result = Dart_Invoke(lib, NewString("test_i"), 0, NULL);
-    EXPECT(Dart_IsError(result) == saved_enable_type_checks_mode);
-
-    // Invoke the test_b function.
-    result = Dart_Invoke(lib, NewString("test_b"), 0, NULL);
-    EXPECT(Dart_IsError(result) == saved_enable_type_checks_mode);
-    Dart_ExitScope();
-  }
-  Dart_ShutdownIsolate();
-  free(full_snapshot);
-  free(script_snapshot);
-}
-
-VM_UNIT_TEST_CASE(MismatchedSnapshotKinds) {
-  const char* kScriptChars = "main() { print('Hello, world!'); }";
-  Dart_Handle result;
-
-  uint8_t* buffer;
-  intptr_t size;
-  intptr_t vm_isolate_snapshot_size;
-  uint8_t* isolate_snapshot = NULL;
-  intptr_t isolate_snapshot_size;
-  uint8_t* full_snapshot = NULL;
-  uint8_t* script_snapshot = NULL;
-
-  bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
-  FLAG_load_deferred_eagerly = true;
-  bool saved_concurrent_sweep_mode = FLAG_concurrent_sweep;
-  FLAG_concurrent_sweep = false;
-  {
-    // Start an Isolate, and create a full snapshot of it.
-    TestIsolateScope __test_isolate__;
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Write out the script snapshot.
-    result = Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size,
-                                 &isolate_snapshot, &isolate_snapshot_size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(isolate_snapshot, isolate_snapshot_size));
-    full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
-    memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
-    Dart_ExitScope();
-  }
-  FLAG_concurrent_sweep = saved_concurrent_sweep_mode;
-  FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
-
-  {
-    // Create an Isolate using the full snapshot, load a script and create
-    // a script snapshot of the script.
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Create a test library and Load up a test script in it.
-    TestCase::LoadTestScript(kScriptChars, NULL);
-
-    EXPECT_VALID(Api::CheckAndFinalizePendingClasses(Thread::Current()));
-
-    // Write out the script snapshot.
-    result = Dart_CreateScriptSnapshot(&buffer, &size);
-    EXPECT_VALID(result);
-    EXPECT(Dart_IsSnapshot(buffer, size));
-    script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
-    memmove(script_snapshot, buffer, size);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-  }
-
-  {
-    // Use a script snapshot where a full snapshot is expected.
-    char* error = NULL;
-    Dart_Isolate isolate =
-        Dart_CreateIsolate("script-uri", "main", script_snapshot, NULL, NULL,
-                           NULL, NULL, NULL, &error);
-    EXPECT(isolate == NULL);
-    EXPECT(error != NULL);
-    EXPECT_SUBSTRING(
-        "Incompatible snapshot kinds:"
-        " vm 'full', isolate 'script'",
-        error);
-    free(error);
-  }
-
-  {
-    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Use a full snapshot where a script snapshot is expected.
-    Dart_Handle result = Dart_LoadScriptFromSnapshot(full_snapshot, size);
-    EXPECT_ERROR(result,
-                 "Dart_LoadScriptFromSnapshot expects parameter"
-                 " 'buffer' to be a script type snapshot.");
-
-    Dart_ExitScope();
-  }
-  Dart_ShutdownIsolate();
-  free(full_snapshot);
-  free(script_snapshot);
-}
-
-VM_UNIT_TEST_CASE(CheckKernelSnapshot) {
-  intptr_t vm_isolate_snapshot_size;
-  uint8_t* isolate_snapshot = NULL;
-  intptr_t isolate_snapshot_size;
-  uint8_t* full_snapshot = NULL;
-  bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly;
-  FLAG_load_deferred_eagerly = true;
-  {
-    // Start an Isolate, and create a full snapshot of it.
-    TestIsolateScope __test_isolate__;
-    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
-
-    // Write out the script snapshot.
-    Dart_Handle result =
-        Dart_CreateSnapshot(NULL, &vm_isolate_snapshot_size, &isolate_snapshot,
-                            &isolate_snapshot_size);
-    EXPECT_VALID(result);
-    full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size));
-    memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size);
-    Dart_ExitScope();
-  }
-  FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode;
-  bool is_kernel = Dart_IsDart2Snapshot(full_snapshot);
-  EXPECT_EQ(FLAG_strong, is_kernel);
-  free(full_snapshot);
-}
-
-#endif  // !PRODUCT
-
 // Helper function to call a top level Dart function and serialize the result.
 static Message* GetSerialized(Dart_Handle lib, const char* dart_function) {
   Dart_Handle result;
@@ -2962,13 +2166,6 @@
   free(writer.buffer());
 }
 
-TEST_CASE(IsSnapshotNegative) {
-  EXPECT(!Dart_IsSnapshot(NULL, 0));
-
-  uint8_t buffer[4] = {0, 0, 0, 0};
-  EXPECT(!Dart_IsSnapshot(buffer, ARRAY_SIZE(buffer)));
-}
-
 TEST_CASE(IsKernelNegative) {
   EXPECT(!Dart_IsKernel(NULL, 0));
 
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 2104353..796eae1 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -60,7 +60,7 @@
                              : (variable_index + param_end_from_fp);
 }
 
-void FrameLayout::InitOnce() {
+void FrameLayout::Init() {
   compiler_frame_layout = default_frame_layout;
   runtime_frame_layout = default_frame_layout;
 }
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 58dcc56..c43b60f 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -83,7 +83,7 @@
   }
 
   // Called to initialize the stack frame layout during startup.
-  static void InitOnce();
+  static void Init();
 };
 
 extern FrameLayout compiler_frame_layout;
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 472a825..6e59100 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -43,7 +43,12 @@
 }
 
 #if defined(DART_PRECOMPILED_RUNTIME)
-void StubCode::InitOnce() {
+void StubCode::Init() {
+  // Stubs will be loaded from the snapshot.
+  UNREACHABLE();
+}
+
+void StubCode::Cleanup() {
   // Stubs will be loaded from the snapshot.
   UNREACHABLE();
 }
@@ -53,7 +58,7 @@
   code ^= Generate("_stub_" #name, StubCode::Generate##name##Stub);            \
   entries_[k##name##Index] = new StubEntry(code);
 
-void StubCode::InitOnce() {
+void StubCode::Init() {
   // Generate all the stubs.
   Code& code = Code::Handle();
   VM_STUB_CODE_LIST(STUB_CODE_GENERATE);
@@ -61,6 +66,16 @@
 
 #undef STUB_CODE_GENERATE
 
+#define STUB_CODE_CLEANUP(name)                                                \
+  delete entries_[k##name##Index];                                             \
+  entries_[k##name##Index] = NULL;
+
+void StubCode::Cleanup() {
+  VM_STUB_CODE_LIST(STUB_CODE_CLEANUP);
+}
+
+#undef STUB_CODE_CLEANUP
+
 RawCode* StubCode::Generate(const char* name,
                             void (*GenerateStub)(Assembler* assembler)) {
   ObjectPoolWrapper object_pool_wrapper;
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 73ff3dd..95ec250 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -148,8 +148,9 @@
  public:
   // Generate all stubs which are shared across all isolates, this is done
   // only once and the stub code resides in the vm_isolate heap.
-  static void InitOnce();
+  static void Init();
 
+  static void Cleanup();
   static void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
   // Returns true if stub code has been initialized.
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index fdbdd82..e6c0219 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -44,6 +44,7 @@
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
 
+  __ ldr(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
   __ EnterStubFrame();
 
   // Save exit frame information to enable stack walking as we are about
@@ -648,6 +649,8 @@
 }
 
 void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
+  __ Push(CODE_REG);
+  __ ldr(CODE_REG, Address(THR, Thread::deoptimize_stub_offset()));
   GenerateDeoptimizationSequence(assembler, kEagerDeopt);
   __ Ret();
 }
@@ -1097,14 +1100,14 @@
 }
 
 void StubCode::GenerateWriteBarrierWrappersStub(Assembler* assembler) {
-  RegList saved = (1 << LR) | (1 << R0);
+  RegList saved = (1 << LR) | (1 << kWriteBarrierObjectReg);
   for (intptr_t i = 0; i < kNumberOfCpuRegisters; ++i) {
     if ((kDartAvailableCpuRegs & (1 << i)) == 0) continue;
 
     Register reg = static_cast<Register>(i);
     intptr_t start = __ CodeSize();
     __ PushList(saved);
-    __ mov(R0, Operand(reg));
+    __ mov(kWriteBarrierObjectReg, Operand(reg));
     __ ldr(LR, Address(THR, Thread::write_barrier_entry_point_offset()));
     __ blx(LR);
     __ PopList(saved);
@@ -1117,22 +1120,24 @@
 
 // Helper stub to implement Assembler::StoreIntoObject.
 // Input parameters:
-//   R0: Source object (old)
-//  TMP: Target object (old or new)
-// If TMP is new, add R0 to the store buffer. Otherwise TMP is old, mark TMP
+//   R1: Object (old)
+//   R0: Value (old or new)
+// If R0 is new, add R1 to the store buffer. Otherwise R0 is old, mark R0
 // and add it to the mark list.
+COMPILE_ASSERT(kWriteBarrierObjectReg == R1);
+COMPILE_ASSERT(kWriteBarrierValueReg == R0);
 void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
 #if defined(CONCURRENT_MARKING)
   Label add_to_mark_stack;
-  __ tst(TMP, Operand(1 << kNewObjectBitPosition));
+  __ tst(R0, Operand(1 << kNewObjectBitPosition));
   __ b(&add_to_mark_stack, ZERO);
 #else
   Label add_to_buffer;
   // Check whether this object has already been remembered. Skip adding to the
   // store buffer if the object is in the store buffer already.
-  // Spilled: R1, R2, R3
-  // R0: Address being stored
-  __ ldr(TMP, FieldAddress(R0, Object::tags_offset()));
+  // Spilled: R2, R3, R4
+  // R1: Address being stored
+  __ ldr(TMP, FieldAddress(R1, Object::tags_offset()));
   __ tst(TMP, Operand(1 << RawObject::kOldAndNotRememberedBit));
   __ b(&add_to_buffer, NE);
   __ Ret();
@@ -1141,46 +1146,46 @@
 #endif
 
   // Save values being destroyed.
-  __ PushList((1 << R1) | (1 << R2) | (1 << R3));
+  __ PushList((1 << R2) | (1 << R3) | (1 << R4));
 
   if (TargetCPUFeatures::arm_version() == ARMv5TE) {
 // TODO(21263): Implement 'swp' and use it below.
 #if !defined(USING_SIMULATOR)
     ASSERT(OS::NumberOfAvailableProcessors() <= 1);
 #endif
-    __ ldr(R2, FieldAddress(R0, Object::tags_offset()));
+    __ ldr(R2, FieldAddress(R1, Object::tags_offset()));
     __ bic(R2, R2, Operand(1 << RawObject::kOldAndNotRememberedBit));
-    __ str(R2, FieldAddress(R0, Object::tags_offset()));
+    __ str(R2, FieldAddress(R1, Object::tags_offset()));
   } else {
     // Atomically set the remembered bit of the object header.
     ASSERT(Object::tags_offset() == 0);
-    __ sub(R3, R0, Operand(kHeapObjectTag));
+    __ sub(R3, R1, Operand(kHeapObjectTag));
     // R3: Untagged address of header word (ldrex/strex do not support offsets).
     Label retry;
     __ Bind(&retry);
     __ ldrex(R2, R3);
     __ bic(R2, R2, Operand(1 << RawObject::kOldAndNotRememberedBit));
-    __ strex(R1, R2, R3);
-    __ cmp(R1, Operand(1));
+    __ strex(R4, R2, R3);
+    __ cmp(R4, Operand(1));
     __ b(&retry, EQ);
   }
 
   // Load the StoreBuffer block out of the thread. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
-  __ ldr(R1, Address(THR, Thread::store_buffer_block_offset()));
-  __ ldr(R2, Address(R1, StoreBufferBlock::top_offset()));
-  __ add(R3, R1, Operand(R2, LSL, kWordSizeLog2));
-  __ str(R0, Address(R3, StoreBufferBlock::pointers_offset()));
+  __ ldr(R4, Address(THR, Thread::store_buffer_block_offset()));
+  __ ldr(R2, Address(R4, StoreBufferBlock::top_offset()));
+  __ add(R3, R4, Operand(R2, LSL, kWordSizeLog2));
+  __ str(R1, Address(R3, StoreBufferBlock::pointers_offset()));
 
   // Increment top_ and check for overflow.
   // R2: top_.
-  // R1: StoreBufferBlock.
+  // R4: StoreBufferBlock.
   Label overflow;
   __ add(R2, R2, Operand(1));
-  __ str(R2, Address(R1, StoreBufferBlock::top_offset()));
+  __ str(R2, Address(R4, StoreBufferBlock::top_offset()));
   __ CompareImmediate(R2, StoreBufferBlock::kSize);
   // Restore values.
-  __ PopList((1 << R1) | (1 << R2) | (1 << R3));
+  __ PopList((1 << R2) | (1 << R3) | (1 << R4));
   __ b(&overflow, EQ);
   __ Ret();
 
@@ -1200,7 +1205,7 @@
 
 #if defined(CONCURRENT_MARKING)
   __ Bind(&add_to_mark_stack);
-  __ PushList((1 << R1) | (1 << R2) | (1 << R3));  // Spill.
+  __ PushList((1 << R2) | (1 << R3) | (1 << R4));  // Spill.
 
   Label marking_retry, lost_race, marking_overflow;
   if (TargetCPUFeatures::arm_version() == ARMv5TE) {
@@ -1208,32 +1213,32 @@
 #if !defined(USING_SIMULATOR)
     ASSERT(OS::NumberOfAvailableProcessors() <= 1);
 #endif
-    __ ldr(R2, FieldAddress(TMP, Object::tags_offset()));
+    __ ldr(R2, FieldAddress(R0, Object::tags_offset()));
     __ bic(R2, R2, Operand(1 << RawObject::kOldAndNotMarkedBit));
-    __ str(R2, FieldAddress(TMP, Object::tags_offset()));
+    __ str(R2, FieldAddress(R0, Object::tags_offset()));
   } else {
     // Atomically clear kOldAndNotMarkedBit.
     ASSERT(Object::tags_offset() == 0);
-    __ sub(R3, TMP, Operand(kHeapObjectTag));
+    __ sub(R3, R0, Operand(kHeapObjectTag));
     // R3: Untagged address of header word (ldrex/strex do not support offsets).
     __ Bind(&marking_retry);
     __ ldrex(R2, R3);
     __ tst(R2, Operand(1 << RawObject::kOldAndNotMarkedBit));
     __ b(&lost_race, ZERO);
     __ bic(R2, R2, Operand(1 << RawObject::kOldAndNotMarkedBit));
-    __ strex(R1, R2, R3);
-    __ cmp(R1, Operand(1));
+    __ strex(R4, R2, R3);
+    __ cmp(R4, Operand(1));
     __ b(&marking_retry, EQ);
   }
 
-  __ ldr(R1, Address(THR, Thread::marking_stack_block_offset()));
-  __ ldr(R2, Address(R1, MarkingStackBlock::top_offset()));
-  __ add(R3, R1, Operand(R2, LSL, kWordSizeLog2));
-  __ str(TMP, Address(R3, MarkingStackBlock::pointers_offset()));
+  __ ldr(R4, Address(THR, Thread::marking_stack_block_offset()));
+  __ ldr(R2, Address(R4, MarkingStackBlock::top_offset()));
+  __ add(R3, R4, Operand(R2, LSL, kWordSizeLog2));
+  __ str(R0, Address(R3, MarkingStackBlock::pointers_offset()));
   __ add(R2, R2, Operand(1));
-  __ str(R2, Address(R1, MarkingStackBlock::top_offset()));
+  __ str(R2, Address(R4, MarkingStackBlock::top_offset()));
   __ CompareImmediate(R2, MarkingStackBlock::kSize);
-  __ PopList((1 << R1) | (1 << R2) | (1 << R3));  // Unspill.
+  __ PopList((1 << R4) | (1 << R2) | (1 << R3));  // Unspill.
   __ b(&marking_overflow, EQ);
   __ Ret();
 
@@ -1248,7 +1253,7 @@
   __ Ret();
 
   __ Bind(&lost_race);
-  __ PopList((1 << R1) | (1 << R2) | (1 << R3));  // Unspill.
+  __ PopList((1 << R2) | (1 << R3) | (1 << R4));  // Unspill.
   __ Ret();
 #endif
 }
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 0f1bf6f..15e905d 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -43,8 +43,9 @@
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
 
-  __ SetPrologueOffset();
   __ Comment("CallToRuntimeStub");
+  __ ldr(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
+  __ SetPrologueOffset();
   __ EnterStubFrame();
 
   // Save exit frame information to enable stack walking as we are about
@@ -692,6 +693,8 @@
 }
 
 void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
+  __ Push(CODE_REG);
+  __ ldr(CODE_REG, Address(THR, Thread::deoptimize_stub_offset()));
   GenerateDeoptimizationSequence(assembler, kEagerDeopt);
   __ ret();
 }
@@ -1312,11 +1315,11 @@
     Register reg = static_cast<Register>(i);
     intptr_t start = __ CodeSize();
     __ Push(LR);
-    __ Push(R0);
-    __ mov(R0, reg);
+    __ Push(kWriteBarrierObjectReg);
+    __ mov(kWriteBarrierObjectReg, reg);
     __ ldr(LR, Address(THR, Thread::write_barrier_entry_point_offset()));
     __ blr(LR);
-    __ Pop(R0);
+    __ Pop(kWriteBarrierObjectReg);
     __ Pop(LR);
     __ ret(LR);
     intptr_t end = __ CodeSize();
@@ -1327,19 +1330,21 @@
 
 // Helper stub to implement Assembler::StoreIntoObject.
 // Input parameters:
-//   R0: Source object (old)
-//   TMP2: Target object (old or new)
-// If TMP2 is new, add R0 to the store buffer. Otherwise TMP2 is old, mark TMP2
+//   R1: Object (old)
+//   R0: Value (old or new)
+// If R0 is new, add R1 to the store buffer. Otherwise R0 is old, mark R0
 // and add it to the mark list.
+COMPILE_ASSERT(kWriteBarrierObjectReg == R1);
+COMPILE_ASSERT(kWriteBarrierValueReg == R0);
 void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
 #if defined(CONCURRENT_MARKING)
   Label add_to_mark_stack;
-  __ tbz(&add_to_mark_stack, TMP2, kNewObjectBitPosition);
+  __ tbz(&add_to_mark_stack, R0, kNewObjectBitPosition);
 #else
   Label add_to_buffer;
   // Check whether this object has already been remembered. Skip adding to the
   // store buffer if the object is in the store buffer already.
-  __ LoadFieldFromOffset(TMP, R0, Object::tags_offset(), kWord);
+  __ LoadFieldFromOffset(TMP, R1, Object::tags_offset(), kWord);
   __ tbnz(&add_to_buffer, TMP, RawObject::kOldAndNotRememberedBit);
   __ ret();
 
@@ -1347,13 +1352,13 @@
 #endif
 
   // Save values being destroyed.
-  __ Push(R1);
   __ Push(R2);
   __ Push(R3);
+  __ Push(R4);
 
   // Atomically set the remembered bit of the object header.
   ASSERT(Object::tags_offset() == 0);
-  __ sub(R3, R0, Operand(kHeapObjectTag));
+  __ sub(R3, R1, Operand(kHeapObjectTag));
   // R3: Untagged address of header word (ldxr/stxr do not support offsets).
   // Note that we use 32 bit operations here to match the size of the
   // background sweeper which is also manipulating this 32 bit word.
@@ -1361,27 +1366,27 @@
   __ Bind(&retry);
   __ ldxr(R2, R3, kWord);
   __ AndImmediate(R2, R2, ~(1 << RawObject::kOldAndNotRememberedBit));
-  __ stxr(R1, R2, R3, kWord);
-  __ cbnz(&retry, R1);
+  __ stxr(R4, R2, R3, kWord);
+  __ cbnz(&retry, R4);
 
   // Load the StoreBuffer block out of the thread. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
-  __ LoadFromOffset(R1, THR, Thread::store_buffer_block_offset());
-  __ LoadFromOffset(R2, R1, StoreBufferBlock::top_offset(), kUnsignedWord);
-  __ add(R3, R1, Operand(R2, LSL, kWordSizeLog2));
-  __ StoreToOffset(R0, R3, StoreBufferBlock::pointers_offset());
+  __ LoadFromOffset(R4, THR, Thread::store_buffer_block_offset());
+  __ LoadFromOffset(R2, R4, StoreBufferBlock::top_offset(), kUnsignedWord);
+  __ add(R3, R4, Operand(R2, LSL, kWordSizeLog2));
+  __ StoreToOffset(R1, R3, StoreBufferBlock::pointers_offset());
 
   // Increment top_ and check for overflow.
   // R2: top_.
-  // R1: StoreBufferBlock.
+  // R4: StoreBufferBlock.
   Label overflow;
   __ add(R2, R2, Operand(1));
-  __ StoreToOffset(R2, R1, StoreBufferBlock::top_offset(), kUnsignedWord);
+  __ StoreToOffset(R2, R4, StoreBufferBlock::top_offset(), kUnsignedWord);
   __ CompareImmediate(R2, StoreBufferBlock::kSize);
   // Restore values.
+  __ Pop(R4);
   __ Pop(R3);
   __ Pop(R2);
-  __ Pop(R1);
   __ b(&overflow, EQ);
   __ ret();
 
@@ -1401,34 +1406,34 @@
 
 #if defined(CONCURRENT_MARKING)
   __ Bind(&add_to_mark_stack);
-  __ Push(R1);  // Spill.
   __ Push(R2);  // Spill.
   __ Push(R3);  // Spill.
+  __ Push(R4);  // Spill.
 
   // Atomically clear kOldAndNotMarkedBit.
   // Note that we use 32 bit operations here to match the size of the
   // background sweeper which is also manipulating this 32 bit word.
   Label marking_retry, lost_race, marking_overflow;
   ASSERT(Object::tags_offset() == 0);
-  __ sub(R3, TMP2, Operand(kHeapObjectTag));
+  __ sub(R3, R0, Operand(kHeapObjectTag));
   // R3: Untagged address of header word (ldxr/stxr do not support offsets).
   __ Bind(&marking_retry);
   __ ldxr(R2, R3, kWord);
   __ tbz(&lost_race, R2, RawObject::kOldAndNotMarkedBit);
   __ AndImmediate(R2, R2, ~(1 << RawObject::kOldAndNotMarkedBit));
-  __ stxr(R1, R2, R3, kWord);
-  __ cbnz(&marking_retry, R1);
+  __ stxr(R4, R2, R3, kWord);
+  __ cbnz(&marking_retry, R4);
 
-  __ LoadFromOffset(R1, THR, Thread::marking_stack_block_offset());
-  __ LoadFromOffset(R2, R1, MarkingStackBlock::top_offset(), kUnsignedWord);
-  __ add(R3, R1, Operand(R2, LSL, kWordSizeLog2));
-  __ StoreToOffset(TMP2, R3, MarkingStackBlock::pointers_offset());
+  __ LoadFromOffset(R4, THR, Thread::marking_stack_block_offset());
+  __ LoadFromOffset(R2, R4, MarkingStackBlock::top_offset(), kUnsignedWord);
+  __ add(R3, R4, Operand(R2, LSL, kWordSizeLog2));
+  __ StoreToOffset(R0, R3, MarkingStackBlock::pointers_offset());
   __ add(R2, R2, Operand(1));
-  __ StoreToOffset(R2, R1, MarkingStackBlock::top_offset(), kUnsignedWord);
+  __ StoreToOffset(R2, R4, MarkingStackBlock::top_offset(), kUnsignedWord);
   __ CompareImmediate(R2, MarkingStackBlock::kSize);
+  __ Pop(R4);  // Unspill.
   __ Pop(R3);  // Unspill.
   __ Pop(R2);  // Unspill.
-  __ Pop(R1);  // Unspill.
   __ b(&marking_overflow, EQ);
   __ ret();
 
@@ -1443,9 +1448,9 @@
   __ ret();
 
   __ Bind(&lost_race);
+  __ Pop(R4);  // Unspill.
   __ Pop(R3);  // Unspill.
   __ Pop(R2);  // Unspill.
-  __ Pop(R1);  // Unspill.
   __ ret();
 #endif
 }
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 369dad7..4535bad 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -45,6 +45,7 @@
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
 
+  __ movl(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
   __ EnterStubFrame();
 
   // Save exit frame information to enable stack walking as we are about
@@ -979,7 +980,10 @@
 
 // Helper stub to implement Assembler::StoreIntoObject.
 // Input parameters:
-//   EDX: Address being stored
+//   EDX: Object (old)
+// If EDX is not remembered, mark as remembered and add to the store buffer.
+COMPILE_ASSERT(kWriteBarrierObjectReg == EDX);
+COMPILE_ASSERT(kWriteBarrierValueReg == kNoRegister);
 void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
   // Save values being destroyed.
   __ pushl(EAX);
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index a316199..182667e 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -49,6 +49,7 @@
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
 
+  __ movq(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
   __ EnterStubFrame();
 
   // Save exit frame information to enable stack walking as we are about
@@ -620,6 +621,10 @@
 }
 
 void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
+  __ popq(TMP);
+  __ pushq(CODE_REG);
+  __ pushq(TMP);
+  __ movq(CODE_REG, Address(THR, Thread::deoptimize_stub_offset()));
   GenerateDeoptimizationSequence(assembler, kEagerDeopt);
   __ ret();
 }
@@ -1244,10 +1249,10 @@
 
     Register reg = static_cast<Register>(i);
     intptr_t start = __ CodeSize();
-    __ pushq(RDX);
-    __ movq(RDX, reg);
+    __ pushq(kWriteBarrierObjectReg);
+    __ movq(kWriteBarrierObjectReg, reg);
     __ call(Address(THR, Thread::write_barrier_entry_point_offset()));
-    __ popq(RDX);
+    __ popq(kWriteBarrierObjectReg);
     __ ret();
     intptr_t end = __ CodeSize();
 
@@ -1257,14 +1262,16 @@
 
 // Helper stub to implement Assembler::StoreIntoObject.
 // Input parameters:
-//   RDX: Source object (old)
-//   TMP: Target object (old or new)
-// If TMP is new, add RDX to the store buffer. Otherwise TMP is old, mark TMP
+//   RDX: Object (old)
+//   RAX: Value (old or new)
+// If RAX is new, add RDX to the store buffer. Otherwise RAX is old, mark RAX
 // and add it to the mark list.
+COMPILE_ASSERT(kWriteBarrierObjectReg == RDX);
+COMPILE_ASSERT(kWriteBarrierValueReg == RAX);
 void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
 #if defined(CONCURRENT_MARKING)
   Label add_to_mark_stack;
-  __ testq(TMP, Immediate(1 << kNewObjectBitPosition));
+  __ testq(RAX, Immediate(1 << kNewObjectBitPosition));
   __ j(ZERO, &add_to_mark_stack);
 #else
   Label add_to_buffer;
@@ -1329,6 +1336,7 @@
   __ Bind(&add_to_mark_stack);
   __ pushq(RAX);  // Spill.
   __ pushq(RCX);  // Spill.
+  __ movq(TMP, RAX);  // RAX is fixed implicit operand of CAS.
 
   // Atomically clear kOldAndNotMarkedBit.
   // Note that we use 32 bit operations here to match the size of the
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index 78c655e..e9f410f 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -204,7 +204,7 @@
   return *symbol_handles_[token_id];
 }
 
-void Symbols::InitOnce(Isolate* vm_isolate) {
+void Symbols::Init(Isolate* vm_isolate) {
   // Should only be run by the vm isolate.
   ASSERT(Isolate::Current() == Dart::vm_isolate());
   ASSERT(vm_isolate == Dart::vm_isolate());
@@ -250,7 +250,7 @@
   vm_isolate->object_store()->set_symbol_table(table.Release());
 }
 
-void Symbols::InitOnceFromSnapshot(Isolate* vm_isolate) {
+void Symbols::InitFromSnapshot(Isolate* vm_isolate) {
   // Should only be run by the vm isolate.
   ASSERT(Isolate::Current() == Dart::vm_isolate());
   ASSERT(vm_isolate == Dart::vm_isolate());
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index bef0efa..38d7814 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -607,8 +607,8 @@
   static const String& Token(Token::Kind token);
 
   // Initialize frequently used symbols in the vm isolate.
-  static void InitOnce(Isolate* isolate);
-  static void InitOnceFromSnapshot(Isolate* isolate);
+  static void Init(Isolate* isolate);
+  static void InitFromSnapshot(Isolate* isolate);
 
   // Initialize and setup a symbol table for the isolate.
   static void SetupSymbolTable(Isolate* isolate);
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 2ff06b8..9584f37 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -96,6 +96,7 @@
       deferred_interrupts_mask_(0),
       deferred_interrupts_(0),
       stack_overflow_count_(0),
+      bump_allocate_(false),
       hierarchy_info_(NULL),
       type_usage_info_(NULL),
       pending_functions_(GrowableObjectArray::null()),
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index c6b485b..740c043 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -107,6 +107,7 @@
     StubCode::MonomorphicMiss_entry()->code(), NULL)                           \
   V(RawCode*, ic_lookup_through_code_stub_,                                    \
     StubCode::ICCallThroughCode_entry()->code(), NULL)                         \
+  V(RawCode*, deoptimize_stub_, StubCode::Deoptimize_entry()->code(), NULL)    \
   V(RawCode*, lazy_deopt_from_return_stub_,                                    \
     StubCode::DeoptimizeLazyFromReturn_entry()->code(), NULL)                  \
   V(RawCode*, lazy_deopt_from_throw_stub_,                                     \
@@ -154,7 +155,8 @@
   V(uword, megamorphic_call_checked_entry_,                                    \
     StubCode::MegamorphicCall_entry()->EntryPoint(), 0)                        \
   V(uword, monomorphic_miss_entry_,                                            \
-    StubCode::MonomorphicMiss_entry()->EntryPoint(), 0)
+    StubCode::MonomorphicMiss_entry()->EntryPoint(), 0)                        \
+  V(uword, deoptimize_entry_, StubCode::Deoptimize_entry()->EntryPoint(), 0)
 
 #endif
 
@@ -464,6 +466,9 @@
   static intptr_t top_offset() { return OFFSET_OF(Thread, top_); }
   static intptr_t end_offset() { return OFFSET_OF(Thread, end_); }
 
+  bool bump_allocate() const { return bump_allocate_; }
+  void set_bump_allocate(bool b) { bump_allocate_ = b; }
+
   int32_t no_handle_scope_depth() const {
 #if defined(DEBUG)
     return no_handle_scope_depth_;
@@ -867,6 +872,7 @@
   uint16_t deferred_interrupts_mask_;
   uint16_t deferred_interrupts_;
   int32_t stack_overflow_count_;
+  bool bump_allocate_;
 
   // Compiler state:
   CompilerState* compiler_state_ = nullptr;
diff --git a/runtime/vm/thread_interrupter.cc b/runtime/vm/thread_interrupter.cc
index 6d9b99d..1de2c0c 100644
--- a/runtime/vm/thread_interrupter.cc
+++ b/runtime/vm/thread_interrupter.cc
@@ -59,11 +59,14 @@
 intptr_t ThreadInterrupter::interrupt_period_ = 1000;
 intptr_t ThreadInterrupter::current_wait_time_ = Monitor::kNoTimeout;
 
-void ThreadInterrupter::InitOnce() {
+void ThreadInterrupter::Init() {
   ASSERT(!initialized_);
-  monitor_ = new Monitor();
+  if (monitor_ == NULL) {
+    monitor_ = new Monitor();
+  }
   ASSERT(monitor_ != NULL);
   initialized_ = true;
+  shutdown_ = false;
 }
 
 void ThreadInterrupter::Startup() {
@@ -94,7 +97,7 @@
   }
 }
 
-void ThreadInterrupter::Shutdown() {
+void ThreadInterrupter::Cleanup() {
   {
     MonitorLocker shutdown_ml(monitor_);
     if (shutdown_) {
@@ -114,6 +117,7 @@
   ASSERT(interrupter_thread_id_ != OSThread::kInvalidThreadJoinId);
   OSThread::Join(interrupter_thread_id_);
   interrupter_thread_id_ = OSThread::kInvalidThreadJoinId;
+  initialized_ = false;
 
   if (FLAG_trace_thread_interrupter) {
     OS::PrintErr("ThreadInterrupter shut down.\n");
diff --git a/runtime/vm/thread_interrupter.h b/runtime/vm/thread_interrupter.h
index 204f824..11c6584 100644
--- a/runtime/vm/thread_interrupter.h
+++ b/runtime/vm/thread_interrupter.h
@@ -22,10 +22,10 @@
 
 class ThreadInterrupter : public AllStatic {
  public:
-  static void InitOnce();
+  static void Init();
 
   static void Startup();
-  static void Shutdown();
+  static void Cleanup();
 
   // Delay between interrupts.
   static void SetInterruptPeriod(intptr_t period);
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index bea9fb6..000e759 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -199,7 +199,7 @@
   return false;
 }
 
-void Timeline::InitOnce() {
+void Timeline::Init() {
   ASSERT(recorder_ == NULL);
   recorder_ = CreateTimelineRecorder();
   ASSERT(recorder_ != NULL);
@@ -231,7 +231,7 @@
   }
 }
 
-void Timeline::Shutdown() {
+void Timeline::Cleanup() {
   ASSERT(recorder_ != NULL);
 
   if (Timeline::stream_Embedder_.enabled() &&
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index 94934e0..92f33a3 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -76,10 +76,10 @@
 class Timeline : public AllStatic {
  public:
   // Initialize timeline system. Not thread safe.
-  static void InitOnce();
+  static void Init();
 
-  // Shutdown timeline system. Not thread safe.
-  static void Shutdown();
+  // Cleanup timeline system. Not thread safe.
+  static void Cleanup();
 
   // Access the global recorder. Not thread safe.
   static TimelineEventRecorder* recorder();
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index dc76612..c56e770 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -37,15 +37,26 @@
 const uint8_t* platform_strong_dill = kPlatformStrongDill;
 const intptr_t platform_strong_dill_size = kPlatformStrongDillSize;
 
+const uint8_t* TesterState::vm_snapshot_data = NULL;
+Dart_IsolateCreateCallback TesterState::create_callback = NULL;
+Dart_IsolateShutdownCallback TesterState::shutdown_callback = NULL;
+Dart_IsolateCleanupCallback TesterState::cleanup_callback = NULL;
+const char** TesterState::argv = NULL;
+int TesterState::argc = 0;
+
 DEFINE_FLAG(bool,
             use_dart_frontend,
             true,
             "Parse scripts with Dart-to-Kernel parser");
 
-DECLARE_FLAG(bool, strong);
+void KernelBufferList::AddBufferToList(const uint8_t* kernel_buffer) {
+  next_ = new KernelBufferList(kernel_buffer_, next_);
+  kernel_buffer_ = kernel_buffer;
+}
 
 TestCaseBase* TestCaseBase::first_ = NULL;
 TestCaseBase* TestCaseBase::tail_ = NULL;
+KernelBufferList* TestCaseBase::current_kernel_buffers_ = NULL;
 
 TestCaseBase::TestCaseBase(const char* name)
     : raw_test_(false), next_(NULL), name_(name) {
@@ -62,6 +73,7 @@
   while (test != NULL) {
     if (test->raw_test_) {
       test->RunTest();
+      CleanupState();
     }
     test = test->next_;
   }
@@ -72,11 +84,28 @@
   while (test != NULL) {
     if (!test->raw_test_) {
       test->RunTest();
+      CleanupState();
     }
     test = test->next_;
   }
 }
 
+void TestCaseBase::CleanupState() {
+  if (current_kernel_buffers_ != NULL) {
+    delete current_kernel_buffers_;
+    current_kernel_buffers_ = NULL;
+  }
+}
+
+void TestCaseBase::AddToKernelBuffers(const uint8_t* kernel_buffer) {
+  ASSERT(kernel_buffer != NULL);
+  if (current_kernel_buffers_ == NULL) {
+    current_kernel_buffers_ = new KernelBufferList(kernel_buffer);
+  } else {
+    current_kernel_buffers_->AddBufferToList(kernel_buffer);
+  }
+}
+
 Dart_Isolate TestCase::CreateIsolate(const uint8_t* data_buffer,
                                      intptr_t len,
                                      const uint8_t* instr_buffer,
@@ -85,7 +114,6 @@
   char* err;
   Dart_IsolateFlags api_flags;
   Isolate::FlagsInitialize(&api_flags);
-  api_flags.use_dart_frontend = FLAG_use_dart_frontend;
   Dart_Isolate isolate = NULL;
   if (len == 0) {
     isolate = Dart_CreateIsolate(name, NULL, data_buffer, instr_buffer, NULL,
@@ -103,16 +131,9 @@
 }
 
 Dart_Isolate TestCase::CreateTestIsolate(const char* name, void* data) {
-  if (FLAG_use_dart_frontend) {
-    return CreateIsolate(
-        platform_strong_dill, platform_strong_dill_size,
-        NULL, /* There is no instr buffer in case of dill buffers. */
-        name, data);
-  } else {
-    return CreateIsolate(bin::core_isolate_snapshot_data,
-                         0 /* Snapshots have length encoded within them. */,
-                         bin::core_isolate_snapshot_instructions, name, data);
-  }
+  return CreateIsolate(bin::core_isolate_snapshot_data,
+                       0 /* Snapshots have length encoded within them. */,
+                       bin::core_isolate_snapshot_instructions, name, data);
 }
 
 static const char* kPackageScheme = "package:";
@@ -184,7 +205,8 @@
 }
 
 static void ReloadTest(Dart_NativeArguments native_args) {
-  Dart_Handle result = TestCase::TriggerReload();
+  Dart_Handle result = TestCase::TriggerReload(/* kernel_buffer= */ NULL,
+                                               /* kernel_buffer_size= */ 0);
   if (Dart_IsError(result)) {
     Dart_PropagateError(result);
   }
@@ -219,10 +241,6 @@
   return FLAG_use_dart_frontend;
 }
 
-bool TestCase::UsingStrongMode() {
-  return FLAG_strong;
-}
-
 char* TestCase::CompileTestScriptWithDFE(const char* url,
                                          const char* source,
                                          const uint8_t** kernel_buffer,
@@ -322,10 +340,18 @@
     char* result =
         OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
     free(compilation_result.error);
+    if (compilation_result.kernel != NULL) {
+      free(const_cast<uint8_t*>(compilation_result.kernel));
+    }
+    *kernel_buffer = NULL;
+    *kernel_buffer_size = 0;
     return result;
   }
   *kernel_buffer = compilation_result.kernel;
   *kernel_buffer_size = compilation_result.kernel_size;
+  if (compilation_result.error != NULL) {
+    free(compilation_result.error);
+  }
   if (kernel_buffer == NULL) {
     return OS::SCreate(zone, "front end generated a NULL kernel file");
   }
@@ -524,6 +550,9 @@
         Dart_LoadLibraryFromKernel(kernel_buffer, kernel_buffer_size);
     EXPECT_VALID(lib);
 
+    // Ensure kernel buffer isn't leaked after test is run.
+    AddToKernelBuffers(kernel_buffer);
+
     // TODO(32618): Kernel doesn't correctly represent the root library.
     lib = Dart_LookupLibrary(Dart_NewStringFromCString(sourcefiles[0].uri));
     DART_CHECK_VALID(lib);
@@ -566,6 +595,9 @@
       Dart_LoadLibraryFromKernel(kernel_buffer, kernel_buffer_size);
   DART_CHECK_VALID(lib);
 
+  // Ensure kernel buffer isn't leaked after test is run.
+  AddToKernelBuffers(kernel_buffer);
+
   // BOGUS: Kernel doesn't correctly represent the root library.
   lib = Dart_LookupLibrary(Dart_NewStringFromCString(
       entry_script_uri != NULL ? entry_script_uri : sourcefiles[0].uri));
@@ -610,17 +642,18 @@
   }
 }
 
-Dart_Handle TestCase::TriggerReload() {
+Dart_Handle TestCase::TriggerReload(const uint8_t* kernel_buffer,
+                                    intptr_t kernel_buffer_size) {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   JSONStream js;
   bool success = false;
   {
     TransitionNativeToVM transition(thread);
-    success = isolate->ReloadSources(&js,
-                                     false,  // force_reload
-                                     NULL, NULL,
-                                     true);  // dont_delete_reload_context
+    success = isolate->ReloadKernel(&js,
+                                    false,  // force_reload
+                                    kernel_buffer, kernel_buffer_size,
+                                    true);  // dont_delete_reload_context
     OS::PrintErr("RELOAD REPORT:\n%s\n", js.ToCString());
   }
 
@@ -656,18 +689,21 @@
     if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
       Dart_Handle result = Dart_NewApiError(compilation_result.error);
       free(compilation_result.error);
+      if (compilation_result.kernel != NULL) {
+        free(const_cast<uint8_t*>(compilation_result.kernel));
+      }
       return result;
     }
   } else {
     SetReloadTestScript(script);
   }
 
-  return TriggerReload();
+  return TriggerReload(/* kernel_buffer= */ NULL, /* kernel_buffer_size= */ 0);
 }
 
 Dart_Handle TestCase::ReloadTestKernel(const uint8_t* kernel_buffer,
                                        intptr_t kernel_buffer_size) {
-  return TriggerReload();
+  return TriggerReload(kernel_buffer, kernel_buffer_size);
 }
 
 #endif  // !PRODUCT
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 1115f6d..a77dc9d 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -272,11 +272,41 @@
 extern const uint8_t* core_isolate_snapshot_instructions;
 }  // namespace bin
 
-extern const uint8_t* platform_dill;
 extern const uint8_t* platform_strong_dill;
-extern const intptr_t platform_dill_size;
 extern const intptr_t platform_strong_dill_size;
 
+class TesterState : public AllStatic {
+ public:
+  static const uint8_t* vm_snapshot_data;
+  static Dart_IsolateCreateCallback create_callback;
+  static Dart_IsolateShutdownCallback shutdown_callback;
+  static Dart_IsolateCleanupCallback cleanup_callback;
+  static const char** argv;
+  static int argc;
+};
+
+class KernelBufferList {
+ public:
+  explicit KernelBufferList(const uint8_t* kernel_buffer)
+      : kernel_buffer_(kernel_buffer), next_(NULL) {}
+
+  KernelBufferList(const uint8_t* kernel_buffer, KernelBufferList* next)
+      : kernel_buffer_(kernel_buffer), next_(next) {}
+
+  ~KernelBufferList() {
+    free(const_cast<uint8_t*>(kernel_buffer_));
+    if (next_ != NULL) {
+      delete next_;
+    }
+  }
+
+  void AddBufferToList(const uint8_t* kernel_buffer);
+
+ private:
+  const uint8_t* kernel_buffer_;
+  KernelBufferList* next_;
+};
+
 class TestCaseBase {
  public:
   explicit TestCaseBase(const char* name);
@@ -289,8 +319,11 @@
 
   static void RunAll();
   static void RunAllRaw();
+  static void CleanupState();
+  static void AddToKernelBuffers(const uint8_t* kernel_buffer);
 
  protected:
+  static KernelBufferList* current_kernel_buffers_;
   bool raw_test_;
 
  private:
@@ -314,7 +347,6 @@
   TestCase(RunEntry* run, const char* name) : TestCaseBase(name), run_(run) {}
 
   static bool UsingDartFrontend();
-  static bool UsingStrongMode();
 
   static char* CompileTestScriptWithDFE(const char* url,
                                         const char* source,
@@ -382,10 +414,13 @@
   static Dart_Handle SetReloadTestScript(const char* script);
 
   // Initiates the reload.
-  static Dart_Handle TriggerReload();
+  static Dart_Handle TriggerReload(const uint8_t* kernel_buffer,
+                                   intptr_t kernel_buffer_size);
 
   // Helper function which reloads the current isolate using |script|.
   static Dart_Handle ReloadTestScript(const char* script);
+
+  // Helper function which reloads the current isolate using |script|.
   static Dart_Handle ReloadTestKernel(const uint8_t* kernel_buffer,
                                       intptr_t kernel_buffer_size);
 
diff --git a/runtime/vm/virtual_memory.h b/runtime/vm/virtual_memory.h
index 62dbcbb..0ccdb41 100644
--- a/runtime/vm/virtual_memory.h
+++ b/runtime/vm/virtual_memory.h
@@ -29,7 +29,7 @@
   void* address() const { return region_.pointer(); }
   intptr_t size() const { return region_.size(); }
 
-  static void InitOnce();
+  static void Init();
 
   bool Contains(uword addr) const { return region_.Contains(addr); }
 
diff --git a/runtime/vm/virtual_memory_android.cc b/runtime/vm/virtual_memory_android.cc
index ff39c23..9644ffc 100644
--- a/runtime/vm/virtual_memory_android.cc
+++ b/runtime/vm/virtual_memory_android.cc
@@ -25,7 +25,7 @@
 
 uword VirtualMemory::page_size_ = 0;
 
-void VirtualMemory::InitOnce() {
+void VirtualMemory::Init() {
   page_size_ = getpagesize();
 }
 
diff --git a/runtime/vm/virtual_memory_fuchsia.cc b/runtime/vm/virtual_memory_fuchsia.cc
index 78186e9..7f23434 100644
--- a/runtime/vm/virtual_memory_fuchsia.cc
+++ b/runtime/vm/virtual_memory_fuchsia.cc
@@ -37,7 +37,7 @@
 
 uword VirtualMemory::page_size_ = 0;
 
-void VirtualMemory::InitOnce() {
+void VirtualMemory::Init() {
   page_size_ = getpagesize();
 }
 
diff --git a/runtime/vm/virtual_memory_linux.cc b/runtime/vm/virtual_memory_linux.cc
index 80fb7c7..e18510e 100644
--- a/runtime/vm/virtual_memory_linux.cc
+++ b/runtime/vm/virtual_memory_linux.cc
@@ -25,7 +25,7 @@
 
 uword VirtualMemory::page_size_ = 0;
 
-void VirtualMemory::InitOnce() {
+void VirtualMemory::Init() {
   page_size_ = getpagesize();
 }
 
diff --git a/runtime/vm/virtual_memory_macos.cc b/runtime/vm/virtual_memory_macos.cc
index e9dcc4b..59fdf59 100644
--- a/runtime/vm/virtual_memory_macos.cc
+++ b/runtime/vm/virtual_memory_macos.cc
@@ -25,7 +25,7 @@
 
 uword VirtualMemory::page_size_ = 0;
 
-void VirtualMemory::InitOnce() {
+void VirtualMemory::Init() {
   page_size_ = getpagesize();
 }
 
diff --git a/runtime/vm/virtual_memory_win.cc b/runtime/vm/virtual_memory_win.cc
index b31a2fe..4d03dad 100644
--- a/runtime/vm/virtual_memory_win.cc
+++ b/runtime/vm/virtual_memory_win.cc
@@ -16,7 +16,7 @@
 
 uword VirtualMemory::page_size_ = 0;
 
-void VirtualMemory::InitOnce() {
+void VirtualMemory::Init() {
   SYSTEM_INFO info;
   GetSystemInfo(&info);
   page_size_ = info.dwPageSize;
diff --git a/samples/sample_extension/test/sample_extension_script_snapshot_test.dart b/samples/sample_extension/test/sample_extension_script_snapshot_test.dart
deleted file mode 100644
index 31b9e03..0000000
--- a/samples/sample_extension/test/sample_extension_script_snapshot_test.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// Dart test program for testing native extensions.
-
-import 'sample_extension_test_helper.dart';
-
-void main() {
-  testNativeExtensions("script");
-}
diff --git a/samples/samples.status b/samples/samples.status
index 2d1d4b8..3af1d7e 100644
--- a/samples/samples.status
+++ b/samples/samples.status
@@ -28,7 +28,6 @@
 
 [ $compiler == app_jitk || $compiler == dartk || $compiler == dartkb || $compiler == dartkp ]
 sample_extension/test/sample_extension_app_snapshot_test: RuntimeError
-sample_extension/test/sample_extension_script_snapshot_test: RuntimeError
 sample_extension/test/sample_extension_test: RuntimeError
 
 # Skip tests that use dart:io
@@ -37,4 +36,3 @@
 
 [ $hot_reload || $hot_reload_rollback ]
 sample_extension/test/sample_extension_app_snapshot_test: SkipByDesign # Cannot reload with URI pointing to app snapshot.
-sample_extension/test/sample_extension_script_snapshot_test: SkipByDesign # Cannot reload with URI pointing to script snapshot.
diff --git a/sdk/bin/dartdevc_sdk b/sdk/bin/dartdevc_sdk
index 7bc98de..60d2fe1 100755
--- a/sdk/bin/dartdevc_sdk
+++ b/sdk/bin/dartdevc_sdk
@@ -20,12 +20,9 @@
 
 # Handle the case where dart-sdk/bin has been symlinked to.
 BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
-SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
-
-SDK_ARG="--dart-sdk=$SDK_DIR"
 
 SNAPSHOT="$BIN_DIR/snapshots/dartdevc.dart.snapshot"
 
 # We are running the snapshot in the built SDK.
 DART="$BIN_DIR/dart"
-exec "$DART" "$SNAPSHOT" "$SDK_ARG" "$@"
+exec "$DART" "$SNAPSHOT" "$@"
diff --git a/sdk/bin/dartdevk_sdk b/sdk/bin/dartdevk_sdk
index 098775a..9917871 100755
--- a/sdk/bin/dartdevk_sdk
+++ b/sdk/bin/dartdevk_sdk
@@ -20,10 +20,9 @@
 
 # Handle the case where dart-sdk/bin has been symlinked to.
 BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
-SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
 
 SNAPSHOT="$BIN_DIR/snapshots/dartdevk.dart.snapshot"
 
 # We are running the snapshot in the built SDK.
 DART="$BIN_DIR/dart"
-exec "$DART" "$SNAPSHOT" "--packages=$SDK_DIR/../../../.packages" "$@"
+exec "$DART" "$SNAPSHOT" "$@"
diff --git a/sdk/lib/_internal/js_runtime/lib/annotations.dart b/sdk/lib/_internal/js_runtime/lib/annotations.dart
index 483dd0c..390024a 100644
--- a/sdk/lib/_internal/js_runtime/lib/annotations.dart
+++ b/sdk/lib/_internal/js_runtime/lib/annotations.dart
@@ -29,13 +29,6 @@
   const ForceInline();
 }
 
-// Ensures that the annotated method is represented internally using
-// IR nodes ([:value == true:]) or AST nodes ([:value == false:]).
-class IrRepresentation {
-  final bool value;
-  const IrRepresentation(this.value);
-}
-
 /// Marks a class as native and defines its JavaScript name(s).
 class Native {
   final String name;
diff --git a/sdk/lib/_internal/js_runtime/lib/async_patch.dart b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
index ba145e5..09b75af 100644
--- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
@@ -74,7 +74,6 @@
       callback();
     }
 
-    ;
     JS('void', 'self.scheduleImmediate(#)',
         convertDartClosureToJS(internalCallback, 0));
   }
@@ -84,7 +83,6 @@
       callback();
     }
 
-    ;
     JS('void', 'self.setImmediate(#)',
         convertDartClosureToJS(internalCallback, 0));
   }
diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
index e27baf5..059ce00 100644
--- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
@@ -827,12 +827,6 @@
   toString() => "Error: field '$_name' is already initialized.";
 }
 
-@patch
-class _ConstantExpressionError {
-  @patch
-  _throw(error) => throw error;
-}
-
 // TODO(sra): The rest of this core_patch.dart source should reside in an
 // included part file instead of being inlined. However, part files are not
 // properly supported here.
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 48b8b68..5f60976 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -577,14 +577,6 @@
       : "Reading static variable '$variableName' during its initialization";
 }
 
-/// Used by Fasta to throw a compile-time error in a way that is compatible
-/// with compile-time constant evaluation.
-class _ConstantExpressionError {
-  const _ConstantExpressionError();
-
-  external _throw(error);
-}
-
 /// Used by Fasta to wrap constant expressions so an illegal constant expression
 /// will throw an error.
 class _ConstantHelper {
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 895c0c0..ce81a64 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -849,11 +849,17 @@
     String scheme;
 
     // Derive some positions that weren't set to normalize the indices.
-    // If pathStart isn't set (it's before scheme end or host start), then
-    // the path is empty.
     if (fragmentStart < queryStart) queryStart = fragmentStart;
-    if (pathStart < hostStart || pathStart <= schemeEnd) {
+    // If pathStart isn't set (it's before scheme end or host start), then
+    // the path is empty, or there is no authority part and the path
+    // starts with a non-simple character.
+    if (pathStart < hostStart) {
+      // There is an authority, but no path. The path would start with `/`
+      // if it was there.
       pathStart = queryStart;
+    } else if (pathStart <= schemeEnd) {
+      // There is a scheme, but no authority.
+      pathStart = schemeEnd + 1;
     }
     // If there is an authority with no port, set the port position
     // to be at the end of the authority (equal to pathStart).
@@ -2110,7 +2116,8 @@
     }
     var result;
     if (path != null) {
-      result = _normalizeOrSubstring(path, start, end, _pathCharOrSlashTable);
+      result = _normalizeOrSubstring(path, start, end, _pathCharOrSlashTable,
+          escapeDelimiters: true);
     } else {
       result = pathSegments
           .map((s) => _uriEncode(_pathCharTable, s, utf8, false))
@@ -2143,7 +2150,8 @@
       if (queryParameters != null) {
         throw new ArgumentError('Both query and queryParameters specified');
       }
-      return _normalizeOrSubstring(query, start, end, _queryCharTable);
+      return _normalizeOrSubstring(query, start, end, _queryCharTable,
+          escapeDelimiters: true);
     }
     if (queryParameters == null) return null;
 
@@ -2175,7 +2183,8 @@
 
   static String _makeFragment(String fragment, int start, int end) {
     if (fragment == null) return null;
-    return _normalizeOrSubstring(fragment, start, end, _queryCharTable);
+    return _normalizeOrSubstring(fragment, start, end, _queryCharTable,
+        escapeDelimiters: true);
   }
 
   /**
@@ -2261,8 +2270,10 @@
    * this methods returns the substring if [component] from [start] to [end].
    */
   static String _normalizeOrSubstring(
-      String component, int start, int end, List<int> charTable) {
-    return _normalize(component, start, end, charTable) ??
+      String component, int start, int end, List<int> charTable,
+      {bool escapeDelimiters = false}) {
+    return _normalize(component, start, end, charTable,
+            escapeDelimiters: escapeDelimiters) ??
         component.substring(start, end);
   }
 
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 7e97123..9ef419e 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -225,7 +225,6 @@
 LibTest/collection/LinkedList/add_A01_t01: Pass, Slow # Slow tests that needs extra time to finish.
 LibTest/collection/ListBase/ListBase_class_A01_t01: RuntimeError # Please triage this failure
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError # Please triage this failure
-LibTest/collection/Maps/*: Skip # Maps class no longer exists
 LibTest/convert/JsonCodec/encode_A01_t01: RuntimeError # code.google.com/p/co19/issues/detail?id=735
 LibTest/convert/JsonCodec/encode_A01_t02: RuntimeError # code.google.com/p/co19/issues/detail?id=735
 LibTest/convert/JsonDecoder/fuse_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index a018bea..b96fc73 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -225,6 +225,7 @@
 Language/Classes/Superinterfaces/implicit_interface_t02: CompileTimeError
 Language/Classes/Superinterfaces/no_member_t01: CompileTimeError
 Language/Classes/Superinterfaces/no_member_t02: CompileTimeError
+Language/Classes/Superinterfaces/no_member_t03: CompileTimeError
 Language/Classes/Superinterfaces/no_member_t05: CompileTimeError
 Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
 Language/Classes/method_definition_t03: CompileTimeError
@@ -1274,16 +1275,6 @@
 LibTest/collection/MapBase/MapBase_class_A01_t01: CompileTimeError
 LibTest/collection/MapMixin/MapMixin_class_A01_t01: CompileTimeError
 LibTest/collection/MapView/MapView_class_A01_t01: CompileTimeError
-LibTest/collection/Maps/forEach_A01_t01: CompileTimeError
-LibTest/collection/Maps/forEach_A01_t02: CompileTimeError
-LibTest/collection/Maps/forEach_A01_t04: CompileTimeError
-LibTest/collection/Maps/forEach_A01_t05: CompileTimeError
-LibTest/collection/Maps/forEach_A01_t06: CompileTimeError
-LibTest/collection/Maps/forEach_A01_t08: CompileTimeError
-LibTest/collection/Maps/forEach_A02_t01: CompileTimeError
-LibTest/collection/Maps/putIfAbsent_A01_t04: CompileTimeError
-LibTest/collection/Maps/putIfAbsent_A01_t07: CompileTimeError
-LibTest/collection/Maps/putIfAbsent_A01_t08: CompileTimeError
 LibTest/collection/Queue/Queue_class_A01_t01: CompileTimeError
 LibTest/collection/SetBase/SetBase_class_A01_t01: CompileTimeError
 LibTest/collection/SetBase/setToString_A01_t01: CompileTimeError
diff --git a/tests/co19_2/co19_2-analyzer.status b/tests/co19_2/co19_2-analyzer.status
index 054926b..122453a 100644
--- a/tests/co19_2/co19_2-analyzer.status
+++ b/tests/co19_2/co19_2-analyzer.status
@@ -13,7 +13,6 @@
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t04: MissingCompileTimeError # Issue 33995
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t05: MissingCompileTimeError # Issue 33995
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t06: MissingCompileTimeError # Issue 33995
-Language/Classes/Constructors/Generative_Constructors/final_variables_t01: CompileTimeError # co19 issue 155
 Language/Classes/Constructors/name_t01: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Constructors/name_t02: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Constructors/name_t03: MissingCompileTimeError # Legal, see #33235
@@ -25,7 +24,6 @@
 Language/Classes/Getters/instance_getter_t06: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Getters/type_object_t01: CompileTimeError # Issue 33995
 Language/Classes/Getters/type_object_t02: CompileTimeError # Issue 33995
-Language/Classes/Instance_Methods/Operators/return_type_t01: CompileTimeError # co19 issue 156
 Language/Classes/Instance_Methods/override_different_default_values_t01: MissingCompileTimeError # Issue 33995
 Language/Classes/Instance_Methods/override_different_default_values_t02: MissingCompileTimeError # Issue 33995
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: MissingCompileTimeError # Issue 33995
@@ -43,10 +41,6 @@
 Language/Classes/Setters/instance_setter_t06: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Setters/name_t06: CompileTimeError
 Language/Classes/Setters/name_t07: CompileTimeError
-Language/Classes/Setters/return_type_not_void_t01: CompileTimeError # co19 issue 153
-Language/Classes/Setters/same_name_getter_different_type_t01: CompileTimeError # co19 issue 154
-Language/Classes/Setters/syntax_t04: CompileTimeError # co19 issue 153
-Language/Classes/Setters/type_object_t02: CompileTimeError # co19 issue 153
 Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError # Invalid test, see #33237
 Language/Classes/method_definition_t06: MissingCompileTimeError # Please triage this failure
 Language/Classes/mixins_t02: MissingCompileTimeError # This syntax is now allowed
@@ -72,25 +66,25 @@
 Language/Expressions/Lists/constant_list_t01: CompileTimeError # Please triage this failure
 Language/Expressions/Maps/constant_map_t02: MissingCompileTimeError # Please triage this failure
 Language/Expressions/Maps/constant_map_type_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Strings/String_Interpolation/double_quote_t02: CompileTimeError # Uses void, see issue #164 in the co19 repo
+Language/Expressions/Strings/String_Interpolation/single_quote_t02: CompileTimeError # Uses void, see issue #164 in the co19 repo
 Language/Functions/generator_return_type_t02: MissingCompileTimeError # Issue 32192
 Language/Functions/generator_return_type_t06: MissingCompileTimeError # Issue 32192
 Language/Generics/scope_t03: CompileTimeError # Please triage this failure
 Language/Generics/syntax_t02: CompileTimeError # Please triage this failure
 Language/Generics/syntax_t03: Crash # Issue 29388
+Language/Generics/syntax_t04: CompileTimeError # Bad test
 Language/Libraries_and_Scripts/Exports/implicit_hide_t01: MissingStaticWarning # Issue #34302
 Language/Libraries_and_Scripts/Imports/implicit_hide_t01: MissingStaticWarning # Issue #34302
 Language/Libraries_and_Scripts/Imports/implicit_hide_t02: MissingStaticWarning # Issue #34302
-Language/Libraries_and_Scripts/Imports/library_name_t01: CompileTimeError # co19 issue 152
 Language/Libraries_and_Scripts/Parts/compilation_t01: MissingCompileTimeError, Pass # Please triage this failure
 Language/Libraries_and_Scripts/Parts/compilation_t04: Pass, CompileTimeError, MissingCompileTimeError # Please triage this failure
 Language/Libraries_and_Scripts/Parts/compilation_t15: CompileTimeError, Pass # Please triage this failure
 Language/Mixins/Mixin_Application/static_warning_t02: CompileTimeError # Issue 26409
-Language/Mixins/Mixin_Application/superinterfaces_t07: CompileTimeError # Issue 26409
 Language/Mixins/Mixin_Application/syntax_t11: CompileTimeError # Issue 26409
 Language/Mixins/Mixin_Application/syntax_t12: CompileTimeError # Issue 26409
 Language/Mixins/Mixin_Application/syntax_t13: CompileTimeError # Issue 26409
 Language/Mixins/Mixin_Application/syntax_t14: CompileTimeError # Issue 26409
-Language/Mixins/Mixin_Application/syntax_t21: CompileTimeError # Issue 26409
 Language/Mixins/Mixin_Application/syntax_t22: CompileTimeError # Issue 26409
 Language/Mixins/Mixin_Application/syntax_t23: CompileTimeError # Issue 26409
 Language/Mixins/Mixin_Application/syntax_t24: CompileTimeError # Issue 26409
@@ -128,8 +122,6 @@
 Language/Statements/Return/no_expression_function_t16: CompileTimeError # issue #34319
 Language/Statements/Return/no_expression_not_function_t01: CompileTimeError # issue #34319
 Language/Types/Interface_Types/subtype_t30: CompileTimeError # Please triage this failure
-Language/Types/Type_Void/syntax_t09: CompileTimeError # Please triage this failure
-Language/Types/Type_Void/using_t02: CompileTimeError # Please triage this failure
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_named_extends_neg_assign_l1_t03: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_named_extends_neg_assign_l1_t04: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_named_extends_neg_assign_l1_t05: MissingCompileTimeError # Issue 34087
@@ -160,6 +152,14 @@
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_param_extends_neg_assign_l1_t10: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_param_extends_neg_assign_l1_t11: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_param_extends_neg_assign_l1_t12: MissingCompileTimeError # Issue 34087
+LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t08: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t09: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t10: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t12: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t13: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t14: MissingCompileTimeError # Issue 34087
@@ -170,6 +170,18 @@
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t19: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t20: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t21: MissingCompileTimeError # Issue 34087
+LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: CompileTimeError # Bad test
+LanguageFeatures/Instantiate-to-bound/class/class_extends_FutureOr_neg_l3_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_FutureOr_pos_l1_t01: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_assign_l3_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_assign_l3_t02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_assign_l4_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_assign_l4_t02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_assign_l4_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_assign_l4_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_assign_l4_t06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_assign_l4_t07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_l3_t01: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l3_t01: MissingCompileTimeError # Issue 33152, 33477
 LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l3_t02: MissingCompileTimeError # Issue 33152, 33477
 LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t01: MissingCompileTimeError # Issue 33152, 33477
@@ -178,46 +190,67 @@
 LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t05: MissingCompileTimeError # Issue 33152, 33477
 LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t06: MissingCompileTimeError # Issue 33152, 33477
 LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t07: MissingCompileTimeError # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/function/function_named_extends_Future_pos_l1_t05: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_named_extends_Future_pos_l1_t06: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_neg_assign_l1_t10: CompileTimeError # Issue 33995
-LanguageFeatures/Instantiate-to-bound/function/function_named_extends_pos_l1_t04: CompileTimeError # Issue 33995
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_pos_l1_t05: CompileTimeError # Issue 33995
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_pos_l1_t06: CompileTimeError # Issue 33995
+LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_Future_pos_l1_t05: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_Future_pos_l1_t06: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_neg_assign_l1_t10: CompileTimeError # Issue 33995
-LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_pos_l1_t04: CompileTimeError # Issue 33995
 LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_pos_l1_t05: CompileTimeError # Issue 33995
 LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_pos_l1_t06: CompileTimeError # Issue 33995
+LanguageFeatures/Instantiate-to-bound/function/function_param_extends_Future_pos_l1_t05: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_param_extends_neg_assign_l1_t10: CompileTimeError # Issue 33995
-LanguageFeatures/Instantiate-to-bound/function/function_param_extends_pos_l1_t04: CompileTimeError # Issue 33995
 LanguageFeatures/Instantiate-to-bound/function/function_param_extends_pos_l1_t05: CompileTimeError # Issue 33995
 LanguageFeatures/Instantiate-to-bound/function/function_pos_l1_t01: CompileTimeError # Issue 33995
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t08: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t09: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t19: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t01: MissingCompileTimeError # Issue 33995
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t08: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t09: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t19: CompileTimeError # Issue 33995
 LanguageFeatures/Instantiate-to-bound/interface/interface_neg_assign_l2_t01: MissingCompileTimeError # Issue 33995
 LanguageFeatures/Instantiate-to-bound/interface/interface_neg_assign_l2_t02: MissingCompileTimeError # Issue 33308
 LanguageFeatures/Instantiate-to-bound/mixin/mixin_neg_l1_t02: MissingCompileTimeError # Issue 33596
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_named_extends_neg_l1_t02: Crash # Issue 33599
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_named_extends_neg_l1_t03: MissingCompileTimeError # Issue 33597
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_named_extends_neg_l2_t01: Crash # Issue 33599
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_optparam_extends_neg_l1_t02: Crash # Issue 33599
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_optparam_extends_neg_l1_t03: MissingCompileTimeError # Issue 33597
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_optparam_extends_neg_l2_t01: Crash # Issue 33599
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_param_extends_neg_l1_t02: Crash # Issue 33599
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_param_extends_neg_l1_t04: MissingCompileTimeError # Issue 33597
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_param_extends_neg_l2_t01: Crash # Issue 33599
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_ret_extends_neg_l1_t02: Crash # Issue 33599
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_ret_extends_neg_l1_t04: MissingCompileTimeError # Issue 33597
-LanguageFeatures/Instantiate-to-bound/typedef/typedef_ret_extends_neg_l2_t01: Crash # Issue 33599
-LanguageFeatures/Super-bounded-types/motivation_example_A01_t01: CompileTimeError # Issue 32903
-LanguageFeatures/Super-bounded-types/motivation_example_A01_t03: CompileTimeError # Issue 32903
-LanguageFeatures/Super-bounded-types/motivation_example_A01_t05: CompileTimeError # Issue 32903
-LanguageFeatures/Super-bounded-types/static_analysis_A01_t01: CompileTimeError # Issue 32903
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_named_extends_pos_l2_t01: CompileTimeError # Bad test
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_optparam_extends_pos_l2_t01: CompileTimeError # Bad test
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_param_extends_pos_l2_t01: CompileTimeError # Bad test
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_ret_extends_pos_l2_t01: CompileTimeError # Bad test
 LanguageFeatures/Super-bounded-types/static_analysis_A01_t02: CompileTimeError # Issue 32903
-LanguageFeatures/Super-bounded-types/static_analysis_A01_t03: CompileTimeError # Issue 32903
-LanguageFeatures/Super-bounded-types/static_analysis_A01_t04: CompileTimeError # Issue 32903
 LanguageFeatures/Super-bounded-types/static_analysis_A01_t05: CompileTimeError # Issue 32903
-LanguageFeatures/Super-bounded-types/static_analysis_A01_t06: CompileTimeError # Issue 32903
-LanguageFeatures/Super-bounded-types/static_analysis_A01_t07: CompileTimeError # Issue 32903
 LanguageFeatures/Super-bounded-types/static_analysis_A01_t08: CompileTimeError # Issue 32903
-LanguageFeatures/Super-bounded-types/static_analysis_A01_t09: CompileTimeError # Issue 32903
-LanguageFeatures/int-to-double/min_acceptable_values_t01: CompileTimeError # https://github.com/dart-lang/co19/issues/161
-LanguageFeatures/int-to-double/representation_t01: CompileTimeError # https://github.com/dart-lang/co19/issues/160
+LanguageFeatures/Super_Mixins/declarations_neg_t01/none: CompileTimeError
+LanguageFeatures/Super_Mixins/declarations_neg_t02/none: CompileTimeError
+LanguageFeatures/Super_Mixins/declarations_t01: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_application_neg_t01/none: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_application_neg_t03/none: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_application_t01: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_application_t02: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_application_t03: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_application_t04: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_applying_t01: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_member_neg_t01: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_member_neg_t02: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_member_t01: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_member_t02: CompileTimeError
+LanguageFeatures/Super_Mixins/more_specific_t01: CompileTimeError
+LanguageFeatures/Super_Mixins/super_invocation_neg_t01/none: CompileTimeError
+LanguageFeatures/Super_Mixins/super_invocation_t01: CompileTimeError
+LanguageFeatures/Super_Mixins/syntax_t01: CompileTimeError
+LanguageFeatures/Super_Mixins/syntax_t02: CompileTimeError
+LanguageFeatures/Super_Mixins/syntax_t04: CompileTimeError
diff --git a/tests/co19_2/co19_2-dart2js.status b/tests/co19_2/co19_2-dart2js.status
index d45fa1d..be656d4 100644
--- a/tests/co19_2/co19_2-dart2js.status
+++ b/tests/co19_2/co19_2-dart2js.status
@@ -66,12 +66,6 @@
 Language/Types/Interface_Types/subtype_t27: Pass, Crash # Issue 34389
 Language/Types/Type_Declarations/Typedef/dynamic_param_type_t02: RuntimeError
 Language/Variables/constant_initialization_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_arguments_binding_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_arguments_binding_A02_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_arguments_binding_A02_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_class_member_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_class_member_A02_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_global_variable_A02_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t03: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A52_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A52_t02: RuntimeError
@@ -92,8 +86,6 @@
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_global_variable_fail_A31_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_global_variable_fail_A32_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_arguments_binding_A02_t02: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_arguments_binding_A02_t03: RuntimeError
 LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError
 LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError
 LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError
@@ -1285,9 +1277,6 @@
 Language/Types/Interface_Types/subtype_t23: RuntimeError
 Language/Variables/constant_variable_t09: RuntimeError
 LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_class_member_A02_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_local_variable_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_return_value_A02_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t02: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t01: RuntimeError
@@ -1313,10 +1302,6 @@
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A31_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A32_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_arguments_binding_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t02: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t03: RuntimeError
 LayoutTests/fast/animation/request-animation-frame-cancel2_t01: Timeout, Pass
 LayoutTests/fast/animation/request-animation-frame-cancel_t01: Timeout, Pass
 LayoutTests/fast/animation/request-animation-frame-prefix_t01: Timeout, Pass
@@ -1399,6 +1384,7 @@
 LayoutTests/fast/css-generated-content/pseudo-animation_t01: RuntimeError, Pass
 LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Timeout
 LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Timeout, Pass
+LayoutTests/fast/css-generated-content/reset-content-to-initial_t01: Timeout, Pass
 LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError
 LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError
 LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError
@@ -1454,6 +1440,7 @@
 LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError
 LayoutTests/fast/css/media-query-recovery_t01: RuntimeError
 LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError
+LayoutTests/fast/css/overflow-property_t01: RuntimeError, Pass
 LayoutTests/fast/css/padding-no-renderer_t01: RuntimeError, Pass
 LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError
 LayoutTests/fast/css/percent-min-width-img-src-change_t01: Timeout, Pass
@@ -1582,6 +1569,7 @@
 LayoutTests/fast/events/event-creation_t01: RuntimeError
 LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError
 LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError
+LayoutTests/fast/events/fire-scroll-event-element_t01: Timeout, Pass
 LayoutTests/fast/events/fire-scroll-event_t01: RuntimeError, Timeout
 LayoutTests/fast/events/init-message-event_t01: RuntimeError
 LayoutTests/fast/events/input-focus-no-duplicate-events_t01: RuntimeError, Pass
@@ -1590,7 +1578,7 @@
 LayoutTests/fast/events/label-focus_t01: RuntimeError, Pass
 LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError
 LayoutTests/fast/events/nested-event-remove-node-crash_t01: Timeout, Pass
-LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: RuntimeError
+LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: RuntimeError, Timeout
 LayoutTests/fast/events/scoped/editing-commands_t01: RuntimeError
 LayoutTests/fast/events/scroll-during-zoom-change_t01: Timeout, Pass
 LayoutTests/fast/events/scroll-event-phase_t01: Timeout, Pass
@@ -1884,6 +1872,7 @@
 LibTest/html/IFrameElement/focus_A01_t01: Timeout, Pass
 LibTest/html/IFrameElement/onMouseWheel_A01_t01: Timeout
 LibTest/html/IFrameElement/onTransitionEnd_A01_t01: Timeout
+LibTest/typed_data/Float64List/shuffle_A01_t01: RuntimeError, Pass
 LibTest/typed_data/Int16List/shuffle_A01_t01: RuntimeError, Pass
 Utils/tests/Expect/throws_A01_t04: RuntimeError
 WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Timeout
@@ -1998,12 +1987,12 @@
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: RuntimeError, Pass
 LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: RuntimeError, Pass
 LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: RuntimeError, Pass
+WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError, Pass
 
 [ $compiler == dart2js && $runtime == chrome && $system == macos && $fast_startup ]
 LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError
 LayoutTests/fast/css/overflow-property_t01: RuntimeError, Pass
 LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError, Pass
-LayoutTests/fast/events/fire-scroll-event-element_t01: Timeout, Pass
 LayoutTests/fast/forms/percent-height-auto-width-form-controls_t01: RuntimeError
 LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError, Pass
 LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: RuntimeError
@@ -3303,7 +3292,7 @@
 LayoutTests/fast/css/getPropertyValue-columns_t01: RuntimeError
 LayoutTests/fast/css/invalid-not-with-simple-selector-sequence_t01: RuntimeError
 LayoutTests/fast/css/parsing-object-position_t01: RuntimeError
-LayoutTests/fast/css/shadow-current-color_t01: RuntimeError
+LayoutTests/fast/css/shadow-current-color_t01: RuntimeError, Pass
 LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError
 LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: RuntimeError
 LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last_t01: RuntimeError
@@ -3331,7 +3320,7 @@
 LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-sync-request_t01: RuntimeError
 LibTest/html/Element/getClientRects_A01_t02: RuntimeError
-LibTest/html/Element/isContentEditable_A02_t01: RuntimeError
+LibTest/html/Element/isContentEditable_A02_t01: RuntimeError, Pass
 LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError
 LibTest/html/Window/close_A01_t01: RuntimeError
 
@@ -3465,6 +3454,9 @@
 LayoutTests/fast/css/getComputedStyle/getComputedStyle-zoom-and-background-size_t01: RuntimeError
 
 [ $compiler == dart2js && $runtime == d8 ]
+Language/Classes/Instance_Methods/Operators/return_type_t01: MissingCompileTimeError
+Language/Classes/Setters/return_type_not_void_t01: MissingCompileTimeError
+Language/Classes/Setters/syntax_t04: MissingCompileTimeError
 Language/Expressions/Additive_Expressions/syntax_t01: RuntimeError
 Language/Expressions/Await_Expressions/evaluation_throws_t04: RuntimeError
 Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError
@@ -3500,6 +3492,7 @@
 Language/Metadata/before_param_t07: RuntimeError
 Language/Metadata/before_param_t09: RuntimeError
 Language/Metadata/before_variable_t02: RuntimeError
+Language/Mixins/Mixin_Application/superclass_t01: MissingCompileTimeError
 Language/Overview/Privacy/private_and_public_t18: RuntimeError
 Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: RuntimeError
 Language/Statements/Assert/execution_t09: RuntimeError
@@ -3528,9 +3521,16 @@
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t09: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t10: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_class_member_A02_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_local_variable_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_return_value_A02_t01: RuntimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_named_extends_Future_neg_assign_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_named_extends_Future_neg_assign_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_Future_neg_assign_l1_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_Future_neg_assign_l1_t07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_param_extends_Future_neg_assign_l1_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t13: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t15: MissingCompileTimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t02: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t01: RuntimeError
@@ -3556,10 +3556,8 @@
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A31_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A32_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_arguments_binding_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t02: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t03: RuntimeError
+LanguageFeatures/Super_Mixins/mixin_member_neg_t02: RuntimeError
+LanguageFeatures/Super_Mixins/super_invocation_t01: CompileTimeError
 LayoutTests/fast/animation/request-animation-frame-prefix_t01: RuntimeError
 LayoutTests/fast/backgrounds/animated-gif-as-background_t01: RuntimeError
 LayoutTests/fast/backgrounds/background-fill-zero-area-crash_t01: RuntimeError
@@ -5176,9 +5174,6 @@
 Language/Types/Interface_Types/subtype_t23: RuntimeError
 Language/Variables/constant_variable_t09: RuntimeError
 LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_class_member_A02_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_local_variable_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_return_value_A02_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t02: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t01: RuntimeError
@@ -5204,10 +5199,6 @@
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A31_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A32_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_arguments_binding_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t02: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t03: RuntimeError
 LayoutTests/fast/animation/request-animation-frame-cancel_t01: Timeout, Pass
 LayoutTests/fast/animation/request-animation-frame-timestamps-advance_t01: Timeout, Pass
 LayoutTests/fast/backgrounds/background-position-parsing-2_t01: RuntimeError
@@ -5572,6 +5563,7 @@
 LayoutTests/fast/events/nested-event-remove-node-crash_t01: Timeout
 LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: RuntimeError
 LayoutTests/fast/events/scoped/editing-commands_t01: RuntimeError
+LayoutTests/fast/events/scroll-during-zoom-change_t01: Timeout, Pass
 LayoutTests/fast/events/scroll-event-phase_t01: Timeout, Pass
 LayoutTests/fast/events/selectstart-on-selectall_t01: RuntimeError
 LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError
@@ -5618,6 +5610,7 @@
 LayoutTests/fast/forms/date/date-pseudo-classes_t01: RuntimeError
 LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError
 LayoutTests/fast/forms/datetimelocal/datetimelocal-input-type_t01: RuntimeError
+LayoutTests/fast/forms/datetimelocal/datetimelocal-interactive-validation-required_t01: RuntimeError, Pass
 LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError
 LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError
 LayoutTests/fast/forms/fieldset/fieldset-disabled_t01: RuntimeError
@@ -5774,12 +5767,14 @@
 LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError
 LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError
 LayoutTests/fast/xsl/default-html_t01: RuntimeError
+LibTest/async/Future/Future.delayed_A01_t02: RuntimeError, Pass
 LibTest/async/Future/asStream_A01_t02: RuntimeError
 LibTest/async/Stream/Stream.fromFutures_A04_t01: RuntimeError
 LibTest/async/Stream/Stream.fromFutures_A04_t02: RuntimeError
 LibTest/async/Stream/Stream.fromIterable_A02_t01: RuntimeError
 LibTest/async/Stream/Stream.fromIterable_A03_t01: RuntimeError, Timeout, Pass
 LibTest/async/Stream/Stream.fromIterable_A03_t02: RuntimeError
+LibTest/async/Stream/Stream.periodic_A01_t01: RuntimeError, Pass
 LibTest/async/Stream/Stream.periodic_A04_t02: RuntimeError
 LibTest/async/Stream/Stream.periodic_A04_t03: RuntimeError
 LibTest/async/StreamController/StreamController.broadcast_A03_t02: RuntimeError
@@ -6100,9 +6095,6 @@
 Language/Types/Interface_Types/subtype_t23: RuntimeError
 Language/Variables/constant_variable_t09: RuntimeError
 LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_class_member_A02_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_local_variable_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_return_value_A02_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t02: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t01: RuntimeError
@@ -6128,10 +6120,6 @@
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A31_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A32_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_arguments_binding_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t02: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t03: RuntimeError
 LayoutTests/fast/animation/request-animation-frame-prefix_t01: Timeout, Pass
 LayoutTests/fast/backgrounds/background-position-parsing-2_t01: RuntimeError
 LayoutTests/fast/backgrounds/background-shorthand-with-backgroundSize-style_t01: RuntimeError
@@ -7029,9 +7017,6 @@
 Language/Types/Interface_Types/subtype_t23: RuntimeError
 Language/Variables/constant_variable_t09: RuntimeError
 LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_class_member_A02_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_local_variable_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/interface_compositionality_return_value_A02_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t02: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t01: RuntimeError
@@ -7057,10 +7042,6 @@
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A31_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A32_t01: RuntimeError
 LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_arguments_binding_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t01: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t02: RuntimeError
-LanguageFeatures/Subtyping/static/generated/interface_compositionality_class_member_A02_t03: RuntimeError
 LayoutTests/fast/backgrounds/background-position-parsing-2_t01: RuntimeError
 LayoutTests/fast/backgrounds/background-shorthand-with-backgroundSize-style_t01: RuntimeError
 LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError
@@ -7461,7 +7442,7 @@
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: Timeout, Pass
+LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: Timeout, Pass, RuntimeError
 LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: RuntimeError
 LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: Timeout, Pass
 LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: Timeout, Pass
@@ -7493,6 +7474,7 @@
 LayoutTests/fast/text/glyph-reordering_t01: RuntimeError
 LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError
 LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError
+LayoutTests/fast/text/multiglyph-characters_t01: RuntimeError, Pass
 LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError
 LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError
 LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
index b4cff1a..662a94c 100644
--- a/tests/co19_2/co19_2-kernel.status
+++ b/tests/co19_2/co19_2-kernel.status
@@ -2,6 +2,73 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+[ $compiler == dartkp ]
+Language/Expressions/Instance_Creation/New/evaluation_t20: RuntimeError
+Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: DartkCrash
+Language/Libraries_and_Scripts/Imports/deferred_import_t01: RuntimeError
+Language/Metadata/before_factory_t01: RuntimeError
+Language/Metadata/before_library_t01: RuntimeError
+Language/Metadata/before_param_t06: RuntimeError
+Language/Metadata/before_param_t08: RuntimeError
+Language/Metadata/before_param_t09: DartkCrash
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t09: RuntimeError
+Language/Types/Interface_Types/subtype_t03: RuntimeError
+Language/Types/Interface_Types/subtype_t26: RuntimeError
+LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
+LanguageFeatures/Subtyping/static/generated/left_bottom_global_variable_A02_t01: DartkCrash
+LanguageFeatures/Subtyping/static/generated/left_promoted_variable_global_variable_A02_t01: DartkCrash
+LibTest/async/Stream/Stream.periodic_A02_t01: RuntimeError
+LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue.from_A01_t01: RuntimeError
+LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t02: RuntimeError
+LibTest/collection/IterableMixin/reduce_A01_t01: RuntimeError
+LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: RuntimeError
+LibTest/collection/Queue/Queue.from_A01_t01: RuntimeError
+LibTest/collection/SetBase/SetBase_class_A01_t01: RuntimeError
+LibTest/core/List/List_class_A01_t01: RuntimeError
+LibTest/core/StackOverflowError/stackTrace_A01_t02: RuntimeError
+LibTest/core/Uri/Uri.dataFromString_A01_t01: RuntimeError
+LibTest/core/double/round_A01_t03: RuntimeError
+LibTest/io/Cookie/Cookie_A01_t02: RuntimeError
+LibTest/io/Directory/renameSync_A02_t01: RuntimeError
+LibTest/io/Directory/rename_A02_t01: RuntimeError
+LibTest/io/File/openRead_A01_t04: RuntimeError
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t05: Fail, Pass
+LibTest/io/HttpClientRequest/addStream_A02_t02: RuntimeError
+LibTest/io/HttpClientRequest/add_A03_t01: RuntimeError
+LibTest/io/HttpServer/bind_A05_t02: Fail
+LibTest/io/IOSink/close_A02_t01: RuntimeError
+LibTest/io/IOSink/writeAll_A01_t01: RuntimeError
+LibTest/io/IOSink/writeAll_A02_t02: RuntimeError
+LibTest/io/IOSink/write_A01_t04: RuntimeError
+LibTest/io/ProcessResult/pid_A01_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A01_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A02_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A03_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t03: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A02_t01: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A01_t03: RuntimeError
+LibTest/io/RawDatagramSocket/asBroadcastStream_A03_t01: Timeout
+LibTest/io/RawDatagramSocket/join_A02_t01: RuntimeError
+LibTest/io/RawSecureServerSocket/first_A02_t01: RuntimeError
+LibTest/io/Stdin/any_A01_t03: RuntimeError
+LibTest/io/Stdin/first_A02_t01: RuntimeError
+LibTest/io/Stdin/readByteSync_A02_t01: RuntimeError
+LibTest/io/Stdout/addStream_A03_t01: RuntimeError
+LibTest/io/Stdout/nonBlocking_A01_t01: RuntimeError
+LibTest/io/ZLibDecoder/fuse_A01_t01: RuntimeError
+LibTest/io/exit/exit_A01_t01: RuntimeError
+LibTest/io/exit/exit_A02_t01: RuntimeError
+LibTest/io/exitCode/exitCode_A01_t01: RuntimeError
+LibTest/isolate/Isolate/spawnUri_A01_t02: RuntimeError
+LibTest/isolate/Isolate/spawnUri_A05_t05: RuntimeError
+LibTest/isolate/ReceivePort/lastWhere_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asFloat32x4List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asInt32List_A01_t01: RuntimeError
+LibTest/typed_data/Float32List/first_A01_t02: RuntimeError
+LibTest/typed_data/Float32x4List/every_A01_t01: RuntimeError
+LibTest/typed_data/Int32List/any_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/clear_A01_t01: RuntimeError
+
 [ $fasta ]
 Language/Classes/Abstract_Instance_Members/override_default_value_t01: MissingCompileTimeError # Issue 34190
 Language/Classes/Abstract_Instance_Members/override_default_value_t02: MissingCompileTimeError # Issue 34190
@@ -13,8 +80,6 @@
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t04: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t05: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t06: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: MissingCompileTimeError # Issue 34192
-Language/Classes/Constructors/Generative_Constructors/final_variables_t01: CompileTimeError # Expects a warning, but this is an error in Dart 2
 Language/Classes/Constructors/Generative_Constructors/initializers_t15: CompileTimeError
 Language/Classes/Constructors/name_t01: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Constructors/name_t02: MissingCompileTimeError # Legal, see #33235
@@ -27,6 +92,7 @@
 Language/Classes/Getters/instance_getter_t06: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Getters/type_object_t01: CompileTimeError
 Language/Classes/Getters/type_object_t02: CompileTimeError
+Language/Classes/Instance_Methods/Operators/return_type_t01: MissingCompileTimeError
 Language/Classes/Instance_Methods/override_different_default_values_t01: MissingCompileTimeError # Issue 34190
 Language/Classes/Instance_Methods/override_different_default_values_t02: MissingCompileTimeError # Issue 34190
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: MissingCompileTimeError # Legal, see #33235
@@ -44,6 +110,10 @@
 Language/Classes/Setters/instance_setter_t06: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Setters/name_t06: CompileTimeError
 Language/Classes/Setters/name_t07: CompileTimeError
+Language/Classes/Setters/return_type_not_void_t01: MissingCompileTimeError
+Language/Classes/Setters/same_name_getter_different_type_t01: MissingCompileTimeError
+Language/Classes/Setters/syntax_t04: MissingCompileTimeError
+Language/Classes/Setters/syntax_t05: MissingCompileTimeError
 Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError
 Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError # Issue 30273
 Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError # Issue 30273
@@ -113,10 +183,15 @@
 Language/Generics/syntax_t02: CompileTimeError
 Language/Generics/syntax_t03: CompileTimeError
 Language/Generics/upper_bound_t01: MissingCompileTimeError # Issue 33308
-Language/Libraries_and_Scripts/Imports/library_name_t01: CompileTimeError # Test is wrong. Spec says error not warning.
+Language/Libraries_and_Scripts/Imports/library_name_t01: MissingCompileTimeError # Expects an error, but this is a warning in Dart 2
 Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError # Issue 30273
 Language/Mixins/Mixin_Application/static_warning_t01: MissingCompileTimeError # Mixin super equirement
-Language/Mixins/Mixin_Application/syntax_t21: CompileTimeError # The test even says in the comment it should be a compile time error
+Language/Mixins/Mixin_Application/superclass_t01: MissingCompileTimeError
+Language/Mixins/Mixin_Application/superclass_t02: MissingCompileTimeError
+Language/Mixins/Mixin_Application/superinterfaces_t07: MissingCompileTimeError
+Language/Mixins/Mixin_Application/warning_t01: CompileTimeError # Expects a warning, but this is an error in Dart 2
+Language/Mixins/Mixin_Application/warning_t02: CompileTimeError # Expects a warning, but this is an error in Dart 2
+Language/Mixins/Mixin_Application/warning_t03: CompileTimeError # Expects a warning, but this is an error in Dart 2
 Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Mixin constructor
 Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Mixin constructor
 Language/Overview/Privacy/private_and_public_t11: CompileTimeError
@@ -147,8 +222,6 @@
 Language/Types/Static_Types/malformed_type_t01/04: MissingCompileTimeError # Issue 33308
 Language/Types/Static_Types/malformed_type_t01/05: MissingCompileTimeError # Issue 33308
 Language/Types/Static_Types/malformed_type_t01/06: MissingCompileTimeError # Issue 33308
-Language/Types/Type_Void/syntax_t09: CompileTimeError # Test contains a compile-time error
-Language/Types/Type_Void/using_t02: CompileTimeError # Test contains a compile-time error
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_named_extends_neg_assign_l1_t01: MissingCompileTimeError # Please triage this failure
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_named_extends_neg_assign_l1_t03: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_named_extends_neg_assign_l1_t04: MissingCompileTimeError # Issue 34087
@@ -201,7 +274,14 @@
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t19: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t20: MissingCompileTimeError # Issue 34087
 LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t21: MissingCompileTimeError # Issue 34087
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_l1_t05: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_named_extends_Future_neg_assign_l1_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_named_extends_Future_neg_assign_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_named_extends_Future_neg_assign_l1_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_named_extends_Future_neg_assign_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_named_extends_Future_neg_assign_l1_t06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_named_extends_Future_neg_assign_l1_t07: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_neg_assign_l1_t01: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_neg_assign_l1_t03: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_neg_assign_l1_t04: MissingCompileTimeError
@@ -210,6 +290,13 @@
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_neg_assign_l1_t07: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_neg_assign_l1_t08: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_named_extends_neg_assign_l1_t09: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_Future_neg_assign_l1_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_Future_neg_assign_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_Future_neg_assign_l1_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_Future_neg_assign_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_Future_neg_assign_l1_t06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_Future_neg_assign_l1_t07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_Future_neg_assign_l1_t08: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_neg_assign_l1_t01: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_neg_assign_l1_t03: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_neg_assign_l1_t04: MissingCompileTimeError
@@ -218,6 +305,13 @@
 LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_neg_assign_l1_t07: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_neg_assign_l1_t08: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_optparam_extends_neg_assign_l1_t09: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_param_extends_Future_neg_assign_l1_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_param_extends_Future_neg_assign_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_param_extends_Future_neg_assign_l1_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_param_extends_Future_neg_assign_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_param_extends_Future_neg_assign_l1_t06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_param_extends_Future_neg_assign_l1_t07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_param_extends_Future_neg_assign_l1_t08: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_param_extends_neg_assign_l1_t01: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_param_extends_neg_assign_l1_t03: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_param_extends_neg_assign_l1_t04: MissingCompileTimeError
@@ -226,6 +320,25 @@
 LanguageFeatures/Instantiate-to-bound/function/function_param_extends_neg_assign_l1_t07: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_param_extends_neg_assign_l1_t08: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_param_extends_neg_assign_l1_t09: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t08: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t09: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t11: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t12: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t13: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t14: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t15: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t16: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t17: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t18: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t20: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t21: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t01: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t02: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_neg_assign_l1_t03: MissingCompileTimeError
@@ -250,7 +363,6 @@
 LanguageFeatures/Instantiate-to-bound/interface/interface_neg_assign_l2_t02: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/mixin/mixin_extends_neg_l1_t01: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/mixin/mixin_neg_assign_l2_t01: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/mixin/mixin_neg_l1_t02: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/mixin/mixin_neg_l1_t07: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/mixin/mixin_neg_l2_t01: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/typedef/typedef_named_extends_neg_l1_t03: MissingCompileTimeError
@@ -262,51 +374,368 @@
 LanguageFeatures/Instantiate-to-bound/typedef/typedef_ret_extends_neg_l1_t04: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/typedef/typedef_ret_extends_neg_l1_t05: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/typedef/typedef_ret_extends_neg_l2_t02: MissingCompileTimeError
-LanguageFeatures/int-to-double/arguments_binding_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/arguments_binding_t02: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/assignment_class_member_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/assignment_class_member_t02: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/assignment_global_variable_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/assignment_global_variable_t02: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/assignment_local_variable_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/assignment_local_variable_t02: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/assignment_super_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/assignment_super_t02: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/assignment_this_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/assignment_this_t02: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/max_acceptable_value_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/min_acceptable_values_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/representation_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/representation_t02: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/representation_t03: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/representation_t04: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/return_value_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/int-to-double/return_value_t02: CompileTimeError # Please triage this failureLibTest/collection/Maps/forEach_A01_t01: CompileTimeError
-LibTest/collection/Maps/forEach_A01_t03: CompileTimeError
-LibTest/collection/Maps/forEach_A01_t04: CompileTimeError
-LibTest/collection/Maps/forEach_A01_t05: CompileTimeError
-LibTest/collection/Maps/forEach_A01_t06: CompileTimeError
-LibTest/collection/Maps/forEach_A02_t01: CompileTimeError
+LanguageFeatures/Super_Mixins/declarations_neg_t01/none: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_application_neg_t01/none: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_application_neg_t03/none: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_member_neg_t01: CompileTimeError
+LanguageFeatures/Super_Mixins/mixin_member_neg_t02: CompileTimeError
+LanguageFeatures/Super_Mixins/super_invocation_neg_t01/03: MissingCompileTimeError
+LanguageFeatures/Super_Mixins/super_invocation_t01: CompileTimeError
 
-[ $compiler != dart2js && $fasta ]
+[ $arch == simdbc64 && ($compiler == dartk || $compiler == dartkb) ]
+LibTest/io/Link/renameSync_A02_t01: RuntimeError, Pass
+LibTest/io/Process/start_A01_t01: RuntimeError
+LibTest/io/Process/start_A02_t01: RuntimeError
+LibTest/io/Process/start_A02_t02: RuntimeError
+LibTest/io/Process/start_A03_t01: RuntimeError
+LibTest/io/Process/start_A03_t02: RuntimeError
+LibTest/io/ProcessSignal/watch_A01_t01: RuntimeError
+LibTest/io/ProcessSignal/watch_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A01_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t03: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t04: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A03_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A03_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A03_t03: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t03: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t04: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A05_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A01_t03: RuntimeError
+LibTest/io/RandomAccessFile/lock_A01_t04: RuntimeError
+LibTest/io/RandomAccessFile/lock_A02_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A02_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A02_t03: RuntimeError
+LibTest/io/RandomAccessFile/lock_A03_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A03_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A03_t03: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t03: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t04: RuntimeError
+LibTest/io/RandomAccessFile/lock_A05_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A05_t02: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A01_t01: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A01_t03: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A02_t01: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A01_t03: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A01_t04: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A02_t01: RuntimeError
+LibTest/io/RawDatagramSocket/any_A03_t01: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/timeout_A02_t01: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/timeout_A03_t01: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/timeout_A06_t01: RuntimeError, Pass
+LibTest/io/RawSecureServerSocket/first_A02_t01: RuntimeError
+LibTest/io/RawSecureServerSocket/first_A02_t02: RuntimeError
+LibTest/io/RawSecureServerSocket/first_A03_t01: RuntimeError
+LibTest/io/RawSecureServerSocket/isEmpty_A01_t02: RuntimeError
+LibTest/io/RawSecureServerSocket/last_A02_t01: RuntimeError
+LibTest/io/RawSecureServerSocket/length_A01_t02: RuntimeError
+LibTest/io/RawSecureServerSocket/single_A01_t03: RuntimeError
+LibTest/io/RawSecureServerSocket/single_A02_t01: RuntimeError
+LibTest/io/Stdin/first_A01_t01: RuntimeError, Pass
+LibTest/io/Stdout/add_A02_t01: RuntimeError, Pass
+LibTest/io/Stdout/add_A04_t01: RuntimeError, Pass
+LibTest/io/stderr/stderr_A01_t01: RuntimeError, Pass
+LibTest/isolate/Isolate/ping_A03_t02: RuntimeError, Pass
+
+[ $compiler != dart2js && $runtime != vm && $fasta ]
 Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t01: MissingCompileTimeError # Issue 34191
 Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t02: MissingCompileTimeError # Issue 34191
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t03: MissingCompileTimeError # Issue 34191
 Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t02: MissingCompileTimeError # Issue 34192
 Language/Expressions/Constants/exception_t01: MissingCompileTimeError # Issue 31936
 Language/Expressions/Constants/exception_t03: MissingCompileTimeError # Issue 31936
 Language/Expressions/Constants/exception_t04: MissingCompileTimeError # Issue 31936
-Language/Expressions/Constants/literal_string_t02: MissingCompileTimeError # Issue 34192
 Language/Expressions/Constants/no_other_constant_expressions_t11: MissingCompileTimeError # Issue 34192
 Language/Expressions/Constants/ternary_operator_t02: MissingCompileTimeError # Issue 34192
 Language/Expressions/Instance_Creation/Const/exception_t01: MissingCompileTimeError # Issue 31936
 Language/Metadata/compilation_t03: MissingCompileTimeError # Issue 34205
 
-[ $strong && ($compiler == dartk || $compiler == dartkb) ]
+[ $compiler != dart2js && $fasta ]
+Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t03: MissingCompileTimeError # Issue 34191
+Language/Expressions/Constants/literal_string_t02: MissingCompileTimeError # Issue 34192
+
+[ $runtime == vm && ($compiler == dartk || $compiler == dartkb) ]
+Language/Classes/definition_t23: CompileTimeError
+Language/Expressions/Constants/exception_t02/01: MissingRuntimeError
+Language/Expressions/Function_Invocation/async_invokation_t02: RuntimeError
+Language/Expressions/Logical_Boolean_Expressions/syntax_t01: RuntimeError
+Language/Mixins/Mixin_Application/syntax_t16: CompileTimeError
+Language/Statements/Assert/execution_t08: RuntimeError
+Language/Types/Function_Types/call_t01: RuntimeError
+LanguageFeatures/Instantiate-to-bound/mixin/mixin_neg_l1_t08: CompileTimeError
+LibTest/async/Stream/Stream.fromFutures_A04_t01: RuntimeError
+LibTest/async/Stream/Stream.fromIterable_A02_t01: RuntimeError
+LibTest/async/StreamController/addStream_A03_t01: RuntimeError
+LibTest/async/StreamSink/addStream_A01_t02: RuntimeError
+LibTest/collection/HashSet/HashSet_class_A01_t01: RuntimeError
+LibTest/collection/IterableBase/IterableBase_class_A01_t02: RuntimeError
+LibTest/collection/IterableMixin/IterableMixin_class_A02_t01: RuntimeError
+LibTest/collection/IterableMixin/contains_A02_t01: RuntimeError
+LibTest/collection/IterableMixin/every_A01_t02: RuntimeError
+LibTest/collection/IterableMixin/every_A02_t01: RuntimeError
+LibTest/collection/IterableMixin/expand_A02_t01: RuntimeError
+LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError
+LibTest/collection/LinkedList/LinkedList_class_A03_t01: RuntimeError
+LibTest/collection/LinkedListEntry/LinkedListEntry_class_A03_t01: RuntimeError
+LibTest/collection/LinkedListEntry/insertAfter_A01_t01: RuntimeError
+LibTest/collection/LinkedListEntry/insertAfter_A02_t02: RuntimeError
+LibTest/collection/LinkedListEntry/insertAfter_A02_t03: RuntimeError
+LibTest/collection/LinkedListEntry/insertBefore_A01_t01: RuntimeError
+LibTest/collection/LinkedListEntry/insertBefore_A01_t02: RuntimeError
+LibTest/collection/LinkedListEntry/insertBefore_A02_t02: RuntimeError
+LibTest/collection/LinkedListEntry/insertBefore_A02_t03: RuntimeError
+LibTest/collection/LinkedListEntry/list_A01_t03: RuntimeError
+LibTest/collection/LinkedListEntry/next_A01_t02: RuntimeError
+LibTest/collection/LinkedListEntry/next_A01_t03: RuntimeError
+LibTest/collection/LinkedListEntry/previous_A01_t02: RuntimeError
+LibTest/collection/LinkedListEntry/previous_A01_t03: RuntimeError
+LibTest/collection/LinkedListEntry/unlink_A01_t01: RuntimeError
+LibTest/collection/LinkedListEntry/unlink_A01_t02: RuntimeError
+LibTest/collection/ListBase/ListBase_class_A01_t01: RuntimeError
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError
+LibTest/collection/ListQueue/ListQueue_class_A01_t01: RuntimeError
+LibTest/collection/Queue/Queue_class_A01_t01: RuntimeError
+LibTest/collection/SetMixin/SetMixin_class_A01_t01: RuntimeError
+LibTest/collection/SplayTreeSet/SplayTreeSet_class_A01_t01: RuntimeError
+LibTest/collection/UnmodifiableListView/UnmodifiableListView_class_A01_t01: RuntimeError
+LibTest/core/Function/Function_class_A01_t01: RuntimeError
+LibTest/core/List/Iterable_A01_t01: RuntimeError
+LibTest/core/int/abs_A01_t01: RuntimeError
+LibTest/core/int/isOdd_A01_t01: RuntimeError
+LibTest/io/Cookie/Cookie_A01_t04: RuntimeError
+LibTest/io/Directory/watch_A01_t01: Fail, Pass
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t01: Fail, Pass
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t02: Fail, Pass
+LibTest/io/FileSystemCreateEvent/path_A01_t01: Fail
+LibTest/io/FileSystemModifyEvent/isDirectory_A01_t02: Fail
+LibTest/io/FileSystemModifyEvent/path_A01_t01: Fail
+LibTest/io/FileSystemModifyEvent/type_A01_t02: Fail
+LibTest/io/HeaderValue/parse_A03_t01: RuntimeError
+LibTest/io/HttpClientRequest/addError_A02_t01: RuntimeError
+LibTest/io/HttpClientRequest/addStream_A01_t01: RuntimeError
+LibTest/io/HttpClientRequest/addStream_A02_t01: RuntimeError
+LibTest/io/HttpClientRequest/add_A03_t02: RuntimeError
+LibTest/io/HttpClientRequest/flush_A02_t01: RuntimeError
+LibTest/io/HttpClientRequest/flush_A02_t02: RuntimeError
+LibTest/io/HttpServer/close_A04_t01: RuntimeError, Pass
+LibTest/io/InternetAddress/lookup_A02_t01: RuntimeError
+LibTest/io/InternetAddress/lookup_A03_t01: RuntimeError
+LibTest/io/InternetAddress/lookup_A03_t02: RuntimeError
+LibTest/io/Link/renameSync_A02_t01: RuntimeError, Pass
+LibTest/io/Link/watch_A01_t01: Fail
+LibTest/io/NetworkInterface/list_A02_t01: RuntimeError
+LibTest/io/NetworkInterface/list_A02_t02: RuntimeError
+LibTest/io/NetworkInterface/list_A02_t03: RuntimeError
+LibTest/io/Process/exitCode_A01_t01: RuntimeError
+LibTest/io/Process/kill_A01_t02: RuntimeError, Pass
+LibTest/io/Process/pid_A01_t01: RuntimeError
+LibTest/io/Process/start_A01_t02: RuntimeError
+LibTest/io/ProcessResult/ProcessResult_A01_t02: RuntimeError
+LibTest/io/ProcessResult/ProcessResult_A01_t03: RuntimeError
+LibTest/io/ProcessResult/exitCode_A01_t01: RuntimeError
+LibTest/io/ProcessResult/exitCode_A01_t02: RuntimeError
+LibTest/io/ProcessResult/stderr_A01_t01: RuntimeError
+LibTest/io/ProcessResult/stderr_A01_t02: RuntimeError
+LibTest/io/ProcessResult/stdout_A01_t01: RuntimeError
+LibTest/io/ProcessResult/stdout_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/writeByte_A01_t01: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/any_A01_t04: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/any_A01_t05: RuntimeError
+LibTest/io/RawDatagramSocket/any_A01_t06: RuntimeError
+LibTest/io/RawDatagramSocket/any_A02_t01: RuntimeError
+LibTest/io/RawDatagramSocket/any_A02_t02: RuntimeError
+LibTest/io/RawDatagramSocket/any_A02_t03: RuntimeError
+LibTest/io/RawDatagramSocket/any_A02_t04: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/asBroadcastStream_A01_t03: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/asBroadcastStream_A02_t02: Timeout, Pass
+LibTest/io/RawDatagramSocket/close_A01_t02: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/join_A01_t01: RuntimeError
+LibTest/io/RawDatagramSocket/join_A01_t02: RuntimeError
+LibTest/io/RawDatagramSocket/reduce_A01_t01: RuntimeError
+LibTest/io/RawDatagramSocket/reduce_A02_t02: RuntimeError
+LibTest/io/RawDatagramSocket/reduce_A04_t01: RuntimeError
+LibTest/io/RawDatagramSocket/single_A02_t01: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/single_A03_t01: RuntimeError, Pass
+LibTest/io/Stdout/addError_A02_t02: RuntimeError
+LibTest/io/Stdout/addStream_A01_t01: RuntimeError
+LibTest/io/Stdout/add_A02_t07: RuntimeError
+LibTest/io/WebSocket/connect_A01_t01: RuntimeError
+LibTest/io/WebSocket/connect_A01_t02: RuntimeError
+LibTest/isolate/Isolate/pause_A01_t02: Timeout, Pass
+LibTest/isolate/Isolate/ping_A03_t01: RuntimeError, Pass
+LibTest/isolate/Isolate/ping_A03_t02: RuntimeError, Pass
+LibTest/isolate/ReceivePort/firstWhere_A01_t01: RuntimeError
+LibTest/isolate/ReceivePort/firstWhere_A02_t01: RuntimeError
+LibTest/isolate/ReceivePort/transform_A01_t01: RuntimeError
+
+[ $runtime != vm && $fasta ]
+Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: MissingCompileTimeError # Issue 34192
+LanguageFeatures/Instantiate-to-bound/class/class_extends_FutureOr_neg_l3_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_Future_neg_l3_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_l3_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/mixin/mixin_neg_l1_t02: MissingCompileTimeError
+
+[ $runtime != vm && ($compiler == dartk || $compiler == dartkb) ]
 Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: Crash
+Language/Expressions/Booleans/Boolean_Conversion/definition_t01: RuntimeError
+Language/Expressions/Unary_Expressions/variable_negative_t03: RuntimeError
+Language/Metadata/before_export_t01: RuntimeError
+Language/Metadata/before_import_t01: RuntimeError
+Language/Metadata/before_param_t01: RuntimeError
+Language/Metadata/before_param_t02: RuntimeError
+Language/Metadata/before_param_t03: RuntimeError
+Language/Metadata/before_param_t04: RuntimeError
+Language/Metadata/before_param_t05: RuntimeError
+Language/Metadata/before_param_t07: RuntimeError
+Language/Statements/Do/execution_t06: RuntimeError
+Language/Statements/For/For_Loop/execution_t11: RuntimeError
+Language/Statements/While/execution_t02: RuntimeError
+Language/Types/Type_Declarations/Typedef/self_reference_t08: DartkCrash
+Language/Types/Type_Declarations/Typedef/self_reference_t09: DartkCrash
+LibTest/collection/LinkedList/add_A01_t01: RuntimeError
+LibTest/collection/LinkedList/forEach_A01_t01: RuntimeError
+LibTest/collection/LinkedList/map_A01_t01: RuntimeError
+LibTest/collection/LinkedList/map_A02_t01: RuntimeError
+LibTest/collection/LinkedList/map_A03_t01: RuntimeError
+LibTest/collection/LinkedList/reduce_A01_t01: RuntimeError
+LibTest/collection/LinkedList/reduce_A03_t01: RuntimeError
+LibTest/collection/LinkedList/reduce_A04_t01: RuntimeError
+LibTest/collection/LinkedList/singleWhere_A01_t01: RuntimeError
+LibTest/collection/LinkedList/singleWhere_A02_t01: RuntimeError
+LibTest/collection/LinkedList/singleWhere_A02_t02: RuntimeError
+LibTest/collection/LinkedList/skipWhile_A01_t01: RuntimeError
+LibTest/collection/LinkedList/skipWhile_A03_t01: RuntimeError
+LibTest/collection/LinkedList/skipWhile_A04_t01: RuntimeError
+LibTest/collection/LinkedList/skipWhile_A05_t01: RuntimeError
+LibTest/collection/LinkedList/takeWhile_A01_t01: RuntimeError
+LibTest/collection/LinkedList/takeWhile_A01_t02: RuntimeError
+LibTest/collection/LinkedList/takeWhile_A02_t01: RuntimeError
+LibTest/collection/LinkedList/takeWhile_A03_t01: RuntimeError
+LibTest/collection/LinkedList/take_A01_t01: RuntimeError
+LibTest/collection/LinkedList/take_A03_t01: RuntimeError
+LibTest/collection/LinkedList/where_A01_t01: RuntimeError
+LibTest/collection/LinkedList/where_A02_t01: RuntimeError
+LibTest/io/Directory/watch_A01_t01: RuntimeError
+LibTest/io/Directory/watch_A01_t02: RuntimeError
+LibTest/io/Directory/watch_A02_t01: RuntimeError
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t01: RuntimeError
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t02: RuntimeError
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t04: RuntimeError
+LibTest/io/FileSystemCreateEvent/path_A01_t01: RuntimeError
+LibTest/io/FileSystemCreateEvent/type_A01_t01: RuntimeError
+LibTest/io/FileSystemCreateEvent/type_A01_t02: RuntimeError
+LibTest/io/FileSystemCreateEvent/type_A01_t03: RuntimeError
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t01: RuntimeError
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t02: RuntimeError
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t03: RuntimeError
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t04: RuntimeError
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t05: RuntimeError
+LibTest/io/FileSystemDeleteEvent/path_A01_t01: RuntimeError
+LibTest/io/FileSystemDeleteEvent/path_A01_t02: RuntimeError
+LibTest/io/FileSystemDeleteEvent/path_A01_t03: RuntimeError
+LibTest/io/FileSystemDeleteEvent/type_A01_t01: RuntimeError
+LibTest/io/FileSystemDeleteEvent/type_A01_t02: RuntimeError
+LibTest/io/FileSystemDeleteEvent/type_A01_t03: RuntimeError
+LibTest/io/FileSystemModifyEvent/isDirectory_A01_t01: RuntimeError
+LibTest/io/FileSystemModifyEvent/path_A01_t02: RuntimeError
+LibTest/io/FileSystemModifyEvent/type_A01_t01: RuntimeError
+LibTest/io/FileSystemMoveEvent/destination_A01_t01: RuntimeError
+LibTest/io/FileSystemMoveEvent/destination_A01_t02: RuntimeError
+LibTest/io/FileSystemMoveEvent/destination_A01_t03: RuntimeError
+LibTest/io/FileSystemMoveEvent/isDirectory_A01_t01: RuntimeError
+LibTest/io/FileSystemMoveEvent/isDirectory_A01_t02: RuntimeError
+LibTest/io/FileSystemMoveEvent/isDirectory_A01_t03: RuntimeError
+LibTest/io/FileSystemMoveEvent/path_A01_t01: RuntimeError
+LibTest/io/FileSystemMoveEvent/path_A01_t02: RuntimeError
+LibTest/io/FileSystemMoveEvent/path_A01_t03: RuntimeError
+LibTest/io/FileSystemMoveEvent/type_A01_t01: RuntimeError
+LibTest/io/FileSystemMoveEvent/type_A01_t02: RuntimeError
+LibTest/io/FileSystemMoveEvent/type_A01_t03: RuntimeError
+LibTest/io/HttpClient/autoUncompress_A02_t01: RuntimeError
+LibTest/io/HttpClient/autoUncompress_A04_t01: RuntimeError
+LibTest/io/HttpClient/autoUncompress_A04_t03: RuntimeError
+LibTest/io/HttpServer/autoCompress_A02_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t03: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t04: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A03_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A03_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A03_t03: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t03: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t04: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A05_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A01_t03: RuntimeError
+LibTest/io/RandomAccessFile/lock_A01_t04: RuntimeError
+LibTest/io/RandomAccessFile/lock_A02_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A02_t03: RuntimeError
+LibTest/io/RandomAccessFile/lock_A03_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A03_t03: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t04: RuntimeError
+LibTest/io/RandomAccessFile/lock_A05_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A05_t02: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A01_t01: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A01_t03: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A01_t04: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A02_t01: RuntimeError
+LibTest/io/RawDatagramSocket/any_A01_t04: Timeout
+LibTest/io/RawDatagramSocket/any_A01_t05: RuntimeError
+LibTest/io/Stdin/readByteSync_A01_t02: RuntimeError
+LibTest/io/Stdin/supportsAnsiEscapes_A02_t01: RuntimeError
+LibTest/io/Stdout/supportsAnsiEscapes_A02_t01: RuntimeError
+LibTest/io/Stdout/writeAll_A02_t05: RuntimeError
+LibTest/io/Stdout/writeCharCode_A01_t03: RuntimeError
+LibTest/isolate/Isolate/ping_A03_t02: RuntimeError, Pass
+LibTest/isolate/Isolate/ping_A03_t02: RuntimeError
+LibTest/isolate/ReceivePort/any_A01_t01: RuntimeError
+LibTest/isolate/ReceivePort/firstWhere_A03_t02: RuntimeError
+LibTest/isolate/ReceivePort/lastWhere_A04_t01: RuntimeError
+LibTest/isolate/ReceivePort/singleWhere_A02_t01: RuntimeError
+LibTest/typed_data/Float32x4List/first_A01_t02: RuntimeError
+LibTest/typed_data/Float32x4List/last_A01_t02: RuntimeError
+LibTest/typed_data/Float64List/first_A01_t02: RuntimeError
+LibTest/typed_data/Float64List/last_A01_t02: RuntimeError
+LibTest/typed_data/Float64x2List/first_A01_t02: RuntimeError
+LibTest/typed_data/Float64x2List/last_A01_t02: RuntimeError
+LibTest/typed_data/Int16List/first_A01_t02: RuntimeError
+LibTest/typed_data/Int16List/last_A01_t02: RuntimeError
+LibTest/typed_data/Int32List/first_A01_t02: RuntimeError
+LibTest/typed_data/Int32List/last_A01_t02: RuntimeError
+LibTest/typed_data/Int32x4List/first_A01_t02: RuntimeError
+LibTest/typed_data/Int32x4List/last_A01_t02: RuntimeError
+LibTest/typed_data/Int64List/first_A01_t02: RuntimeError
+LibTest/typed_data/Int64List/last_A01_t02: RuntimeError
+LibTest/typed_data/Int8List/first_A01_t02: RuntimeError
+LibTest/typed_data/Int8List/last_A01_t02: RuntimeError
+LibTest/typed_data/Uint16List/first_A01_t02: RuntimeError
+LibTest/typed_data/Uint16List/last_A01_t02: RuntimeError
+LibTest/typed_data/Uint32List/first_A01_t02: RuntimeError
+LibTest/typed_data/Uint32List/last_A01_t02: RuntimeError
+LibTest/typed_data/Uint64List/first_A01_t02: RuntimeError
+LibTest/typed_data/Uint8ClampedList/first_A01_t02: RuntimeError
+LibTest/typed_data/Uint8ClampedList/last_A01_t02: RuntimeError
+LibTest/typed_data/Uint8List/first_A01_t02: RuntimeError
+LibTest/typed_data/Uint8List/last_A01_t02: RuntimeError
+
+[ $strong && ($compiler == dartk || $compiler == dartkb) ]
 Language/Expressions/Additive_Expressions/syntax_t01: RuntimeError
 Language/Expressions/Assignment/null_aware_assignment_static_type_t01: RuntimeError
-Language/Expressions/Booleans/Boolean_Conversion/definition_t01: RuntimeError
 Language/Expressions/Constants/depending_on_itself_t03: Crash
 Language/Expressions/Function_Invocation/async_generator_invokation_t08: Fail
 Language/Expressions/Function_Invocation/async_generator_invokation_t10: Fail
@@ -318,23 +747,13 @@
 Language/Expressions/Object_Identity/string_t01: RuntimeError
 Language/Expressions/Strings/adjacent_strings_t02: RuntimeError
 Language/Expressions/Type_Cast/syntax_t01: RuntimeError
-Language/Expressions/Unary_Expressions/variable_negative_t03: RuntimeError
 Language/Functions/External_Functions/not_connected_to_a_body_t01: RuntimeError
 Language/Generics/syntax_t02: DartkCrash
 Language/Generics/syntax_t03: DartkCrash
+Language/Libraries_and_Scripts/Imports/deferred_import_t01: RuntimeError
 Language/Libraries_and_Scripts/Parts/compilation_t03: RuntimeError
 Language/Libraries_and_Scripts/Parts/compilation_t05: RuntimeError
-Language/Metadata/before_export_t01: RuntimeError
-Language/Metadata/before_import_t01: RuntimeError
-Language/Metadata/before_library_t01: RuntimeError
-Language/Metadata/before_param_t01: RuntimeError
-Language/Metadata/before_param_t02: RuntimeError
-Language/Metadata/before_param_t03: RuntimeError
-Language/Metadata/before_param_t04: RuntimeError
-Language/Metadata/before_param_t05: RuntimeError
-Language/Metadata/before_param_t06: RuntimeError
-Language/Metadata/before_param_t07: RuntimeError
-Language/Metadata/before_param_t08: RuntimeError
+Language/Libraries_and_Scripts/Scripts/top_level_main_t01: Crash, Pass
 Language/Metadata/before_param_t09: RuntimeError
 Language/Metadata/before_type_param_t01: RuntimeError
 Language/Metadata/before_typedef_t01: RuntimeError
@@ -342,12 +761,7 @@
 Language/Statements/Assert/execution_t03: RuntimeError
 Language/Statements/Assert/execution_t09: RuntimeError
 Language/Statements/Assert/execution_t11: RuntimeError
-Language/Statements/Do/execution_t06: RuntimeError
-Language/Statements/For/For_Loop/execution_t11: RuntimeError
 Language/Statements/For/For_in/execution_t02: RuntimeError
-Language/Statements/If/condition_evaluation_t02: RuntimeError
-Language/Statements/If/condition_evaluation_t03: RuntimeError
-Language/Statements/While/execution_t02: RuntimeError
 Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t08: RuntimeError
 Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t09: RuntimeError
 Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t10: RuntimeError
@@ -374,10 +788,13 @@
 Language/Types/Interface_Types/subtype_t23: RuntimeError
 Language/Types/Interface_Types/subtype_t26: RuntimeError
 Language/Types/Type_Declarations/Typedef/dynamic_param_type_t02: RuntimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t08: DartkCrash
-Language/Types/Type_Declarations/Typedef/self_reference_t09: DartkCrash
 Language/Variables/constant_initialization_t03: RuntimeError
 Language/Variables/constant_variable_t09: RuntimeError
+LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
+LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_named_extends_Future_neg_assign_l1_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t21: MissingCompileTimeError
+LanguageFeatures/Super_Mixins/mixin_application_neg_t01/none: CompileTimeError
 LibTest/async/Future/asStream_A01_t02: RuntimeError
 LibTest/async/Stream/Stream.fromFutures_A04_t02: RuntimeError
 LibTest/async/Stream/Stream.fromFutures_A04_t03: RuntimeError
@@ -420,37 +837,18 @@
 LibTest/collection/IterableMixin/single_A01_t02: RuntimeError
 LibTest/collection/IterableMixin/skipWhile_A03_t01: RuntimeError
 LibTest/collection/IterableMixin/skipWhile_A04_t01: RuntimeError
+LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: RuntimeError
 LibTest/collection/LinkedList/addAll_A01_t02: RuntimeError
-LibTest/collection/LinkedList/add_A01_t01: RuntimeError
-LibTest/collection/LinkedList/forEach_A01_t01: RuntimeError
 LibTest/collection/LinkedList/join_A01_t01: RuntimeError
-LibTest/collection/LinkedList/map_A01_t01: RuntimeError
-LibTest/collection/LinkedList/map_A02_t01: RuntimeError
-LibTest/collection/LinkedList/map_A03_t01: RuntimeError
-LibTest/collection/LinkedList/reduce_A01_t01: RuntimeError
-LibTest/collection/LinkedList/reduce_A02_t01: RuntimeError
-LibTest/collection/LinkedList/reduce_A03_t01: RuntimeError
-LibTest/collection/LinkedList/reduce_A04_t01: RuntimeError
 LibTest/collection/LinkedList/remove_A01_t03: RuntimeError
-LibTest/collection/LinkedList/singleWhere_A01_t01: RuntimeError
-LibTest/collection/LinkedList/singleWhere_A02_t01: RuntimeError
-LibTest/collection/LinkedList/singleWhere_A02_t02: RuntimeError
-LibTest/collection/LinkedList/skipWhile_A01_t01: RuntimeError
-LibTest/collection/LinkedList/skipWhile_A03_t01: RuntimeError
-LibTest/collection/LinkedList/skipWhile_A04_t01: RuntimeError
-LibTest/collection/LinkedList/skipWhile_A05_t01: RuntimeError
-LibTest/collection/LinkedList/takeWhile_A01_t01: RuntimeError
-LibTest/collection/LinkedList/takeWhile_A01_t02: RuntimeError
-LibTest/collection/LinkedList/takeWhile_A02_t01: RuntimeError
-LibTest/collection/LinkedList/takeWhile_A03_t01: RuntimeError
-LibTest/collection/LinkedList/take_A01_t01: RuntimeError
-LibTest/collection/LinkedList/take_A02_t01: RuntimeError
-LibTest/collection/LinkedList/take_A03_t01: RuntimeError
 LibTest/collection/LinkedList/toString_A03_t01: RuntimeError
-LibTest/collection/LinkedList/where_A01_t01: RuntimeError
-LibTest/collection/LinkedList/where_A02_t01: RuntimeError
+LibTest/collection/LinkedListEntry/insertAfter_A01_t02: RuntimeError
+LibTest/collection/LinkedListEntry/list_A01_t01: RuntimeError
+LibTest/collection/LinkedListEntry/unlink_A01_t03: RuntimeError
+LibTest/collection/LinkedListEntry/unlink_A02_t02: RuntimeError
 LibTest/collection/ListQueue/ListQueue.from_A01_t01: RuntimeError
 LibTest/collection/Queue/Queue.from_A01_t01: RuntimeError
+LibTest/collection/SetBase/SetBase_class_A01_t01: RuntimeError
 LibTest/convert/ByteConversionSink/ByteConversionSink.from_A01_t01: RuntimeError
 LibTest/convert/ByteConversionSink/ByteConversionSink_class_A01_t01: RuntimeError
 LibTest/convert/LineSplitter/fuse_A01_t01: RuntimeError
@@ -470,6 +868,7 @@
 LibTest/core/Expando/operator_square_brackets_A01_t03: RuntimeError
 LibTest/core/Expando/operator_square_brackets_A01_t04: RuntimeError
 LibTest/core/Expando/operator_square_brackets_A01_t05: RuntimeError
+LibTest/core/List/List_class_A01_t01: RuntimeError
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError
 LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: RuntimeError
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError
@@ -537,9 +936,6 @@
 LibTest/io/Directory/rename_A02_t01: RuntimeError
 LibTest/io/Directory/statSync_A01_t05: RuntimeError
 LibTest/io/Directory/stat_A01_t05: RuntimeError
-LibTest/io/Directory/watch_A01_t01: RuntimeError
-LibTest/io/Directory/watch_A01_t02: RuntimeError
-LibTest/io/Directory/watch_A02_t01: RuntimeError
 LibTest/io/File/absolute_A01_t01: RuntimeError
 LibTest/io/File/openRead_A01_t04: RuntimeError
 LibTest/io/File/openRead_A02_t01: RuntimeError
@@ -552,54 +948,20 @@
 LibTest/io/FileStat/modeString_A01_t01: RuntimeError
 LibTest/io/FileStat/mode_A01_t01: RuntimeError
 LibTest/io/FileStat/modified_A01_t01: RuntimeError
-LibTest/io/FileSystemCreateEvent/isDirectory_A01_t01: RuntimeError
-LibTest/io/FileSystemCreateEvent/isDirectory_A01_t02: RuntimeError
-LibTest/io/FileSystemCreateEvent/isDirectory_A01_t03: RuntimeError
-LibTest/io/FileSystemCreateEvent/isDirectory_A01_t04: RuntimeError
-LibTest/io/FileSystemCreateEvent/isDirectory_A01_t05: RuntimeError
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t05: Fail
 LibTest/io/FileSystemCreateEvent/isDirectory_A01_t06: RuntimeError
-LibTest/io/FileSystemCreateEvent/path_A01_t01: RuntimeError
-LibTest/io/FileSystemCreateEvent/path_A01_t02: RuntimeError
-LibTest/io/FileSystemCreateEvent/path_A01_t03: RuntimeError
-LibTest/io/FileSystemCreateEvent/type_A01_t01: RuntimeError
-LibTest/io/FileSystemCreateEvent/type_A01_t02: RuntimeError
-LibTest/io/FileSystemCreateEvent/type_A01_t03: RuntimeError
-LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t01: RuntimeError
-LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t02: RuntimeError
-LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t03: RuntimeError
-LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t04: RuntimeError
-LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t05: RuntimeError
+LibTest/io/FileSystemCreateEvent/path_A01_t02: RuntimeError, Fail, Pass
+LibTest/io/FileSystemCreateEvent/path_A01_t03: RuntimeError, Fail, Pass
 LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t06: RuntimeError
-LibTest/io/FileSystemDeleteEvent/path_A01_t01: RuntimeError
-LibTest/io/FileSystemDeleteEvent/path_A01_t02: RuntimeError
-LibTest/io/FileSystemDeleteEvent/path_A01_t03: RuntimeError
-LibTest/io/FileSystemDeleteEvent/type_A01_t01: RuntimeError
-LibTest/io/FileSystemDeleteEvent/type_A01_t02: RuntimeError
-LibTest/io/FileSystemDeleteEvent/type_A01_t03: RuntimeError
 LibTest/io/FileSystemEntity/isDirectorySync_A01_t03: RuntimeError
 LibTest/io/FileSystemEntity/isDirectory_A01_t03: RuntimeError
 LibTest/io/FileSystemEntity/isFileSync_A01_t03: RuntimeError
 LibTest/io/FileSystemEntity/isFile_A01_t01: RuntimeError
 LibTest/io/FileSystemEntity/isFile_A01_t03: RuntimeError
 LibTest/io/FileSystemModifyEvent/contentChanged_A01_t01: RuntimeError
-LibTest/io/FileSystemModifyEvent/isDirectory_A01_t01: RuntimeError
 LibTest/io/FileSystemModifyEvent/isDirectory_A01_t02: RuntimeError
 LibTest/io/FileSystemModifyEvent/path_A01_t01: RuntimeError
-LibTest/io/FileSystemModifyEvent/path_A01_t02: RuntimeError
-LibTest/io/FileSystemModifyEvent/type_A01_t01: RuntimeError
 LibTest/io/FileSystemModifyEvent/type_A01_t02: RuntimeError
-LibTest/io/FileSystemMoveEvent/destination_A01_t01: RuntimeError
-LibTest/io/FileSystemMoveEvent/destination_A01_t02: RuntimeError
-LibTest/io/FileSystemMoveEvent/destination_A01_t03: RuntimeError
-LibTest/io/FileSystemMoveEvent/isDirectory_A01_t01: RuntimeError
-LibTest/io/FileSystemMoveEvent/isDirectory_A01_t02: RuntimeError
-LibTest/io/FileSystemMoveEvent/isDirectory_A01_t03: RuntimeError
-LibTest/io/FileSystemMoveEvent/path_A01_t01: RuntimeError
-LibTest/io/FileSystemMoveEvent/path_A01_t02: RuntimeError
-LibTest/io/FileSystemMoveEvent/path_A01_t03: RuntimeError
-LibTest/io/FileSystemMoveEvent/type_A01_t01: RuntimeError
-LibTest/io/FileSystemMoveEvent/type_A01_t02: RuntimeError
-LibTest/io/FileSystemMoveEvent/type_A01_t03: RuntimeError
 LibTest/io/HttpClient/addCredentials_A03_t01: RuntimeError
 LibTest/io/HttpClient/addProxyCredentials_A03_t01: RuntimeError
 LibTest/io/HttpClient/authenticateProxy_A01_t01: RuntimeError
@@ -608,9 +970,6 @@
 LibTest/io/HttpClient/authenticate_A01_t01: RuntimeError
 LibTest/io/HttpClient/authenticate_A01_t02: RuntimeError
 LibTest/io/HttpClient/authenticate_A02_t01: RuntimeError
-LibTest/io/HttpClient/autoUncompress_A02_t01: RuntimeError
-LibTest/io/HttpClient/autoUncompress_A04_t01: RuntimeError
-LibTest/io/HttpClient/autoUncompress_A04_t03: RuntimeError
 LibTest/io/HttpClient/close_A01_t01: RuntimeError
 LibTest/io/HttpClient/findProxy_A01_t01: RuntimeError
 LibTest/io/HttpClient/findProxy_A01_t02: RuntimeError
@@ -620,11 +979,12 @@
 LibTest/io/HttpClient/findProxy_A03_t02: RuntimeError
 LibTest/io/HttpClientBasicCredentials/HttpClientBasicCredentials_A01_t01: RuntimeError
 LibTest/io/HttpClientDigestCredentials/HttpClientDigestCredentials_A01_t01: RuntimeError
+LibTest/io/HttpClientRequest/addStream_A02_t02: RuntimeError
+LibTest/io/HttpClientRequest/add_A03_t01: RuntimeError
 LibTest/io/HttpClientRequest/close_A02_t01: RuntimeError
 LibTest/io/HttpClientRequest/done_A02_t01: RuntimeError
 LibTest/io/HttpClientResponse/certificate_A01_t01: RuntimeError
 LibTest/io/HttpClientResponse/isRedirect_A01_t02: RuntimeError
-LibTest/io/HttpServer/autoCompress_A02_t01: RuntimeError
 LibTest/io/HttpServer/bind_A02_t03: RuntimeError
 LibTest/io/HttpServer/bind_A03_t01: RuntimeError
 LibTest/io/HttpServer/bind_A03_t02: RuntimeError
@@ -684,58 +1044,20 @@
 LibTest/io/Process/stderr_A01_t01: RuntimeError
 LibTest/io/Process/stdin_A01_t01: RuntimeError
 LibTest/io/Process/stdout_A01_t01: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A01_t01: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A01_t02: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A02_t01: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A02_t02: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A02_t03: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A02_t04: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A03_t01: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A03_t02: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A03_t03: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A04_t01: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A04_t02: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A04_t03: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A04_t04: RuntimeError
-LibTest/io/RandomAccessFile/lockSync_A05_t01: RuntimeError
-LibTest/io/RandomAccessFile/lock_A01_t02: RuntimeError
-LibTest/io/RandomAccessFile/lock_A01_t03: RuntimeError
-LibTest/io/RandomAccessFile/lock_A01_t04: RuntimeError
-LibTest/io/RandomAccessFile/lock_A02_t01: RuntimeError
-LibTest/io/RandomAccessFile/lock_A02_t02: RuntimeError
-LibTest/io/RandomAccessFile/lock_A02_t03: RuntimeError
-LibTest/io/RandomAccessFile/lock_A03_t01: RuntimeError
-LibTest/io/RandomAccessFile/lock_A03_t02: RuntimeError
-LibTest/io/RandomAccessFile/lock_A03_t03: RuntimeError
-LibTest/io/RandomAccessFile/lock_A04_t01: RuntimeError
-LibTest/io/RandomAccessFile/lock_A04_t02: RuntimeError
-LibTest/io/RandomAccessFile/lock_A04_t03: RuntimeError
-LibTest/io/RandomAccessFile/lock_A04_t04: RuntimeError
-LibTest/io/RandomAccessFile/lock_A05_t01: RuntimeError
-LibTest/io/RandomAccessFile/lock_A05_t02: RuntimeError
-LibTest/io/RandomAccessFile/unlockSync_A01_t01: RuntimeError
-LibTest/io/RandomAccessFile/unlockSync_A01_t02: RuntimeError
-LibTest/io/RandomAccessFile/unlockSync_A01_t03: RuntimeError
-LibTest/io/RandomAccessFile/unlockSync_A02_t01: RuntimeError
-LibTest/io/RandomAccessFile/unlock_A01_t02: RuntimeError
-LibTest/io/RandomAccessFile/unlock_A01_t03: RuntimeError
-LibTest/io/RandomAccessFile/unlock_A01_t04: RuntimeError
-LibTest/io/RandomAccessFile/unlock_A02_t01: RuntimeError
-LibTest/io/RawDatagramSocket/any_A01_t01: RuntimeError
-LibTest/io/RawDatagramSocket/any_A01_t04: Timeout
+LibTest/io/ProcessResult/pid_A01_t01: RuntimeError
+LibTest/io/RawDatagramSocket/any_A01_t01: RuntimeError, Pass
 LibTest/io/RawDatagramSocket/any_A01_t05: Timeout
 LibTest/io/RawDatagramSocket/any_A01_t06: Timeout
 LibTest/io/RawDatagramSocket/any_A01_t07: Timeout
 LibTest/io/RawDatagramSocket/any_A01_t08: Timeout
+LibTest/io/RawDatagramSocket/asBroadcastStream_A03_t01: Timeout, Pass
+LibTest/io/RawDatagramSocket/join_A02_t01: RuntimeError
 LibTest/io/RawDatagramSocket/multicastInterface_A01_t01: RuntimeError
 LibTest/io/RawDatagramSocket/receive_A02_t02: RuntimeError
 LibTest/io/Stdin/echoMode_A01_t01: RuntimeError
 LibTest/io/Stdin/echoMode_A01_t02: RuntimeError
 LibTest/io/Stdin/lineMode_A01_t01: RuntimeError
 LibTest/io/Stdin/lineMode_A01_t02: RuntimeError
-LibTest/io/Stdin/readByteSync_A01_t02: RuntimeError
-LibTest/io/Stdin/readByteSync_A02_t01: RuntimeError
-LibTest/io/Stdin/supportsAnsiEscapes_A02_t01: RuntimeError
 LibTest/io/Stdout/Stdout_class_A02_t01: RuntimeError
 LibTest/io/Stdout/Stdout_class_A03_t01: RuntimeError
 LibTest/io/Stdout/addError_A02_t01: RuntimeError
@@ -748,24 +1070,17 @@
 LibTest/io/Stdout/close_A02_t02: RuntimeError
 LibTest/io/Stdout/flush_A01_t01: RuntimeError
 LibTest/io/Stdout/flush_A02_t01: RuntimeError
-LibTest/io/Stdout/supportsAnsiEscapes_A02_t01: RuntimeError
-LibTest/io/Stdout/writeAll_A02_t05: RuntimeError
-LibTest/io/Stdout/writeCharCode_A01_t03: RuntimeError
+LibTest/io/Stdout/nonBlocking_A01_t01: RuntimeError
 LibTest/io/SystemEncoding/name_A01_t01: RuntimeError
 LibTest/io/WebSocket/isEmpty_A01_t01: RuntimeError
 LibTest/io/WebSocketTransformer/bind_A01_t01: RuntimeError
 LibTest/io/ZLibDecoder/fuse_A01_t01: RuntimeError
 LibTest/io/ZLibEncoder/fuse_A01_t01: RuntimeError
 LibTest/isolate/Isolate/addOnExitListener_A04_t01: RuntimeError
-LibTest/isolate/Isolate/ping_A03_t02: RuntimeError
 LibTest/isolate/Isolate/ping_A04_t01: RuntimeError
-LibTest/isolate/Isolate/spawnUri_A05_t04: RuntimeError
-LibTest/isolate/Isolate/spawn_A04_t04: RuntimeError
-LibTest/isolate/ReceivePort/any_A01_t01: RuntimeError
-LibTest/isolate/ReceivePort/every_A01_t01: RuntimeError
-LibTest/isolate/ReceivePort/firstWhere_A03_t02: RuntimeError
-LibTest/isolate/ReceivePort/lastWhere_A04_t01: RuntimeError
-LibTest/isolate/ReceivePort/singleWhere_A02_t01: RuntimeError
+LibTest/isolate/Isolate/spawnUri_A05_t04: RuntimeError, Pass
+LibTest/isolate/Isolate/spawn_A04_t04: RuntimeError, Pass
+LibTest/isolate/ReceivePort/lastWhere_A01_t01: RuntimeError
 LibTest/isolate/ReceivePort/transform_A01_t02: RuntimeError
 LibTest/isolate/SendPort/send_A01_t02: Crash
 LibTest/isolate/SendPort/send_A01_t03: Crash
@@ -794,33 +1109,21 @@
 LibTest/typed_data/Float32List/last_A01_t02: RuntimeError
 LibTest/typed_data/Float32x4List/any_A01_t01: RuntimeError
 LibTest/typed_data/Float32x4List/every_A01_t01: RuntimeError
-LibTest/typed_data/Float32x4List/first_A01_t02: RuntimeError
-LibTest/typed_data/Float32x4List/last_A01_t02: RuntimeError
 LibTest/typed_data/Float32x4List/shuffle_A01_t01: RuntimeError
 LibTest/typed_data/Float64List/any_A01_t01: RuntimeError
 LibTest/typed_data/Float64List/every_A01_t01: RuntimeError
-LibTest/typed_data/Float64List/first_A01_t02: RuntimeError
-LibTest/typed_data/Float64List/last_A01_t02: RuntimeError
-LibTest/typed_data/Float64x2List/first_A01_t02: RuntimeError
-LibTest/typed_data/Float64x2List/last_A01_t02: RuntimeError
 LibTest/typed_data/Float64x2List/shuffle_A01_t01: RuntimeError
 LibTest/typed_data/Float64x2List/sort_A01_t01: RuntimeError
 LibTest/typed_data/Int16List/any_A01_t01: RuntimeError
 LibTest/typed_data/Int16List/every_A01_t01: RuntimeError
-LibTest/typed_data/Int16List/first_A01_t02: RuntimeError
-LibTest/typed_data/Int16List/last_A01_t02: RuntimeError
 LibTest/typed_data/Int32List/any_A01_t01: RuntimeError
 LibTest/typed_data/Int32List/every_A01_t01: RuntimeError
-LibTest/typed_data/Int32List/first_A01_t02: RuntimeError
-LibTest/typed_data/Int32List/last_A01_t02: RuntimeError
 LibTest/typed_data/Int32x4List/Int32x4List.fromList_A01_t01: RuntimeError
 LibTest/typed_data/Int32x4List/Int32x4List.fromList_A01_t02: RuntimeError
 LibTest/typed_data/Int32x4List/Int32x4List.view_A01_t01: RuntimeError
 LibTest/typed_data/Int32x4List/clear_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/first_A01_t02: RuntimeError
 LibTest/typed_data/Int32x4List/fold_A01_t01: RuntimeError
 LibTest/typed_data/Int32x4List/forEach_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/last_A01_t02: RuntimeError
 LibTest/typed_data/Int32x4List/lengthInBytes_A01_t01: RuntimeError
 LibTest/typed_data/Int32x4List/length_A01_t01: RuntimeError
 LibTest/typed_data/Int32x4List/offsetInBytes_A01_t01: RuntimeError
@@ -832,30 +1135,17 @@
 LibTest/typed_data/Int32x4List/take_A02_t01: RuntimeError
 LibTest/typed_data/Int64List/any_A01_t01: RuntimeError
 LibTest/typed_data/Int64List/every_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/first_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/last_A01_t02: RuntimeError
 LibTest/typed_data/Int8List/any_A01_t01: RuntimeError
 LibTest/typed_data/Int8List/every_A01_t01: RuntimeError
-LibTest/typed_data/Int8List/first_A01_t02: RuntimeError
-LibTest/typed_data/Int8List/last_A01_t02: RuntimeError
 LibTest/typed_data/Uint16List/any_A01_t01: RuntimeError
 LibTest/typed_data/Uint16List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint16List/first_A01_t02: RuntimeError
-LibTest/typed_data/Uint16List/last_A01_t02: RuntimeError
 LibTest/typed_data/Uint32List/any_A01_t01: RuntimeError
 LibTest/typed_data/Uint32List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint32List/first_A01_t02: RuntimeError
-LibTest/typed_data/Uint32List/last_A01_t02: RuntimeError
 LibTest/typed_data/Uint64List/any_A01_t01: RuntimeError
 LibTest/typed_data/Uint64List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/first_A01_t02: RuntimeError
 LibTest/typed_data/Uint64List/last_A01_t02: RuntimeError
 LibTest/typed_data/Uint8ClampedList/any_A01_t01: RuntimeError
 LibTest/typed_data/Uint8ClampedList/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint8ClampedList/first_A01_t02: RuntimeError
-LibTest/typed_data/Uint8ClampedList/last_A01_t02: RuntimeError
 LibTest/typed_data/Uint8List/any_A01_t01: RuntimeError
 LibTest/typed_data/Uint8List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint8List/first_A01_t02: RuntimeError
-LibTest/typed_data/Uint8List/last_A01_t02: RuntimeError
 Utils/tests/Expect/throws_A01_t04: RuntimeError
diff --git a/tests/co19_2/co19_2-runtime.status b/tests/co19_2/co19_2-runtime.status
index 7e3177d..3de7200 100644
--- a/tests/co19_2/co19_2-runtime.status
+++ b/tests/co19_2/co19_2-runtime.status
@@ -2,7 +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.
 
-[ $compiler != dart2js && $runtime != none && !$checked ]
+[ $runtime != none ]
+LibTest/core/Uri/hasEmptyPath_A01_t01: RuntimeError
+LibTest/core/Uri/parse_A05_t01: RuntimeError
+
+[ $compiler != dart2js && $runtime != none && $runtime != vm && !$checked ]
 LibTest/async/Future/catchError_A03_t05: RuntimeError
 
 [ $compiler == fasta || $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
diff --git a/tests/compiler/dart2js/analyses/analysis_helper.dart b/tests/compiler/dart2js/analyses/analysis_helper.dart
index 3c16c3b..76f4a89 100644
--- a/tests/compiler/dart2js/analyses/analysis_helper.dart
+++ b/tests/compiler/dart2js/analyses/analysis_helper.dart
@@ -37,8 +37,6 @@
   });
 }
 
-// TODO(johnniwinther): Handle dynamic access of Object properties/methods
-// separately.
 class DynamicVisitor extends StaticTypeTraversalVisitor {
   final DiagnosticReporter reporter;
   final ir.Component component;
@@ -228,9 +226,10 @@
 
   @override
   ir.DartType visitPropertyGet(ir.PropertyGet node) {
-    ir.DartType type = visitNode(node.receiver);
-    ir.DartType result = computePropertyGetType(node, type);
-    if (type is ir.DynamicType) {
+    ir.DartType receiverType = visitNode(node.receiver);
+    ir.DartType result = computePropertyGetType(node, receiverType);
+    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
+    if (receiverType is ir.DynamicType) {
       reportError(node, "Dynamic access of '${node.name}'.");
     }
     return result;
@@ -238,9 +237,10 @@
 
   @override
   ir.DartType visitPropertySet(ir.PropertySet node) {
-    ir.DartType type = visitNode(node.receiver);
+    ir.DartType receiverType = visitNode(node.receiver);
     ir.DartType result = visitNode(node.value);
-    if (type is ir.DynamicType) {
+    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
+    if (receiverType is ir.DynamicType) {
       reportError(node, "Dynamic update to '${node.name}'.");
     }
     return result;
@@ -248,17 +248,14 @@
 
   @override
   ir.DartType visitMethodInvocation(ir.MethodInvocation node) {
-    ir.DartType type = visitNode(node.receiver);
-    ir.DartType result = computeMethodInvocationType(node, type);
+    ir.DartType receiverType = visitNode(node.receiver);
+    ir.DartType result = computeMethodInvocationType(node, receiverType);
     if (!isSpecialCasedBinaryOperator(node.interfaceTarget)) {
       visitNodes(node.arguments.positional);
       visitNodes(node.arguments.named);
     }
-    if (node.name.name == '==' &&
-        node.arguments.positional.single is ir.NullLiteral) {
-      return result;
-    }
-    if (type is ir.DynamicType) {
+    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
+    if (receiverType is ir.DynamicType) {
       reportError(node, "Dynamic invocation of '${node.name}'.");
     }
     return result;
diff --git a/tests/compiler/dart2js/analyses/api_allowed.json b/tests/compiler/dart2js/analyses/api_allowed.json
index 75f95cb..322c7d9 100644
--- a/tests/compiler/dart2js/analyses/api_allowed.json
+++ b/tests/compiler/dart2js/analyses/api_allowed.json
@@ -1,7 +1,4 @@
 {
-  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/interceptors.dart": {
-    "Dynamic invocation of 'toString'.": 1
-  },
   "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_number.dart": {
     "Dynamic invocation of '[]'.": 5,
     "Dynamic invocation of '<'.": 4,
@@ -19,20 +16,13 @@
     "Dynamic invocation of '<'.": 6,
     "Dynamic invocation of '>'.": 4,
     "Dynamic invocation of '+'.": 1,
-    "Dynamic invocation of 'noSuchMethod'.": 1,
     "Dynamic access of '_js_helper::_self'.": 1,
     "Dynamic access of '_js_helper::_target'.": 1,
     "Dynamic access of '_js_helper::_receiver'.": 1,
-    "Dynamic invocation of '=='.": 1,
-    "Dynamic access of 'hashCode'.": 2,
-    "Dynamic invocation of 'toString'.": 2,
     "Dynamic access of 'length'.": 3,
     "Dynamic invocation of '>='.": 1,
     "Dynamic invocation of 'substring'.": 1
   },
-  "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/constant_map.dart": {
-    "Dynamic invocation of '=='.": 1
-  },
   "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/string_helper.dart": {
     "Dynamic invocation of '<'.": 1,
     "Dynamic invocation of '+'.": 1,
@@ -43,7 +33,6 @@
     "Dynamic invocation of '_js_helper::_execGlobal'.": 1,
     "Dynamic access of 'start'.": 1,
     "Dynamic access of 'end'.": 1,
-    "Dynamic invocation of '=='.": 1,
     "Dynamic access of 'length'.": 4,
     "Dynamic invocation of '[]'.": 2,
     "Dynamic invocation of 'call'.": 13,
@@ -52,8 +41,6 @@
     "Dynamic invocation of 'replaceRange'.": 2
   },
   "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart": {
-    "Dynamic access of 'hashCode'.": 1,
-    "Dynamic invocation of '=='.": 2,
     "Dynamic access of '_js_helper::_length'.": 2,
     "Dynamic access of '_js_helper::_modifications'.": 4,
     "Dynamic invocation of 'containsKey'.": 1,
@@ -64,7 +51,6 @@
     "Dynamic invocation of '-'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/native_helper.dart": {
-    "Dynamic invocation of '=='.": 6,
     "Dynamic access of 'length'.": 2,
     "Dynamic invocation of '[]'.": 1
   },
@@ -93,8 +79,6 @@
     "Dynamic invocation of 'call'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/collection_patch.dart": {
-    "Dynamic access of 'hashCode'.": 3,
-    "Dynamic invocation of '=='.": 4,
     "Dynamic access of 'dart.collection::_length'.": 2,
     "Dynamic invocation of 'dart.collection::_computeKeys'.": 2,
     "Dynamic invocation of 'containsKey'.": 2,
@@ -107,20 +91,12 @@
     "Dynamic access of 'dart.collection::_element'.": 1,
     "Dynamic access of 'dart.collection::_first'.": 1
   },
-  "org-dartlang-sdk:///sdk/lib/collection/splay_tree.dart": {
-    "Dynamic invocation of '=='.": 1
-  },
-  "org-dartlang-sdk:///sdk/lib/collection/hash_map.dart": {
-    "Dynamic invocation of '=='.": 1,
-    "Dynamic access of 'hashCode'.": 1
-  },
   "org-dartlang-sdk:///sdk/lib/collection/iterable.dart": {
     "Dynamic access of 'length'.": 2,
     "Dynamic invocation of '+'.": 2
   },
   "org-dartlang-sdk:///sdk/lib/html/dart2js/html_dart2js.dart": {
     "Dynamic access of 'style'.": 1,
-    "Dynamic invocation of '=='.": 4,
     "Dynamic access of 'left'.": 3,
     "Dynamic access of 'top'.": 3,
     "Dynamic access of 'width'.": 2,
@@ -138,7 +114,6 @@
     "Dynamic invocation of 'dart.dom.html::_initKeyboardEvent'.": 1,
     "Dynamic access of 'attributes'.": 1,
     "Dynamic invocation of '[]'.": 1,
-    "Dynamic invocation of 'toString'.": 1,
     "Dynamic invocation of 'toLowerCase'.": 1,
     "Dynamic invocation of 'attached'.": 1,
     "Dynamic invocation of 'detached'.": 1,
@@ -153,23 +128,18 @@
   "org-dartlang-sdk:///sdk/lib/html/html_common/filtered_element_list.dart": {
     "Dynamic invocation of 'remove'.": 1
   },
-  "org-dartlang-sdk:///sdk/lib/html/html_common/lists.dart": {
-    "Dynamic invocation of '=='.": 2
-  },
   "org-dartlang-sdk:///sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart": {
     "Dynamic access of 'onUpgradeNeeded'.": 1,
     "Dynamic invocation of 'listen'.": 2,
     "Dynamic access of 'onBlocked'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/io/directory_impl.dart": {
-    "Dynamic invocation of '=='.": 5,
     "Dynamic invocation of '[]'.": 10
   },
   "org-dartlang-sdk:///sdk/lib/io/file_impl.dart": {
     "Dynamic invocation of 'cancel'.": 1,
     "Dynamic invocation of 'pause'.": 1,
     "Dynamic invocation of 'resume'.": 1,
-    "Dynamic invocation of '=='.": 2,
     "Dynamic invocation of '[]'.": 4,
     "Dynamic access of 'length'.": 2
   },
@@ -177,7 +147,6 @@
     "Dynamic invocation of '[]'.": 7
   },
   "org-dartlang-sdk:///sdk/lib/io/io_resource_info.dart": {
-    "Dynamic invocation of '=='.": 2,
     "Dynamic invocation of 'containsKey'.": 1,
     "Dynamic invocation of '[]'.": 1,
     "Dynamic access of 'path'.": 1,
@@ -196,7 +165,6 @@
     "Dynamic access of 'name'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/io/link.dart": {
-    "Dynamic invocation of '=='.": 1,
     "Dynamic invocation of '[]'.": 3
   },
   "org-dartlang-sdk:///sdk/lib/io/platform_impl.dart": {
@@ -216,7 +184,6 @@
     "Dynamic access of 'host'.": 1,
     "Dynamic update to 'dart.io::_owner'.": 1,
     "Dynamic access of 'length'.": 1,
-    "Dynamic invocation of '=='.": 1,
     "Dynamic invocation of '~/'.": 1,
     "Dynamic invocation of '+'.": 2,
     "Dynamic invocation of '-'.": 7
@@ -225,11 +192,9 @@
     "Dynamic invocation of 'writeFromSync'.": 1,
     "Dynamic invocation of 'cancel'.": 1,
     "Dynamic invocation of 'closeSync'.": 1,
-    "Dynamic access of 'dart.io::_stream'.": 1,
-    "Dynamic invocation of '=='.": 3
+    "Dynamic access of 'dart.io::_stream'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/io/common.dart": {
-    "Dynamic invocation of '=='.": 1,
     "Dynamic invocation of '[]'.": 3
   },
   "org-dartlang-sdk:///sdk/lib/js/dart2js/js_dart2js.dart": {
@@ -252,7 +217,6 @@
     "Dynamic invocation of 'dart.core::_absXorSetSign'.": 1,
     "Dynamic invocation of '[]='.": 2,
     "Dynamic invocation of '&'.": 6,
-    "Dynamic invocation of '=='.": 16,
     "Dynamic invocation of '-'.": 1,
     "Dynamic invocation of '>='.": 1
   },
@@ -292,8 +256,7 @@
   "org-dartlang-sdk:///sdk/lib/core/uri.dart": {
     "Dynamic access of 'isEmpty'.": 1,
     "Dynamic invocation of 'startsWith'.": 1,
-    "Dynamic invocation of 'add'.": 1,
-    "Dynamic invocation of '=='.": 8
+    "Dynamic invocation of 'add'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/math/point.dart": {
     "Dynamic access of 'x'.": 1,
@@ -306,15 +269,10 @@
     "Dynamic access of 'bottom'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/convert_patch.dart": {
-    "Dynamic invocation of '=='.": 1,
     "Dynamic invocation of 'clear'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/convert/encoding.dart": {
-    "Dynamic invocation of 'write'.": 1,
-    "Dynamic invocation of 'toString'.": 1
-  },
-  "org-dartlang-sdk:///sdk/lib/convert/string_conversion.dart": {
-    "Dynamic invocation of 'toString'.": 3
+    "Dynamic invocation of 'write'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/convert/json.dart": {
     "Dynamic invocation of 'toJson'.": 1
@@ -332,11 +290,9 @@
     "Dynamic access of 'length'.": 3,
     "Dynamic invocation of '<'.": 1,
     "Dynamic invocation of '>='.": 2,
-    "Dynamic invocation of '[]'.": 7,
-    "Dynamic invocation of '=='.": 2
+    "Dynamic invocation of '[]'.": 7
   },
   "org-dartlang-sdk:///sdk/lib/_http/http_headers.dart": {
-    "Dynamic invocation of '=='.": 3,
     "Dynamic invocation of 'toLowerCase'.": 1,
     "Dynamic access of 'length'.": 1,
     "Dynamic invocation of 'codeUnitAt'.": 1
@@ -346,7 +302,6 @@
     "Dynamic invocation of 'split'.": 1,
     "Dynamic invocation of 'trim'.": 1,
     "Dynamic invocation of 'toLowerCase'.": 1,
-    "Dynamic invocation of '=='.": 1,
     "Dynamic invocation of 'call'.": 1,
     "Dynamic invocation of 'destroy'.": 2,
     "Dynamic invocation of 'setOption'.": 1,
@@ -359,9 +314,6 @@
     "Dynamic invocation of 'listen'.": 1,
     "Dynamic invocation of 'close'.": 1
   },
-  "org-dartlang-sdk:///sdk/lib/_http/http_parser.dart": {
-    "Dynamic invocation of '=='.": 4
-  },
   "org-dartlang-sdk:///sdk/lib/_http/websocket_impl.dart": {
     "Dynamic invocation of 'transform'.": 1,
     "Dynamic invocation of 'listen'.": 1,
diff --git a/tests/compiler/dart2js/analyses/dart2js_allowed.json b/tests/compiler/dart2js/analyses/dart2js_allowed.json
index 6796477..27f1199 100644
--- a/tests/compiler/dart2js/analyses/dart2js_allowed.json
+++ b/tests/compiler/dart2js/analyses/dart2js_allowed.json
@@ -1,7 +1,6 @@
 {
   "pkg/compiler/lib/src/dart2js.dart": {
     "Dynamic invocation of 'call'.": 1,
-    "Dynamic invocation of '=='.": 1,
     "Dynamic invocation of 'pause'.": 1,
     "Dynamic invocation of 'resume'.": 1
   },
@@ -9,16 +8,13 @@
     "Dynamic invocation of 'call'.": 3
   },
   "pkg/compiler/lib/src/util/util.dart": {
-    "Dynamic access of 'hashCode'.": 8,
     "Dynamic access of 'a'.": 1,
     "Dynamic access of 'b'.": 1,
     "Dynamic invocation of 'write'.": 11,
-    "Dynamic invocation of 'writeCharCode'.": 1,
-    "Dynamic invocation of '=='.": 1
+    "Dynamic invocation of 'writeCharCode'.": 1
   },
   "pkg/compiler/lib/src/util/maplet.dart": {
     "Dynamic access of 'isEmpty'.": 1,
-    "Dynamic invocation of '=='.": 9,
     "Dynamic access of 'length'.": 1,
     "Dynamic invocation of 'containsKey'.": 1,
     "Dynamic invocation of '[]'.": 11,
@@ -35,7 +31,6 @@
     "Dynamic access of 'iterator'.": 1,
     "Dynamic access of 'length'.": 1,
     "Dynamic access of 'isEmpty'.": 1,
-    "Dynamic invocation of '=='.": 10,
     "Dynamic invocation of 'contains'.": 1,
     "Dynamic invocation of '[]'.": 7,
     "Dynamic invocation of 'add'.": 1,
@@ -50,16 +45,8 @@
     "Dynamic invocation of 'toSet'.": 1,
     "Dynamic invocation of 'toList'.": 1
   },
-  "pkg/compiler/lib/src/common/tasks.dart": {
-    "Dynamic invocation of '=='.": 4
-  },
-  "pkg/compiler/lib/src/compiler.dart": {
-    "Dynamic invocation of 'toString'.": 1
-  },
   "pkg/compiler/lib/src/diagnostics/messages.dart": {
     "Dynamic access of 'template'.": 1,
-    "Dynamic invocation of 'toString'.": 1,
-    "Dynamic access of 'lexeme'.": 1,
     "Dynamic invocation of 'toDartText'.": 1
   },
   "pkg/compiler/lib/src/diagnostics/source_span.dart": {
@@ -123,7 +110,6 @@
     "Dynamic access of 'isMap'.": 1,
     "Dynamic access of 'forwardTo'.": 2,
     "Dynamic access of 'isDictionary'.": 1,
-    "Dynamic invocation of '=='.": 1,
     "Dynamic access of 'typeMap'.": 1,
     "Dynamic access of 'values'.": 1,
     "Dynamic invocation of 'union'.": 1,
@@ -135,7 +121,6 @@
     "Dynamic access of 'forwardTo'.": 1
   },
   "pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart": {
-    "Dynamic invocation of '=='.": 1,
     "Dynamic access of 'isUnion'.": 5,
     "Dynamic access of 'disjointMasks'.": 4,
     "Dynamic invocation of 'contains'.": 1,
@@ -150,9 +135,6 @@
     "Dynamic access of 'offset'.": 1,
     "Dynamic access of 'sourceName'.": 1
   },
-  "pkg/compiler/lib/src/js_model/js_strategy.dart": {
-    "Dynamic invocation of '=='.": 2
-  },
   "pkg/compiler/lib/src/ssa/nodes.dart": {
     "Dynamic invocation of 'replaceWith'.": 1
   },
@@ -168,8 +150,7 @@
     "Dynamic access of 'isRedirection'.": 1
   },
   "pkg/compiler/lib/src/constants/expressions.dart": {
-    "Dynamic access of 'kind'.": 1,
-    "Dynamic access of 'hashCode'.": 1
+    "Dynamic access of 'kind'.": 1
   },
   "pkg/compiler/lib/src/helpers/trace.dart": {
     "Dynamic access of 'index'.": 1,
@@ -178,9 +159,6 @@
     "Dynamic access of 'columnNo'.": 1,
     "Dynamic access of 'method'.": 1
   },
-  "pkg/compiler/lib/src/helpers/debug_collection.dart": {
-    "Dynamic access of 'runtimeType'.": 4
-  },
   "pkg/compiler/lib/src/helpers/expensive_map.dart": {
     "Dynamic access of 'length'.": 1,
     "Dynamic access of 'isEmpty'.": 1,
@@ -232,9 +210,7 @@
   "pkg/compiler/lib/src/constants/values.dart": {
     "Dynamic access of 'element'.": 1,
     "Dynamic access of 'type'.": 1,
-    "Dynamic access of 'length'.": 1,
-    "Dynamic invocation of '=='.": 1,
-    "Dynamic access of 'hashCode'.": 2
+    "Dynamic access of 'length'.": 1
   },
   "pkg/compiler/lib/src/elements/types.dart": {
     "Dynamic access of 'element'.": 1
@@ -242,8 +218,7 @@
   "pkg/compiler/lib/src/js_backend/constant_system_javascript.dart": {
     "Dynamic invocation of 'remainder'.": 1,
     "Dynamic access of 'isString'.": 1,
-    "Dynamic access of 'stringValue'.": 1,
-    "Dynamic invocation of '=='.": 1
+    "Dynamic access of 'stringValue'.": 1
   },
   "pkg/compiler/lib/src/universe/use.dart": {
     "Dynamic access of 'selector'.": 1,
@@ -259,22 +234,14 @@
     "Dynamic invocation of '[]'.": 13,
     "Dynamic invocation of 'forEach'.": 3,
     "Dynamic invocation of 'map'.": 2,
-    "Dynamic invocation of '=='.": 2,
     "Dynamic access of 'length'.": 1
   },
-  "pkg/compiler/lib/src/js/js.dart": {
-    "Dynamic invocation of '=='.": 1
-  },
   "pkg/compiler/lib/src/util/enumset.dart": {
     "Dynamic access of 'index'.": 4,
     "Dynamic access of 'value'.": 1
   },
   "pkg/compiler/lib/src/native/enqueue.dart": {
-    "Dynamic access of 'isDynamic'.": 1,
-    "Dynamic access of 'runtimeType'.": 1
-  },
-  "pkg/compiler/lib/src/js/rewrite_async.dart": {
-    "Dynamic invocation of '=='.": 1
+    "Dynamic access of 'isDynamic'.": 1
   },
   "pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart": {
     "Dynamic access of 'name'.": 1
@@ -282,7 +249,6 @@
   "pkg/compiler/lib/src/js_backend/namer_names.dart": {
     "Dynamic access of 'js_backend.namer::_target'.": 4,
     "Dynamic access of 'base'.": 1,
-    "Dynamic invocation of '=='.": 4,
     "Dynamic access of 'prefix'.": 1,
     "Dynamic access of 'js_backend.namer::_parts'.": 2,
     "Dynamic access of 'length'.": 1,
@@ -302,7 +268,6 @@
     "Dynamic invocation of 'addSuccessor'.": 1
   },
   "pkg/compiler/lib/src/ssa/types.dart": {
-    "Dynamic invocation of '=='.": 2,
     "Dynamic access of 'isVoid'.": 1,
     "Dynamic access of 'isDynamic'.": 1,
     "Dynamic access of 'treatAsDynamic'.": 1,
@@ -341,7 +306,6 @@
     "Dynamic access of 'superConstructorInvocation'.": 1,
     "Dynamic access of 'defaultValues'.": 2,
     "Dynamic access of 'fieldMap'.": 1,
-    "Dynamic invocation of '=='.": 1,
     "Dynamic access of 'thisConstructorInvocation'.": 1,
     "Dynamic access of 'targetConstructorInvocation'.": 1
   },
@@ -358,7 +322,6 @@
     "Dynamic access of 'instructionType'.": 2,
     "Dynamic access of 'isContainer'.": 2,
     "Dynamic access of 'isNullable'.": 1,
-    "Dynamic invocation of '=='.": 1,
     "Dynamic invocation of 'containsOnly'.": 2,
     "Dynamic invocation of 'containsOnlyString'.": 1
   },
@@ -379,12 +342,8 @@
     "Dynamic invocation of '<='.": 1,
     "Dynamic invocation of '>'.": 1,
     "Dynamic invocation of '>='.": 1,
-    "Dynamic invocation of '=='.": 1,
     "Dynamic invocation of 'codeUnitAt'.": 1
   },
-  "pkg/compiler/lib/src/native/js.dart": {
-    "Dynamic invocation of '=='.": 1
-  },
   "third_party/pkg/dart2js_info/lib/src/measurements.dart": {
     "Dynamic access of 'name'.": 1,
     "Dynamic invocation of 'call'.": 1
@@ -406,7 +365,6 @@
     "Dynamic invocation of 'toStatement'.": 3
   },
   "pkg/compiler/lib/src/inferrer/inferrer_engine.dart": {
-    "Dynamic invocation of '=='.": 7,
     "Dynamic access of 'isVoid'.": 1,
     "Dynamic access of 'isDynamic'.": 1,
     "Dynamic access of 'isInterfaceType'.": 1,
@@ -447,7 +405,6 @@
     "Dynamic access of 'left'.": 4,
     "Dynamic access of 'right'.": 4,
     "Dynamic access of 'lower'.": 1,
-    "Dynamic invocation of '=='.": 2,
     "Dynamic access of 'upper'.": 1,
     "Dynamic invocation of 'operation'.": 1
   },
@@ -459,16 +416,13 @@
     "Dynamic access of 'positional'.": 2,
     "Dynamic access of 'length'.": 2,
     "Dynamic access of 'named'.": 2,
-    "Dynamic invocation of '[]'.": 2,
-    "Dynamic invocation of '=='.": 1
+    "Dynamic invocation of '[]'.": 2
   },
   "pkg/compiler/lib/src/inferrer/type_graph_dump.dart": {
     "Dynamic invocation of 'contains'.": 2
   },
   "pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart": {
     "Dynamic access of 'scheme'.": 1,
-    "Dynamic invocation of '=='.": 1,
-    "Dynamic invocation of 'toString'.": 1,
     "Dynamic invocation of 'finalizeTokens'.": 1
   },
   "pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart": {
@@ -479,7 +433,6 @@
   },
   "pkg/compiler/lib/src/inferrer/node_tracer.dart": {
     "Dynamic access of 'receiver'.": 2,
-    "Dynamic invocation of '=='.": 2,
     "Dynamic access of 'selector'.": 6,
     "Dynamic access of 'name'.": 4,
     "Dynamic access of 'isIndex'.": 1
diff --git a/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart b/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
index f86c1f1..d31c169 100644
--- a/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
+++ b/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
@@ -66,7 +66,9 @@
 
           /// 01: ok
           r"""function() {
-  var __goto = 0, __completer = NewCompleter(CompleterType), closures, v0, v1, v2, v3;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    closures, v0, v1, v2, v3;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -102,7 +104,9 @@
   await foo();
 }""", """
 function(a) {
-  var __goto = 0, __completer = NewCompleter(CompleterType), __self = this;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    __self = this;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -147,7 +151,9 @@
     return 4;
   }""", """
 function(b) {
-  var __goto = 0, __completer = NewCompleter(CompleterType), __returnValue, __handler = 2, __currentError, __next = [], __helper;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    __returnValue, __handler = 2, __currentError, __next = [], __helper;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1) {
       __currentError = __result;
@@ -257,7 +263,9 @@
   f = --foo1()[await foo2()];
 }""", """
 function(c) {
-  var __goto = 0, __completer = NewCompleter(CompleterType), a, b, c, d, e, f, __temp1;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    a, b, c, d, e, f, __temp1;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -309,7 +317,9 @@
     h = foo1() && foo2();
   }""", """
 function(d2) {
-  var __goto = 0, __completer = NewCompleter(CompleterType), a, b, c, d, e, f, g, h, __temp1;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    a, b, c, d, e, f, g, h, __temp1;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -441,7 +451,8 @@
   }
 }""", """
 function(x, y) {
-  var __goto = 0, __completer = NewCompleter(CompleterType);
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType);
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -525,7 +536,9 @@
   }
   """, """
 function(f) {
-  var __goto = 0, __completer = NewCompleter(CompleterType), a;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    a;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -585,7 +598,9 @@
 }
 """, """
 function(g) {
-  var __goto = 0, __completer = NewCompleter(CompleterType), __returnValue, i, __temp1;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    __returnValue, i, __temp1;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -665,7 +680,9 @@
   }
   """, """
 function(a, h) {
-  var __goto = 0, __completer = NewCompleter(CompleterType), x, __temp1, __temp2;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    x, __temp1, __temp2;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -741,7 +758,9 @@
 }
 """, """
 function(c, i) {
-  var __goto = 0, __completer = NewCompleter(CompleterType), __handler = 1, __currentError, __next = [], x, y, __error, __error1;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    __handler = 1, __currentError, __next = [], x, y, __error, __error1;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1) {
       __currentError = __result;
@@ -851,7 +870,9 @@
   }
   """, """
 function(x, y, j) {
-  var __goto = 0, __completer = NewCompleter(CompleterType), __temp1, __temp2, __temp3;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    __temp1, __temp2, __temp3;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -929,7 +950,9 @@
   }
 }""", """
 function(x, y, k) {
-  var __goto = 0, __completer = NewCompleter(CompleterType), __returnValue, __temp1;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    __returnValue, __temp1;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -1052,7 +1075,8 @@
     }
   }""", """
 function(l) {
-  var __goto = 0, __completer = NewCompleter(CompleterType);
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType);
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -1099,7 +1123,9 @@
     print(exception);
   }""", """
 function(m) {
-  var __goto = 0, __completer = NewCompleter(CompleterType), __handler = 1, __currentError, __next = [], exception, __exception;
+  var __goto = 0,
+    __completer = NewCompleter(CompleterType),
+    __handler = 1, __currentError, __next = [], exception, __exception;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1) {
       __currentError = __result;
diff --git a/tests/compiler/dart2js/closure/closure_test.dart b/tests/compiler/dart2js/closure/closure_test.dart
index a74d20e..6f527ee 100644
--- a/tests/compiler/dart2js/closure/closure_test.dart
+++ b/tests/compiler/dart2js/closure/closure_test.dart
@@ -10,7 +10,6 @@
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/js_model/element_map.dart';
-import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
 import 'package:compiler/src/js_model/locals.dart';
 import 'package:compiler/src/universe/world_builder.dart';
diff --git a/tests/compiler/dart2js/codegen/pragma_annotations_test.dart b/tests/compiler/dart2js/codegen/pragma_annotations_test.dart
new file mode 100644
index 0000000..d2ae5aa
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/pragma_annotations_test.dart
@@ -0,0 +1,67 @@
+// 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:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/world.dart' show JClosedWorld;
+import '../helpers/memory_compiler.dart';
+
+const Map<String, String> MEMORY_SOURCE_FILES = const {
+  'main.dart': r"""
+int method(String arg) => arg.length;
+
+@pragma('dart2js:noInline')
+int methodNoInline(String arg) => arg.length;
+
+@pragma('dart2js:tryInline')
+int methodTryInline(String arg) {
+  return arg.length;
+}
+
+void main(List<String> args) {
+  print(method(args[0]));
+  print(method('bar'));
+  print(methodNoInline(args[0]));
+  print(methodNoInline('bar'));
+  print(methodTryInline(args[0]));
+  print(methodTryInline('bar'));
+}
+"""
+};
+
+main() {
+  asyncTest(() async {
+    await runTest();
+  });
+}
+
+runTest() async {
+  CompilationResult result =
+      await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
+  Compiler compiler = result.compiler;
+  JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+  Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
+
+  void test(String name,
+      {bool expectNoInline: false, bool expectTryInline: false}) {
+    LibraryEntity mainApp = closedWorld.elementEnvironment.mainLibrary;
+    FunctionEntity method =
+        closedWorld.elementEnvironment.lookupLibraryMember(mainApp, name);
+    Expect.isNotNull(method, "Cannot find method '$name'");
+    Expect.equals(
+        expectNoInline,
+        closedWorld.annotationsData.nonInlinableFunctions.contains(method),
+        "Unexpected annotation of 'noInline' on '$method'.");
+    Expect.equals(
+        expectTryInline,
+        closedWorld.annotationsData.tryInlineFunctions.contains(method),
+        "Unexpected annotation of 'tryInline' on '$method'.");
+  }
+
+  test('method');
+  test('methodNoInline', expectNoInline: true);
+  test('methodTryInline', expectTryInline: true);
+}
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index d510bbc..b39dc5f4f 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -25,7 +25,6 @@
 inference/swarm_test: Slow, Pass, Fail #
 inference/type_mask2_test: RuntimeError # Issue 34095
 inlining/inlining_test: Slow, Pass
-model/in_user_code_test: RuntimeError # Two libraries with the same name -- actually a CompileTimeError
 model/native_test: Pass, Slow
 model/no_such_method_enabled_test: Pass, Slow
 model/subtype_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 a47110f..da87f28 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -12,7 +12,6 @@
 import 'package:compiler/src/ir/util.dart';
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
-import 'package:compiler/src/kernel/element_map.dart';
 import 'package:expect/expect.dart';
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
diff --git a/tests/compiler/dart2js/end_to_end/user_crash_test.dart b/tests/compiler/dart2js/end_to_end/user_crash_test.dart
index 27ecab2..76d92cd 100644
--- a/tests/compiler/dart2js/end_to_end/user_crash_test.dart
+++ b/tests/compiler/dart2js/end_to_end/user_crash_test.dart
@@ -47,7 +47,7 @@
         templateCantReadFile.withArguments(entryPoint, EXCEPTION);
     List<String> expectedLines = [
       "Error: ${cantReadFile.message}",
-      "${entryPoint}:\nError: ${messageMissingMain.message}",
+      "Error: ${messageMissingMain.message}",
     ];
     test('Throw in input provider',
         await run(memorySourceFiles: new CrashingMap()),
diff --git a/tests/compiler/dart2js/helpers/type_test_helper.dart b/tests/compiler/dart2js/helpers/type_test_helper.dart
index 9576e09..c4304da 100644
--- a/tests/compiler/dart2js/helpers/type_test_helper.dart
+++ b/tests/compiler/dart2js/helpers/type_test_helper.dart
@@ -99,7 +99,7 @@
   DartType getElementType(String name) {
     dynamic element = getElement(name);
     if (element is FieldEntity) {
-      return (elementEnvironment as JElementEnvironment).getFieldType(element);
+      return elementEnvironment.getFieldType(element);
     } else if (element is FunctionEntity) {
       return elementEnvironment.getFunctionType(element);
     } else if (element is ClassEntity) {
@@ -131,7 +131,7 @@
   DartType getMemberType(String name, [ClassEntity cls]) {
     MemberEntity member = _getMember(name, cls);
     if (member is FieldEntity) {
-      return (elementEnvironment as JElementEnvironment).getFieldType(member);
+      return elementEnvironment.getFieldType(member);
     } else if (member is FunctionEntity) {
       return elementEnvironment.getFunctionType(member);
     }
@@ -159,7 +159,7 @@
     FieldEntity field =
         elementEnvironment.lookupLibraryMember(mainLibrary, name);
     Expect.isNotNull(field);
-    return (elementEnvironment as JElementEnvironment).getFieldType(field);
+    return elementEnvironment.getFieldType(field);
   }
 
   bool isSubtype(DartType T, DartType S) {
diff --git a/tests/compiler/dart2js/impact/data/expressions.dart b/tests/compiler/dart2js/impact/data/expressions.dart
index b28d3e5..e2b5552 100644
--- a/tests/compiler/dart2js/impact/data/expressions.dart
+++ b/tests/compiler/dart2js/impact/data/expressions.dart
@@ -31,6 +31,7 @@
   testPreInc(1),
   testSetIfNull(1),
   testThrow(0),
+  testTypedIfNotNull(1),
   testUnaryMinus(0)
 ],type=[inst:JSNull]
  */
@@ -61,6 +62,7 @@
   testAsGenericDynamic();
   testThrow();
   testIfNotNull(null);
+  testTypedIfNotNull(null);
   testIfNotNullSet(null);
   testIfNull(null);
   testSetIfNull(null);
@@ -310,19 +312,24 @@
  type=[inst:JSString]*/
 testThrow() => throw '';
 
-/*element: testIfNotNull:dynamic=[==,foo],type=[inst:JSNull]*/
+/*element: testIfNotNull:dynamic=[Object.==,foo],type=[inst:JSNull]*/
 testIfNotNull(o) => o?.foo;
 
-/*element: testIfNotNullSet:dynamic=[==,foo=],type=[inst:JSBool,inst:JSNull]*/
+/*element: testTypedIfNotNull:dynamic=[Class.==,Class.field],type=[inst:JSBool,inst:JSNull,param:Class]*/
+testTypedIfNotNull(Class o) => o?.field;
+
+/*element: testIfNotNullSet:dynamic=[Object.==,foo=],type=[inst:JSBool,inst:JSNull]*/
 testIfNotNullSet(o) => o?.foo = true;
 
-/*element: testIfNull:dynamic=[==],type=[inst:JSBool,inst:JSNull]*/
+/*element: testIfNull:dynamic=[Object.==],type=[inst:JSBool,inst:JSNull]*/
 testIfNull(o) => o ?? true;
 
-/*element: testSetIfNull:dynamic=[==],type=[inst:JSBool,inst:JSNull]*/
+/*element: testSetIfNull:dynamic=[Object.==],type=[inst:JSBool,inst:JSNull]*/
 testSetIfNull(o) => o ??= true;
 
-class Class {}
+class Class {
+  var field;
+}
 
 class GenericClass<X, Y> {}
 
diff --git a/tests/compiler/dart2js/impact/data/literals.dart b/tests/compiler/dart2js/impact/data/literals.dart
index d08c904..1239e44 100644
--- a/tests/compiler/dart2js/impact/data/literals.dart
+++ b/tests/compiler/dart2js/impact/data/literals.dart
@@ -166,7 +166,7 @@
 /*strong.element: testComplexConstSymbol:static=[Symbol.,Symbol.(1),Symbol.validated,complexSymbolField],type=[impl:String,inst:JSBool,inst:Symbol]*/
 testComplexConstSymbol() => const Symbol(complexSymbolField);
 
-/*element: testIfNullConstSymbol:dynamic=[==],static=[Symbol.,Symbol.(1),Symbol.validated],type=[inst:JSNull,inst:JSString,inst:Symbol]*/
+/*element: testIfNullConstSymbol:dynamic=[Null.==],static=[Symbol.,Symbol.(1),Symbol.validated],type=[inst:JSNull,inst:JSString,inst:Symbol]*/
 testIfNullConstSymbol() => const Symbol(null ?? 'foo');
 
 /*element: testTypeLiteral:static=[createRuntimeType],type=[inst:Type,inst:TypeImpl,lit:Object]*/
diff --git a/tests/compiler/dart2js/impact/data/promotion.dart b/tests/compiler/dart2js/impact/data/promotion.dart
index f7022a2..b076243 100644
--- a/tests/compiler/dart2js/impact/data/promotion.dart
+++ b/tests/compiler/dart2js/impact/data/promotion.dart
@@ -53,7 +53,7 @@
   cls.method();
 }
 
-/*element: dynamicToString:dynamic=[toString(0)]*/
+/*element: dynamicToString:dynamic=[Object.toString(0)]*/
 dynamicToString(dynamic cls) {
   cls.toString();
 }
@@ -63,22 +63,22 @@
   cls.toString(null);
 }
 
-/*element: dynamicToStringTearOff:dynamic=[toString]*/
+/*element: dynamicToStringTearOff:dynamic=[Object.toString]*/
 dynamicToStringTearOff(dynamic cls) {
   cls.toString;
 }
 
-/*element: dynamicToEquals:dynamic=[==],type=[inst:JSNull]*/
+/*element: dynamicToEquals:dynamic=[Object.==],type=[inst:JSNull]*/
 dynamicToEquals(dynamic cls) {
   cls == null;
 }
 
-/*element: dynamicToHashCode:dynamic=[hashCode]*/
+/*element: dynamicToHashCode:dynamic=[Object.hashCode]*/
 dynamicToHashCode(dynamic cls) {
   cls.hashCode;
 }
 
-/*element: dynamicToNoSuchMethod:dynamic=[noSuchMethod(1)],type=[inst:JSNull]*/
+/*element: dynamicToNoSuchMethod:dynamic=[Object.noSuchMethod(1)],type=[inst:JSNull]*/
 dynamicToNoSuchMethod(dynamic cls) {
   cls.noSuchMethod(null);
 }
@@ -88,7 +88,7 @@
   cls.noSuchMethod();
 }
 
-/*element: dynamicToNoSuchMethodTearOff:dynamic=[noSuchMethod]*/
+/*element: dynamicToNoSuchMethodTearOff:dynamic=[Object.noSuchMethod]*/
 dynamicToNoSuchMethodTearOff(dynamic cls) {
   cls.noSuchMethod;
 }
diff --git a/tests/compiler/dart2js/impact/data/runtime_type_strong.dart b/tests/compiler/dart2js/impact/data/runtime_type_strong.dart
index 3f0452b..63d2dea 100644
--- a/tests/compiler/dart2js/impact/data/runtime_type_strong.dart
+++ b/tests/compiler/dart2js/impact/data/runtime_type_strong.dart
@@ -5,7 +5,7 @@
 /*element: Class1a.:static=[Object.(0)]*/
 class Class1a<T> {
   /*element: Class1a.==:
-   dynamic=[Class1a.runtimeType,Type.==,runtimeType],
+   dynamic=[Class1a.runtimeType,Object.runtimeType,Type.==],
    runtimeType=[equals:Class1a<Class1a.T>/dynamic]
   */
   bool operator ==(other) {
@@ -16,7 +16,7 @@
 /*element: Class1b.:static=[Class1a.(0)]*/
 class Class1b<T> extends Class1a<T> {
   /*element: Class1b.==:
-   dynamic=[Class1b.runtimeType,Type.==,runtimeType],
+   dynamic=[Class1b.runtimeType,Object.runtimeType,Type.==],
    runtimeType=[equals:dynamic/Class1b<Class1b.T>]
   */
   bool operator ==(other) {
@@ -27,7 +27,7 @@
 /*element: Class1c.:static=[Object.(0)]*/
 class Class1c<T> implements Class1a<T> {
   /*element: Class1c.==:
-   dynamic=[==,Class1c.runtimeType,Type.==,runtimeType],
+   dynamic=[Class1c.runtimeType,Object.==,Object.runtimeType,Type.==],
    runtimeType=[equals:Class1c<Class1c.T>/dynamic],
    type=[inst:JSNull]
   */
@@ -39,7 +39,7 @@
 /*element: Class1d.:static=[Object.(0)]*/
 class Class1d<T> implements Class1a<T> {
   /*element: Class1d.==:
-   dynamic=[==,Class1d.runtimeType,Type.==,runtimeType],
+   dynamic=[Class1d.runtimeType,Object.==,Object.runtimeType,Type.==],
    runtimeType=[equals:dynamic/Class1d<Class1d.T>],
    type=[inst:JSNull]
   */
@@ -84,7 +84,7 @@
 toString1(Class2<int> c) => '${c.runtimeType}';
 
 /*element: toString2:
- dynamic=[==,Class2.runtimeType,toString(0)],
+ dynamic=[Class2.==,Class2.runtimeType,toString(0)],
  runtimeType=[string:Class2<int>],
  static=[
   S,
@@ -129,7 +129,7 @@
 toString3(Class2<int> c) => c.runtimeType.toString();
 
 /*element: toString4:
- dynamic=[==,Class2.runtimeType,Type.toString(0)],
+ dynamic=[Class2.runtimeType,Type.==,Type.toString(0)],
  runtimeType=[string:Class2<int>],
  static=[
   checkSubtype,
@@ -151,7 +151,7 @@
 toString4(Class2<int> c) => c.runtimeType?.toString();
 
 /*element: toString5:
- dynamic=[==,Class2.runtimeType,Type.toString(0)],
+ dynamic=[Class2.==,Class2.runtimeType,Type.==,Type.toString(0)],
  runtimeType=[string:Class2<int>],
  static=[
   checkSubtype,
@@ -173,7 +173,7 @@
 toString5(Class2<int> c) => c?.runtimeType?.toString();
 
 /*element: toString6:
- dynamic=[==,Class2.runtimeType,Type.toString(0)],
+ dynamic=[Class2.==,Class2.runtimeType,Type.toString(0)],
  runtimeType=[string:Class2<int>],
  static=[
   checkSubtype,
@@ -216,7 +216,7 @@
 unknown(Class2<int> c) => c.runtimeType;
 
 /*element: equals1:
- dynamic=[==,Class1a.runtimeType,Class1d.runtimeType,Type.==],
+ dynamic=[Class1a.==,Class1a.runtimeType,Class1d.==,Class1d.runtimeType,Type.==],
  runtimeType=[equals:Class1a<int>/Class1d<int>],
  static=[
   checkSubtype,
@@ -246,7 +246,7 @@
 almostEquals1(Class3 a) => a.runtimeType == null;
 
 /*element: almostEquals2:
- dynamic=[==,Class3.runtimeType,Type.==],
+ dynamic=[Class3.==,Class3.runtimeType,Type.==],
  runtimeType=[unknown:Class3],
  type=[inst:JSBool,inst:JSNull,param:Class3]
 */
@@ -260,7 +260,7 @@
 almostEquals3(Class3 a) => null == a.runtimeType;
 
 /*element: almostEquals4:
- dynamic=[==,Class3.runtimeType,Null.==],
+ dynamic=[Class3.==,Class3.runtimeType,Null.==],
  runtimeType=[unknown:Class3],
  type=[inst:JSBool,inst:JSNull,param:Class3]
 */
@@ -274,49 +274,49 @@
 almostEquals5(Class3 a) => a.runtimeType == a.field;
 
 /*element: almostEquals6:
- dynamic=[==,Class3.field,Class3.runtimeType,Type.==],
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],
  runtimeType=[unknown:Class3],
  type=[inst:JSBool,inst:JSNull,param:Class3]
 */
 almostEquals6(Class3 a) => a?.runtimeType == a.field;
 
 /*element: almostEquals7:
- dynamic=[==,Class3.field,Class3.runtimeType,Type.==],
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],
  runtimeType=[unknown:Class3],
  type=[inst:JSBool,inst:JSNull,param:Class3]
 */
 almostEquals7(Class3 a) => a.runtimeType == a?.field;
 
 /*element: almostEquals8:
- dynamic=[==,Class3.field,Class3.runtimeType,Type.==],
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],
  runtimeType=[unknown:Class3],
  type=[inst:JSBool,inst:JSNull,param:Class3]
 */
 almostEquals8(Class3 a) => a?.runtimeType == a?.field;
 
 /*element: almostEquals9:
- dynamic=[==,Class3.field,Class3.runtimeType],
+ dynamic=[Class3.field,Class3.runtimeType,Object.==],
  runtimeType=[unknown:Class3],
  type=[inst:JSBool,param:Class3]
 */
 almostEquals9(Class3 a) => a.field == a.runtimeType;
 
 /*element: almostEquals10:
- dynamic=[==,Class3.field,Class3.runtimeType],
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],
  runtimeType=[unknown:Class3],
  type=[inst:JSBool,inst:JSNull,param:Class3]
 */
 almostEquals10(Class3 a) => a?.field == a.runtimeType;
 
 /*element: almostEquals11:
- dynamic=[==,Class3.field,Class3.runtimeType],
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],
  runtimeType=[unknown:Class3],
  type=[inst:JSBool,inst:JSNull,param:Class3]
 */
 almostEquals11(Class3 a) => a.field == a?.runtimeType;
 
 /*element: almostEquals12:
- dynamic=[==,Class3.field,Class3.runtimeType],
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],
  runtimeType=[unknown:Class3],
  type=[inst:JSBool,inst:JSNull,param:Class3]
 */
@@ -330,7 +330,7 @@
 almostToString1(Class3 a) => a.runtimeType.toString;
 
 /*element: almostToString2:
- dynamic=[==,Class3.runtimeType,Type.toString],
+ dynamic=[Class3.==,Class3.runtimeType,Type.==,Type.toString],
  runtimeType=[unknown:Class3],
  type=[inst:JSBool,inst:JSNull,param:Class3]
 */
@@ -344,7 +344,7 @@
 almostToString3(Class3 a) => a.runtimeType.noSuchMethod(null);
 
 /*element: almostToString4:
- dynamic=[==,Class3.runtimeType,Type.noSuchMethod(1)],
+ dynamic=[Class3.==,Class3.runtimeType,Type.noSuchMethod(1)],
  runtimeType=[unknown:Class3],
  type=[inst:JSBool,inst:JSNull,param:Class3]
 */
@@ -358,21 +358,21 @@
 notEquals1(Class3 a, Class4 b) => a.runtimeType != b.runtimeType;
 
 /*element: notEquals2:
- dynamic=[==,Class3.runtimeType,Class4.runtimeType,Type.==],
+ dynamic=[Class3.==,Class3.runtimeType,Class4.runtimeType,Type.==],
  runtimeType=[equals:Class3/Class4],
  type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
 */
 notEquals2(Class3 a, Class4 b) => a?.runtimeType != b.runtimeType;
 
 /*element: notEquals3:
- dynamic=[==,Class3.runtimeType,Class4.runtimeType,Type.==],
+ dynamic=[Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],
  runtimeType=[equals:Class3/Class4],
  type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
 */
 notEquals3(Class3 a, Class4 b) => a.runtimeType != b?.runtimeType;
 
 /*element: notEquals4:
- dynamic=[==,Class3.runtimeType,Class4.runtimeType,Type.==],
+ dynamic=[Class3.==,Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],
  runtimeType=[equals:Class3/Class4],
  type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
 */
diff --git a/tests/compiler/dart2js/impact/impact_test.dart b/tests/compiler/dart2js/impact/impact_test.dart
index 5bdc7ef..c5a6cb9 100644
--- a/tests/compiler/dart2js/impact/impact_test.dart
+++ b/tests/compiler/dart2js/impact/impact_test.dart
@@ -8,11 +8,11 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/ir/util.dart';
-import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:compiler/src/universe/feature.dart';
 import 'package:compiler/src/universe/use.dart';
 import 'package:compiler/src/universe/world_impact.dart';
+import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
 
@@ -41,8 +41,7 @@
       {bool verbose: false}) {
     KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
     WorldImpact impact = compiler.impactCache[member];
-    MemberDefinition definition =
-        frontendStrategy.elementMap.getMemberDefinition(member);
+    ir.Member node = frontendStrategy.elementMap.getMemberNode(member);
     Features features = new Features();
     if (impact.typeUses.length > 50) {
       features.addElement(Tags.typeUse, '*');
@@ -71,8 +70,8 @@
         features.addElement(Tags.runtimeTypeUse, use.shortText);
       }
     }
-    Id id = computeEntityId(definition.node);
+    Id id = computeEntityId(node);
     actualMap[id] = new ActualData(new IdValue(id, features.getText()),
-        computeSourceSpanFromTreeNode(definition.node), member);
+        computeSourceSpanFromTreeNode(node), member);
   }
 }
diff --git a/tests/compiler/dart2js/inference/callers_test.dart b/tests/compiler/dart2js/inference/callers_test.dart
index e0a1a72..e39a720 100644
--- a/tests/compiler/dart2js/inference/callers_test.dart
+++ b/tests/compiler/dart2js/inference/callers_test.dart
@@ -12,7 +12,6 @@
 import 'package:compiler/src/inferrer/type_graph_inferrer.dart';
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
-import 'package:compiler/src/kernel/element_map.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/inference/inference_data_test.dart b/tests/compiler/dart2js/inference/inference_data_test.dart
index 4b7a74e..7254d31 100644
--- a/tests/compiler/dart2js/inference/inference_data_test.dart
+++ b/tests/compiler/dart2js/inference/inference_data_test.dart
@@ -12,7 +12,6 @@
 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_strategy.dart';
-import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/world.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
diff --git a/tests/compiler/dart2js/inference/inference_test_helper.dart b/tests/compiler/dart2js/inference/inference_test_helper.dart
index cfaf1e1..cb617c7 100644
--- a/tests/compiler/dart2js/inference/inference_test_helper.dart
+++ b/tests/compiler/dart2js/inference/inference_test_helper.dart
@@ -14,7 +14,6 @@
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
 import 'package:compiler/src/js_model/locals.dart';
-import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/inferrer/builder_kernel.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
diff --git a/tests/compiler/dart2js/inference/load_deferred_library_test.dart b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
index 07b2e26..55157c9 100644
--- a/tests/compiler/dart2js/inference/load_deferred_library_test.dart
+++ b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
@@ -11,7 +11,6 @@
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
-import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/types/abstract_value_domain.dart';
 import 'package:compiler/src/world.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/inference/side_effects_test.dart b/tests/compiler/dart2js/inference/side_effects_test.dart
index e5d8e40..1aa9803 100644
--- a/tests/compiler/dart2js/inference/side_effects_test.dart
+++ b/tests/compiler/dart2js/inference/side_effects_test.dart
@@ -12,7 +12,6 @@
 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_strategy.dart';
-import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/world.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
diff --git a/tests/compiler/dart2js/inlining/inlining_test.dart b/tests/compiler/dart2js/inlining/inlining_test.dart
index 8312b79..43e83b7 100644
--- a/tests/compiler/dart2js/inlining/inlining_test.dart
+++ b/tests/compiler/dart2js/inlining/inlining_test.dart
@@ -12,7 +12,6 @@
 import 'package:compiler/src/js_backend/backend.dart';
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
-import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/ssa/builder_kernel.dart' as kernel;
 import 'package:compiler/src/universe/world_impact.dart';
 import 'package:compiler/src/universe/use.dart';
diff --git a/tests/compiler/dart2js/inlining/meta_annotations_test.dart b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
index 3b31d3c..e62db8e 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
@@ -40,10 +40,6 @@
         compiler.resolutionWorldBuilder.closedWorldForTesting;
     KElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
     Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
-    Expect.isNotNull(closedWorld.commonElements.metaNoInlineClass,
-        'NoInlineClass is unresolved.');
-    Expect.isNotNull(closedWorld.commonElements.metaTryInlineClass,
-        'TryInlineClass is unresolved.');
 
     void test(String name,
         {bool expectNoInline: false, bool expectTryInline: false}) {
diff --git a/tests/compiler/dart2js/jumps/jump_test.dart b/tests/compiler/dart2js/jumps/jump_test.dart
index 90ceaf8..47518bc 100644
--- a/tests/compiler/dart2js/jumps/jump_test.dart
+++ b/tests/compiler/dart2js/jumps/jump_test.dart
@@ -13,7 +13,6 @@
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
 import 'package:compiler/src/js_model/locals.dart';
-import 'package:compiler/src/kernel/element_map.dart';
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
 import 'package:kernel/ast.dart' as ir;
diff --git a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
index a76638c..64b6506 100644
--- a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
@@ -31,10 +31,7 @@
   /// Tested constants.
   final List<ConstantData> constants;
 
-  final bool strongModeOnly;
-
-  const TestData(this.name, this.declarations, this.constants,
-      {this.strongModeOnly: false});
+  const TestData(this.name, this.declarations, this.constants);
 }
 
 class ConstantData {
@@ -539,9 +536,7 @@
     const ConstantData(r'const D(0)',
         'ConstructedConstant(D(a=IntConstant(1),b=IntConstant(2)))'),
   ]),
-  const TestData(
-      'instantiations',
-      '''
+  const TestData('instantiations', '''
 T identity<T>(T t) => t;
 class C<T> {
   final T defaultValue;
@@ -549,21 +544,30 @@
 
   const C(this.defaultValue, this.identityFunction);
 }
-  ''',
-      const <ConstantData>[
-        const ConstantData('identity', 'FunctionConstant(identity)'),
-        const ConstantData(
-            'const C<int>(0, identity)',
-            'ConstructedConstant(C<int>(defaultValue=IntConstant(0),'
-            'identityFunction=InstantiationConstant([int],'
-            'FunctionConstant(identity))))'),
-        const ConstantData(
-            'const C<double>(0.5, identity)',
-            'ConstructedConstant(C<double>(defaultValue=DoubleConstant(0.5),'
-            'identityFunction=InstantiationConstant([double],'
-            'FunctionConstant(identity))))'),
-      ],
-      strongModeOnly: true)
+  ''', const <ConstantData>[
+    const ConstantData('identity', 'FunctionConstant(identity)'),
+    const ConstantData(
+        'const C<int>(0, identity)',
+        'ConstructedConstant(C<int>(defaultValue=IntConstant(0),'
+        'identityFunction=InstantiationConstant([int],'
+        'FunctionConstant(identity))))'),
+    const ConstantData(
+        'const C<double>(0.5, identity)',
+        'ConstructedConstant(C<double>(defaultValue=DoubleConstant(0.5),'
+        'identityFunction=InstantiationConstant([double],'
+        'FunctionConstant(identity))))'),
+  ]),
+  const TestData('generic class', '''
+class C<T> {
+  const C.generative();
+  const C.redirect() : this.generative();
+}
+  ''', const <ConstantData>[
+    const ConstantData(
+        'const C<int>.generative()', 'ConstructedConstant(C<int>())'),
+    const ConstantData(
+        'const C<int>.redirect()', 'ConstructedConstant(C<int>())'),
+  ])
 ];
 
 main(List<String> args) {
diff --git a/tests/compiler/dart2js/rti/emission/constructor_argument_static_strong.dart b/tests/compiler/dart2js/rti/emission/constructor_argument_static_strong.dart
index 0725a31..e59af18 100644
--- a/tests/compiler/dart2js/rti/emission/constructor_argument_static_strong.dart
+++ b/tests/compiler/dart2js/rti/emission/constructor_argument_static_strong.dart
@@ -29,7 +29,7 @@
 /*class: B2:checks=[],instance*/
 class B2 implements A2 {}
 
-/*class: Test2:checks=[]*/
+/*class: Test2:checks=[],indirectInstance*/
 abstract class Test2 {
   @noInline
   Test2(A2 x) {
diff --git a/tests/compiler/dart2js/rti/emission/inherited_is.dart b/tests/compiler/dart2js/rti/emission/inherited_is.dart
index 6e071e9..1472e8a 100644
--- a/tests/compiler/dart2js/rti/emission/inherited_is.dart
+++ b/tests/compiler/dart2js/rti/emission/inherited_is.dart
@@ -11,7 +11,7 @@
 /*class: B:checks=[]*/
 class B implements A {}
 
-/*class: C:checks=[$isA]*/
+/*class: C:checks=[$isA],indirectInstance*/
 class C = Object with B;
 
 /*class: D:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/inherited_is2.dart b/tests/compiler/dart2js/rti/emission/inherited_is2.dart
index 13739e1..93e5330 100644
--- a/tests/compiler/dart2js/rti/emission/inherited_is2.dart
+++ b/tests/compiler/dart2js/rti/emission/inherited_is2.dart
@@ -8,10 +8,10 @@
 /*class: A:checkedInstance*/
 class A {}
 
-/*class: B:checks=[$isA]*/
+/*class: B:checks=[$isA],indirectInstance*/
 class B implements A {}
 
-/*class: C:checks=[]*/
+/*class: C:checks=[],indirectInstance*/
 class C extends B {}
 
 /*class: D:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart b/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart
index 5c1ed6a..d2957cb 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart
@@ -11,16 +11,16 @@
   }
 }
 
-/*class: A:checks=[]*/
+/*class: A:checks=[],indirectInstance*/
 class A<U> = Object with M<U>;
 
-/*class: B:checks=[]*/
+/*class: B:checks=[],indirectInstance*/
 class B<V> = Object with A<V>;
 
-/*class: C:checks=[$asM]*/
+/*class: C:checks=[$asM],indirectInstance*/
 class C<U> = Object with M<List<U>>;
 
-/*class: D:checks=[$asM]*/
+/*class: D:checks=[$asM],indirectInstance*/
 class D<V> = Object with C<Set<V>>;
 
 /*class: E:checks=[$asM],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart b/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
index 8a1e159..4b56c06 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
@@ -10,7 +10,7 @@
 /*class: J:checkedInstance*/
 class J<T> {}
 
-/*class: S:checkedInstance,checks=[]*/
+/*class: S:checkedInstance,checks=[],indirectInstance*/
 class S<T> {}
 
 /*class: M:checkedInstance,checks=[]*/
diff --git a/tests/compiler/dart2js/rti/emission/mixin_subtype.dart b/tests/compiler/dart2js/rti/emission/mixin_subtype.dart
new file mode 100644
index 0000000..225b312
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/mixin_subtype.dart
@@ -0,0 +1,112 @@
+// 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.
+
+// Derived from language_2/mixin_declaration/mixin_declaration_subtype_test.
+
+import "package:expect/expect.dart";
+
+// A mixin declaration introduces a type.
+
+// A mixin with multiple super-types and implemented types.
+
+/*class: A:checkedInstance,checks=[],typeArgument*/
+class A {}
+
+/*class: B:checkedInstance,checks=[],typeArgument*/
+class B {}
+
+/*class: I:checkedInstance,checks=[],typeArgument*/
+class I {}
+
+/*class: J:checkedInstance,checks=[],typeArgument*/
+class J {}
+
+/*class: M1:checkedInstance,checks=[$isA,$isB,$isI,$isJ],typeArgument*/
+mixin M1 on A, B implements I, J {}
+
+/*class: M2:checkedInstance,checks=[$isA,$isB,$isI,$isJ],typeArgument*/
+class M2 implements A, B, I, J {}
+
+/*class: M3:checkedInstance,checks=[$isA,$isB,$isI,$isJ],instance,typeArgument*/
+class M3 implements A, B, I, J {}
+
+/*class: M4:checkedInstance,checks=[$isA,$isB,$isI,$isJ],typeArgument*/
+class M4 implements A, B, I, J {}
+
+/*class: M5:checkedInstance,checks=[$isA,$isB,$isI,$isJ],typeArgument*/
+class M5 implements A, B, I, J {}
+
+/*class: C:checkedInstance,checks=[$isA,$isB],indirectInstance,typeArgument*/
+class C implements A, B {}
+
+/*class: D1:checkedInstance,checks=[$isI,$isJ,$isM1],typeArgument*/
+class D1 = C with M1;
+
+/*class: D2:checkedInstance,checks=[$isI,$isJ],instance,typeArgument*/
+class D2 = C with M2;
+
+/*class: D3:checkedInstance,checks=[$isI,$isJ,$isM3],typeArgument*/
+class D3 = C with M3;
+
+/*class: D4:checkedInstance,checks=[$isI,$isJ],instance,typeArgument*/
+class D4 extends C with M4 {}
+
+/*class: D5:checkedInstance,checks=[$isI,$isJ],indirectInstance,typeArgument*/
+class D5 extends C with M5 {}
+
+/*class: E5:checkedInstance,checks=[],instance,typeArgument*/
+class E5 extends D5 {}
+
+// Same, with generics.
+/*class: GA:checkedInstance,checks=[],typeArgument*/
+class GA<T> {}
+
+/*class: GB:checkedInstance,checks=[],typeArgument*/
+class GB<T> {}
+
+/*class: GI:checkedInstance,checks=[],typeArgument*/
+class GI<T> {}
+
+/*class: GJ:checkedInstance,checks=[],typeArgument*/
+class GJ<T> {}
+
+/*class: GM:checkedInstance,checks=[$asGA,$asGB,$asGI,$asGJ,$isGA,$isGB,$isGI,$isGJ],typeArgument*/
+mixin GM<T> on GA<T>, GB<List<T>> implements GI<Iterable<T>>, GJ<Set<T>> {}
+
+/*class: GC:checkedInstance,checks=[$asGB,$isGA,$isGB],typeArgument*/
+class GC<T> implements GA<T>, GB<List<T>> {}
+
+/*class: GD:checkedInstance,checks=[$asGI,$asGJ,$isGI,$isGJ,$isGM],typeArgument*/
+class GD<T> = GC<T> with GM<T>;
+
+@NoInline()
+test(o) {}
+
+main() {
+  test(new M3());
+  test(new D2());
+  test(new D4());
+  test(new E5());
+  Expect.subtype<M1, A>();
+  Expect.subtype<M1, B>();
+  Expect.subtype<M1, I>();
+  Expect.subtype<M1, J>();
+  Expect.subtype<D1, M1>();
+  Expect.subtype<D2, M2>();
+  Expect.subtype<D3, M3>();
+  Expect.subtype<D4, M4>();
+  Expect.subtype<D5, M5>();
+  Expect.subtype<E5, M5>();
+  Expect.notSubtype<M1, C>();
+  Expect.notSubtype<C, M1>();
+
+  Expect.subtype<GM<int>, GA<int>>();
+  Expect.subtype<GM<int>, GB<List<int>>>();
+  Expect.subtype<GM<int>, GI<Iterable<int>>>();
+  Expect.subtype<GM<int>, GJ<Set<int>>>();
+  Expect.subtype<GD<int>, GM<int>>();
+  Expect.subtype<GD<int>, GC<int>>();
+  Expect.notSubtype<GM<int>, GC<int>>();
+  Expect.notSubtype<GC<int>, GM<int>>();
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/rti/emission/regress_18713.dart b/tests/compiler/dart2js/rti/emission/regress_18713.dart
index b923d1d..9b7ac50 100644
--- a/tests/compiler/dart2js/rti/emission/regress_18713.dart
+++ b/tests/compiler/dart2js/rti/emission/regress_18713.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 
-/*class: T:checks=[]*/
+/*class: T:checks=[],indirectInstance*/
 class T<X> {
   final Type tType = X;
   Type get getTType => X;
diff --git a/tests/compiler/dart2js/rti/emission/superclass.dart b/tests/compiler/dart2js/rti/emission/superclass.dart
index 7af0de0..8c70ab7 100644
--- a/tests/compiler/dart2js/rti/emission/superclass.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass.dart
@@ -4,7 +4,7 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: B:checkedInstance,checks=[],typeLiteral*/
+/*class: B:checkedInstance,checks=[],indirectInstance,typeLiteral*/
 class B {}
 
 /*class: C:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/superclass_as.dart b/tests/compiler/dart2js/rti/emission/superclass_as.dart
index 0bcd138..5f9a9e1 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_as.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_as.dart
@@ -8,7 +8,7 @@
 /*class: A:checkedInstance,checks=[],instance*/
 class A<T> {}
 
-/*class: B:checks=[]*/
+/*class: B:checks=[],indirectInstance*/
 class B<T, S> {
   @noInline
   method() => new A<S>();
diff --git a/tests/compiler/dart2js/rti/emission/superclass_complex.dart b/tests/compiler/dart2js/rti/emission/superclass_complex.dart
index 1d4fe7f..5b7fa34 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_complex.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_complex.dart
@@ -7,7 +7,7 @@
 /*class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A<T> {}
 
-/*class: B:checkedInstance,checks=[]*/
+/*class: B:checkedInstance,checks=[],indirectInstance*/
 class B<T> {}
 
 /*class: C:checks=[$asB],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/superclass_fixed.dart b/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
index 7beb498..bc445f7 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
@@ -4,7 +4,7 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: B:checkedInstance,checks=[]*/
+/*class: B:checkedInstance,checks=[],indirectInstance*/
 class B<T> {}
 
 /*class: C:checks=[$asB],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
index 5f38aa3..614192e 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
@@ -4,7 +4,7 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: A:checks=[]*/
+/*class: A:checks=[],indirectInstance*/
 class A {}
 
 /*class: B:checkedInstance*/
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
index c87c3f3..32201f8 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
@@ -10,7 +10,7 @@
 /*class: B:checkedInstance*/
 class B<T> {}
 
-/*class: C:checks=[]*/
+/*class: C:checks=[],indirectInstance*/
 class C<T> {}
 
 /*class: D:checks=[$asB,$isB],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
index 6db1e5e..2408c8c 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
@@ -4,7 +4,7 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: A:checks=[]*/
+/*class: A:checks=[],indirectInstance*/
 class A {}
 
 /*class: B:checkedInstance*/
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
index d5c5878..8a7e8fd 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
@@ -4,7 +4,7 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: A:checks=[]*/
+/*class: A:checks=[],indirectInstance*/
 class A<T> {}
 
 /*class: B:checkedInstance*/
diff --git a/tests/compiler/dart2js/rti/emission/superclass_trivial.dart b/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
index 52b3c6f..a9a6ec8 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
@@ -4,7 +4,7 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: B:checkedInstance,checks=[]*/
+/*class: B:checkedInstance,checks=[],indirectInstance*/
 class B<T> {}
 
 /*class: C:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart b/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
index bbaac15..2f6ccb0 100644
--- a/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
@@ -4,7 +4,7 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: A:checkedInstance,checks=[]*/
+/*class: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
 /*class: B:checks=[$asA],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart b/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
index 5067b79..5023aad 100644
--- a/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
@@ -4,7 +4,7 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: A:checkedInstance,checks=[]*/
+/*class: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
 /*class: B:checks=[$asA],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_extends.dart b/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
index f9ab4fa..f00142c 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
@@ -7,7 +7,7 @@
 /*class: A:checkedInstance*/
 class A {}
 
-/*class: B:checks=[$isA]*/
+/*class: B:checks=[$isA],indirectInstance*/
 class B implements A {}
 
 /*class: C:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart b/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
index eee47b1..4f56646 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
@@ -7,10 +7,10 @@
 /*class: A:checkedInstance*/
 class A {}
 
-/*class: B:checks=[$isA]*/
+/*class: B:checks=[$isA],indirectInstance*/
 class B implements A {}
 
-/*class: C:checks=[]*/
+/*class: C:checks=[],indirectInstance*/
 class C extends B {} // Implements A through `extends B`.
 
 /*class: D:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart b/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
index 0dedcb3..c7be77c 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
@@ -4,7 +4,7 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: A:checkedInstance,checks=[]*/
+/*class: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
 /*class: B:checks=[$asA],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart b/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
index f1a15cd..2a5e744 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
@@ -4,7 +4,7 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: A:checkedInstance,checks=[]*/
+/*class: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
 /*class: B:checks=[$asA],instance*/
diff --git a/tests/compiler/dart2js/rti/rti_emission_test.dart b/tests/compiler/dart2js/rti/rti_emission_test.dart
index 84a206c..de07f7e 100644
--- a/tests/compiler/dart2js/rti/rti_emission_test.dart
+++ b/tests/compiler/dart2js/rti/rti_emission_test.dart
@@ -14,7 +14,6 @@
 import 'package:compiler/src/js_emitter/model.dart';
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
-import 'package:compiler/src/kernel/element_map.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -31,7 +30,8 @@
 
 class Tags {
   static const String isChecks = 'checks';
-  static const String instance = 'instance';
+  static const String indirectInstance = 'indirectInstance';
+  static const String directInstance = 'instance';
   static const String checkedInstance = 'checkedInstance';
   static const String typeArgument = 'typeArgument';
   static const String checkedTypeArgument = 'checkedTypeArgument';
@@ -61,9 +61,12 @@
     }
     ClassUse classUse = checksBuilder.classUseMapForTesting[element];
     if (classUse != null) {
-      if (classUse.instance) {
-        features.add(Tags.instance);
+      if (classUse.directInstance) {
+        features.add(Tags.directInstance);
+      } else if (classUse.instance) {
+        features.add(Tags.indirectInstance);
       }
+
       if (classUse.checkedInstance) {
         features.add(Tags.checkedInstance);
       }
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart b/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart
index 5724641..77dd7cf 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart
@@ -84,7 +84,7 @@
     data['title'] = annotations.map((l) => l.title).join(',');
   }
   if (id != null) {
-    Set ids = annotations.map((l) => l.id).toSet();
+    Set ids = annotations.map<int>((l) => l.id).toSet();
     data['name'] = elementScheme.getName(id, ids);
     data['href'] = elementScheme.getHref(id, ids);
     data['onclick'] = elementScheme.onClick(id, ids);
diff --git a/tests/compiler/dart2js_extra/34701_test.dart b/tests/compiler/dart2js_extra/34701_test.dart
new file mode 100644
index 0000000..5612791
--- /dev/null
+++ b/tests/compiler/dart2js_extra/34701_test.dart
@@ -0,0 +1,36 @@
+// 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.
+
+// dart2jsOptions=--omit-implicit-checks
+
+/// Regression test for issue 34701.
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:meta/dart2js.dart';
+
+class A {
+  @noInline //# 01: ok
+  Future<T> _foo<T>(FutureOr<T> Function() f) async {
+    return await f();
+  }
+
+  @noInline //# 01: continued
+  Future<String> get m async => _foo(() => "a");
+}
+
+class M {}
+
+class B extends A with M {
+  @noInline //# 01: continued
+  Future<T> _foo<T>(FutureOr<T> Function() f) => super._foo(f);
+}
+
+main() async {
+  var b = new B();
+  print(b.m.runtimeType);
+  print((await b.m).runtimeType);
+  Expect.isTrue(b.m is Future<String>);
+  Expect.isTrue((await b.m) is String);
+}
diff --git a/tests/compiler/dart2js_extra/data_uri_test.dart b/tests/compiler/dart2js_extra/data_uri_test.dart
new file mode 100644
index 0000000..90191c2
--- /dev/null
+++ b/tests/compiler/dart2js_extra/data_uri_test.dart
@@ -0,0 +1,14 @@
+// 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 "data:,var%20x=#_a._b;var%20y=#a._b;var%20z=#_b;";
+
+main() {
+  print(x);
+  print(x == #_a._b);
+  print(y);
+  print(y == #a._b);
+  print(z);
+  print(z == #_b);
+}
diff --git a/tests/compiler/dart2js_extra/mixin_subtype_test.dart b/tests/compiler/dart2js_extra/mixin_subtype_test.dart
new file mode 100644
index 0000000..c96789a
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mixin_subtype_test.dart
@@ -0,0 +1,53 @@
+// 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:expect/expect.dart";
+
+class A {}
+
+class B {}
+
+class I {}
+
+class J {}
+
+mixin M1 on A, B implements I, J {}
+
+class M2 implements A, B, I, J {}
+
+class M3 implements A, B, I, J {}
+
+class M4 implements A, B, I, J {}
+
+class M5 implements A, B, I, J {}
+
+class C implements A, B {}
+
+class D1 = C with M1;
+
+class D2 = C with M2;
+
+class D3 = C with M3;
+
+class D4 extends C with M4 {}
+
+class D5 extends C with M5 {}
+
+class E5 extends D5 {}
+
+@NoInline()
+test(o) {}
+
+main() {
+  test(new M3());
+  test(new D2());
+  test(new D4());
+  test(new E5());
+  Expect.subtype<D1, M1>();
+  Expect.subtype<D2, M2>();
+  Expect.subtype<D3, M3>();
+  Expect.subtype<D4, M4>();
+  Expect.subtype<D5, M5>();
+  Expect.subtype<E5, M5>();
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js_extra/mock_libraries.dart b/tests/compiler/dart2js_extra/mock_libraries.dart
index 025f221..1667032 100644
--- a/tests/compiler/dart2js_extra/mock_libraries.dart
+++ b/tests/compiler/dart2js_extra/mock_libraries.dart
@@ -228,7 +228,6 @@
   'interceptedTypeCheck': 'interceptedTypeCheck(value, property) {}',
   'intTypeCast': 'intTypeCast(value) {}',
   'intTypeCheck': 'intTypeCheck(value) {}',
-  'IrRepresentation': 'class IrRepresentation {}',
   'isJsIndexable': 'isJsIndexable(a, b) {}',
   'JavaScriptIndexingBehavior': 'abstract class JavaScriptIndexingBehavior {}',
   'JSInvocationMirror': r'''
diff --git a/tests/compiler/dart2js_native/compiler_test_internals.dart b/tests/compiler/dart2js_native/compiler_test_internals.dart
index db3e31f..08e96d0 100644
--- a/tests/compiler/dart2js_native/compiler_test_internals.dart
+++ b/tests/compiler/dart2js_native/compiler_test_internals.dart
@@ -4,7 +4,6 @@
 
 library compiler_test_internals;
 
-export 'dart:_js_helper'
-    show NoSideEffects, NoThrows, NoInline, IrRepresentation;
+export 'dart:_js_helper' show NoSideEffects, NoThrows, NoInline;
 
 export 'dart:_foreign_helper' show JS;
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index caabc0d..00d5d32 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -59,11 +59,8 @@
 int_modulo_arith_test/none: RuntimeError
 string_from_environment3_test/03: Crash
 
-# These tests crash in mixed mode.
 [ $compiler == dartkb ]
-bigint_from_test: Pass, Crash # Please triage
-bigint_parse_radix_test: Pass, Crash # Please triage
-bigint_test: Pass, Crash, RuntimeError # Please triage
+bigint_test: Skip # Switching from non-intrinsic version to intrinsics on the fly causes invariants "assert(d0 == d1)" and "assert(d == _digitsPerStep)" in bigint_patch.dart to break, which leads to flaky RuntimeError / Timeout failures.
 
 [ $compiler == precompiler ]
 bigint_test: Pass, Timeout # --no_intrinsify
@@ -424,8 +421,8 @@
 list_test/*: RuntimeError # VM doesn't implement strong mode covariance checks
 
 [ $arch == simarm || $arch == simarm64 || $arch == simdbc64 || $compiler == dartkb ]
-bigint_parse_radix_test: Pass, Slow # Bigint computations are slow on simulated architectures.
-bigint_test: Pass, Slow, Timeout # Bigint computations are slow on simulated architectures.
+bigint_parse_radix_test: Skip # Issue 31659
+bigint_test: Skip # Issue 31659
 
 [ $arch == simdbc || $arch == simdbc64 ]
 regexp/stack-overflow_test: RuntimeError, OK # Smaller limit with irregex interpreter
@@ -589,6 +586,6 @@
 regexp/UC16_test: RuntimeError
 
 [ $hot_reload || $hot_reload_rollback ]
-bigint_parse_radix_test: Pass, Timeout, Crash # Issue 31659. Issue 34361.
-bigint_test: Pass, Timeout # Issue 31659
+bigint_parse_radix_test: Skip # Issue 31659. Issue 34361.
+bigint_test: Skip # Issue 31659
 integer_parsed_mul_div_vm_test: Pass, Slow # Slow
diff --git a/tests/corelib_2/uri_test.dart b/tests/corelib_2/uri_test.dart
index 8795c53..386838a 100644
--- a/tests/corelib_2/uri_test.dart
+++ b/tests/corelib_2/uri_test.dart
@@ -280,19 +280,10 @@
   checkInvalid("s://x@x:x/");
   // At most one port.
   checkInvalid("s://x@x:9:9/");
-  // At most one #.
-  checkInvalid("s://x/x#foo#bar");
   // @ not allowed in scheme.
   checkInvalid("s@://x:9/x?x#x");
   // ] not allowed alone in host.
   checkInvalid("s://xx]/");
-  // ] not allowed anywhere except in host.
-  checkInvalid("s://xx/]");
-  checkInvalid("s://xx/?]");
-  checkInvalid("s://xx/#]");
-  checkInvalid("s:/]");
-  checkInvalid("s:/?]");
-  checkInvalid("s:/#]");
   // IPv6 must be enclosed in [ and ] for Uri.parse.
   // It is allowed un-enclosed as argument to `Uri(host:...)` because we don't
   // need to delimit.
@@ -387,6 +378,18 @@
       "scheme:///#",
       new Uri(scheme: "scheme", host: "", path: "/", query: "", fragment: "")
           .toString());
+
+  // We allow, and escape, general delimiters in paths, queries and fragments.
+  // Allow `[` and `]` in path:
+  Expect.equals("s:/%5B%5D", Uri.parse("s:/[]").toString());
+  Expect.equals("s:%5B%5D", Uri.parse("s:[]").toString());
+  Expect.equals("%5B%5D", Uri.parse("[]").toString());
+  // Allow `[`, `]` and `?` in query (anything after *first* `?`).
+  // The `?` is not escaped.
+  Expect.equals("s://xx/?%5B%5D?", Uri.parse("s://xx/?[]?").toString());
+  // Allow `[`, `]`, `?` and `#` in fragment (anything after *first* `#`).
+  // The `?` is not escaped.
+  Expect.equals("s://xx/#%5B%5D%23?", Uri.parse("s://xx/#[]#?").toString());
 }
 
 void testReplace() {
diff --git a/tests/language_2/config_import_test.dart b/tests/language_2/config_import_test.dart
index 6aab223..2e15460 100644
--- a/tests/language_2/config_import_test.dart
+++ b/tests/language_2/config_import_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// DartOptions=-Did=true -Ddotted.id=some_string -Dlots.of.dots.In.id=false
-// VMOptions=-Did=true -Ddotted.id=some_string -Dlots.of.dots.In.id=false
+// SharedOptions=-Did=true -Ddotted.id=some_string -Dlots.of.dots.In.id=false
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language_2/const_native_factory_test.dart b/tests/language_2/const_native_factory_test.dart
index ff1352d..13d398f 100644
--- a/tests/language_2/const_native_factory_test.dart
+++ b/tests/language_2/const_native_factory_test.dart
@@ -5,7 +5,7 @@
 class Cake {
   final name;
   const Cake(this.name);
-  const factory BakeMeACake()
+  const factory Cake.BakeMeACake()
       native "Cake_BakeMeACake"; /*@compile-error=unspecified*/
 }
 
diff --git a/tests/language_2/double_literals/double_literal_coercion_test.dart b/tests/language_2/double_literals/double_literal_coercion_test.dart
index 3eaf06f..2438bd4 100644
--- a/tests/language_2/double_literals/double_literal_coercion_test.dart
+++ b/tests/language_2/double_literals/double_literal_coercion_test.dart
@@ -115,7 +115,7 @@
   expectDouble(p2_63, 0x8000000000000000);
   expectDouble(p2_64, 0x10000000000000000);
   expectDouble(maxValue,
-      0xfffffffffffff80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);
+      0xfffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);
 
   expectDouble(-0.0, -0x0);
   expectDouble(-1.0, -0x1);
@@ -146,5 +146,5 @@
   expectDouble(-(p2_63), -0x8000000000000000);
   expectDouble(-(p2_64), -0x10000000000000000);
   expectDouble(-maxValue,
-      -0xfffffffffffff80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);
+      -0xfffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);
 }
diff --git a/tests/language_2/double_literals/implicit_double_context_test.dart b/tests/language_2/double_literals/implicit_double_context_test.dart
index a2cdd02..50842f3 100644
--- a/tests/language_2/double_literals/implicit_double_context_test.dart
+++ b/tests/language_2/double_literals/implicit_double_context_test.dart
@@ -156,8 +156,8 @@
   Expect.identical(18446744073709551616.0, fun6());
   double fun7() => 0x02;
   Expect.identical(2.0, fun7());
-  double fun4() => -0x02;
-  Expect.identical(-120, fun4());
+  double fun8() => -0x02;
+  Expect.identical(-2.0, fun8());
 
   // Inferred return context.
   testFun(0.0, () => 0);
@@ -325,7 +325,7 @@
   Expect.identical(-2.0, tg8);
 
   // Class contexts
-  var c = new C();
+  var c = new C.ci1();
   Expect.identical(0.0, c.v1);
   Expect.identical(1.0, c.v2);
   Expect.identical(-0.0, c.v3);
@@ -476,15 +476,20 @@
   Expect.identical(2.0, value = 0x02);
   Expect.identical(-2.0, value = -0x02);
 
+  // JavaScript platforms represent integers as doubles, so negating them will
+  // result in negative zero, unfortunately.
+  int zero = 0;
+  bool platformHasNegativeZeroInts = (-zero).isNegative;
+
   // Not promoted without a double context.
   num x = -0;
   Expect.identical(0, x);
-  Expect.isFalse(x.isNegative);
+  Expect.equals(x.isNegative, platformHasNegativeZeroInts);
 
   var list = [3.14, 2.17, -0];
   Expect.notType<List<double>>(list);
   Expect.identical(0, list[2]);
-  Expect.isFalse(list[2].isNegative);
+  Expect.equals(list[2].isNegative, platformHasNegativeZeroInts);
 
   // FutureOr<double> also forces double.
   // "Type that int is not assignable to, but double is."
@@ -547,7 +552,7 @@
     // Check that the correct value is used as receiver for the cascade.
     var collector = StringBuffer();
     double tricky = -42
-      ..toString().codeUnits.forEach(collector.addCharCode);
+      ..toString().codeUnits.forEach(collector.writeCharCode);
     Expect.equals("${-42.0}", collector.toString());
   }
 
diff --git a/tests/language_2/instantiate_to_bounds_super_bounded_test.dart b/tests/language_2/instantiate_to_bounds_super_bounded_test.dart
new file mode 100644
index 0000000..7990480
--- /dev/null
+++ b/tests/language_2/instantiate_to_bounds_super_bounded_test.dart
@@ -0,0 +1,143 @@
+// 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.
+
+// Verify that when a super-bounded type is produced by instantiate-to-bounds,
+// it's properly allowed or rejected depending on the context in which it's
+// used.
+
+// Raw `A` will be instantiated to `A<B<dynamic>>`, which is super-bounded.
+class A<T extends B<T>> extends Base {
+  const A();
+}
+
+class B<T> {}
+
+class Base {
+  const Base();
+
+  factory Base.test() = A; //# 01: compile-time error
+}
+
+typedef void OldStyleTypedef<T>();
+
+typedef NewStyleTypedef<T> = void Function();
+
+void genericFunction<T>() {}
+
+mixin Mixin {}
+
+class C {
+  dynamic field;
+
+  void genericMethod<T>() {}
+
+  A test; //# 02: ok
+
+  A test() {} //# 03: ok
+
+  void test(A param()) {} //# 04: ok
+
+  void test(A param) {} //# 05: ok
+
+  void test([A param]) {} //# 06: ok
+
+  void test({A param}) {} //# 07: ok
+
+  C(A param()); //# 08: ok
+
+  C(A this.field); //# 09: ok
+
+  C(A param); //# 10: ok
+
+  C([A param]); //# 11: ok
+
+  C({A param}); //# 12: ok
+}
+
+class Test extends B<A> {} //# 13: ok
+
+class Test extends A {} //# 14: compile-time error
+
+class Test implements A {} //# 15: compile-time error
+
+class Test extends Object with A {} //# 16: compile-time error
+
+class Test = A with Mixin; //# 17: compile-time error
+
+class Test = Object with Mixin implements A; //# 18: compile-time error
+
+class Test = Object with A; //# 19: compile-time error
+
+mixin Test implements A {} //# 20: compile-time error
+
+mixin Test on A {} //# 21: compile-time error
+
+A test; //# 22: ok
+
+A test() {} //# 23: ok
+
+void test(A param()) {} //# 24: ok
+
+void test(A param) {} //# 25: ok
+
+void test([A param]) {} //# 26: ok
+
+void test({A param}) {} //# 27: ok
+
+typedef A Test(); //# 28: ok
+
+typedef void Test(A param()); //# 29: ok
+
+typedef void Test(A param); //# 30: ok
+
+typedef void Test([A param]); //# 31: ok
+
+typedef void Test({A param}); //# 32: ok
+
+typedef Test = A Function(); //# 33: ok
+
+typedef Test = void Function(A param); //# 34: ok
+
+typedef Test = void Function(A); //# 35: ok
+
+typedef Test = void Function([A param]); //# 36: ok
+
+typedef Test = void Function([A]); //# 37: ok
+
+typedef Test = void Function({A param}); //# 38: ok
+
+void f(dynamic x) {
+  void localFunction<T>() {}
+
+  g(x as A); //# 39: ok
+  g(x is A); //# 40: ok
+  try {} on A catch (_) {} //# 41: ok
+  for (A test in [x]) {} //# 42: ok
+  A test; //# 43: ok
+  OldStyleTypedef<A> test; //# 44: ok
+  NewStyleTypedef<A> test; //# 45: ok
+  genericFunction<A>(); //# 46: ok
+  new C().genericMethod<A>(); //# 47: ok
+  localFunction<A>(); //# 48: ok
+  A test() {} //# 49: ok
+  void test(A param()) {} //# 50: ok
+  void test(A param) {} //# 51: ok
+  void test([A param]) {} //# 52: ok
+  void test({A param}) {} //# 53: ok
+  void Function(A param) test; //# 54: ok
+  void Function(A) test; //# 55: ok
+  void Function([A param]) test; //# 56: ok
+  void Function([A]) test; //# 57: ok
+  void Function({A param}) test; //# 58: ok
+  A(); //# 59: compile-time error
+  new A(); //# 60: compile-time error
+  const A(); //# 61: compile-time error
+  const test = A(); //# 62: compile-time error
+}
+
+void g(dynamic x) {}
+
+main() {
+  f(null);
+}
diff --git a/tests/language_2/int64_literal_test.dart b/tests/language_2/int64_literal_test.dart
index 5c54736..e111807 100644
--- a/tests/language_2/int64_literal_test.dart
+++ b/tests/language_2/int64_literal_test.dart
@@ -1,3 +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.
+
 import 'package:expect/expect.dart';
 
 const String realMaxInt64Value = '9223372036854775807';
@@ -7,26 +11,26 @@
 
 main() {
   int minInt64Value = -1 * i21 * i21 * i21;
-  minInt64Value = -9223372036854775807 - 1; /// 01: ok
-  minInt64Value = -9223372036854775808;     /// 02: ok
-  minInt64Value = -(9223372036854775808);   /// 03: compile-time error
-  minInt64Value = -(0x8000000000000000);    /// 04: ok
-  minInt64Value = 0x8000000000000000;       /// 05: ok
-  minInt64Value = -0x8000000000000000;      /// 06: ok
+  minInt64Value = -9223372036854775807 - 1; //# 01: ok
+  minInt64Value = -9223372036854775808;     //# 02: ok
+  minInt64Value = -(9223372036854775808);   //# 03: compile-time error
+  minInt64Value = -(0x8000000000000000);    //# 04: ok
+  minInt64Value = 0x8000000000000000;       //# 05: ok
+  minInt64Value = -0x8000000000000000;      //# 06: ok
 
   Expect.equals('$minInt64Value', realMinInt64Value);
   Expect.equals('${minInt64Value - 1}', realMaxInt64Value);
 
   int maxInt64Value = 1 * i21 * i21 * i21 - 1;
-  maxInt64Value = 9223372036854775807;      /// 11: ok
-  maxInt64Value = 9223372036854775807;      /// 12: ok
-  maxInt64Value = 9223372036854775808 - 1;  /// 13: compile-time error
-  maxInt64Value = -9223372036854775808 - 1; /// 14: ok
-  maxInt64Value = -9223372036854775809;     /// 15: compile-time error
-  maxInt64Value = 0x8000000000000000 - 1;   /// 16: ok
-  maxInt64Value = -0x8000000000000000 - 1;  /// 17: ok
-  maxInt64Value = -0x8000000000000001;      /// 18: compile-time error
-  maxInt64Value = -(0x8000000000000001);    /// 19: ok
+  maxInt64Value = 9223372036854775807;      //# 11: ok
+  maxInt64Value = 9223372036854775807;      //# 12: ok
+  maxInt64Value = 9223372036854775808 - 1;  //# 13: compile-time error
+  maxInt64Value = -9223372036854775808 - 1; //# 14: ok
+  maxInt64Value = -9223372036854775809;     //# 15: compile-time error
+  maxInt64Value = 0x8000000000000000 - 1;   //# 16: ok
+  maxInt64Value = -0x8000000000000000 - 1;  //# 17: ok
+  maxInt64Value = -0x8000000000000001;      //# 18: compile-time error
+  maxInt64Value = -(0x8000000000000001);    //# 19: ok
 
   Expect.equals('$maxInt64Value', realMaxInt64Value);
   Expect.equals('${maxInt64Value + 1}', realMinInt64Value);
diff --git a/tests/language_2/issue34514_test.dart b/tests/language_2/issue34514_test.dart
new file mode 100644
index 0000000..063c500
--- /dev/null
+++ b/tests/language_2/issue34514_test.dart
@@ -0,0 +1,10 @@
+// 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.
+
+// Inferred type should be `int`
+var x = (() => 1)();
+
+main() {
+  /*@compile-error=unspecified*/ x = 'bad'; // `String` not assignable to `int`
+}
diff --git a/tests/language_2/issue34532_test.dart b/tests/language_2/issue34532_test.dart
new file mode 100644
index 0000000..da30e3b
--- /dev/null
+++ b/tests/language_2/issue34532_test.dart
@@ -0,0 +1,12 @@
+// 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.
+
+class Foo<T> {}
+
+class Bar<T extends Foo<T>> {}
+
+// Should be error here, because Bar completes to Bar<Foo>
+class Baz extends /*@compile-error=unspecified*/ Bar {}
+
+void main() {}
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index c8bc2fe..4be92d4 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -6,7 +6,6 @@
 deferred_inheritance_constraints_test/redirecting_constructor: Crash
 
 [ $compiler != compare_analyzer_cfe ]
-bug34235_test/01: MissingCompileTimeError # Issue 34235
 mixin_constructor_forwarding/const_constructor_test/none: CompileTimeError # Issue 32223
 mixin_constructor_forwarding/const_constructor_with_field_test/none: CompileTimeError # Issue 32223
 mixin_constructor_forwarding/optional_named_parameters_test/none: CompileTimeError # Issue 31543
@@ -15,15 +14,6 @@
 [ $compiler != dart2analyzer ]
 switch_case_warn_test: Skip # Analyzer only, see language_analyzer2.status
 
-[ $compiler == dart2js ]
-double_literals/*: Skip # https://github.com/dart-lang/sdk/issues/34356
-invalid_returns/*: Skip # https://github.com/dart-lang/sdk/issues/34011
-mixin_declaration/*: Skip # See https://github.com/dart-lang/language/issues/7
-void/*: Skip # https://github.com/dart-lang/sdk/issues/34011
-
-[ $compiler == fasta ]
-double_literals/*: Skip # https://github.com/dart-lang/sdk/issues/34357
-
 [ $compiler == spec_parser ]
 double_literals/*: Skip # https://github.com/dart-lang/sdk/issues/34355
 invalid_returns/*: Skip # https://github.com/dart-lang/sdk/issues/34015
@@ -48,10 +38,7 @@
 type_checks_in_factory_method_test: SkipByDesign # Requires checked mode.
 
 [ $fasta ]
-mixin_declaration/mixin_declaration_inference_invalid_05_test: MissingCompileTimeError, DartkCrash # https://github.com/dart-lang/sdk/issues/34165
-mixin_declaration/mixin_declaration_inference_invalid_07_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34165
-mixin_declaration/mixin_declaration_inference_invalid_10_test: MissingCompileTimeError, DartkCrash # https://github.com/dart-lang/sdk/issues/34165
-mixin_declaration/mixin_declaration_inference_invalid_11_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34165
+mixin_declaration/mixin_declaration_invalid_syntax_test/none: CompileTimeError # because mixin declarations get (invalid) forwarding constructors
 partial_instantiation_static_bounds_check_test/01: MissingCompileTimeError # Issue 34327
 partial_instantiation_static_bounds_check_test/02: MissingCompileTimeError # Issue 34327
 partial_instantiation_static_bounds_check_test/03: MissingCompileTimeError # Issue 34327
@@ -227,17 +214,11 @@
 [ !$preview_dart_2 && ($runtime == dart_precompiled || $runtime == vm) ]
 *: SkipByDesign # Deprecating all Dart1 modes of execution
 
-[ $compiler == app_jit || $compiler == app_jitk || $compiler == dartk || $compiler == dartkb || $compiler == dartkp || $compiler == none || $compiler == precompiler ]
-double_literals/*: Skip # https://github.com/dart-lang/sdk/issues/34358
-
 [ $compiler == app_jit || $compiler == none ]
 invalid_returns/*: Skip # https://github.com/dart-lang/sdk/issues/34013
 library_env_test/has_no_mirror_support: RuntimeError, OK
 void/*: Skip # https://github.com/dart-lang/sdk/issues/34013
 
-[ $compiler == dartdevc || $compiler == dartdevk ]
-double_literals/*: Skip # https://github.com/dart-lang/sdk/issues/34359
-
 [ $hot_reload || $hot_reload_rollback ]
 cha_deopt1_test: Crash # Requires deferred libraries
 cha_deopt2_test: Crash # Requires deferred libraries
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 65e2302..1a7bb18 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -5,8 +5,6 @@
 # Sections in this file should contain "$compiler == dart2analyzer".
 
 [ $compiler == dart2analyzer ]
-abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue #30568
-abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue #30568
 accessor_conflict_export2_test: CompileTimeError # Issue 25626
 accessor_conflict_export_test: CompileTimeError # Issue 25626
 accessor_conflict_import2_test: CompileTimeError # Issue 25626
@@ -22,11 +20,12 @@
 const_constructor3_test/04: MissingCompileTimeError # Side-effect of working around issue 33441 for int-to-double
 constructor_reference_test/27: MissingCompileTimeError # Issue 34403
 covariant_subtyping_with_mixin_test: CompileTimeError # Issue 34329
-double_literals/implicit_double_context_test: CompileTimeError # Needs triage, see Issue #34444
 dynamic_prefix_core_test/01: MissingCompileTimeError # failing-by-design: #34339
 emit_const_fields_test: CompileTimeError # failing-by-design: #34340
 enum_syntax_test/05: Fail # Issue 34341
 enum_syntax_test/06: Fail # Issue 34341
+f_bounded_quantification2_test: CompileTimeError # Issue 34583
+f_bounded_quantification4_test: CompileTimeError # Issue 34583
 forwarding_stub_tearoff_test: CompileTimeError # Issue 34329
 generic_local_functions_test: CompileTimeError # Issue 28515
 generic_methods_generic_function_parameter_test: CompileTimeError # Issue 28515
@@ -71,8 +70,8 @@
 issue31596_tearoff_test: CompileTimeError # Issue #31596
 issue31596_test: CompileTimeError # Issue #31596
 issue34498_test: MissingCompileTimeError # Issue 34500
+large_class_declaration_test: Slow, Pass
 malformed2_test: Pass, MissingCompileTimeError # Flaky: issue 31056.
-mixin_declaration/mixin_declaration_inference_invalid_07_test: MissingCompileTimeError
 mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError # Issue 30552
 mixin_method_override_test/01: MissingCompileTimeError
 mixin_super_2_test/01: MissingCompileTimeError
@@ -108,8 +107,6 @@
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
 regress_30121_test: CompileTimeError # Issue 31087
 regress_30339_test: CompileTimeError
-regress_32660_test/01: MissingCompileTimeError # Issue #32660.
-regress_32660_test/04: CompileTimeError
 regress_33479_test/01: Crash # Issue #33479
 setter3_test/01: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
 setter3_test/02: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
@@ -142,29 +139,7 @@
 void/return_future_future_or_void_async_error1_test/none: CompileTimeError # issue #34319
 void/return_future_or_future_or_void_sync_error2_test/none: CompileTimeError # issue #34319
 void/return_future_or_void_sync_error4_test/none: CompileTimeError # issue #34319
-void/void_type_usage_test/async_use_in_yield: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/async_use_in_yield_star: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/call_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/call_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/call_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/final_local_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/final_local_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/final_local_for_in2: MissingCompileTimeError
-void/void_type_usage_test/final_local_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/global_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/global_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/global_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/local_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/local_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/local_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/param_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/param_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/param_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/paren_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/paren_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/paren_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/sync_use_in_yield: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/sync_use_in_yield_star: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 web_int_literals_test/01: MissingCompileTimeError
 web_int_literals_test/02: MissingCompileTimeError
 web_int_literals_test/03: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 228a5bd..79e1714 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -77,7 +77,6 @@
 partial_tearoff_instantiation_test/06: Pass # for the wrong reason.
 partial_tearoff_instantiation_test/07: Pass # for the wrong reason.
 partial_tearoff_instantiation_test/08: Pass # for the wrong reason.
-type_alias_equality_test/02: RuntimeError # Issue 32784
 vm/*: SkipByDesign # Tests for the VM.
 
 [ $compiler != dart2js ]
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index c9f79bb..a349516 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -4,8 +4,6 @@
 
 # Sections in this file should contain "$compiler == dartdevc" or dartdevk.
 [ $compiler == dartdevc ]
-abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue #30568
-abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue #30568
 accessor_conflict_export2_test: CompileTimeError # Issue 25626
 accessor_conflict_export_test: CompileTimeError # Issue 25626
 accessor_conflict_import2_test: CompileTimeError # Issue 25626
@@ -48,7 +46,9 @@
 execute_finally6_test: RuntimeError # Issue 29920
 expect_test: RuntimeError # Issue 29920
 export_private_test/01: MissingCompileTimeError # Issue 29920
+f_bounded_quantification2_test: CompileTimeError # Issue 34583
 f_bounded_quantification3_test: RuntimeError # Issue 29920
+f_bounded_quantification4_test: CompileTimeError # Issue 34583
 field_wierd_name_test: Crash
 forwarding_stub_tearoff_generic_test: RuntimeError
 forwarding_stub_tearoff_test: CompileTimeError
@@ -105,12 +105,12 @@
 issue34404_flutter_test: CompileTimeError # DDC doesn't support mixin inference
 issue34498_test: MissingCompileTimeError # Issue 34500
 label_test: RuntimeError
+large_class_declaration_test: Slow, Pass
 left_shift_test: RuntimeError # Ints and doubles are unified.
 mixin_declaration/mixin_declaration_inference_invalid_03_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
 mixin_declaration/mixin_declaration_inference_invalid_04_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
 mixin_declaration/mixin_declaration_inference_invalid_05_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
 mixin_declaration/mixin_declaration_inference_invalid_06_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
-mixin_declaration/mixin_declaration_inference_invalid_07_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
 mixin_declaration/mixin_declaration_inference_invalid_08_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
 mixin_declaration/mixin_declaration_inference_invalid_09_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
 mixin_declaration/mixin_declaration_inference_invalid_10_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34167
@@ -146,7 +146,7 @@
 mixin_declaration/mixin_declaration_inference_valid_C13_test: CompileTimeError # Issue #34164
 mixin_declaration/mixin_declaration_inference_valid_mixin_applications_test: CompileTimeError # https://github.com/dart-lang/sdk/issues/34164
 mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError # Analyzer chooses wrong(?) super method.
-mixin_method_override_test/01: MissingCompileTimeError # Issue 34235
+mixin_method_override_test/01: MissingCompileTimeError
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
 mixin_super_test: RuntimeError
@@ -181,8 +181,6 @@
 regress_29784_test/02: MissingCompileTimeError
 regress_30121_test: CompileTimeError # Issue 31087
 regress_30339_test: CompileTimeError # As expected. Should we make this a multi test?
-regress_32660_test/01: MissingCompileTimeError # Issue #32660.
-regress_32660_test/04: CompileTimeError
 regress_33479_test/01: Crash # Issue #33479
 setter3_test/01: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
 setter3_test/02: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
@@ -202,10 +200,6 @@
 truncdiv_test: RuntimeError # Issue 29920
 try_catch_on_syntax_test/10: MissingCompileTimeError
 try_catch_on_syntax_test/11: MissingCompileTimeError
-type_alias_equality_test/01: RuntimeError # Issue 32785
-type_alias_equality_test/02: RuntimeError # Issue 32785
-type_alias_equality_test/03: RuntimeError # Issue 32785
-type_alias_equality_test/04: RuntimeError # Issue 32785
 type_inference_circularity_test: MissingCompileTimeError
 type_inference_inconsistent_inheritance_test: MissingCompileTimeError
 type_promotion_functions_test/02: CompileTimeError # Issue 30895
@@ -220,29 +214,7 @@
 void/return_future_future_or_void_async_error1_test/none: CompileTimeError # issue #34319
 void/return_future_or_future_or_void_sync_error2_test/none: CompileTimeError # issue #34319
 void/return_future_or_void_sync_error4_test/none: CompileTimeError # issue #34319
-void/void_type_usage_test/async_use_in_yield: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/async_use_in_yield_star: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/call_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/call_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/call_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/final_local_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/final_local_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 void/void_type_usage_test/final_local_for_in2: MissingCompileTimeError
-void/void_type_usage_test/final_local_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/global_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/global_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/global_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/local_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/local_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/local_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/param_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/param_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/param_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/paren_boolean_and_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/paren_boolean_or_right: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/paren_use_in_string_interpolation: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/sync_use_in_yield: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
-void/void_type_usage_test/sync_use_in_yield_star: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/30177
 
 [ $compiler == dartdevk ]
 built_in_identifier_type_annotation_test/dynamic-funarg: RuntimeError # Issue 30450, test name contains hyphen
@@ -267,7 +239,7 @@
 compile_time_constant_static5_test/23: CompileTimeError # Issue 31537
 conditional_import_string_test: CompileTimeError # Test is broken
 conditional_import_test: CompileTimeError # Test is broken
-config_import_test: CompileTimeError
+config_import_test: RuntimeError
 const_cast1_test/02: MissingCompileTimeError
 const_constructor3_test/04: MissingCompileTimeError
 const_constructor_mixin3_test: CompileTimeError # Issue 33644.
@@ -318,26 +290,16 @@
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-mixin_declaration/mixin_declaration_inference_invalid_05_test: MissingCompileTimeError, Crash # https://github.com/dart-lang/sdk/issues/34165
 mixin_declaration/mixin_declaration_inference_invalid_07_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34165
-mixin_declaration/mixin_declaration_inference_invalid_10_test: MissingCompileTimeError, Crash # https://github.com/dart-lang/sdk/issues/34165
-mixin_declaration/mixin_declaration_inference_invalid_11_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/34165
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/03: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/04: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/05: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_override_test/06: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_override_test/07: MissingCompileTimeError
 mixin_declaration/mixin_declaration_invalid_override_test/08: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_superinvocation_test/none: CompileTimeError
 mixin_declaration/mixin_declaration_invalid_syntax_test/none: CompileTimeError
 mixin_declaration/mixin_declaration_invalid_usage_test/03: MissingCompileTimeError
+mixin_declaration/mixin_declaration_subtype_test: RuntimeError
 mixin_declaration/mixin_declaration_superinvocation_application_test/04: MissingCompileTimeError
 mixin_declaration/mixin_declaration_superinvocation_application_test/05: MissingCompileTimeError
 mixin_declaration/mixin_declaration_superinvocation_application_test/06: MissingCompileTimeError
 mixin_declaration/mixin_declaration_superinvocation_application_test/07: MissingCompileTimeError
 mixin_declaration/mixin_declaration_superinvocation_application_test/08: MissingCompileTimeError
-mixin_declaration/mixin_declaration_supertype_compatible_test/none: CompileTimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/04: MissingCompileTimeError
 mixin_illegal_super_use_test/07: MissingCompileTimeError
@@ -408,8 +370,6 @@
 syncstar_yield_test/capturing: RuntimeError
 syncstar_yield_test/copyParameters: RuntimeError # Expect.equals(expected: <2>, actual: <3>) fails.
 try_catch_test/01: MissingCompileTimeError
-type_alias_equality_test/02: RuntimeError # Issue 32785
-type_literal_test: RuntimeError # Expect.equals(expected: <Func>, actual: <(bool) => int>) fails.
 type_promotion_functions_test/02: CompileTimeError # Issue 31537
 type_promotion_functions_test/03: CompileTimeError # Issue 31537
 type_promotion_functions_test/04: CompileTimeError # Issue 31537
@@ -451,7 +411,6 @@
 compile_time_constant_d_test: RuntimeError # Issue 30876; Expect.isTrue(false) fails.
 compile_time_constant_e_test: RuntimeError # Issue 30876; Expect.identical(expected: <A 3 499 99 100>, actual: <A 3 499 99 100>) fails.
 config_import_corelib_test: CompileTimeError
-config_import_test: RuntimeError # Expect.equals(expected: <b>, actual: <a>) fails.
 const_evaluation_test/01: RuntimeError # dart:mirrors not supported in DDC
 const_list_test: RuntimeError # Expect.equals(expected: <false>, actual: <true>) fails.
 const_map4_test: RuntimeError # Expect.equals(expected: <true>, actual: <false>) fails.
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 33a2810..349ebbc 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -84,16 +84,6 @@
 local_function3_test/none: RuntimeError
 local_function_test/none: RuntimeError
 main_test/03: RuntimeError
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/03: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/04: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/05: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_override_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_superinvocation_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_syntax_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_usage_test/03: MissingCompileTimeError
-mixin_declaration/mixin_declaration_superinvocation_application_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_supertype_compatible_test/none: CompileTimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/04: MissingCompileTimeError
 mixin_illegal_super_use_test/07: MissingCompileTimeError
@@ -145,11 +135,9 @@
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
 super_test: RuntimeError
-type_alias_equality_test/02: RuntimeError # Issue 32783
 type_alias_equality_test/03: RuntimeError # Issue 32783
 type_alias_equality_test/04: RuntimeError # Issue 32783
 type_error_test: RuntimeError
-type_literal_test: RuntimeError
 type_promotion_functions_test/02: CompileTimeError
 type_promotion_functions_test/03: CompileTimeError
 type_promotion_functions_test/04: CompileTimeError
@@ -207,16 +195,6 @@
 implicit_creation/implicit_const_not_default_values_test/e5: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e7: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e8: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/03: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/04: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/05: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_override_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_superinvocation_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_syntax_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_usage_test/03: MissingCompileTimeError
-mixin_declaration/mixin_declaration_superinvocation_application_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_supertype_compatible_test/none: CompileTimeError
 vm/regress_33469_test/01: MissingCompileTimeError
 vm/regress_33469_test/02: MissingCompileTimeError
 vm/regress_33469_test/03: MissingCompileTimeError
@@ -237,6 +215,12 @@
 f_bounded_quantification_test/02: MissingCompileTimeError # Issue 33308
 generic_methods_bounds_test/01: MissingCompileTimeError # Issue 33308
 generic_methods_recursive_bound_test/02: MissingCompileTimeError # Issue 33308
+instantiate_to_bounds_super_bounded_test/14: MissingCompileTimeError # Issue 33308
+instantiate_to_bounds_super_bounded_test/15: MissingCompileTimeError # Issue 33308
+instantiate_to_bounds_super_bounded_test/17: MissingCompileTimeError # Issue 33308
+instantiate_to_bounds_super_bounded_test/18: MissingCompileTimeError # Issue 33308
+instantiate_to_bounds_super_bounded_test/20: MissingCompileTimeError # Issue 33308
+instantiate_to_bounds_super_bounded_test/21: MissingCompileTimeError # Issue 33308
 issue31596_super_test/02: MissingCompileTimeError # Issue 31596
 issue31596_super_test/04: MissingCompileTimeError # Issue 31596
 issue34488_test/01: MissingCompileTimeError # Issue 34488
@@ -246,6 +230,7 @@
 issue34488_test/05: MissingCompileTimeError # Issue 34488
 issue34488_test/06: MissingCompileTimeError # Issue 34488
 issue34498_test: MissingCompileTimeError # Issue 34498
+issue34532_test: MissingCompileTimeError # Issue 33308
 malbounded_instantiation_test/01: MissingCompileTimeError # Issue 33308
 malbounded_instantiation_test/02: MissingCompileTimeError # Issue 33308
 malbounded_instantiation_test/03: MissingCompileTimeError # Issue 33308
@@ -261,6 +246,17 @@
 malbounded_type_test_test/00: MissingCompileTimeError # Issue 33308
 malbounded_type_test_test/01: MissingCompileTimeError # Issue 33308
 malbounded_type_test_test/02: MissingCompileTimeError # Issue 33308
+mixin_declaration/mixin_declaration_inference_invalid_07_test: MissingCompileTimeError
+mixin_declaration/mixin_declaration_invalid_application_supertype_test/05: MissingCompileTimeError
+mixin_declaration/mixin_declaration_invalid_application_supertype_test/06: MissingCompileTimeError
+mixin_declaration/mixin_declaration_invalid_application_supertype_test/07: MissingCompileTimeError
+mixin_declaration/mixin_declaration_invalid_override_test/08: MissingCompileTimeError
+mixin_declaration/mixin_declaration_invalid_usage_test/03: MissingCompileTimeError
+mixin_declaration/mixin_declaration_superinvocation_application_test/04: MissingCompileTimeError
+mixin_declaration/mixin_declaration_superinvocation_application_test/05: MissingCompileTimeError
+mixin_declaration/mixin_declaration_superinvocation_application_test/06: MissingCompileTimeError
+mixin_declaration/mixin_declaration_superinvocation_application_test/07: MissingCompileTimeError
+mixin_declaration/mixin_declaration_superinvocation_application_test/08: MissingCompileTimeError
 mixin_invalid_bound2_test/02: MissingCompileTimeError # Issue 33308
 mixin_invalid_bound2_test/03: MissingCompileTimeError # Issue 33308
 mixin_invalid_bound2_test/04: MissingCompileTimeError # Issue 33308
@@ -284,32 +280,7 @@
 mixin_invalid_bound_test/08: MissingCompileTimeError # Issue 33308
 mixin_invalid_bound_test/09: MissingCompileTimeError # Issue 33308
 mixin_invalid_bound_test/10: MissingCompileTimeError # Issue 33308
-mixin_method_override_test/C1: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/C2: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/C3: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/C4: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/C7: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/C8: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/G2: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/G3: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/G4: MissingCompileTimeError # Issue 34235
 mixin_method_override_test/G5: Crash # Issue 34354
-mixin_method_override_test/N10: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/N11: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/N12: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/N13: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/N14: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/N3: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/N4: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/N5: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/N6: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/N9: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/O10: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/O13: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/O14: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/O5: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/O6: MissingCompileTimeError # Issue 34235
-mixin_method_override_test/O9: MissingCompileTimeError # Issue 34235
 mixin_super_bound_test/01: MissingCompileTimeError # Issue 33308
 mixin_super_bound_test/02: MissingCompileTimeError # Issue 33308
 regress_22976_test/*: CompileTimeError # Issue 31935
@@ -330,6 +301,9 @@
 type_variable_bounds_test/04: MissingCompileTimeError # Issue 33308
 type_variable_bounds_test/05: MissingCompileTimeError # Issue 33308
 type_variable_bounds_test/06: MissingCompileTimeError # Issue 33308
+typedef_check_bounds_generic_test: MissingCompileTimeError
+typedef_check_bounds_test: MissingCompileTimeError
+typedef_check_bounds_unused_test: MissingCompileTimeError
 vm/debug_break_enabled_vm_test/01: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
 vm/debug_break_enabled_vm_test/none: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
 vm/regress_27201_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
@@ -392,6 +366,9 @@
 [ $compiler != dart2analyzer && $fasta && !$strong ]
 super_call4_test/01: MissingCompileTimeError
 
+[ $compiler != dart2js && $compiler != dartdevk && $fasta ]
+const_native_factory_test: MissingCompileTimeError # Issue 29763
+
 [ $compiler != dart2js && $fasta ]
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
@@ -418,7 +395,6 @@
 const_dynamic_type_literal_test/02: Pass
 map_literal3_test/01: Pass
 map_literal3_test/02: Pass
-type_alias_equality_test/02: RuntimeError # Issue 32783
 vm/bool_check_stack_traces_test/01: RuntimeError # No support for line numbers in stacktraces
 vm/bool_check_stack_traces_test/none: RuntimeError # No support for line numbers in stacktraces
 vm/causal_async_exception_stack2_test: RuntimeError # No support for line numbers in stacktraces
@@ -446,7 +422,6 @@
 vm/type_vm_test/36: MissingRuntimeError
 
 [ $compiler == dartkp && $runtime == dart_precompiled ]
-type_alias_equality_test/02: RuntimeError # Issue 32783
 type_alias_equality_test/03: RuntimeError # Issue 32783
 type_alias_equality_test/04: RuntimeError # Issue 32783
 vm/bool_check_stack_traces_test/01: RuntimeError # Issue 33584
@@ -695,7 +670,6 @@
 super_bound_closure_test/none: CompileTimeError # Issue 31533
 super_test: Fail, OK
 syntax_test/00: MissingCompileTimeError
-type_literal_test: RuntimeError
 type_promotion_functions_test/02: CompileTimeError # Issue 31537
 type_promotion_functions_test/03: CompileTimeError # Issue 31537
 type_promotion_functions_test/04: CompileTimeError # Issue 31537
@@ -741,6 +715,9 @@
 vm/type_vm_test/31: MissingRuntimeError
 vm/type_vm_test/32: MissingRuntimeError
 
+[ $compiler == dartkp && $system == windows ]
+disassemble_test: Pass, Slow
+
 [ $compiler == dartkp && $minified ]
 no_such_method_native_test: RuntimeError # Compares symbol #foobar with string "foobar" in noSuchMethod
 recursive_generic_test: RuntimeError # Compares a (dynamic) toString call to 'C<D>'
@@ -756,7 +733,6 @@
 conditional_import_string_test: CompileTimeError
 conditional_import_test: CompileTimeError
 config_import_corelib_test: CompileTimeError
-config_import_test: Crash
 const_constructor3_test/04: MissingCompileTimeError
 constants_test/05: MissingCompileTimeError
 deferred_load_library_wrong_args_test/01: CompileTimeError
@@ -1080,28 +1056,18 @@
 async_star_test/01: Crash
 async_star_test/05: Crash
 
-[ $mode == debug && $hot_reload_rollback && ($compiler == dartk || $compiler == dartkb) ]
-enum_test: Crash
-
 [ $mode == debug && ($compiler == dartk || $compiler == dartkb) && ($hot_reload || $hot_reload_rollback) ]
-enum_duplicate_test/01: Pass, Crash
+enum_duplicate_test/01: Pass, Crash # Issue 34606
+enum_duplicate_test/02: Crash # Issue 34606
+enum_duplicate_test/none: Crash # Issue 34606
+enum_private_test/01: Crash # Issue 34606
+enum_test: Crash # Issue 34606
 
 [ $mode == product && $runtime == vm && ($compiler == dartk || $compiler == dartkb) ]
-deferred_load_constants_test/02: Fail
-deferred_load_constants_test/03: Fail
-deferred_load_constants_test/05: Fail
 deferred_not_loaded_check_test: CompileTimeError
 vm/causal_async_exception_stack2_test: SkipByDesign
 vm/causal_async_exception_stack_test: SkipByDesign
-vm/type_vm_test/28: MissingRuntimeError
 vm/type_vm_test/29: MissingRuntimeError
-vm/type_vm_test/30: MissingRuntimeError
-vm/type_vm_test/31: MissingRuntimeError
-vm/type_vm_test/32: MissingRuntimeError
-vm/type_vm_test/33: MissingRuntimeError
-vm/type_vm_test/34: MissingRuntimeError
-vm/type_vm_test/35: MissingRuntimeError
-vm/type_vm_test/36: MissingRuntimeError
 
 [ $runtime == vm && $checked && $strong && ($compiler == dartk || $compiler == dartkb) ]
 assert_initializer_test/31: MissingCompileTimeError # KernelVM bug: Constant evaluation.
@@ -1247,7 +1213,6 @@
 super_bound_closure_test/none: CompileTimeError # Issue 31533
 super_call4_test/01: MissingCompileTimeError
 super_test: Fail, OK
-type_literal_test: RuntimeError
 type_promotion_functions_test/02: CompileTimeError # Issue 31537
 type_promotion_functions_test/03: CompileTimeError # Issue 31537
 type_promotion_functions_test/04: CompileTimeError # Issue 31537
@@ -1424,7 +1389,6 @@
 conditional_property_increment_decrement_test/34: MissingCompileTimeError
 conditional_property_increment_decrement_test/39: MissingCompileTimeError
 conditional_property_increment_decrement_test/40: MissingCompileTimeError
-config_import_test: Crash
 const_conditional_test/08: MissingCompileTimeError
 const_constructor2_test/05: MissingCompileTimeError
 const_constructor2_test/06: MissingCompileTimeError
@@ -2096,7 +2060,6 @@
 
 [ ($compiler == app_jitk || $compiler == dartk || $compiler == dartkp) && ($runtime == dart_precompiled || $runtime == vm) ]
 covariant_subtyping_with_mixin_test: RuntimeError # Issue 34321
-type_alias_equality_test/02: RuntimeError # Issue 32783
 type_alias_equality_test/03: RuntimeError # Issue 32783
 type_alias_equality_test/04: RuntimeError # Issue 32783
 
@@ -2111,13 +2074,3 @@
 [ $compiler == dartk || $compiler == dartkb || $compiler == dartkp ]
 generic_function_bounds_test: RuntimeError # Issue 32076
 generic_test/01: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/03: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/04: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_application_supertype_test/05: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_override_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_superinvocation_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_syntax_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_invalid_usage_test/03: MissingCompileTimeError
-mixin_declaration/mixin_declaration_superinvocation_application_test/none: CompileTimeError
-mixin_declaration/mixin_declaration_supertype_compatible_test/none: CompileTimeError
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_invalid_application_supertype_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_invalid_application_supertype_test.dart
index 584003c..08e33a6 100644
--- a/tests/language_2/mixin_declaration/mixin_declaration_invalid_application_supertype_test.dart
+++ b/tests/language_2/mixin_declaration/mixin_declaration_invalid_application_supertype_test.dart
@@ -26,6 +26,14 @@
 class _ = UnaryInt with M2;  //# 04: compile-time error
 class _ = UnaryNum with M2;  //# 05: compile-time error
 
+// Note that it is not sufficient for the application to declare that it
+// implements the super-interface.
+abstract class _ = Object with M1 implements UnaryNum;  //# 06: compile-time error
+
+// Nor is it sufficient, in the case of an anonymous mixin application, for the
+// containing class to declare that it implements the super-interface.
+abstract class _ extends Object with M1 implements UnaryNum {}  //# 07: compile-time error
+
 main() {
   // M1 and M2 are valid types.
   Expect.notType<M1>(null);
diff --git a/tests/language_2/mixin_declaration/mixin_declaration_syntax_test.dart b/tests/language_2/mixin_declaration/mixin_declaration_syntax_test.dart
index b87284a..9bfc38f 100644
--- a/tests/language_2/mixin_declaration/mixin_declaration_syntax_test.dart
+++ b/tests/language_2/mixin_declaration/mixin_declaration_syntax_test.dart
@@ -191,7 +191,7 @@
 
 // Concrete subclass of abstract mixin appliction
 class COaMiIJ extends OaMiIJ {
-  String toString() => "${super.toString()}:$COaMiIJ";
+  String toString() => "${super.toString()}:COaMiIJ";
   String methodI() => "COaMiIJ:${this}.I";
   String methodJ() => "COaMiIJ:${this}.J";
 }
@@ -201,7 +201,7 @@
 
 // Concrete subclass of abstract mixin appliction
 class COaMiIJ_2 extends OaMiIJ_2 {
-  String toString() => "${super.toString()}:$COaMiIJ";
+  String toString() => "${super.toString()}:COaMiIJ";
   String methodI() => "COaMiIJ:${this}.I";
   String methodJ() => "COaMiIJ:${this}.J";
 }
@@ -332,7 +332,7 @@
       Expect.type<MBC>(o);
       Expect.equals("BC&MBC", "$o");
       Expect.equals("MBC:$o.MBC", o.methodMBC());
-      Expect.equals("MBC:$o.A->BC:$o.A->C:$o.A->$A:$o.A", o.methodA());
+      Expect.equals("MBC:$o.A->BC:$o.A->C:$o.A->A:$o.A", o.methodA());
       Expect.equals("MBC:$o.B->BC:$o.B", o.methodB());
       Expect.equals("MBC:$o.C->BC:$o.C->C:$o.C", o.methodC());
     }
@@ -346,7 +346,7 @@
       Expect.equals("A&MAiBC&MBC", "$o");
       Expect.equals("MBC:$o.MBC", (o as MBC).methodMBC());
       Expect.equals("MAiBC:$o.MAiBC", o.methodMAiBC());
-      Expect.equals("MBC:$o.A->MAiBC:$o.A->$A:$o.A", o.methodA());
+      Expect.equals("MBC:$o.A->MAiBC:$o.A->A:$o.A", o.methodA());
       Expect.equals("MBC:$o.B->MAiBC:$o.B", o.methodB());
       Expect.equals("MBC:$o.C->MAiBC:$o.C", o.methodC());
     }
@@ -360,7 +360,7 @@
       Expect.type<J>(o);
       Expect.equals("BC&MBCiIJ", "$o");
       Expect.equals("MBCiIJ:$o.MBCiIJ", o.methodMBCiIJ());
-      Expect.equals("MBCiIJ:$o.A->BC:$o.A->C:$o.A->$A:$o.A", o.methodA());
+      Expect.equals("MBCiIJ:$o.A->BC:$o.A->C:$o.A->A:$o.A", o.methodA());
       Expect.equals("MBCiIJ:$o.B->BC:$o.B", o.methodB());
       Expect.equals("MBCiIJ:$o.C->BC:$o.C->C:$o.C", o.methodC());
       Expect.equals("MBCiIJ:$o.I", o.methodI());
@@ -378,7 +378,7 @@
       Expect.equals("A&MAiBC&MBCiIJ", "$o");
       Expect.equals("MBCiIJ:$o.MBCiIJ", o.methodMBCiIJ());
       Expect.equals("MAiBC:$o.MAiBC", (o as CAaMAiBC).methodMAiBC());
-      Expect.equals("MBCiIJ:$o.A->MAiBC:$o.A->$A:$o.A", o.methodA());
+      Expect.equals("MBCiIJ:$o.A->MAiBC:$o.A->A:$o.A", o.methodA());
       Expect.equals("MBCiIJ:$o.B->MAiBC:$o.B", o.methodB());
       Expect.equals("MBCiIJ:$o.C->MAiBC:$o.C", o.methodC());
       Expect.equals("MBCiIJ:$o.I", o.methodI());
diff --git a/tests/language_2/mixin_deduplication_test.dart b/tests/language_2/mixin_deduplication_test.dart
new file mode 100644
index 0000000..f401bf1
--- /dev/null
+++ b/tests/language_2/mixin_deduplication_test.dart
@@ -0,0 +1,46 @@
+// 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 mixin de-duplication with new mixin syntax.
+
+import 'package:expect/expect.dart';
+
+class A {
+  int foo() => 1;
+}
+
+class B {
+  int bar() => 2;
+}
+
+abstract class C implements A, B {
+}
+
+mixin M1 on A, B {
+  int sum() => foo() + bar();
+}
+
+mixin M2 on A, B, M1 {
+  int sumX2() => sum()*2;
+}
+
+class X extends C with M1, M2 {
+  int foo() => 4;
+  int bar() => 5;
+}
+
+class Y extends C with M1, M2 {
+  int foo() => 7;
+  int bar() => 10;
+}
+
+X x = new X();
+Y y = new Y();
+
+void main() {
+  Expect.equals(9, x.sum());
+  Expect.equals(18, x.sumX2());
+  Expect.equals(17, y.sum());
+  Expect.equals(34, y.sumX2());
+}
diff --git a/tests/language_2/mixin_interface_check_test.dart b/tests/language_2/mixin_interface_check_test.dart
new file mode 100644
index 0000000..b174f5e
--- /dev/null
+++ b/tests/language_2/mixin_interface_check_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+class Thing {}
+
+class SubThing extends Thing {
+  void sub() {}
+}
+
+class A {
+  Thing get thing => new Thing();
+}
+
+abstract class B implements A {
+  @override
+  SubThing get thing;
+}
+
+class C extends A //
+    with //# mixin: compile-time error
+        B //# mixin: continued
+{}
+
+main() {
+  new C()
+          .thing //
+          .sub() //# mixin: continued
+      ;
+}
diff --git a/tests/language_2/regress_34392_test.dart b/tests/language_2/regress_34392_test.dart
new file mode 100644
index 0000000..286d8e1
--- /dev/null
+++ b/tests/language_2/regress_34392_test.dart
@@ -0,0 +1,19 @@
+// 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.
+
+abstract class I {
+  foo([a]);
+}
+
+abstract class A {
+  foo() {}
+}
+
+abstract class B extends A implements I {}
+
+class C extends B {
+  foo([a]) {}
+}
+
+void main() {}
diff --git a/tests/language_2/type_alias_equality_test.dart b/tests/language_2/type_alias_equality_test.dart
index 18b055d..7ee087a 100644
--- a/tests/language_2/type_alias_equality_test.dart
+++ b/tests/language_2/type_alias_equality_test.dart
@@ -10,7 +10,7 @@
 
 typedef F1 = void Function(int);
 typedef F2 = void Function(int);
-typedef void F3(int);
+typedef void F3(int x);
 
 typedef G1 = X Function<X>(X);
 typedef G2 = X Function<X>(X);
diff --git a/tests/language_2/type_literal_test.dart b/tests/language_2/type_literal_test.dart
index 37e59d1..c21c95a 100644
--- a/tests/language_2/type_literal_test.dart
+++ b/tests/language_2/type_literal_test.dart
@@ -21,8 +21,23 @@
 
 class G<A, B> {}
 
+/// A typedef that defines a non-generic function type.
 typedef int Func(bool b);
-typedef int GenericFunc<T>(T t);
+
+/// Semantically identical to [Func], but using the Dart 2 syntax.
+typedef Func2 = int Function(bool);
+
+/// A typedef that defines a generic function type.
+typedef GenericFunc = int Function<T>(T);
+
+/// A typedef with a type paramter that defines a non-generic function type.
+typedef int GenericTypedef<T>(T t);
+
+/// Semantically identical to [GenericTypedef], but using the Dart 2 syntax.
+typedef GenericTypedef2<T> = int Function(T);
+
+/// A typedef with a type paramter that defines a generic function type.
+typedef GenericTypedefAndFunc<S> = S Function<T>(T);
 
 main() {
   // Primitive types.
@@ -38,17 +53,28 @@
   testType(Foo, "Foo");
 
   // Generic classes.
-  testType(Box, "Box", "<dynamic>");
+  testType(Box, ["Box", "Box<dynamic>"]);
   testType(new Box<Foo>().typeArg, "Foo");
   testType(new Box<dynamic>().typeArg, "dynamic");
   testType(new Box<Box<Foo>>().typeArg, "Box<Foo>");
-  testType(G, "G", "<dynamic, dynamic>");
+  testType(G, ["G", "G<dynamic, dynamic>"]);
   testType(new Box<G<int, String>>().typeArg, "G<int, String>");
 
   // Typedef.
-  testType(Func, "Func");
-  testType(GenericFunc, "GenericFunc", "<dynamic>");
-  testType(new Box<GenericFunc<int>>().typeArg, "GenericFunc<int>");
+  testType(Func, ["Func", "(bool) => int"]);
+  testType(Func2, ["Func2", "(bool) => int"]);
+  testType(GenericTypedef,
+      ["GenericTypedef", "GenericTypedef<dynamic>", "(dynamic) => int"]);
+  testType(GenericTypedef2,
+      ["GenericTypedef2", "GenericTypedef2<dynamic>", "(dynamic) => int"]);
+  testType(new Box<GenericTypedef<int>>().typeArg,
+      ["GenericTypedef<int>", "(int) => int"]);
+  testType(GenericFunc, ["GenericFunc", "<T>(T) => int"]);
+  testType(GenericTypedefAndFunc, [
+    "GenericTypedefAndFunc",
+    "GenericTypedefAndFunc<dynamic>",
+    "<T>(T) => dynamic"
+  ]);
 
   // Literals are canonicalized.
   Expect.identical(Foo, Foo);
@@ -70,14 +96,13 @@
   Expect.equals("result", prefix.Foo.method());
 }
 
-void testType(Type type, String string, [String genericArgs]) {
-  if (genericArgs != null) {
+void testType(Type type, Object expectedToStringValues) {
+  if (expectedToStringValues is List) {
     var s = type.toString();
-    Expect.isTrue(
-        s == string || s == '$string$genericArgs',
-        'type `$type`.toString() should be `$string`, '
-        'optionally with $genericArgs suffix.');
+    Expect.isTrue(expectedToStringValues.contains(s),
+        'type `$type`.toString() should be one of: $expectedToStringValues.');
   } else {
+    var string = expectedToStringValues as String;
     Expect.equals(string, type.toString());
   }
   Expect.isTrue(type is Type);
diff --git a/tests/language_2/typedef_check_bounds_generic_test.dart b/tests/language_2/typedef_check_bounds_generic_test.dart
new file mode 100644
index 0000000..cc28dae
--- /dev/null
+++ b/tests/language_2/typedef_check_bounds_generic_test.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.
+
+// Check that typedef type parameters are verified to satisfy their bounds.
+
+typedef F<T extends num> = T Function<U>(T x);
+
+void g(/*@compile-error=unspecified*/ F<String> f) {}
+
+main() {
+  g(null);
+}
diff --git a/tests/language_2/typedef_check_bounds_test.dart b/tests/language_2/typedef_check_bounds_test.dart
new file mode 100644
index 0000000..e1a411e
--- /dev/null
+++ b/tests/language_2/typedef_check_bounds_test.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.
+
+// Check that typedef type parameters are verified to satisfy their bounds.
+
+typedef T F<T extends num>(T x);
+
+void g(/*@compile-error=unspecified*/ F<String> f) {}
+
+main() {
+  g(null);
+}
diff --git a/tests/language_2/typedef_check_bounds_unused_test.dart b/tests/language_2/typedef_check_bounds_unused_test.dart
new file mode 100644
index 0000000..247b004
--- /dev/null
+++ b/tests/language_2/typedef_check_bounds_unused_test.dart
@@ -0,0 +1,14 @@
+// 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.
+
+// Check that typedef type parameters are verified to satisfy their bounds, even
+// if the type parameter in question isn't used by the typedef.
+
+typedef void F<T extends num>();
+
+void g(/*@compile-error=unspecified*/ F<String> f) {}
+
+main() {
+  g(null);
+}
diff --git a/tests/language_2/vm/regress_34644_test.dart b/tests/language_2/vm/regress_34644_test.dart
new file mode 100644
index 0000000..24f8cf8
--- /dev/null
+++ b/tests/language_2/vm/regress_34644_test.dart
@@ -0,0 +1,34 @@
+// 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 verifies that annotations on parameters are correctly handled
+// in the tree shaker.
+// Regression test for https://github.com/dart-lang/sdk/issues/34644.
+
+class ClassUsedInAnnotation1 {
+  const ClassUsedInAnnotation1();
+}
+
+class ClassUsedInAnnotation2 {
+  const ClassUsedInAnnotation2();
+}
+
+abstract class B {
+  void foo(@ClassUsedInAnnotation1() String param);
+}
+
+class C implements B {
+  void foo(String param) {}
+}
+
+typedef void Foo(@ClassUsedInAnnotation2() String param);
+
+B x = new C();
+
+void main() {
+  x.foo("hi");
+
+  Foo y = x.foo;
+  y("hello");
+}
diff --git a/tests/language_2/vm/regress_flutter_22131_test.dart b/tests/language_2/vm/regress_flutter_22131_test.dart
new file mode 100644
index 0000000..e9e2bb7
--- /dev/null
+++ b/tests/language_2/vm/regress_flutter_22131_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// Verifies that inferred type of a final field takes constant objects into
+// account. This is a regression test for
+// https://github.com/flutter/flutter/issues/22131.
+
+// VMOptions=--no_background_compilation --optimization_counter_threshold=10
+
+import "package:expect/expect.dart";
+
+class X {
+  final Map<int, String> data;
+  const X(this.data);
+}
+
+const f = X({1: "ok-f"});
+final g = X({1: "ok-g"});
+
+void doTest() {
+  Expect.equals("ok-f", f.data[1]);
+  Expect.equals("ok-g", g.data[1]);
+}
+
+void main() {
+  for (int i = 0; i < 20; i++) {
+    doTest();
+  }
+}
diff --git a/tests/language_2/vm/tree_shake_type_args_in_constant_test.dart b/tests/language_2/vm/tree_shake_type_args_in_constant_test.dart
new file mode 100644
index 0000000..09b9197
--- /dev/null
+++ b/tests/language_2/vm/tree_shake_type_args_in_constant_test.dart
@@ -0,0 +1,20 @@
+// 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 verifies that if a class is only used as a type argument of
+// a constant object, it is not removed by tree shaker.
+
+import "package:expect/expect.dart";
+
+abstract class A {}
+
+class B<T> {
+  const B();
+  toString() => T.toString();
+}
+
+void main() {
+  const x = const B<A>();
+  Expect.equals("A", x.toString());
+}
diff --git a/tests/lib_2/html/mirrors_js_typed_interop_test.dart b/tests/lib_2/html/mirrors_js_typed_interop_test.dart
index e4358a7..22a43b3 100644
--- a/tests/lib_2/html/mirrors_js_typed_interop_test.dart
+++ b/tests/lib_2/html/mirrors_js_typed_interop_test.dart
@@ -47,4 +47,14 @@
     expect(() => reflect(f).setField(#x, 123), throws);
     expect(f.x, 3);
   });
+
+  test('generic function metadata', () {
+    // TODO(jmesserly): this test is not related to JS interop, but this is the
+    // only test we have for DDC's deprecated --emit-metadata flag.
+    expect(testGenericFunctionMetadata(42), int);
+    var testFn = testGenericFunctionMetadata;
+    expect(reflect(testFn).type.reflectedType, testFn.runtimeType); //# 01: ok
+  });
 }
+
+Type testGenericFunctionMetadata<T>(T _) => T;
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 035de4d..44d8af1 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -30,7 +30,8 @@
 html/js_typed_interop_default_arg_test/explicit_argument: RuntimeError
 html/js_typed_interop_side_cast_exp_test: Pass, RuntimeError # Roll 50 failure
 html/js_typed_interop_test: RuntimeError
-html/mirrors_js_typed_interop_test: Pass, Slow
+html/mirrors_js_typed_interop_test/01: SkipByDesign # Mirrors not supported on web in Dart 2.0.
+html/mirrors_js_typed_interop_test/none: Pass, Slow
 html/svgelement_test/PathElement: Pass, RuntimeError # Roll 50 failure
 html/worker_api_test: SkipByDesign
 html/wrapping_collections_test: SkipByDesign # Testing an issue that is only relevant to Dartium
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 8bdc706..04c296a 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -26,7 +26,6 @@
 html/*: Skip # TODO(ahe): Make dart:html available.
 isolate/browser/*: Skip # TODO(ahe): Make dart:html available.
 js/*: Skip # TODO(ahe): Make dart:js available.
-mirrors/repeated_private_anon_mixin_app_test: CompileTimeError # Two libraries with same name inported.
 
 [ $fasta ]
 mirrors/deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
@@ -71,10 +70,11 @@
 # The failures below still need to be investigated and possibly fixed, or marked as skipped.
 [ $compiler == dartkb && $strong ]
 convert/streamed_conversion_json_utf8_decode_test: Pass, Timeout # Please triage.
-io/file_lock_test: Pass, Timeout # Please triage.
-isolate/isolate_complex_messages_test: Pass, Crash # Non-canonical type arguments.
-isolate/mandel_isolate_test: Pass, Timeout, Crash # Please triage.
-isolate/spawn_uri_exported_main_test: Pass, RuntimeError # 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/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
 
@@ -205,7 +205,7 @@
 mirrors/relation_assignable_test: RuntimeError
 mirrors/relation_subclass_test: RuntimeError
 mirrors/relation_subtype_test: RuntimeError
-mirrors/repeated_private_anon_mixin_app_test: CompileTimeError # Two libraries with same name inported.
+mirrors/repeated_private_anon_mixin_app_test: RuntimeError # Mangled mixin application class name
 mirrors/static_members_easier_test: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/static_members_test: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/symbol_validation_test/01: RuntimeError # Issue 31537
diff --git a/tests/standalone/script_snapshot_depfile_test.dart b/tests/standalone/script_snapshot_depfile_test.dart
deleted file mode 100644
index 3bcd2ec..0000000
--- a/tests/standalone/script_snapshot_depfile_test.dart
+++ /dev/null
@@ -1,53 +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 "dart:io";
-
-void main(List<String> args) {
-  if (args.contains("--child")) {
-    print("Hello, pre-scanned world!");
-  } else {
-    generateSnapshot();
-  }
-}
-
-void generateSnapshot() {
-  var tempDir = Directory.systemTemp.createTempSync("script-snapshot");
-  var snapshotPath = tempDir.uri.resolve("hello.snapshot").toFilePath();
-  var depfilePath = tempDir.uri.resolve("hello.snapshot.d").toFilePath();
-  var scriptPath = Platform.script.toFilePath();
-
-  var exec = Platform.resolvedExecutable;
-  var args = new List();
-  args.addAll(Platform.executableArguments);
-  args.add("--snapshot=$snapshotPath");
-  args.add("--snapshot-depfile=$depfilePath");
-  args.add(scriptPath);
-  args.add("--child");
-  var result = Process.runSync(exec, args);
-
-  print("Exit code: ${result.exitCode}");
-  print("stdout:");
-  print(result.stdout);
-  print("stderr:");
-  print(result.stderr);
-
-  if (result.exitCode != 0) {
-    throw "Bad exit code: ${result.exitCode}";
-  }
-
-  var depfileContents = new File(depfilePath).readAsStringSync();
-  print("depfile:");
-  print(depfileContents);
-  if (!depfileContents.contains(snapshotPath)) {
-    print("snapshotPath:");
-    print(snapshotPath);
-    throw "Missing snapshot path";
-  }
-  if (!depfileContents.contains(scriptPath)) {
-    print("scriptPath:");
-    print(scriptPath);
-    throw "Missing script path";
-  }
-}
diff --git a/tests/standalone/script_snapshot_not_executed_test.dart b/tests/standalone/script_snapshot_not_executed_test.dart
deleted file mode 100644
index f002270..0000000
--- a/tests/standalone/script_snapshot_not_executed_test.dart
+++ /dev/null
@@ -1,51 +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 "dart:io";
-
-void main(List<String> args) {
-  if (args.contains("--child")) {
-    print("Hello, pre-scanned world!");
-  } else {
-    runSnapshot(generateSnapshot());
-  }
-}
-
-generateSnapshot() {
-  var tempDir = Directory.systemTemp.createTempSync("script-snapshot");
-  var snapshotPath = tempDir.uri.resolve("hello.snapshot").toFilePath();
-
-  var exec = Platform.resolvedExecutable;
-  var args = new List();
-  args.addAll(Platform.executableArguments);
-  args.add("--snapshot=$snapshotPath");
-  args.add(Platform.script.toFilePath());
-  args.add("--child");
-  var result = Process.runSync(exec, args);
-  if (result.exitCode != 0) {
-    throw "Bad exit code: ${result.exitCode}";
-  }
-  if (result.stdout.contains("Hello, pre-scanned world!")) {
-    print(result.stdout);
-    throw "Should not have run the script.";
-  }
-
-  return snapshotPath;
-}
-
-runSnapshot(var snapshotPath) {
-  var exec = Platform.resolvedExecutable;
-  var args = new List();
-  args.addAll(Platform.executableArguments);
-  args.add(snapshotPath);
-  args.add("--child");
-  var result = Process.runSync(exec, args);
-  if (result.exitCode != 0) {
-    throw "Bad exit code: ${result.exitCode}";
-  }
-  if (!result.stdout.contains("Hello, pre-scanned world!")) {
-    print(result.stdout);
-    throw "Failed to run the snapshot.";
-  }
-}
diff --git a/tests/standalone_2/app_snapshot_share_test.dart b/tests/standalone_2/app_snapshot_share_test.dart
index 27b6cb2..27ef93d 100644
--- a/tests/standalone_2/app_snapshot_share_test.dart
+++ b/tests/standalone_2/app_snapshot_share_test.dart
@@ -32,8 +32,6 @@
   try {
     args = <String>[
       '--aot',
-      '--strong-mode',
-      '--sync-async',
       '--platform=$buildDir/vm_platform_strong.dill',
       '-o',
       scriptPathDill,
@@ -42,25 +40,21 @@
     runSync("pkg/vm/tool/gen_kernel${Platform.isWindows ? '.bat' : ''}", args);
 
     args = <String>[
-      "--strong",
       "--deterministic",
-      "--use-blobs",
-      "--snapshot-kind=app-aot",
-      "--snapshot=$snapshot1Path",
+      "--snapshot-kind=app-aot-blobs",
+      "--blobs_container_filename=$snapshot1Path",
       scriptPathDill,
     ];
-    runSync("$buildDir/dart_bootstrap", args);
+    runSync("$buildDir/gen_snapshot", args);
 
     args = <String>[
-      "--strong",
       "--deterministic",
-      "--use-blobs",
-      "--snapshot-kind=app-aot",
-      "--snapshot=$snapshot2Path",
+      "--snapshot-kind=app-aot-blobs",
+      "--blobs_container_filename=$snapshot2Path",
       "--shared-blobs=$snapshot1Path",
       scriptPathDill,
     ];
-    runSync("$buildDir/dart_bootstrap", args);
+    runSync("$buildDir/gen_snapshot", args);
 
     var sizeWithoutSharing = new File(snapshot1Path).statSync().size;
     var deltaWhenSharing = new File(snapshot2Path).statSync().size;
@@ -71,7 +65,6 @@
     }
 
     args = <String>[
-      "--strong",
       "--shared-blobs=$snapshot1Path",
       snapshot2Path,
       "--child",
diff --git a/tests/standalone_2/io/process_stderr_test.dart b/tests/standalone_2/io/process_stderr_test.dart
index b568c8a..3ea157a 100644
--- a/tests/standalone_2/io/process_stderr_test.dart
+++ b/tests/standalone_2/io/process_stderr_test.dart
@@ -30,8 +30,10 @@
 
     void readData(List<int> data) {
       buffer.addAll(data);
-      for (int i = received; i < min(data.length, buffer.length) - 1; i++) {
-        Expect.equals(data[i], buffer[i]);
+      for (int i = received;
+          i < min(input_data.length, buffer.length) - 1;
+          i++) {
+        Expect.equals(input_data[i], buffer[i]);
       }
       received = buffer.length;
       if (received >= input_dataSize) {
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 011c128..8bfe26f 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -38,11 +38,12 @@
 deferred_transitive_import_error_test: CompileTimeError
 package/package1_test: CompileTimeError
 package/package_test: CompileTimeError
+package/scenarios/invalid/invalid_utf8_test: CompileTimeError
+package/scenarios/invalid/non_existent_packages_file_test: CompileTimeError
 package/scenarios/invalid/same_package_twice_test: CompileTimeError
 
-[ $arch != simarm && $arch != simarm64 && $arch != simdbc64 && $compiler != dartkb && $fasta ]
-package/scenarios/invalid/invalid_utf8_test: CompileTimeError # Issue 32085
-package/scenarios/invalid/non_existent_packages_file_test: CompileTimeError # Issue 32085
+[ $arch == ia32 && $compiler == dartk && $strong ]
+io/dart_std_io_pipe_test: Timeout, Pass # Issue 34723
 
 [ $arch == simarm64 && $strong && ($compiler == dartk || $compiler == dartkb) ]
 io/http_bind_test: Pass, Slow
@@ -55,24 +56,22 @@
 
 # The failures below still need to be investigated and possibly fixed, or marked as skipped.
 [ $compiler == dartkb && $strong ]
-io/dart_std_io_pipe_test: Pass, Crash # Trap bytecode encountered.
-io/file_lock_test: Pass, Crash # Trap bytecode encountered.
+io/dart_std_io_pipe_test: Pass, Timeout # Please triage.
 io/http_advanced_test: Pass, RuntimeError # Please triage.
 io/http_client_connect_test: Pass, RuntimeError # Please triage.
+io/http_keep_alive_test: Pass, RuntimeError # Please triage: NoSuchMethodError: The method 'close' was called on null.
 io/http_outgoing_size_test: Pass, RuntimeError # Please triage.
+io/http_server_test: Pass, RuntimeError # Please triage: NoSuchMethodError: The method 'call' was called on null.
+io/http_shutdown_test: Pass, RuntimeError # Please triage: NoSuchMethodError: The method 'call' was called on null.
 io/platform_test: RuntimeError # Platform.script points to dill file.
-io/process_sync_test: Pass, Crash # Bytecode compilation.
 io/test_extension_fail_test: RuntimeError # Platform.script points to dill file.
 io/test_extension_test: RuntimeError # Platform.script points to dill file.
-io/web_socket_compression_test: Pass, RuntimeError # Please triage.
+io/web_socket_compression_test: Pass, RuntimeError # Please triage: NoSuchMethodError: The method 'call' was called on null.
 io/web_socket_ping_test: Pass, RuntimeError # Please triage.
 io/web_socket_protocol_test: Pass, RuntimeError # Please triage.
+io/web_socket_test: Pass, RuntimeError # Please triage: NoSuchMethodError: The getter '_httpConnection' was called on null; NoSuchMethodError: The getter 'scheme' was called on null.
 io/web_socket_typed_data_test: Pass, RuntimeError # Please triage.
 no_lazy_dispatchers_test: SkipByDesign # KBC interpreter doesn't support --no_lazy_dispatchers
-package/scenarios/packages_file_strange_formatting/empty_lines_test: CompileTimeError # Please triage.
-package/scenarios/packages_file_strange_formatting/mixed_line_ends_test: CompileTimeError # Please triage.
-package/scenarios/packages_option_only/packages_option_only_test: CompileTimeError # Please triage.
-typed_data_isolate_test: Pass, Crash, Timeout # Please triage.
 
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
 io/compile_all_test: Crash # Issue 32373
@@ -163,6 +162,7 @@
 map_insert_remove_oom_test: Skip # Heap limit too low.
 
 [ $system == windows && ($compiler == dartk || $compiler == dartkb) ]
+io/dart_std_io_pipe_test: Pass, Slow
 io/secure_builtin_roots_test: Skip # Issues 32137 and 32138.
 io/test_extension_fail_test: RuntimeError, Pass # Issue 32137.
 io/test_extension_test: RuntimeError, Pass # Issue 32137.
@@ -196,9 +196,6 @@
 io/test_extension_fail_test: RuntimeError # Platform.script points to dill file.
 io/test_extension_test: RuntimeError # Platform.script points to dill file.
 map_insert_remove_oom_test: Skip # Heap limit too low.
-package/scenarios/packages_file_strange_formatting/empty_lines_test: CompileTimeError # Please triage.
-package/scenarios/packages_file_strange_formatting/mixed_line_ends_test: CompileTimeError # Please triage.
-package/scenarios/packages_option_only/packages_option_only_test: CompileTimeError # Please triage.
 
 # ===== Skip dartk and darkp in !$strong mode ====
 [ !$strong && ($compiler == dartk || $compiler == dartkb) ]
diff --git a/tools/VERSION b/tools/VERSION
index 646d82b..272ca47 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 1
 PATCH 0
-PRERELEASE 6
+PRERELEASE 7
 PRERELEASE_PATCH 0
diff --git a/tools/bots/compare_results.dart b/tools/bots/compare_results.dart
index 5192925..9d69ba3 100755
--- a/tools/bots/compare_results.dart
+++ b/tools/bots/compare_results.dart
@@ -74,6 +74,7 @@
     ArgResults options) {
   bool judgement = false;
   bool beganSection = false;
+  int count = options["count"] != null ? int.parse(options["count"]) : null;
 
   for (final event in events) {
     if (searchFor == "passing" &&
@@ -104,6 +105,14 @@
     if (!after.flaked && !after.matches) {
       judgement = true;
     }
+    if (count != null) {
+      if (--count <= 0) {
+        if (options["human"]) {
+          print("(And more)");
+        }
+        break;
+      }
+    }
     if (options["human"]) {
       if (options["verbose"]) {
         String expected =
@@ -140,6 +149,9 @@
       abbr: 'c',
       negatable: false,
       help: "Show only tests that changed results.");
+  parser.addOption("count",
+      abbr: "C",
+      help: "Upper limit on how many tests to report in each section");
   parser.addFlag("failing",
       abbr: 'f', negatable: false, help: "Show failing tests.");
   parser.addOption("flakiness-data",
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 9fe04ff..34e9fed 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -101,9 +101,12 @@
       "out/ReleaseSIMDBC64/",
       "out/ReleaseX64/",
       "xcodebuild/DebugIA32/",
+      "xcodebuild/DebugSIMDBC64/",
       "xcodebuild/DebugX64/",
+      "xcodebuild/ProductX64/",
       "xcodebuild/ReleaseIA32/",
       "xcodebuild/ReleaseSIMARM64/",
+      "xcodebuild/ReleaseSIMDBC64/",
       "xcodebuild/ReleaseX64/",
       "samples/",
       "samples-dev/",
@@ -112,7 +115,7 @@
       "third_party/pkg_tested/",
       "third_party/observatory_pub_packages/packages/",
       "tests/angular/",
-      "tests/co19/",
+      "tests/co19_2/",
       "tests/compiler/",
       "tests/corelib/",
       "tests/corelib_2/",
@@ -179,114 +182,11 @@
         "vm-options": ["-DuseFastaParser=true"],
         "builder-tag": "analyzer_use_fasta"
       }},
-    "vm-legacy-(linux|mac|win)-(debug|release)-(ia32|x64)": {
+    "dartk-asan-linux-release-(ia32|x64)": {
       "options": {
-        "preview-dart-2": false,
-        "builder-tag": "swarming"
-      }},
-    "vm-legacy-checked-(linux|mac|win)-(debug|release)-(ia32|x64)": {
-      "options": {
-        "preview-dart-2": false,
-        "checked": true,
-        "builder-tag": "swarming"
-      }},
-    "vm-legacy-linux-debug-simarm": {
-      "options": {
-        "preview-dart-2": false,
-        "builder-tag": "swarming"
-      }},
-    "vm-legacy-checked-linux-debug-simarm": {
-      "options": {
-        "preview-dart-2": false,
-        "checked": true,
-        "builder-tag": "swarming"
-      }},
-    "vm-legacy-linux-release-(simarm|simarm64)": {
-      "options": {
-        "preview-dart-2": false,
-        "builder-tag": "swarming"
-      }},
-    "vm-legacy-checked-linux-release-(simarm|simarm64)": {
-      "options": {
-        "preview-dart-2": false,
-        "checked": true,
-        "builder-tag": "swarming"
-      }},
-    "vm-legacy-mac-(debug|release)-simdbc64": {
-      "options": {
-        "preview-dart-2": false,
-        "builder-tag": "swarming"
-      }},
-    "vm-legacy-checked-mac-(debug|release)-simdbc64": {
-      "options": {
-        "preview-dart-2": false,
-        "checked": true,
-        "builder-tag": "swarming"
-      }},
-    "vm-legacy-(linux|mac|win)-product-x64": {
-      "options": {
-        "preview-dart-2": false,
-        "builder-tag": "swarming"
-      }},
-    "vm-legacy-asan-linux-release-x64": {
-      "options": {
-        "preview-dart-2": false,
         "builder-tag": "asan",
         "timeout": 240
       }},
-    "vm-legacy-checked-asan-linux-release-x64": {
-      "options": {
-        "preview-dart-2": false,
-        "checked": true,
-        "builder-tag": "asan",
-        "timeout": 240
-      }},
-    "vm-legacy-optcounter-linux-release-(ia32|x64)": {
-      "options": {
-        "preview-dart-2": false,
-        "builder-tag": "optimization_counter_threshold",
-        "vm-options": ["--optimization-counter-threshold=5"]
-      }},
-    "vm-legacy-optcounter-checked-linux-release-(ia32|x64)": {
-      "options": {
-        "preview-dart-2": false,
-        "checked": true,
-        "builder-tag": "optimization_counter_threshold",
-        "vm-options": ["--optimization-counter-threshold=5"]
-      }},
-    "vm-legacy-reload-linux-(debug|release)-x64": {
-      "options": {
-        "preview-dart-2": false,
-        "hot-reload": true
-      }},
-    "vm-legacy-reload-checked-linux-(debug|release)-x64": {
-      "options": {
-        "preview-dart-2": false,
-        "checked": true,
-        "hot-reload": true
-      }},
-    "vm-legacy-reload-mac-(debug|release)-simdbc64": {
-      "options": {
-        "preview-dart-2": false,
-        "hot-reload": true
-      }},
-    "vm-legacy-reload-checked-mac-(debug|release)-simdbc64": {
-      "options": {
-        "preview-dart-2": false,
-        "checked": true,
-        "hot-reload": true
-      }},
-    "vm-legacy-reload-rollback-linux-(debug|release)-x64": {
-      "options": {
-        "preview-dart-2": false,
-        "hot-reload-rollback": true
-      }},
-    "vm-legacy-reload-rollback-checked-linux-(debug|release)-x64": {
-      "options": {
-        "preview-dart-2": false,
-        "checked": true,
-        "hot-reload-rollback": true
-      }},
     "dart2js-(linux|mac|win)-chrome": {
       "options": {
         "use-sdk": true
@@ -373,23 +273,20 @@
       "options": {
         "vm-options": ["--no-enable-malloc-hooks"]
     }},
-    "dartk-(linux|mac)-(debug|release)-x64": { },
+    "dartk-(linux|mac)-(debug|release)-(ia32|x64)": { },
     "dartk-checked-linux-release-x64": {
       "options": {
         "checked": true
     }},
-    "dartk-win-release-x64": { },
-    "dartk-linux-(debug|release)-simdbc64": { },
+    "dartk-win-(debug|release)-(ia32|x64)": { },
+    "dartk-(linux|mac|win)-product-x64": { },
+    "dartk-(linux|mac)-(debug|release)-simdbc64": { },
     "dartk-linux-release-(simarm|simarm64)": { },
-    "dartk-optcounter-linux-release-x64": {
+    "dartk-optcounter-linux-release-(ia32|x64)": {
       "options": {
         "builder-tag": "optimization_counter_threshold",
         "vm-options": ["--optimization-counter-threshold=5"]
       }},
-    "dartk-legacy-linux-release-x64": {
-      "options": {
-        "preview-dart-2": false
-      }},
     "dartk-reload-linux-(debug|release)-x64": {
       "options": {
         "hot-reload": true
@@ -432,12 +329,6 @@
         "enable-asserts": true,
         "use-sdk": true
       }},
-    "analyzer-cfe-(linux|mac|win)": {
-      "options": {
-        "compiler": "dart2analyzer",
-        "use-cfe": true,
-        "use-sdk": true
-      }},
     "analyzer-fasta_parser-linux": {
       "options": {
         "compiler": "dart2analyzer",
@@ -520,7 +411,9 @@
             "corelib_2",
             "lib_2",
             "standalone_2"
-          ]
+          ],
+          "fileset": "vm-kernel",
+          "shards": 10
         },
         {
           "name": "vm bytecode compiler tests",
@@ -531,7 +424,9 @@
             "corelib_2",
             "lib_2",
             "standalone_2"
-          ]
+          ],
+          "fileset": "vm-kernel",
+          "shards": 10
         },
         {
           "name": "vm interpreter tests",
@@ -542,70 +437,9 @@
             "corelib_2",
             "lib_2",
             "standalone_2"
-          ]
-        }
-      ]
-    },
-    {
-      "builders": [
-        "vm-linux-product-x64",
-        "vm-mac-product-x64",
-        "vm-win-product-x64"
-      ],
-      "meta": {
-        "description": "This configuration is used by the vm product builders."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["runtime"]
-        },
-        {
-          "name": "vm tests",
-          "arguments": [
-            "-nvm-legacy-${system}-product-x64"]
-        }
-      ]
-    },
-    {
-      "builders": [
-        "vm-linux-debug-ia32",
-        "vm-linux-debug-simarm",
-        "vm-linux-debug-x64",
-        "vm-linux-release-ia32",
-        "vm-linux-release-simarm",
-        "vm-linux-release-simarm64",
-        "vm-linux-release-x64",
-        "vm-mac-debug-ia32",
-        "vm-mac-debug-simdbc64",
-        "vm-mac-debug-x64",
-        "vm-mac-release-ia32",
-        "vm-mac-release-simdbc64",
-        "vm-mac-release-x64",
-        "vm-win-debug-ia32",
-        "vm-win-debug-x64",
-        "vm-win-release-ia32",
-        "vm-win-release-x64"
-      ],
-      "meta": {
-        "description": "This configuration is used by the vm debug and vm release builders."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["runtime"]
-        },
-        {
-          "name": "vm tests",
-          "arguments": [
-            "-nvm-legacy-${system}-${mode}-${arch}"]
-        },
-        {
-          "name": "checked vm tests",
-          "arguments": [
-            "-nvm-legacy-checked-${system}-${mode}-${arch}"]
+          ],
+          "fileset": "vm-kernel",
+          "shards": 10
         }
       ]
     },
@@ -625,41 +459,19 @@
         {
           "name": "vm ia32 tests",
           "arguments": [
-            "-nvm-legacy-linux-debug-ia32",
+            "-ndartk-linux-debug-ia32",
             "vm"]
         },
         {
           "name": "vm x64 tests",
           "arguments": [
-            "-nvm-legacy-linux-debug-x64",
+            "-ndartk-linux-debug-x64",
             "vm"]
         }
       ]
     },
     {
       "builders": [
-        "vm-kernel-legacy-linux-release-x64"
-      ],
-      "meta": {
-        "description": "Tests the vm with dartk in legacy mode."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["runtime_kernel"]
-        },
-        {
-          "name": "vm legacy tests",
-          "arguments": [
-            "-ndartk-legacy-linux-release-x64"],
-          "fileset": "vm-kernel",
-          "shards": 10
-        }
-      ]
-    },
-    {
-      "builders": [
         "vm-kernel-precomp-linux-debug-x64",
         "vm-kernel-precomp-linux-product-x64",
         "vm-kernel-precomp-linux-release-simarm",
@@ -684,8 +496,7 @@
         {
           "name": "vm tests",
           "arguments": [
-            "-ndartkp-${system}-${mode}-${arch}",
-            "-v"
+            "-ndartkp-${system}-${mode}-${arch}"
           ],
           "fileset": "vm-kernel",
           "shards": 10
@@ -711,8 +522,7 @@
         {
           "name": "vm tests",
           "arguments": [
-            "-ndartkp-obfuscate-${system}-${mode}-${arch}",
-            "-v"
+            "-ndartkp-obfuscate-${system}-${mode}-${arch}"
           ],
           "fileset": "vm-kernel",
           "shards": 10
@@ -721,35 +531,23 @@
     },
     {
       "builders": [
-        "vm-asan-linux-release-x64"
+        "vm-kernel-asan-linux-release-ia32",
+        "vm-kernel-asan-linux-release-x64"
       ],
       "meta": {
         "description": "This configuration is used by the vm builders with address sanitizing (asan). We have to run gn.py with the DART_USE_ASAN options, which we do by running generate_buildfiles."
       },
       "steps": [
         {
-          "name": "generate build files with ASAN_USE_DART=1",
-          "script": "tools/generate_buildfiles.py",
-          "environment": {"DART_USE_ASAN": 1}
-        },
-        {
           "name": "build dart",
           "script": "tools/build.py",
-          "arguments": ["-v", "runtime"]
+          "arguments": ["runtime"],
+          "environment": {"DART_USE_ASAN": 1}
         },
         {
           "name": "vm tests",
           "arguments": [
-            "-nvm-legacy-asan-linux-release-x64"],
-          "environment": {
-            "ASAN_OPTIONS": "handle_segv=0:detect_stack_use_after_return=0",
-            "ASAN_SYMBOLIZER_PATH": "buildtools/linux-x64/clang/bin/llvm-symbolizer"
-          }
-        },
-        {
-          "name": "checked vm tests",
-          "arguments": [
-            "-nvm-legacy-checked-asan-linux-release-x64"],
+            "-ndartk-asan-linux-release-${arch}"],
           "environment": {
             "ASAN_OPTIONS": "handle_segv=0:detect_stack_use_after_return=0",
             "ASAN_SYMBOLIZER_PATH": "buildtools/linux-x64/clang/bin/llvm-symbolizer"
@@ -759,14 +557,21 @@
     },
     {
       "builders": [
+        "vm-kernel-linux-debug-ia32",
         "vm-kernel-linux-debug-simdbc64",
         "vm-kernel-linux-debug-x64",
         "vm-kernel-linux-release-simarm",
         "vm-kernel-linux-release-simarm64",
-        "vm-kernel-linux-release-simdbc64",
-        "vm-kernel-linux-release-x64",
+        "vm-kernel-linux-release-ia32",
+        "vm-kernel-mac-debug-simdbc64",
         "vm-kernel-mac-debug-x64",
+        "vm-kernel-mac-product-x64",
+        "vm-kernel-mac-release-simdbc64",
         "vm-kernel-mac-release-x64",
+        "vm-kernel-win-debug-ia32",
+        "vm-kernel-win-debug-x64",
+        "vm-kernel-win-product-x64",
+        "vm-kernel-win-release-ia32",
         "vm-kernel-win-release-x64"
       ],
       "meta": {
@@ -789,6 +594,39 @@
     },
     {
       "builders": [
+        "vm-kernel-linux-product-x64",
+        "vm-kernel-linux-release-simdbc64",
+        "vm-kernel-linux-release-x64"
+      ],
+      "meta": {
+        "description": "This configuration is for the co19_2 kernel builder group."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["runtime_kernel"]
+        },
+        {
+          "name": "vm tests",
+          "arguments": [
+            "-ndartk-${system}-${mode}-${arch}"],
+          "fileset": "vm-kernel",
+          "shards": 10
+        },
+        {
+          "name": "vm co19 tests",
+          "arguments": [
+            "-ndartk-${system}-${mode}-${arch}",
+            "co19_2"
+          ],
+          "fileset": "vm-kernel",
+          "shards": 10
+        }
+      ]
+    },
+    {
+      "builders": [
         "vm-kernel-checked-linux-release-x64"
       ],
       "meta": {
@@ -966,34 +804,7 @@
     },
     {
       "builders": [
-        "vm-optcounter-threshold-linux-release-ia32",
-        "vm-optcounter-threshold-linux-release-x64"
-      ],
-      "meta": {
-        "description": "This is the configuration for the optcounter builders, under the vm-misc group. They run the same tests as the ordinary VM builders, but add extra options to the vm."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": [
-            "runtime"
-          ]
-        },
-        {
-          "name": "vm tests",
-          "arguments": [
-            "-nvm-legacy-optcounter-linux-release-${arch}"]
-        },
-        {
-          "name": "checked vm tests",
-          "arguments": [
-            "-nvm-legacy-optcounter-checked-linux-release-${arch}"]
-        }
-      ]
-    },
-    {
-      "builders": [
+        "vm-kernel-optcounter-threshold-linux-release-ia32",
         "vm-kernel-optcounter-threshold-linux-release-x64"
       ],
       "meta": {
@@ -1010,7 +821,7 @@
         {
           "name": "vm tests",
           "arguments": [
-            "-ndartk-optcounter-linux-release-x64"],
+            "-ndartk-optcounter-linux-release-${arch}"],
           "fileset": "vm-kernel",
           "shards": 10
         }
@@ -1018,34 +829,6 @@
     },
     {
       "builders": [
-        "vm-reload-linux-debug-x64",
-        "vm-reload-linux-release-x64",
-        "vm-reload-mac-debug-simdbc64",
-        "vm-reload-mac-release-simdbc64"
-      ],
-      "meta": {
-        "description": "This is the configuration for the hot reload builders."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["runtime"]
-        },
-        {
-          "name": "vm tests",
-          "arguments": [
-            "-nvm-legacy-reload-${system}-${mode}-${arch}"]
-        },
-        {
-          "name": "checked vm tests",
-          "arguments": [
-            "-nvm-legacy-reload-checked-${system}-${mode}-${arch}"]
-        }
-      ]
-    },
-    {
-      "builders": [
         "vm-kernel-reload-linux-debug-x64",
         "vm-kernel-reload-linux-release-x64",
         "vm-kernel-reload-mac-debug-simdbc64",
@@ -1069,32 +852,6 @@
     },
     {
       "builders": [
-        "vm-reload-rollback-linux-debug-x64",
-        "vm-reload-rollback-linux-release-x64"
-      ],
-      "meta": {
-        "description": "This is the configuration for reload rollback builders."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["runtime"]
-        },
-        {
-          "name": "vm tests",
-          "arguments": [
-            "-nvm-legacy-reload-rollback-linux-${mode}-x64"]
-        },
-        {
-          "name": "checked vm tests",
-          "arguments": [
-            "-nvm-legacy-reload-rollback-checked-linux-${mode}-x64"]
-        }
-      ]
-    },
-    {
-      "builders": [
         "vm-kernel-reload-rollback-linux-debug-x64",
         "vm-kernel-reload-rollback-linux-release-x64"
       ],
@@ -1622,23 +1379,6 @@
       ]
     },
     {
-      "builders": [
-        "analyzer-use-cfe-linux",
-        "analyzer-use-cfe-mac",
-        "analyzer-use-cfe-win"
-      ],
-      "meta": {
-        "description": "The configuration used by the analyzer builders running --use-cfe."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["create_sdk"]
-        }
-      ]
-    },
-    {
       "builders": ["analyzer-analysis-server-linux"],
       "meta": {
         "description": "Analyze analyzer related packages."
@@ -1941,6 +1681,45 @@
           "arguments": ["linux-x64-benchmark"]
         }
       ]
+    },
+    {
+      "builders": ["fuzz-linux"],
+      "meta": {
+        "description": "This configuration is used for fuzz testing."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": [
+            "--mode=debug,release",
+            "--arch=x64,simarm64",
+            "runtime",
+            "dart_precompiled_runtime"
+          ]
+        },
+        {
+          "name": "build dart 32bit",
+          "script": "tools/build.py",
+          "arguments": [
+            "--mode=debug,release",
+            "--arch=ia32,simarm",
+            "runtime"
+          ]
+        },
+        {
+          "name": "make a fuzz",
+          "script": "out/ReleaseX64/dart",
+          "arguments": [
+            "runtime/tools/dartfuzz/dartfuzz_test.dart",
+            "--isolates",
+            "8",
+            "--no-show-stats",
+            "--repeat",
+            "125"
+          ]
+        }
+      ]
     }
   ]
 }
diff --git a/tools/bots/try_benchmarks.sh b/tools/bots/try_benchmarks.sh
index a988f47..a2b3555 100755
--- a/tools/bots/try_benchmarks.sh
+++ b/tools/bots/try_benchmarks.sh
@@ -83,7 +83,8 @@
       out/ReleaseIA32/dart-sdk \
       tools/dart2js/angular2_testing_deps \
       out/ReleaseIA32/dart \
-      out/ReleaseIA32/dart_bootstrap \
+      out/ReleaseIA32/gen_snapshot \
+      out/ReleaseIA32/gen_kernel_bytecode.dill \
       out/ReleaseIA32/run_vm_tests \
       third_party/d8/linux/ia32/d8 \
       sdk samples-dev/swarm \
@@ -131,7 +132,7 @@
       -K '_ZN4dart7Version14snapshot_hash_E' \
       -K '_ZN4dart7Version4str_E' \
       -K '_ZN4dart7Version7commit_E' \
-      -K '_ZN4dart9Bootstrap*_paths_E' out/ReleaseIA32/dart_bootstrap
+      -K '_ZN4dart9Bootstrap*_paths_E' out/ReleaseIA32/gen_snapshot
     strip -w \
       -K 'kDartVmSnapshotData' \
       -K 'kDartVmSnapshotInstructions' \
@@ -182,7 +183,8 @@
       out/ReleaseIA32/dart-sdk \
       tools/dart2js/angular2_testing_deps \
       out/ReleaseIA32/dart \
-      out/ReleaseIA32/dart_bootstrap \
+      out/ReleaseIA32/gen_snapshot \
+      out/ReleaseIA32/gen_kernel_bytecode.dill \
       out/ReleaseIA32/run_vm_tests \
       third_party/d8/linux/ia32/d8 \
       sdk \
@@ -222,15 +224,15 @@
     out/ReleaseIA32/dart pkg/front_end/tool/fasta_perf.dart scan hello.dart
     out/ReleaseIA32/dart --print_metrics pkg/analyzer_cli/bin/analyzer.dart --dart-sdk=sdk hello.dart
     out/ReleaseIA32/run_vm_tests InitialRSS
+    out/ReleaseIA32/run_vm_tests GenKernelKernelLoadKernel
     cd ..
     rm -rf tmp
   elif [ "$command" = linux-x64-build ]; then
     ./tools/build.py --mode=release --arch=x64 create_sdk
     ./tools/build.py --mode=release --arch=x64 runtime
-    ./tools/build.py --mode=release --arch=x64 dart_bootstrap
+    ./tools/build.py --mode=release --arch=x64 gen_snapshot
     ./tools/build.py --mode=release --arch=x64 dart_precompiled_runtime
     ./tools/build.py --mode=release --arch=simdbc64 runtime
-    ./tools/build.py --mode=release --arch=x64 runtime_kernel
     tar -czf linux-x64_profile.tar.gz \
       --exclude .git \
       --exclude .gitignore \
@@ -241,9 +243,9 @@
       out/ReleaseX64/vm_platform_strong.dill \
       out/ReleaseX64/dart-sdk \
       out/ReleaseSIMDBC64/dart \
-      out/ReleaseX64/gen/kernel-service.dart.snapshot \
       out/ReleaseX64/dart \
-      out/ReleaseX64/dart_bootstrap \
+      out/ReleaseX64/gen_snapshot \
+      out/ReleaseX64/gen_kernel_bytecode.dill \
       out/ReleaseX64/run_vm_tests \
       third_party/d8/linux/x64/d8 \
       out/ReleaseX64/dart_precompiled_runtime \
@@ -293,7 +295,7 @@
       -K '_ZN4dart7Version14snapshot_hash_E' \
       -K '_ZN4dart7Version4str_E' \
       -K '_ZN4dart7Version7commit_E' \
-      -K '_ZN4dart9Bootstrap*_paths_E' out/ReleaseX64/dart_bootstrap
+      -K '_ZN4dart9Bootstrap*_paths_E' out/ReleaseX64/gen_snapshot
     strip -w \
       -K 'kDartVmSnapshotData' \
       -K 'kDartVmSnapshotInstructions' \
@@ -361,9 +363,9 @@
       out/ReleaseX64/vm_platform_strong.dill \
       out/ReleaseX64/dart-sdk \
       out/ReleaseSIMDBC64/dart \
-      out/ReleaseX64/gen/kernel-service.dart.snapshot \
       out/ReleaseX64/dart \
-      out/ReleaseX64/dart_bootstrap \
+      out/ReleaseX64/gen_snapshot \
+      out/ReleaseX64/gen_kernel_bytecode.dill \
       out/ReleaseX64/run_vm_tests \
       third_party/d8/linux/x64/d8 \
       out/ReleaseX64/dart_precompiled_runtime \
@@ -403,6 +405,7 @@
     out/ReleaseX64/dart --background-compilation=false pkg/front_end/tool/incremental_perf.dart.appjit --target=vm --implementation=minimal --sdk-summary=out/ReleaseX64/vm_platform_strong.dill --sdk-library-specification=sdk/lib/libraries.json pkg/front_end/benchmarks/ikg/hello.dart pkg/front_end/benchmarks/ikg/hello.edits.json
     out/ReleaseX64/dart --packages=.packages pkg/kernel/test/binary_bench.dart --golem AstFromBinaryLazy out/ReleaseX64/vm_platform_strong.dill
     out/ReleaseX64/run_vm_tests InitialRSS
+    out/ReleaseX64/run_vm_tests GenKernelKernelLoadKernel
     cd ..
     rm -rf tmp
   else
diff --git a/tools/bots/update_flakiness.dart b/tools/bots/update_flakiness.dart
index 4c49782..89347f3 100755
--- a/tools/bots/update_flakiness.dart
+++ b/tools/bots/update_flakiness.dart
@@ -43,8 +43,7 @@
       final Map<String, dynamic> testData =
           data.putIfAbsent(name, () => <String, dynamic>{});
       testData["name"] = name;
-      final List<String> outcomes =
-          testData.putIfAbsent("outcomes", () => <String>[]);
+      final outcomes = testData.putIfAbsent("outcomes", () => []);
       if (!outcomes.contains(result["result"])) {
         outcomes.add(result["result"]);
         outcomes..sort();
diff --git a/tools/build.py b/tools/build.py
index efeff21..9c72266 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -38,8 +38,11 @@
   result.add_option("-j",
       type=int,
       help='Ninja -j option for Goma builds.',
-      metavar=1000,
       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]',
@@ -164,7 +167,26 @@
     os.system(command)
 
 
-def RunGN(target_os, mode, arch):
+def GenerateBuildfilesIfNeeded():
+  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
+
+
+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',
@@ -181,11 +203,6 @@
            ' '.join(gn_command))
 
 
-def ShouldRunGN(out_dir):
-  return (not os.path.exists(out_dir) or
-          not os.path.isfile(os.path.join(out_dir, 'args.gn')))
-
-
 def UseGoma(out_dir):
   args_gn = os.path.join(out_dir, 'args.gn')
   return 'use_goma = true' in open(args_gn, 'r').read()
@@ -234,8 +251,7 @@
   using_goma = False
   # TODO(zra): Remove auto-run of gn, replace with prompt for user to run
   # gn.py manually.
-  if ShouldRunGN(out_dir):
-    RunGN(target_os, mode, arch)
+  RunGNIfNeeded(out_dir, target_os, mode, arch)
   command = ['ninja', '-C', out_dir]
   if options.verbose:
     command += ['-v']
@@ -243,6 +259,7 @@
     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.
@@ -290,6 +307,9 @@
   else:
     targets = args
 
+  if not GenerateBuildfilesIfNeeded():
+    return 1
+
   # Build all targets for each requested configuration.
   configs = []
   for target_os in options.os:
diff --git a/tools/gn.py b/tools/gn.py
index 9c24ee3..877e735 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -177,7 +177,7 @@
   if arch != HostCpuForArch(arch):
     # Training an app-jit snapshot under a simulator is slow. Use script
     # snapshots instead.
-    gn_args['dart_snapshot_kind'] = 'script'
+    gn_args['dart_snapshot_kind'] = 'kernel'
   else:
     gn_args['dart_snapshot_kind'] = 'app-jit'
 
diff --git a/tools/infra/config/cq.cfg b/tools/infra/config/cq.cfg
index 758bbb7..62a45b3 100644
--- a/tools/infra/config/cq.cfg
+++ b/tools/infra/config/cq.cfg
@@ -32,9 +32,7 @@
       builders { name: "vm-kernel-linux-release-simdbc64-try" }
       builders { name: "vm-kernel-linux-release-x64-try" }
       builders { name: "vm-kernel-mac-release-x64-try" experiment_percentage: 5 }
-      builders { name: "vm-linux-product-x64-try" }
-      builders { name: "vm-linux-release-x64-try" }
-      builders { name: "vm-mac-release-x64-try" }
+      builders { name: "vm-kernel-linux-product-x64-try" }
     }
     try_job_retry_config {
       try_job_retry_quota: 0
diff --git a/tools/task_kill.py b/tools/task_kill.py
index 0f91b73..12b185d 100755
--- a/tools/task_kill.py
+++ b/tools/task_kill.py
@@ -25,7 +25,6 @@
 EXECUTABLE_NAMES = {
   'win32': {
     'chrome': 'chrome.exe',
-    'dart_bootstrap': 'dart_bootstrap.exe',
     'dart': 'dart.exe',
     'dart_precompiled_runtime': 'dart_precompiled_runtime.exe',
     'firefox': 'firefox.exe',
@@ -37,7 +36,6 @@
   },
   'linux': {
     'chrome': 'chrome',
-    'dart_bootstrap': 'dart_bootstrap',
     'dart': 'dart',
     'dart_precompiled_runtime': 'dart_precompiled_runtime',
     'firefox': 'firefox',
@@ -47,7 +45,6 @@
   'macos': {
     'chrome': 'Chrome',
     'chrome_helper': 'Chrome Helper',
-    'dart_bootstrap': 'dart_bootstrap',
     'dart': 'dart',
     'dart_precompiled_runtime': 'dart_precompiled_runtime',
     'firefox': 'firefox',
@@ -231,7 +228,6 @@
 
 def KillDart():
   status = Kill("dart", dump_stacks=True)
-  status += Kill("dart_bootstrap", dump_stacks=True)
   status += Kill("gen_snapshot", dump_stacks=True)
   status += Kill("dart_precompiled_runtime", dump_stacks=True)
   return status
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 75728c3..91e49e6 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -61,7 +61,7 @@
         return new DevCompilerConfiguration(configuration);
 
       case Compiler.dartdevk:
-        return new DevCompilerConfiguration(configuration, useKernel: true);
+        return new DevCompilerConfiguration(configuration);
 
       case Compiler.appJit:
         return new AppJitCompilerConfiguration(configuration,
@@ -466,17 +466,14 @@
 
 /// Configuration for `dartdevc` and `dartdevk`
 class DevCompilerConfiguration extends CompilerConfiguration {
-  final bool useKernel;
-
-  DevCompilerConfiguration(TestConfiguration configuration,
-      {this.useKernel: false})
+  DevCompilerConfiguration(TestConfiguration configuration)
       : super._subclass(configuration);
 
-  String get compilerName => useKernel ? 'dartdevk' : 'dartdevc';
+  bool get useKernel => _configuration.compiler == Compiler.dartdevk;
 
   String computeCompilerPath() {
     var dir = _useSdk ? "${_configuration.buildDirectory}/dart-sdk" : "sdk";
-    return "$dir/bin/$compilerName$executableScriptSuffix";
+    return "$dir/bin/dartdevc$executableScriptSuffix";
   }
 
   List<String> computeCompilerArguments(
@@ -498,25 +495,24 @@
     // to DDC's Kernel backend. At that point we'd like to migrate from Analyzer
     // summaries to Kernel IL.
     final useDillFormat = false;
-    var sdkSummaryFile = useDillFormat ? 'kernel/ddc_sdk.dill' : 'ddc_sdk.sum';
-    var sdkSummary = new Path(_configuration.buildDirectory)
-        .append("/gen/utils/dartdevc/$sdkSummaryFile")
-        .absolute
-        .toNativePath();
 
-    // If we're testing a built SDK use the SDK path. This will test that we can
-    // find the summary file from that. For local development we don't have a
-    // built SDK yet, so point directly at the built summary file.
-    //
-    // TODO(jmesserly): ideally we'd test the `dartdevc` script/.bat file.
-    // That's the closest to what users/tools use. That script has its own way
-    // of computing `--dart-sdk` and passing it to DDC. For simplicitly that
-    // script should be passing `--dart-sdk-summary`, that way DDC doesn't need
-    // two options for the same thing.
-    var args = _useSdk && !useKernel
-        ? ["--dart-sdk", "${_configuration.buildDirectory}/dart-sdk"]
-        : ["--dart-sdk-summary", sdkSummary];
-
+    var args = <String>[];
+    if (useKernel) {
+      args.add('--kernel');
+    }
+    if (!_useSdk) {
+      // If we're testing a built SDK, DDC will find its own summary.
+      //
+      // For local development we don't have a built SDK yet, so point directly
+      // at the built summary file location.
+      var sdkSummaryFile =
+          useDillFormat ? 'kernel/ddc_sdk.dill' : 'ddc_sdk.sum';
+      var sdkSummary = new Path(_configuration.buildDirectory)
+          .append("/gen/utils/dartdevc/$sdkSummaryFile")
+          .absolute
+          .toNativePath();
+      args.addAll(["--dart-sdk-summary", sdkSummary]);
+    }
     args.addAll(sharedOptions);
     if (!useKernel) {
       // TODO(jmesserly): library-root needs to be removed.
@@ -552,8 +548,9 @@
 
     var inputDir =
         new Path(inputFile).append("..").canonicalize().toNativePath();
-    return Command.compilation(compilerName, outputFile,
-        bootstrapDependencies(), computeCompilerPath(), args, environment,
+    var displayName = useKernel ? 'dartdevk' : 'dartdevc';
+    return Command.compilation(displayName, outputFile, bootstrapDependencies(),
+        computeCompilerPath(), args, environment,
         workingDirectory: inputDir);
   }
 
@@ -654,21 +651,21 @@
     String exec;
     if (_isAndroid) {
       if (_isArm) {
-        exec = "$buildDir/clang_x86/dart_bootstrap";
+        exec = "$buildDir/clang_x86/gen_snapshot";
       } else if (_configuration.architecture == Architecture.arm64) {
-        exec = "$buildDir/clang_x64/dart_bootstrap";
+        exec = "$buildDir/clang_x64/gen_snapshot";
       }
     } else {
-      exec = "$buildDir/dart_bootstrap";
+      exec = "$buildDir/gen_snapshot";
     }
 
     final args = <String>[];
-    args.add("--snapshot-kind=app-aot");
     if (_configuration.useBlobs) {
-      args.add("--snapshot=$tempDir/out.aotsnapshot");
-      args.add("--use-blobs");
+      args.add("--snapshot-kind=app-aot-blobs");
+      args.add("--blobs_container_filename=$tempDir/out.aotsnapshot");
     } else {
-      args.add("--snapshot=$tempDir/out.S");
+      args.add("--snapshot-kind=app-aot-assembly");
+      args.add("--assembly=$tempDir/out.S");
     }
 
     if (_isAndroid && _isArm) {
@@ -1072,7 +1069,8 @@
     ];
 
     args.add(arguments.where((name) => name.endsWith('.dart')).single);
-    args.addAll(arguments.where((name) => name.startsWith('-D')));
+    args.addAll(arguments.where(
+        (name) => name.startsWith('-D') || name.startsWith('--packages=')));
     if (_isChecked || _useEnableAsserts) {
       args.add('--enable_asserts');
     }
@@ -1165,10 +1163,15 @@
       List<String> dart2jsOptions,
       List<String> ddcOptions,
       List<String> args) {
-    var arguments = <String>[];
-    for (var argument in args) {
-      if (argument != "--ignore-unrecognized-flags") {
-        arguments.add(argument);
+    List<String> arguments = <String>[];
+    for (String argument in args) {
+      if (argument == "--ignore-unrecognized-flags") continue;
+      arguments.add(argument);
+      if (!argument.startsWith("-")) {
+        // Some tests pass arguments to the Dart program; that is, arguments
+        // after the name of the test file. Such arguments have nothing to do
+        // with the compiler and should be ignored.
+        break;
       }
     }
     return arguments;
diff --git a/tools/testing/dart/options.dart b/tools/testing/dart/options.dart
index 6c72986..4bd3f1e 100644
--- a/tools/testing/dart/options.dart
+++ b/tools/testing/dart/options.dart
@@ -358,7 +358,8 @@
     'verbose',
     'write_debug_log',
     'write_test_outcome_log',
-    'write_result_log'
+    'write_result_log',
+    'write_results',
   ].toSet();
 
   /// Parses a list of strings as test options.
diff --git a/utils/analysis_server/BUILD.gn b/utils/analysis_server/BUILD.gn
index 643c494..ed5eb6a 100644
--- a/utils/analysis_server/BUILD.gn
+++ b/utils/analysis_server/BUILD.gn
@@ -7,7 +7,9 @@
 application_snapshot("analysis_server") {
   main_dart = "../../pkg/analysis_server/bin/server.dart"
   training_args = [
-    "--sdk=" + rebase_path("../../sdk/"),
-    "--train-using=" + rebase_path("../../pkg/analyzer_cli")
+    "--help"
+    # TODO(34616): This is broken on Fuchsia.
+    # "--sdk=" + rebase_path("../../sdk/"),
+    # "--train-using=" + rebase_path("../../pkg/analyzer_cli")
   ]
 }
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index 16b0025..67749bb 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -11,7 +11,7 @@
   # Default to building app-jit snapshots. The simulator and cross builds
   # override this to script snapshots to cut down on build time.
   if (target_cpu != host_cpu) {
-    dart_snapshot_kind = "script"
+    dart_snapshot_kind = "kernel"
   } else {
     dart_snapshot_kind = "app-jit"
   }
@@ -96,9 +96,9 @@
       "--snapshot-depfile=$abs_depfile",
     ] + snapshot_vm_args
 
-    if (dart_snapshot_kind == "script") {
+    if (dart_snapshot_kind == "kernel") {
       vm_args += [
-        "--snapshot-kind=script",
+        "--snapshot-kind=kernel",
       ]
       assert(training_args != "", "Ignoring unused argument")
       args = []
@@ -184,6 +184,7 @@
     aot_vm_args = invoker.vm_args
   }
   main_dart = invoker.main_dart
+  aot_vm_args = aot_vm_args + [ rebase_path("$main_dart") ]
   name = target_name
   if (defined(invoker.name)) {
     name = invoker.name
@@ -205,11 +206,10 @@
   if (defined(invoker.output)) {
     output = invoker.output
   }
-  dart_bootstrap_action(target_name) {
+  gen_snapshot_action(target_name) {
     deps = extra_deps
     depfile = "$output.d"
 
-    script = main_dart
     inputs = extra_inputs
 
     outputs = [
@@ -221,8 +221,8 @@
     vm_args = [
       "--deterministic",
       "--packages=$dot_packages",
-      "--snapshot-kind=app-aot",
-      "--snapshot=$abs_output",
+      "--snapshot-kind=app-aot-assembly",
+      "--assembly=$abs_output",
     ] + aot_vm_args
 
     args = []
diff --git a/utils/dartanalyzer/BUILD.gn b/utils/dartanalyzer/BUILD.gn
index 887caf5..701a860 100644
--- a/utils/dartanalyzer/BUILD.gn
+++ b/utils/dartanalyzer/BUILD.gn
@@ -22,9 +22,11 @@
 application_snapshot("generate_dartanalyzer_snapshot") {
   main_dart = "../../pkg/analyzer_cli/bin/analyzer.dart"
   training_args = [
-    "--dart-sdk=" + rebase_path("../../sdk/"),
-    "--train-snapshot",
-    rebase_path("../../tests/language/first_test.dart")
+    "--help",
+    # TODO(34616): This is broken on Fuchsia.
+    # "--dart-sdk=" + rebase_path("../../sdk/"),
+    # "--train-snapshot",
+    # rebase_path("../../tests/language/first_test.dart")
   ]
   name = "dartanalyzer"
 }